mirror of
https://github.com/reactos/reactos.git
synced 2024-12-27 09:34:43 +00:00
365 lines
9.8 KiB
C
365 lines
9.8 KiB
C
|
/*
|
||
|
* WineCalc (winecalc.h)
|
||
|
*
|
||
|
* Copyright 2003 James Briggs
|
||
|
*
|
||
|
* This library is free software; you can redistribute it and/or
|
||
|
* modify it under the terms of the GNU Lesser General Public
|
||
|
* License as published by the Free Software Foundation; either
|
||
|
* version 2.1 of the License, or (at your option) any later version.
|
||
|
*
|
||
|
* This library is distributed in the hope that it will be useful,
|
||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||
|
* Lesser General Public License for more details.
|
||
|
*
|
||
|
* You should have received a copy of the GNU Lesser General Public
|
||
|
* License along with this library; if not, write to the Free Software
|
||
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||
|
*/
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////
|
||
|
|
||
|
// numerics are defined here for easier porting
|
||
|
|
||
|
typedef double calcfloat;
|
||
|
#define FMT_DESC_FLOAT "%.32g"
|
||
|
#define FMT_DESC_EXP "%.32e"
|
||
|
|
||
|
#define CALC_ATOF(x) atof(x)
|
||
|
|
||
|
#define CONST_PI 3.1415926535897932384626433832795
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////
|
||
|
|
||
|
#define CALC_BUF_SIZE 128
|
||
|
|
||
|
// statistics dialog dimensions
|
||
|
|
||
|
#define CALC_STA_X 235
|
||
|
#define CALC_STA_Y 180
|
||
|
|
||
|
// sentinel for differentiating Return from Ctrl+M events
|
||
|
|
||
|
#define NUMBER_OF_THE_BEAST 666
|
||
|
|
||
|
#define CALC_COLOR_BLUE 0
|
||
|
#define CALC_COLOR_RED 1
|
||
|
#define CALC_COLOR_GRAY 2
|
||
|
#define CALC_COLOR_MAGENTA 3
|
||
|
|
||
|
// gray hilite on rectangle owner-drawn controls RGB(CALC_GRAY, CALC_GRAY, CALC_GRAY)
|
||
|
|
||
|
#define CALC_GRAY 132
|
||
|
|
||
|
// count of buttons needing special toggle states depending on number base
|
||
|
|
||
|
#define TOGGLE_COUNT 23
|
||
|
|
||
|
// there are 3 window menus, standard, decimal measurement system and word size menus
|
||
|
|
||
|
#define COUNT_MENUS 3
|
||
|
#define MENU_STD 0
|
||
|
#define MENU_SCIMS 1
|
||
|
#define MENU_SCIWS 2
|
||
|
|
||
|
// count of buttons
|
||
|
|
||
|
#define CALC_BUTTONS_STANDARD 28
|
||
|
#define CALC_BUTTONS_SCIENTIFIC 73
|
||
|
|
||
|
// winecalc window outer dimensions
|
||
|
|
||
|
#define CALC_STANDARD_WIDTH 260
|
||
|
#define CALC_STANDARD_HEIGHT 252
|
||
|
#define CALC_SCIENTIFIC_WIDTH 480
|
||
|
#define CALC_SCIENTIFIC_HEIGHT 310
|
||
|
|
||
|
// winecalc private ids for events
|
||
|
|
||
|
#define ID_CALC_ZERO 0
|
||
|
#define ID_CALC_ONE 1
|
||
|
#define ID_CALC_TWO 2
|
||
|
#define ID_CALC_THREE 3
|
||
|
#define ID_CALC_FOUR 4
|
||
|
#define ID_CALC_FIVE 5
|
||
|
#define ID_CALC_SIX 6
|
||
|
#define ID_CALC_SEVEN 7
|
||
|
#define ID_CALC_EIGHT 8
|
||
|
#define ID_CALC_NINE 9
|
||
|
#define ID_CALC_BACKSPACE 20
|
||
|
#define ID_CALC_CLEAR_ENTRY 21
|
||
|
#define ID_CALC_CLEAR_ALL 22
|
||
|
#define ID_CALC_MEM_CLEAR 23
|
||
|
#define ID_CALC_DIVIDE 24
|
||
|
#define ID_CALC_SQRT 25
|
||
|
#define ID_CALC_MEM_RECALL 26
|
||
|
#define ID_CALC_MULTIPLY 27
|
||
|
#define ID_CALC_PERCENT 28
|
||
|
#define ID_CALC_MEM_STORE 29
|
||
|
#define ID_CALC_MINUS 30
|
||
|
#define ID_CALC_RECIPROCAL 31
|
||
|
#define ID_CALC_MEM_PLUS 32
|
||
|
#define ID_CALC_SIGN 33
|
||
|
#define ID_CALC_DECIMAL 34
|
||
|
#define ID_CALC_PLUS 35
|
||
|
#define ID_CALC_EQUALS 36
|
||
|
#define ID_CALC_STA 37
|
||
|
#define ID_CALC_FE 38
|
||
|
#define ID_CALC_LEFTPAREN 39
|
||
|
#define ID_CALC_RIGHTPAREN 40
|
||
|
#define ID_CALC_MOD 41
|
||
|
#define ID_CALC_AND 42
|
||
|
#define ID_CALC_OR 43
|
||
|
#define ID_CALC_XOR 44
|
||
|
#define ID_CALC_SUM 45
|
||
|
#define ID_CALC_SIN 46
|
||
|
#define ID_CALC_LOG10 47
|
||
|
#define ID_CALC_LSH 48
|
||
|
#define ID_CALC_NOT 49
|
||
|
#define ID_CALC_S 50
|
||
|
#define ID_CALC_COS 52
|
||
|
#define ID_CALC_FACTORIAL 53
|
||
|
#define ID_CALC_INT 54
|
||
|
#define ID_CALC_DAT 55
|
||
|
#define ID_CALC_TAN 56
|
||
|
#define ID_CALC_SQUARE 57
|
||
|
#define ID_CALC_A 58
|
||
|
#define ID_CALC_B 59
|
||
|
#define ID_CALC_C 60
|
||
|
#define ID_CALC_D 61
|
||
|
#define ID_CALC_E 62
|
||
|
#define ID_CALC_F 63
|
||
|
#define ID_CALC_AVE 64
|
||
|
#define ID_CALC_DMS 65
|
||
|
#define ID_CALC_EXP 66
|
||
|
#define ID_CALC_LN 67
|
||
|
#define ID_CALC_PI 68
|
||
|
#define ID_CALC_CUBE 69
|
||
|
#define ID_CALC_POWER 51
|
||
|
|
||
|
// Number System Radio Buttons
|
||
|
|
||
|
#define CALC_NS_COUNT 4
|
||
|
#define ID_CALC_NS_HEX 2000
|
||
|
#define ID_CALC_NS_DEC 2001
|
||
|
#define ID_CALC_NS_OCT 2002
|
||
|
#define ID_CALC_NS_BIN 2003
|
||
|
|
||
|
#define NBASE_DECIMAL 0
|
||
|
#define NBASE_BINARY 1
|
||
|
#define NBASE_OCTAL 2
|
||
|
#define NBASE_HEX 3
|
||
|
|
||
|
#define CALC_NS_OFFSET_X 15
|
||
|
#define CALC_NS_OFFSET_Y 37
|
||
|
|
||
|
#define SZ_RADIO_NS_X 50
|
||
|
#define SZ_RADIO_NS_Y 15
|
||
|
|
||
|
#define CALC_NS_HEX_LEFT 0
|
||
|
#define CALC_NS_HEX_TOP 0
|
||
|
|
||
|
#define CALC_NS_DEC_LEFT 50
|
||
|
#define CALC_NS_DEC_TOP 0
|
||
|
|
||
|
#define CALC_NS_OCT_LEFT 98
|
||
|
#define CALC_NS_OCT_TOP 0
|
||
|
|
||
|
#define CALC_NS_BIN_LEFT 148
|
||
|
#define CALC_NS_BIN_TOP 0
|
||
|
|
||
|
// Measurement System Radio Buttons
|
||
|
|
||
|
#define CALC_MS_COUNT 3
|
||
|
#define ID_CALC_MS_DEGREES 2010
|
||
|
#define ID_CALC_MS_RADIANS 2011
|
||
|
#define ID_CALC_MS_GRADS 2012
|
||
|
|
||
|
#define TRIGMODE_DEGREES 0
|
||
|
#define TRIGMODE_RADIANS 1
|
||
|
#define TRIGMODE_GRADS 2
|
||
|
|
||
|
#define CALC_MS_OFFSET_X 225
|
||
|
#define CALC_MS_OFFSET_Y 37
|
||
|
|
||
|
#define SZ_RADIO_MS_X 75
|
||
|
#define SZ_RADIO_MS_Y 15
|
||
|
|
||
|
#define CALC_MS_DEGREES_LEFT 0
|
||
|
#define CALC_MS_DEGREES_TOP 0
|
||
|
|
||
|
#define CALC_MS_RADIANS_LEFT 82
|
||
|
#define CALC_MS_RADIANS_TOP 0
|
||
|
|
||
|
#define CALC_MS_GRADS_LEFT 162
|
||
|
#define CALC_MS_GRADS_TOP 0
|
||
|
|
||
|
// Inv and Hyp Checkboxes
|
||
|
|
||
|
#define CALC_CB_COUNT 2
|
||
|
#define ID_CALC_CB_INV 2020
|
||
|
#define ID_CALC_CB_HYP 2021
|
||
|
|
||
|
#define WORDSIZE_BYTE 1
|
||
|
#define WORDSIZE_WORD 2
|
||
|
#define WORDSIZE_DWORD 4
|
||
|
#define WORDSIZE_QWORD 8
|
||
|
|
||
|
#define CALC_CB_OFFSET_X 15
|
||
|
#define CALC_CB_OFFSET_Y 58
|
||
|
|
||
|
#define CALC_CB_INV_LEFT 0
|
||
|
#define CALC_CB_INV_TOP 10
|
||
|
|
||
|
#define SZ_RADIO_CB_X 50
|
||
|
#define SZ_RADIO_CB_Y 14
|
||
|
|
||
|
#define CALC_CB_HYP_LEFT 58
|
||
|
#define CALC_CB_HYP_TOP 10
|
||
|
|
||
|
// Word Size Radio Buttons
|
||
|
|
||
|
#define CALC_WS_COUNT 4
|
||
|
#define ID_CALC_WS_QWORD 2030
|
||
|
#define ID_CALC_WS_DWORD 2031
|
||
|
#define ID_CALC_WS_WORD 2032
|
||
|
#define ID_CALC_WS_BYTE 2033
|
||
|
|
||
|
#define CALC_WS_OFFSET_X CALC_MS_OFFSET_X
|
||
|
#define CALC_WS_OFFSET_Y CALC_MS_OFFSET_Y
|
||
|
|
||
|
#define CALC_WS_QWORD_LEFT 0
|
||
|
#define CALC_WS_QWORD_TOP 0
|
||
|
|
||
|
#define CALC_WS_DWORD_LEFT 57
|
||
|
#define CALC_WS_DWORD_TOP 0
|
||
|
|
||
|
#define CALC_WS_WORD_LEFT 120
|
||
|
#define CALC_WS_WORD_TOP 0
|
||
|
|
||
|
#define CALC_WS_BYTE_LEFT 175
|
||
|
#define CALC_WS_BYTE_TOP 0
|
||
|
|
||
|
#define SZ_RADIO_WS_X 50
|
||
|
#define SZ_RADIO_WS_Y 15
|
||
|
|
||
|
// drawing offsets
|
||
|
|
||
|
#define CALC_EDIT_HEIGHT 20
|
||
|
|
||
|
#define SZ_FILLER_X 32
|
||
|
#define SZ_FILLER_Y 30
|
||
|
|
||
|
#define SZ_BIGBTN_X 62
|
||
|
#define SZ_BIGBTN_Y 30
|
||
|
|
||
|
#define SZ_MEDBTN_X 36
|
||
|
#define SZ_MEDBTN_Y 30
|
||
|
|
||
|
#define MARGIN_LEFT 7
|
||
|
#define MARGIN_SMALL_X 3
|
||
|
#define MARGIN_SMALL_Y 3
|
||
|
#define MARGIN_BIG_X 274
|
||
|
#define MARGIN_STANDARD_BIG_X 11
|
||
|
#define MARGIN_BIG_Y 6
|
||
|
|
||
|
#define SZ_SPACER_X 11
|
||
|
|
||
|
// winecalc results display area
|
||
|
|
||
|
#define WDISPLAY_STANDARD_LEFT MARGIN_LEFT + 4
|
||
|
#define WDISPLAY_STANDARD_TOP 5
|
||
|
#define WDISPLAY_STANDARD_RIGHT 244
|
||
|
#define WDISPLAY_STANDARD_BOTTOM 24
|
||
|
#define CALC_STANDARD_MARGIN_TOP 16
|
||
|
|
||
|
#define WDISPLAY_SCIENTIFIC_LEFT MARGIN_LEFT + 4
|
||
|
#define WDISPLAY_SCIENTIFIC_TOP 5
|
||
|
#define WDISPLAY_SCIENTIFIC_RIGHT 465
|
||
|
#define WDISPLAY_SCIENTIFIC_BOTTOM 24
|
||
|
#define CALC_SCIENTIFIC_MARGIN_TOP 44
|
||
|
|
||
|
typedef struct tagCalcBtn {
|
||
|
int id; // private id
|
||
|
HWND hBtn; // button child window handle
|
||
|
char label[80]; // text on buttonface
|
||
|
int color; // text color
|
||
|
RECT r; // location
|
||
|
int enable; // 1 = control enbabled, 0 = disabled
|
||
|
}
|
||
|
CALCBTN;
|
||
|
|
||
|
typedef struct tagPos {
|
||
|
int x;
|
||
|
int y;
|
||
|
}
|
||
|
POS;
|
||
|
|
||
|
typedef struct tagCalc {
|
||
|
HINSTANCE hInst; // this HINSTANCE
|
||
|
HWND hWnd; // main window's HWND
|
||
|
|
||
|
POS pos;
|
||
|
int numButtons; // standard = 28, scientific = more
|
||
|
|
||
|
char buffer [CALC_BUF_SIZE]; // current keyboard buffer
|
||
|
char display[CALC_BUF_SIZE]; // display buffer before output
|
||
|
|
||
|
calcfloat value; // most recent computer value
|
||
|
calcfloat memory; // most recent stored memory value from display buffer
|
||
|
int paren; // current parentheses level
|
||
|
|
||
|
int sciMode; // standard = 1, scientific = 0
|
||
|
int displayMode; // 0 = float, 1 = scientific exponential notation like 1.0e+10
|
||
|
|
||
|
char oper; // most recent operator pushed
|
||
|
calcfloat operand; // most recent operand pushed
|
||
|
int newenter; // track multiple =
|
||
|
int next; // binary operation flag
|
||
|
int err; // errror status for divide by zero, infinity, etc.
|
||
|
int init; // starting buffer
|
||
|
|
||
|
int digitGrouping; // no separators = 0, separators = 1
|
||
|
|
||
|
int trigMode; // degrees = 0, radians = 1, grads = 2
|
||
|
int numBase; // 10 = decimal, 2 = binary, 8 = octal, 16 = hex
|
||
|
int wordSize; // 1 = byte, 2 = word, 4 = dword, 8 = qword
|
||
|
int invMode; // INV mode 0 = off, 1 = on
|
||
|
int hypMode; // HYP mode 0 = off, 1 = on
|
||
|
|
||
|
int new; // first time 0 = false, 1 = true
|
||
|
CALCBTN cb[80]; // enough buttons for standard or scientific mode
|
||
|
}
|
||
|
CALC;
|
||
|
|
||
|
BOOL CALLBACK AboutDlgProc( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam );
|
||
|
LRESULT WINAPI MainProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
|
||
|
|
||
|
void InitLuts(void);
|
||
|
void InitMenus(HINSTANCE hInst);
|
||
|
|
||
|
void InitCalc (CALC *calc);
|
||
|
void DestroyCalc (CALC *calc);
|
||
|
|
||
|
void calc_buffer_format(CALC *calc);
|
||
|
void calc_buffer_display(CALC *calc);
|
||
|
char *calc_sep(char *s);
|
||
|
|
||
|
void DrawCalcText (HDC hdc, HDC hMemDC, PAINTSTRUCT *ps, CALC *calc, int object, char *s);
|
||
|
void CalcRect (HDC hdc, HDC hMemDC, PAINTSTRUCT *ps, CALC *calc, int object);
|
||
|
void DrawCalcRectSci(HDC hdc, HDC hMemDC, PAINTSTRUCT *ps, CALC *calc, RECT *r);
|
||
|
void DrawCalc (HDC hdc, HDC hMemDC, PAINTSTRUCT *ps, CALC *calc);
|
||
|
|
||
|
void calc_setmenuitem_radio(HMENU hMenu, UINT id);
|
||
|
|
||
|
void show_debug(CALC *calc, char *title, long wParam, long lParam);
|
||
|
|
||
|
calcfloat calc_atof(char *s, int base);
|
||
|
void calc_ftoa(CALC *calc, calcfloat r, char *buf);
|
||
|
long factorial(long n);
|
||
|
|
||
|
calcfloat calc_convert_to_radians(CALC *calc);
|
||
|
calcfloat calc_convert_from_radians(CALC *calc);
|
||
|
|