00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
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
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
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
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);
00136
00137
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
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 }