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