1 /******************************************************************************** 2 * * 3 * F O X D e s k t o p C a l c u l a t o r * 4 * * 5 ********************************************************************************* 6 * Copyright (C) 2001,2005 by Jeroen van der Zijp. All Rights Reserved. * 7 ********************************************************************************* 8 * This program is free software; you can redistribute it and/or modify * 9 * it under the terms of the GNU General Public License as published by * 10 * the Free Software Foundation; either version 2 of the License, or * 11 * (at your option) any later version. * 12 * * 13 * This program is distributed in the hope that it will be useful, * 14 * but WITHOUT ANY WARRANTY; without even the implied warranty of * 15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * 16 * GNU General Public License for more details. * 17 * * 18 * You should have received a copy of the GNU General Public License * 19 * along with this program; if not, write to the Free Software * 20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. * 21 ********************************************************************************* 22 * $Id: Calculator.h,v 1.25 2005/01/16 16:06:06 fox Exp $ * 23 ********************************************************************************/ 24 #ifndef CALCULATOR_H 25 #define CALCULATOR_H 26 27 28 /*******************************************************************************/ 29 30 31 32 // Mini application object 33 class Calculator : public FXMainWindow { 34 FXDECLARE(Calculator) 35 protected: 36 enum{STACKLEN=32}; 37 protected: 38 FXTextField *display; // Number display 39 FXFont *font; // Display font 40 FXButton *digit[16]; // Digit buttons 41 FXButton *memory[4]; // Memory buttons 42 FXButton *clearbtn; // Clear entry button 43 FXButton *clearallbtn; // Clear all button 44 FXButton *inverse; // Inverse function 45 FXButton *hyper; // Hyper (for trig) button 46 FXButton *functions[16]; // Function buttons 47 FXButton *operators[14]; // Operator buttons 48 FXButton *numbase[4]; // Numeric base 49 FXButton *angmode[3]; // Angle mode (deg, rad, grad) 50 FXIcon *bigicon; // Big application icon 51 FXIcon *smallicon; // Small application icon 52 FXIcon *cmem; // Label 53 FXIcon *quest; // Question mark 54 FXdouble numstack[STACKLEN]; // Evaluation stack 55 FXint numsp; // Evaluation stack pointer 56 FXuchar opstack[STACKLEN]; // Operator stack 57 FXint opsp; // Operator stack pointer 58 FXdouble recall; // Memory cell 59 FXint limit; // Maximum displayed digits 60 FXint digits; // Number of digits entered 61 FXint base; // Number base 62 FXint angles; // Angle mode 63 FXint precision; // How many digits to show 64 FXbool exponent; // Exponential notation mode 65 FXbool beep; // Beep on error 66 FXint parens; // Count of ( and ) 67 FXuchar modifiers; // Invert, hyperbolic, entry modifiers 68 static const char help[]; 69 protected: Calculator()70 Calculator(){} 71 private: 72 Calculator(const Calculator&); 73 Calculator &operator=(const Calculator&); 74 void setDisplayText(const FXString& txt); 75 FXString getDisplayText() const; 76 void setDisplayValue(FXdouble val); 77 FXdouble getDisplayValue() const; 78 FXdouble trigarg(FXdouble ang) const; 79 FXdouble trigres(FXdouble res) const; 80 FXdouble pushnum(FXdouble num); 81 FXdouble setnum(FXdouble num); 82 FXdouble popnum(); 83 FXdouble getnum(); 84 void dyop(FXuchar op); 85 void clear(); 86 void unary(FXuchar op); 87 void dyadic(FXuchar op); 88 void evaluate(); 89 void lparen(); 90 void rparen(); 91 public: 92 long onCmdAngle(FXObject*,FXSelector,void*); 93 long onUpdAngle(FXObject*,FXSelector,void*); 94 long onCmdBase(FXObject*,FXSelector,void*); 95 long onUpdBase(FXObject*,FXSelector,void*); 96 long onUpdDigit(FXObject*,FXSelector,void*); 97 long onCmdDigit(FXObject*,FXSelector,void*); 98 long onCmdPoint(FXObject*,FXSelector,void*); 99 long onUpdPoint(FXObject*,FXSelector,void*); 100 long onCmdExp(FXObject*,FXSelector,void*); 101 long onUpdExp(FXObject*,FXSelector,void*); 102 long onCmdDelete(FXObject*,FXSelector,void*); 103 long onCmdClear(FXObject*,FXSelector,void*); 104 long onCmdClearAll(FXObject*,FXSelector,void*); 105 long onCmdInverse(FXObject*,FXSelector,void*); 106 long onCmdHyper(FXObject*,FXSelector,void*); 107 long onCmdMemRec(FXObject*,FXSelector,void*); 108 long onCmdMemAdd(FXObject*,FXSelector,void*); 109 long onCmdMemSub(FXObject*,FXSelector,void*); 110 long onCmdMemClr(FXObject*,FXSelector,void*); 111 long onCmdSin(FXObject*,FXSelector,void*); 112 long onUpdSin(FXObject*,FXSelector,void*); 113 long onCmdCos(FXObject*,FXSelector,void*); 114 long onUpdCos(FXObject*,FXSelector,void*); 115 long onCmdTan(FXObject*,FXSelector,void*); 116 long onUpdTan(FXObject*,FXSelector,void*); 117 long onCmdLog(FXObject*,FXSelector,void*); 118 long onUpdLog(FXObject*,FXSelector,void*); 119 long onCmdLn(FXObject*,FXSelector,void*); 120 long onUpdLn(FXObject*,FXSelector,void*); 121 long onCmdPi(FXObject*,FXSelector,void*); 122 long onUpdPi(FXObject*,FXSelector,void*); 123 long onCmdFac(FXObject*,FXSelector,void*); 124 long onUpdFac(FXObject*,FXSelector,void*); 125 long onCmdPer(FXObject*,FXSelector,void*); 126 long onUpdPer(FXObject*,FXSelector,void*); 127 long onCmdCom(FXObject*,FXSelector,void*); 128 long onUpdCom(FXObject*,FXSelector,void*); 129 long onCmdRecip(FXObject*,FXSelector,void*); 130 long onUpdRecip(FXObject*,FXSelector,void*); 131 long onCmdPlusMin(FXObject*,FXSelector,void*); 132 long onCmdXToY(FXObject*,FXSelector,void*); 133 long onUpdXToY(FXObject*,FXSelector,void*); 134 long onCmdSqrt(FXObject*,FXSelector,void*); 135 long onUpdSqrt(FXObject*,FXSelector,void*); 136 long onCmdShl(FXObject*,FXSelector,void*); 137 long onUpdShl(FXObject*,FXSelector,void*); 138 long onCmdShr(FXObject*,FXSelector,void*); 139 long onUpdShr(FXObject*,FXSelector,void*); 140 long onCmd2Log(FXObject*,FXSelector,void*); 141 long onUpd2Log(FXObject*,FXSelector,void*); 142 long onCmdLPar(FXObject*,FXSelector,void*); 143 long onCmdRPar(FXObject*,FXSelector,void*); 144 long onCmdAnd(FXObject*,FXSelector,void*); 145 long onCmdOr(FXObject*,FXSelector,void*); 146 long onCmdXor(FXObject*,FXSelector,void*); 147 long onCmdNot(FXObject*,FXSelector,void*); 148 long onCmdMul(FXObject*,FXSelector,void*); 149 long onCmdDiv(FXObject*,FXSelector,void*); 150 long onCmdMod(FXObject*,FXSelector,void*); 151 long onUpdMod(FXObject*,FXSelector,void*); 152 long onCmdAdd(FXObject*,FXSelector,void*); 153 long onCmdSub(FXObject*,FXSelector,void*); 154 long onCmdEnter(FXObject*,FXSelector,void*); 155 long onCmdPreferences(FXObject*,FXSelector,void*); 156 long onUpdColor(FXObject*,FXSelector,void*); 157 long onCmdColor(FXObject*,FXSelector,void*); 158 long onCmdFont(FXObject*,FXSelector,void*); 159 long onCmdExponent(FXObject*,FXSelector,void*); 160 long onUpdExponent(FXObject*,FXSelector,void*); 161 long onCmdPrecision(FXObject*,FXSelector,void*); 162 long onUpdPrecision(FXObject*,FXSelector,void*); 163 long onCmdBeep(FXObject*,FXSelector,void*); 164 long onUpdBeep(FXObject*,FXSelector,void*); 165 long onCmdQuestion(FXObject*,FXSelector,void*); 166 public: 167 enum { 168 MOD_INV=1, // Modes 169 MOD_HYP=2, 170 MOD_ENT=4 171 }; 172 enum { 173 ANG_DEG, // Angle modes 174 ANG_RAD, 175 ANG_GRA 176 }; 177 enum { 178 NUM_BIN=2, // Number bases 179 NUM_OCT=8, 180 NUM_DEC=10, 181 NUM_HEX=16 182 }; 183 enum { 184 DY_OR, // Dyadics 185 DY_XOR, 186 DY_AND, 187 DY_SUB, 188 DY_ADD, 189 DY_MOD, 190 DY_IDIV, 191 DY_DIV, 192 DY_MUL, 193 DY_XTOY, 194 DY_XTOINVY, 195 DY_PER, 196 DY_COM, 197 DY_LPAR, 198 DY_RPAR 199 }; 200 enum { 201 UN_NOT, // Unaries 202 UN_NEG, 203 UN_SHL, 204 UN_SHR, 205 UN_SAR, 206 UN_RECIP, 207 UN_FAC, 208 UN_SQRT, 209 UN_QUAD, 210 UN_2LOG, 211 UN_2TOX, 212 UN_LOG, 213 UN_10TOX, 214 UN_LN, 215 UN_EXP, 216 UN_SIN, 217 UN_ASIN, 218 UN_SINH, 219 UN_ASINH, 220 UN_COS, 221 UN_ACOS, 222 UN_COSH, 223 UN_ACOSH, 224 UN_TAN, 225 UN_ATAN, 226 UN_TANH, 227 UN_ATANH 228 }; 229 public: 230 enum { 231 ID_TEXT=FXMainWindow::ID_LAST, 232 ID_PREFERENCES, 233 ID_COLOR_DISPLAY, 234 ID_COLOR_DISPLAYNUMBER, 235 ID_COLOR_DIGITS, 236 ID_COLOR_HEXDIGITS, 237 ID_COLOR_OPERATORS, 238 ID_COLOR_FUNCTIONS, 239 ID_COLOR_MEMORY, 240 ID_COLOR_BASE, 241 ID_COLOR_ANGLES, 242 ID_COLOR_INVERT, 243 ID_COLOR_HYPER, 244 ID_COLOR_CLEARALL, 245 ID_COLOR_CLEAR, 246 ID_EXPONENT_ALWAYS, 247 ID_EXPONENT_NEVER, 248 ID_PRECISION, 249 ID_QUESTION, 250 ID_BEEP, 251 ID_FONT, 252 ID_BASE, 253 ID_BIN=ID_BASE+NUM_BIN, 254 ID_OCT=ID_BASE+NUM_OCT, 255 ID_DEC=ID_BASE+NUM_DEC, 256 ID_HEX=ID_BASE+NUM_HEX, 257 ID_MODE, 258 ID_DEG=ID_MODE+ANG_DEG, 259 ID_RAD=ID_MODE+ANG_RAD, 260 ID_GRA=ID_MODE+ANG_GRA, 261 ID_MEM_REC, 262 ID_MEM_ADD, 263 ID_MEM_SUB, 264 ID_MEM_CLR, 265 ID_PLUSMIN, 266 ID_ENTER, 267 ID_CLEAR, 268 ID_CLEARALL, 269 ID_DELETE, 270 ID_INV, 271 ID_HYP, 272 ID_EXP, 273 ID_PNT, 274 ID_PI, 275 ID_0, 276 ID_1, 277 ID_2, 278 ID_3, 279 ID_4, 280 ID_5, 281 ID_6, 282 ID_7, 283 ID_8, 284 ID_9, 285 ID_A, 286 ID_B, 287 ID_C, 288 ID_D, 289 ID_E, 290 ID_F, 291 ID_OR, 292 ID_XOR, 293 ID_AND, 294 ID_SUB, 295 ID_ADD, 296 ID_MOD, 297 ID_DIV, 298 ID_MUL, 299 ID_XTOY, 300 ID_PER, 301 ID_COM, 302 ID_LPAR, 303 ID_RPAR, 304 ID_NOT, 305 ID_SHL, 306 ID_SHR, 307 ID_RECIP, 308 ID_FAC, 309 ID_SQRT, 310 ID_2LOG, 311 ID_LOG, 312 ID_LN, 313 ID_SIN, 314 ID_COS, 315 ID_TAN, 316 ID_LAST 317 }; 318 public: 319 320 /// Construct calculator dialog 321 Calculator(FXApp* a); 322 323 // Close the window and save registry 324 virtual FXbool close(FXbool notify=FALSE); 325 326 /// Create 327 virtual void create(); 328 329 /// Set digit color 330 void setDigitColor(FXColor clr); 331 FXColor getDigitColor() const; 332 333 /// Set digit color 334 void setHexDigitColor(FXColor clr); 335 FXColor getHexDigitColor() const; 336 337 /// Set operator color 338 void setOperatorColor(FXColor clr); 339 FXColor getOperatorColor() const; 340 341 /// Set function color 342 void setFunctionColor(FXColor clr); 343 FXColor getFunctionColor() const; 344 345 /// Set memory color 346 void setMemoryColor(FXColor clr); 347 FXColor getMemoryColor() const; 348 349 /// Set inverse color 350 void setInverseColor(FXColor clr); 351 FXColor getInverseColor() const; 352 353 /// Set hyp color 354 void setHyperColor(FXColor clr); 355 FXColor getHyperColor() const; 356 357 /// Set clear color 358 void setClearColor(FXColor clr); 359 FXColor getClearColor() const; 360 361 /// Set clear all color 362 void setClearAllColor(FXColor clr); 363 FXColor getClearAllColor() const; 364 365 /// Set display color 366 void setDisplayColor(FXColor clr); 367 FXColor getDisplayColor() const; 368 369 /// Set display number color 370 void setDisplayNumberColor(FXColor clr); 371 FXColor getDisplayNumberColor() const; 372 373 /// Set numeric base color 374 void setBaseColor(FXColor clr); 375 FXColor getBaseColor() const; 376 377 /// Set numeric base color 378 void setAngleColor(FXColor clr); 379 FXColor getAngleColor() const; 380 381 /// Set number base 382 void setBase(FXint base); getBase()383 FXint getBase() const { return base; } 384 385 /// Set angle mode setAngles(FXint ang)386 void setAngles(FXint ang){ angles=ang; } getAngles()387 FXint getAngles() const { return angles; } 388 389 /// Set exponent mode 390 void setExponentMode(FXbool expmode); getExponentMode()391 FXbool getExponentMode() const { return exponent; } 392 393 /// Set precision 394 void setPrecision(FXint prec); getPrecision()395 FXint getPrecision() const { return precision; } 396 397 /// Beep on error setBeep(FXbool on)398 void setBeep(FXbool on){ beep=on; } getBeep()399 FXbool getBeep() const { return beep; } 400 401 /// Set display font 402 void setDisplayFont(FXFont* font); 403 FXFont* getDisplayFont() const; 404 405 /// Clear the calculator 406 void clearAll(); 407 408 /// Read/write registry 409 void readRegistry(); 410 void writeRegistry(); 411 412 /// Destroy calculator 413 virtual ~Calculator(); 414 }; 415 416 #endif 417