#include "skyos/vkey.h" #include "CalculatorWindow.h" #include "CalculatorButton.h" CalculatorWindow::CalculatorWindow( const Rect &rFrame, const String& szTitle, unsigned int nWindowLayoutFlags, unsigned int uiFlags ): ApplicationWindow(rFrame, szTitle, nWindowLayoutFlags, 0, uiFlags) { Clear(); pText = new TextView(this, Rect(15, 30, 160, 50), WINDOW_LAYOUT_FOLLOW_RIGHT, TEXTVIEW_FLAG_SINGLE_LINE); pText->Enable(false); pText->Set("0.0"); CalculatorButton * pCalculatorButton; pCalculatorButton = new CalculatorButton(this, Rect(Point(15, 60), Point(40, 82)), "7", 0, VKEY_KEYPAD_7); pCalculatorButton = new CalculatorButton(this, Rect(Point(45, 60), Point(70, 82)), "8", 0, VKEY_KEYPAD_8); pCalculatorButton = new CalculatorButton(this, Rect(Point(75, 60), Point(100, 82)), "9", 0, VKEY_KEYPAD_9); pCalculatorButton = new CalculatorButton(this, Rect(Point(105, 60), Point(160, 82)), "Clear", 0, VKEY_BACKSPACE); pCalculatorButton = new CalculatorButton(this, Rect(Point(15, 87), Point(40, 109)), "4", 0, VKEY_KEYPAD_4); pCalculatorButton = new CalculatorButton(this, Rect(Point(45, 87), Point(70, 109)), "5", 0, VKEY_KEYPAD_5); pCalculatorButton = new CalculatorButton(this, Rect(Point(75, 87), Point(100, 109)), "6", 0, VKEY_KEYPAD_6); pCalculatorButton = new CalculatorButton(this, Rect(Point(105, 87), Point(130, 109)), "+", 0, VKEY_KEYPAD_PLUS); pCalculatorButton = new CalculatorButton(this, Rect(Point(135, 87), Point(160, 109)), "-", 0, VKEY_KEYPAD_MINUS); pCalculatorButton = new CalculatorButton(this, Rect(Point(15, 114), Point(40, 136)), "1", 0, VKEY_KEYPAD_1); pCalculatorButton = new CalculatorButton(this, Rect(Point(45, 114), Point(70, 136)), "2", 0, VKEY_KEYPAD_2); pCalculatorButton = new CalculatorButton(this, Rect(Point(75, 114), Point(100, 136)), "3", 0, VKEY_KEYPAD_3); pCalculatorButton = new CalculatorButton(this, Rect(Point(105, 114), Point(130, 136)), "\u00D7", 0, VKEY_KEYPAD_MULT); pCalculatorButton = new CalculatorButton(this, Rect(Point(135, 114), Point(160, 136)), "\u00F7", 0, VKEY_KEYPAD_DIVIDE); pCalculatorButton = new CalculatorButton(this, Rect(Point(15, 141), Point(40, 163)), "0", 0, VKEY_KEYPAD_0); pCalculatorButton = new CalculatorButton(this, Rect(Point(45, 141), Point(70, 163)), ".", 0, VKEY_KEYPAD_SPERATOR); // FIXME: SPERATOR (sic) pCalculatorButton = new CalculatorButton(this, Rect(Point(75, 141), Point(100, 164)), "\u00B1", 0); pCalculatorButton = new CalculatorButton(this, Rect(Point(105, 141), Point(160, 164)), "=", 0, VKEY_KEYPAD_ENTER); } void CalculatorWindow::OnCommand(const MessageCommand *pMessage) { const String minus = String("-"); const String point = String("."); char c[2] = {'0', '\0'}; int message = pMessage->GetID(); line = pText->GetDocument()->GetLine(0); switch (message) { case BUTTON_ZERO: case BUTTON_ONE: case BUTTON_TWO: case BUTTON_THREE: case BUTTON_FOUR: case BUTTON_FIVE: case BUTTON_SIX: case BUTTON_SEVEN: case BUTTON_EIGHT: case BUTTON_NINE: c[0] += message; if (new_operand) { pText->Set((const char *)&c); new_operand = false; } else { pText->Append((const char *)&c); } break; case BUTTON_PLUS: case BUTTON_MINUS: case BUTTON_TIMES: case BUTTON_DIVIDE: case BUTTON_EQUALS: doOperation(message); break; case BUTTON_POINT: /* if(line->find(point)) { // FIXME: figure out how to do this more directly pText->Append(point); }*/ if (!strchr(line->c_str(), '.')) { pText->Append(point); } break; case BUTTON_SIGN: if (line->c_str()[0] != '-') { pText->Insert(minus, Point(0, 0)); } else { pText->Remove(Point(0,0)); } break; case BUTTON_CLEAR: Clear(); pText->Set("0.0"); break; } printf("line: %s; total: %.0f; operand: %.0f; operator: %d\n", line->c_str(), total, operand, operation); } void CalculatorWindow::Clear() { operation = BUTTON_PLUS; total = 0.0; operand = 0.0; new_operand = true; } void CalculatorWindow::doOperation(int next_operation) { char str[32] = {0}; operand = atof(line->c_str()); switch (operation) { case BUTTON_PLUS: total += operand; break; case BUTTON_MINUS: total -= operand; break; case BUTTON_TIMES: total *= operand; break; case BUTTON_DIVIDE: total /= operand; break; } snprintf(str, 32, "%f", total); pText->Set((const char *)&str); operation = next_operation; operand = 0.0; new_operand = true; }