1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
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;
}
|