Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | File List | Class Members | File Members | Related Pages

calculator.cpp

Go to the documentation of this file.
00001 /* *************************************************************************************
00002         Writer:         Sebastien Bloc
00003         Copyright:      2003-2004
00004         eMail:          sebastien.bloc@free.fr
00005         URL:            http://mignonsoft.free.fr
00006 
00007         This program is free software; you can redistribute it and/or
00008         modify it under the terms of the GNU General Public License
00009         as published by the Free Software Foundation; either version 2
00010         of the License, or (at your option) any later version.
00011 
00012         This program is distributed in the hope that it will be useful,
00013         but WITHOUT ANY WARRANTY; without even the implied warranty of
00014         MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00015         GNU General Public License for more details.
00016         http://www.gnu.org/copyleft/gpl.html
00017 ************************************************************************************* */
00018 
00019 #include "3d.h"
00020 #include "input.h"
00021 #include "controlEngine.h"
00022 #include "calculator.h"
00023 
00024 extern ControlEngine ce;
00025 
00026 Opperation::Opperation()
00027 {
00028         number = 0;
00029         op=Op_Null;
00030 }
00031 
00032 void Opperation::operator=(Opperation &src)
00033 {
00034         number=src.number;
00035         op=src.op;
00036 }
00037 
00038 void Opperation::GetText(MyString &result)
00039 {
00040         switch (op)
00041         {
00042         case Op_Null: result="Null"; break;
00043         case Op_Add: result="+"; break;
00044         case Op_Sub: result="-"; break;
00045         case Op_Mult: result="*"; break;
00046         case Op_Div: result="/"; break;
00047         default: result="Error";
00048         }
00049 }
00050 
00051 double Opperation::Compute(double param1,TOpperation op,double param2)
00052 {
00053         switch (op)
00054         {
00055         case Op_Null: return param1;
00056         case Op_Add: return param1+param2;
00057         case Op_Sub: return param1-param2;
00058         case Op_Mult: return param1*param2;
00059         case Op_Div: return !param2?-1:param1/param2;
00060         default: return -1;
00061         }
00062 }
00063 
00064 // *********************************************************************
00065 
00066 Calculator::Calculator()
00067 {
00068         lineCur="0";
00069         txtResult=lineCur;
00070         txtResult.text.SetAlign(align_begin,align_begin);
00071 
00072         title="Calc";
00073         title.useMax=FALSE;
00074 
00075         // gestion evenement de touche
00076         onControl.key.down.connect(this,OnKey);
00077         client.onControl.key.down.connect(this,OnKey);
00078         for (int i=0;i<10;i++) btnNumbers[i].onControl.key.down.connect(this,OnKey);
00079         btnAdd.onControl.key.down.connect(this,OnKey);
00080         btnSub.onControl.key.down.connect(this,OnKey);
00081         btnDiv.onControl.key.down.connect(this,OnKey);
00082         btnMult.onControl.key.down.connect(this,OnKey);
00083         btnEqual.onControl.key.down.connect(this,OnKey);
00084         btnDot.onControl.key.down.connect(this,OnKey);
00085         btnEqual.onControl.key.down.connect(this,OnKey);
00086 
00087         // config des trouches numerique
00088         btnNumbers[0]="0";
00089         btnNumbers[0].onButton.click.connect(this,OnNum0);
00090         btnNumbers[1]="1";
00091         btnNumbers[1].onButton.click.connect(this,OnNum1);
00092         btnNumbers[2]="2";
00093         btnNumbers[2].onButton.click.connect(this,OnNum2);
00094         btnNumbers[3]="3";
00095         btnNumbers[3].onButton.click.connect(this,OnNum3);
00096         btnNumbers[4]="4";
00097         btnNumbers[4].onButton.click.connect(this,OnNum4);
00098         btnNumbers[5]="5";
00099         btnNumbers[5].onButton.click.connect(this,OnNum5);
00100         btnNumbers[6]="6";
00101         btnNumbers[6].onButton.click.connect(this,OnNum6);
00102         btnNumbers[7]="7";
00103         btnNumbers[7].onButton.click.connect(this,OnNum7);
00104         btnNumbers[8]="8";
00105         btnNumbers[8].onButton.click.connect(this,OnNum8);
00106         btnNumbers[9]="9";
00107         btnNumbers[9].onButton.click.connect(this,OnNum9);
00108 
00109         // config touche operation
00110         btnEqual="=";
00111         btnEqual.onButton.click.connect(this,OnEqual);
00112         btnAdd="+";
00113         btnAdd.onButton.click.connect(this,OnAdd);
00114         btnSub="-";
00115         btnSub.onButton.click.connect(this,OnSub);
00116         btnMult="*";
00117         btnMult.onButton.click.connect(this,OnMult);
00118         btnDiv="/";
00119         btnDiv.onButton.click.connect(this,OnDiv);
00120         btnDot=".";
00121         btnDot.onButton.click.connect(this,OnDot);
00122         btnClear="C";
00123         btnClear.onButton.click.connect(this,OnClear);
00124 }
00125 
00126 void Calculator::Create()
00127 {
00128         ce.Push(ce.univers);
00129         Window::Create();
00130         canResize=FALSE;
00131         textureIcon.FromBitmap("calculator icon","texture/control/calculator icon.bmp");
00132         title.btnIcon.faceNode->Elems(FACE_FRONT)->texture=&textureIcon;
00133 
00134         ce.Push(&client);
00135         ce.primitive.GoTo(FACE_FRONT); // a l'avant
00136 
00137         // text resultat
00138         txtResult.Create();
00139         txtResult.XDockCenter(2,0);
00140         txtResult.YDockTop(2,80);
00141 
00142         int posX=2,posY=84;
00143         int dx=20,dy=20;
00144         btnClear.Create();
00145         btnClear.XDockLeft(posX,dx);
00146         btnClear.YDockTop(posY,dy);
00147         btnDiv.Create();
00148         btnDiv.XDockLeft(posX+dx+2,dx);
00149         btnDiv.YDockTop(posY,dy);
00150         btnMult.Create();
00151         btnMult.XDockLeft(posX+(dx+2)*2,dx);
00152         btnMult.YDockTop(posY,dy);
00153         btnSub.Create();
00154         btnSub.XDockLeft(posX+(dx+2)*3,dx);
00155         btnSub.YDockTop(posY,dy);
00156 
00157         posY+=22;
00158         btnNumbers[7].Create();
00159         btnNumbers[7].XDockLeft(posX+(dx+2)*0,dx);
00160         btnNumbers[7].YDockTop(posY,dy);
00161         btnNumbers[8].Create();
00162         btnNumbers[8].XDockLeft(posX+(dx+2)*1,dx);
00163         btnNumbers[8].YDockTop(posY,dy);
00164         btnNumbers[9].Create();
00165         btnNumbers[9].XDockLeft(posX+(dx+2)*2,dx);
00166         btnNumbers[9].YDockTop(posY,dy);
00167         btnAdd.Create();
00168         btnAdd.XDockLeft(posX+(dx+2)*3,dx);
00169         btnAdd.YDockTop(posY,dy*2+2);
00170 
00171         posY+=22;
00172         btnNumbers[4].Create();
00173         btnNumbers[4].XDockLeft(posX+(dx+2)*0,dx);
00174         btnNumbers[4].YDockTop(posY,dy);
00175         btnNumbers[5].Create();
00176         btnNumbers[5].XDockLeft(posX+(dx+2)*1,dx);
00177         btnNumbers[5].YDockTop(posY,dy);
00178         btnNumbers[6].Create();
00179         btnNumbers[6].XDockLeft(posX+(dx+2)*2,dx);
00180         btnNumbers[6].YDockTop(posY,dy);
00181 
00182         posY+=22;
00183         btnNumbers[1].Create();
00184         btnNumbers[1].XDockLeft(posX+(dx+2)*0,dx);
00185         btnNumbers[1].YDockTop(posY,dy);
00186         btnNumbers[2].Create();
00187         btnNumbers[2].XDockLeft(posX+(dx+2)*1,dx);
00188         btnNumbers[2].YDockTop(posY,dy);
00189         btnNumbers[3].Create();
00190         btnNumbers[3].XDockLeft(posX+(dx+2)*2,dx);
00191         btnNumbers[3].YDockTop(posY,dy);
00192         btnEqual.Create();
00193         btnEqual.XDockLeft(posX+(dx+2)*3,dx);
00194         btnEqual.YDockTop(posY,dy*2+2);
00195 
00196         posY+=22;
00197         btnNumbers[0].Create();
00198         btnNumbers[0].XDockLeft(posX+(dx+2)*0,dx*2+2);
00199         btnNumbers[0].YDockTop(posY,dy);
00200         btnDot.Create();
00201         btnDot.XDockLeft(posX+(dx+2)*2,dx);
00202         btnDot.YDockTop(posY,dy);
00203         ce.Pop();
00204 
00205         //affichage arriere:
00206         ce.Push(this);
00207         ce.primitive.GoTo(FACE_BACK);
00208         txtResultBase.Create();
00209         txtResultBase.XDockCenter(2,2);
00210         txtResultBase.YDockCenter(2,2);
00211         txtResultBase.faceNode->elem->angle.z=180;
00212         txtResultBase.text.SetAlign(align_begin,align_center);
00213         ce.Pop();
00214         ce.Pop();
00215 }
00216 
00217 void Calculator::MajResult()
00218 {
00219         MyString text,txtOp;
00220         for (lOpperation.i=0;lOpperation.i.More();lOpperation.i++)
00221         {
00222                 Opperation *oppCur = lOpperation.i.GetElemPtr();
00223                 oppCur->GetText(txtOp);
00224                 text<<oppCur->number<<" "<<txtOp<<"\n";
00225         }
00226         text<<lineCur;
00227         txtResult=text;
00228 }
00229 
00230 void Calculator::Compute()
00231 {
00232         double result=0;
00233         double value;
00234         TOpperation oldOp=Op_Null;
00235         BOOL isFirst=TRUE;
00236 
00237         for (lOpperation.i=0;lOpperation.i.More();lOpperation.i++)
00238         {
00239                 Opperation *oppCur = lOpperation.i.GetElemPtr();
00240                 if (isFirst) { result=oppCur->number; isFirst=FALSE; }
00241                 else result = Opperation::Compute(result,oldOp,oppCur->number);
00242                 oldOp=oppCur->op;
00243         }
00244         sscanf(lineCur,"%lf",&value);
00245         result = Opperation::Compute(result,oldOp,value);
00246         lineCur.Format("%lf",result);
00247         lOpperation.i.SuprAll();
00248         MyString str(result);
00249         txtResult=str;
00250 
00251         MyString resultBase;
00252         str="";
00253         str<<"Hexa:\n";
00254         resultBase.EnterHexaNumber((int)result);
00255         str<<resultBase<<"\n";
00256         str<<"Bin:\n";
00257         resultBase.EnterBinNumber((int)result);
00258         str<<resultBase;
00259         txtResultBase=str;      
00260 }
00261 
00262 int Calculator::OnKey(StateKey *key,int face)
00263 {
00264         switch (key->code)
00265         {
00266         case VK_NUMPAD0: 
00267         case VK_NUMPAD1: 
00268         case VK_NUMPAD2: 
00269         case VK_NUMPAD3: 
00270         case VK_NUMPAD4: 
00271         case VK_NUMPAD5: 
00272         case VK_NUMPAD6: 
00273         case VK_NUMPAD7: 
00274         case VK_NUMPAD8: 
00275         case VK_NUMPAD9: OnNum(key->code-VK_NUMPAD0); return 1;
00276         case VK_DECIMAL: OnDot(); return 1;;
00277         case VK_ADD: OnAdd(); return 1;
00278         case VK_SUBTRACT: OnSub(); return 1;
00279         case VK_DIVIDE: OnDiv(); return 1;
00280         case VK_MULTIPLY: OnMult(); return 1;
00281         case VK_RETURN: OnEqual(); return 1;
00282         case VK_DELETE: OnClear(); return 1;
00283         case VK_ESCAPE: Delete(); return 1;
00284         }
00285         return 1;
00286 }
00287 
00288 void Calculator::OnNum(int num)
00289 {
00290         if (lineCur=="0") lineCur="";
00291         lineCur<<(char)('0'+num);
00292         MajResult();
00293 
00294 }
00295 int Calculator::OnNum0() { OnNum(0); return 0;}
00296 int Calculator::OnNum1() { OnNum(1); return 0;}
00297 int Calculator::OnNum2() { OnNum(2); return 0;}
00298 int Calculator::OnNum3() { OnNum(3); return 0;}
00299 int Calculator::OnNum4() { OnNum(4); return 0;}
00300 int Calculator::OnNum5() { OnNum(5); return 0;}
00301 int Calculator::OnNum6() { OnNum(6); return 0;}
00302 int Calculator::OnNum7() { OnNum(7); return 0;}
00303 int Calculator::OnNum8() { OnNum(8); return 0;}
00304 int Calculator::OnNum9() { OnNum(9); return 0;}
00305 
00306 int Calculator::OnDot()
00307 {
00308         lineCur<<'.';
00309         MajResult();
00310         return 1;
00311 }
00312 
00313 int Calculator::OnClear()
00314 {
00315         lineCur="0";
00316         lOpperation.i.SuprAll();
00317         MajResult();
00318         return 1;
00319 }
00320 
00321 int Calculator::OnEqual()
00322 {
00323         Compute();
00324         return 1;
00325 }
00326 
00327 int Calculator::OnAdd()
00328 {
00329         double result;
00330         sscanf(lineCur,"%lf",&result);
00331         Opperation op;
00332         op.number=result;
00333         op.op=Op_Add;
00334         lOpperation.i+=op;
00335         lineCur="0";
00336         MajResult();
00337         return 1;
00338 }
00339 
00340 int Calculator::OnSub()
00341 {
00342         if (lineCur=="0") lineCur="-";
00343         else if (lineCur=="-") lineCur="0";
00344         else 
00345         {
00346                 double result;
00347                 sscanf(lineCur,"%lf",&result);
00348                 Opperation op;
00349                 op.number=result;
00350                 op.op=Op_Sub;
00351                 lOpperation.i+=op;
00352                 lineCur="0";
00353         }
00354         MajResult();
00355         return 1;
00356 }
00357 
00358 int Calculator::OnMult()
00359 {
00360         double result;
00361         sscanf(lineCur,"%lf",&result);
00362         Opperation op;
00363         op.number=result;
00364         op.op=Op_Mult;
00365         lOpperation.i+=op;
00366         lineCur="0";
00367         MajResult();
00368         return 1;
00369 }
00370 
00371 int Calculator::OnDiv()
00372 {
00373         double result;
00374         sscanf(lineCur,"%lf",&result);
00375         Opperation op;
00376         op.number=result;
00377         op.op=Op_Div;
00378         lOpperation.i+=op;
00379         lineCur="0";
00380         MajResult();
00381         return 1;
00382 }
00383 
00384 int Calculator::OnOk()
00385 {
00386         OnClose();
00387         return 1;
00388 }

Generated on Fri Aug 20 19:19:43 2004 for 3d Controls by doxygen 1.3.6