summaryrefslogtreecommitdiff
path: root/CalculatorWindow.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'CalculatorWindow.cpp')
-rw-r--r--CalculatorWindow.cpp133
1 files changed, 133 insertions, 0 deletions
diff --git a/CalculatorWindow.cpp b/CalculatorWindow.cpp
new file mode 100644
index 0000000..ebbbc77
--- /dev/null
+++ b/CalculatorWindow.cpp
@@ -0,0 +1,133 @@
+#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;
+}
+