#include "calculator.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"); Button * pButton; pButton = new Button(this, Rect(Point(15, 60), Point(40, 82)), "7", 0, new MessageCommand(BUTTON_SEVEN)); pButton = new Button(this, Rect(Point(45, 60), Point(70, 82)), "8", 0, new MessageCommand(BUTTON_EIGHT)); pButton = new Button(this, Rect(Point(75, 60), Point(100, 82)), "9", 0, new MessageCommand(BUTTON_NINE)); pButton = new Button(this, Rect(Point(105, 60), Point(160, 82)), "Clear", 0, new MessageCommand(BUTTON_CLEAR)); pButton = new Button(this, Rect(Point(15, 87), Point(40, 109)), "4", 0, new MessageCommand(BUTTON_FOUR)); pButton = new Button(this, Rect(Point(45, 87), Point(70, 109)), "5", 0, new MessageCommand(BUTTON_FIVE)); pButton = new Button(this, Rect(Point(75, 87), Point(100, 109)), "6", 0, new MessageCommand(BUTTON_SIX)); pButton = new Button(this, Rect(Point(105, 87), Point(130, 109)), "+", 0, new MessageCommand(BUTTON_PLUS)); pButton = new Button(this, Rect(Point(135, 87), Point(160, 109)), "-", 0, new MessageCommand(BUTTON_MINUS)); pButton = new Button(this, Rect(Point(15, 114), Point(40, 136)), "1", 0, new MessageCommand(BUTTON_ONE)); pButton = new Button(this, Rect(Point(45, 114), Point(70, 136)), "2", 0, new MessageCommand(BUTTON_TWO)); pButton = new Button(this, Rect(Point(75, 114), Point(100, 136)), "3", 0, new MessageCommand(BUTTON_THREE)); pButton = new Button(this, Rect(Point(105, 114), Point(130, 136)), "\u00D7", 0, new MessageCommand(BUTTON_TIMES)); pButton = new Button(this, Rect(Point(135, 114), Point(160, 136)), "\u00F7", 0, new MessageCommand(BUTTON_DIVIDE)); pButton = new Button(this, Rect(Point(15, 141), Point(40, 163)), "0", 0, new MessageCommand(BUTTON_ZERO)); pButton = new Button(this, Rect(Point(45, 141), Point(70, 163)), ".", 0, new MessageCommand(BUTTON_POINT)); pButton = new Button(this, Rect(Point(75, 141), Point(100, 164)), "\u00B1", 0, new MessageCommand(BUTTON_SIGN)); pButton = new Button(this, Rect(Point(105, 141), Point(160, 164)), "=", 0, new MessageCommand(BUTTON_EQUALS)); } 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; } Calculator::Calculator(int argc, char* argv[]): Application("application/x-vnd.Calculator", argc, argv) { Rect r(Point(100, 100), Point(275, 275)); CalculatorWindow * pCalculatorWindow = new CalculatorWindow(r, "Calculator", WINDOW_LAYOUT_NOTHING, APPLICATION_WINDOW_NO_VIEW | WINDOW_FLAG_NOT_SIZEABLE); pCalculatorWindow->GetTitleWindow()->SetFlags( (TitleWindowFlags)(pCalculatorWindow->GetTitleWindow()->GetFlags()) ); pCalculatorWindow->Show(); } int main(int argc, char *argv[]) { Calculator pCalculator(argc, argv); return pCalculator.Run(); }