00001
00008 #include <PalmOS.h>
00009 #include <unix_stdlib.h>
00010 #include <palmutils.h>
00011 #include <simcity.h>
00012 #include <simcity_resconsts.h>
00013 #include <globals.h>
00014 #include <logging.h>
00015 #include <ui.h>
00016 #include <simulation.h>
00017 #include <sections.h>
00018 #include <budget.h>
00019 #include <stddef.h>
00020 #include <resCompat.h>
00021 #include <repeathandler.h>
00022
00023 static FormPtr budgetSetup(FormPtr form) BUDGET_SECTION;
00024 static void dealRepeats(EventPtr event) BUDGET_SECTION;
00025 static void dealFieldContentChange(UInt16 fieldID) BUDGET_SECTION;
00026 static void updateBudgetValue(FormPtr form, UInt16 label, const Char *format,
00027 long value) BUDGET_SECTION;
00028 static void updateBudgetNumber(BudgetNumber bn) BUDGET_SECTION;
00029 static void post_fieldhandler(UInt16 field, buttonmapping_t *map,
00030 Int32 newValue) BUDGET_SECTION;
00031
00033 static buttonmapping_t budget_map[] = {
00034 { rbutton_taxdown, rbutton_taxup, fieldID_taxrate,
00035 0, 20, bnIncome, offsetof(GameStruct, tax) },
00036 { rbutton_trafdown, rbutton_trafup, fieldID_budget_tra,
00037 0, 100, bnTraffic, offsetof(GameStruct, upkeep[0]) },
00038 { rbutton_powdown, rbutton_powup, fieldID_budget_pow,
00039 0, 100, bnPower, offsetof(GameStruct, upkeep[1]) },
00040 { rbutton_defdown, rbutton_defup, fieldID_budget_def,
00041 0, 100, bnDefence, offsetof(GameStruct, upkeep[2]) },
00042 { 0, 0, 0, 0, 0, 0, 0 }
00043 };
00044
00051 static void
00052 post_fieldhandler(UInt16 field __attribute__((unused)), buttonmapping_t *map,
00053 Int32 newValue)
00054 {
00055 ((UInt8 *)(&game))[map->special2] = (UInt8)newValue;
00056 if ((BudgetNumber)map->special1 != bnChange)
00057 updateBudgetNumber(bnChange);
00058 updateBudgetNumber((BudgetNumber)map->special1);
00059 updateBudgetNumber(bnNextMonth);
00060 }
00061
00066 static void
00067 dealRepeats(EventPtr event)
00068 {
00069 UInt16 control = event->data.ctlRepeat.controlID;
00070 (void) processRepeater(budget_map, control, true, post_fieldhandler);
00071 }
00072
00077 static void
00078 dealFieldContentChange(UInt16 fieldID)
00079 {
00080 (void) processRepeater(budget_map, fieldID, false, post_fieldhandler);
00081 }
00085 Boolean
00086 hBudget(EventPtr event)
00087 {
00088 Boolean handled = false;
00089 FormPtr form;
00090 UInt16 fieldID;
00091 WChar chr;
00092
00093 switch (event->eType) {
00094 case frmOpenEvent:
00095 PauseGame();
00096 form = FrmGetActiveForm();
00097 SetSilkResizable(form, true);
00098 collapseMove(form, CM_DEFAULT, NULL, NULL);
00099 WriteLog("opening budget\n");
00100 FrmDrawForm(budgetSetup(form));
00101 handled = true;
00102 break;
00103 case frmCloseEvent:
00104 WriteLog("closing budget\n");
00105 SetSilkResizable(NULL, false);
00106 break;
00107 case keyDownEvent:
00108 chr = event->data.keyDown.chr;
00109 if (chr == vchrLaunch) {
00110 FrmGotoForm(formID_pocketCity);
00111 handled = true;
00112 break;
00113 }
00114
00115 if ((chr >= chrDigitZero && chr <= chrDigitNine) ||
00116 (chr == chrBackspace)) {
00117 EvtEnqueueKey(chrTilde, 0, 0);
00118 break;
00119 }
00120 if (chr == chrTilde) {
00121 form = FrmGetActiveForm();
00122 fieldID = FrmGetObjectId(form, FrmGetFocus(form));
00123 dealFieldContentChange(fieldID);
00124 break;
00125 }
00126 break;
00127 case menuEvent:
00128 switch (event->data.menu.itemID) {
00129 case menuitemID_BudgetBack:
00130 FrmGotoForm(formID_pocketCity);
00131 handled = true;
00132 break;
00133 }
00134 break;
00135 case popSelectEvent:
00136 if (event->data.popSelect.controlID == listID_shifter_popup) {
00137 UIGotoForm(event->data.popSelect.selection);
00138 handled = true;
00139 }
00140 break;
00141 case ctlRepeatEvent:
00142
00143 dealRepeats(event);
00144 break;
00145 #if defined(HRSUPPORT)
00146 case winDisplayChangedEvent:
00147 #if defined(SONY_CLIE)
00148 case vchrSilkResize:
00149 #endif
00150 form = FrmGetActiveForm();
00151 if (collapseMove(form, CM_DEFAULT, NULL, NULL)) {
00152 FrmDrawForm(form);
00153 }
00154 handled = true;
00155 break;
00156 #endif
00157 default:
00158 break;
00159 }
00160
00161 return (handled);
00162 }
00163
00169 static const struct updateentity {
00170 const BudgetNumber item;
00171 const char *formatstr;
00172 const UInt16 label;
00173 } entity[] = {
00174 { bnIncome, "%lu%c", labelID_budget_inc },
00175 { bnTraffic, "%lu%c", labelID_budget_tra },
00176 { bnPower, "%lu%c", labelID_budget_pow },
00177 { bnDefence, "%lu%c", labelID_budget_def },
00178 { bnCurrentBalance, "%li%c", labelID_budget_now },
00179 { bnChange, "%+li%c", labelID_budget_tot },
00180 { bnNextMonth, "%li%c", labelID_budget_bal },
00181 { bnResidential, NULL, 0 }
00182 };
00183
00185 #define ENTITY_COUNT (sizeof (entity) / sizeof (entity[0]))
00186
00196 static void
00197 updateBudgetValue(FormPtr form, UInt16 label, const Char *format, long value)
00198 {
00199 Char temp[12];
00200 Char scale;
00201
00202 *temp='$';
00203 value = (Int32)scaleNumber((UInt32)value, &scale);
00204
00205 StrPrintF(temp+1, format, value, scale);
00206 FrmCopyLabel(form, label, temp);
00207 }
00208
00213 static void
00214 updateBudgetNumber(const BudgetNumber item)
00215 {
00216 long value = BudgetGetNumber(item);
00217 struct updateentity *entityp = (struct updateentity *)&entity[0];
00218 FormPtr form;
00219
00220 form = FrmGetActiveForm();
00221
00222 while (entityp->formatstr != NULL) {
00223 if (entityp->item != item) {
00224 entityp++;
00225 continue;
00226 }
00227 updateBudgetValue(form, entityp->label, entityp->formatstr,
00228 value);
00229 break;
00230 }
00231 }
00232
00242 static FormPtr
00243 budgetSetup(FormPtr form)
00244 {
00245 MemHandle texthandle;
00246 MemPtr text;
00247 int i;
00248 struct updateentity *entityp = (struct updateentity *)&entity[0];
00249
00250
00251
00252
00253 while (entityp->formatstr != NULL) {
00254 long value = BudgetGetNumber(entityp->item);
00255 updateBudgetValue(form, entityp->label, entityp->formatstr,
00256 value);
00257
00258 entityp++;
00259 }
00260
00261
00262 for (i = 0; i < 3; i++) {
00263 texthandle = MemHandleNew(5);
00264 text = MemHandleLock(texthandle);
00265 StrPrintF((char *)text, "%u", game.upkeep[i]);
00266 MemHandleUnlock(texthandle);
00267 FldSetTextHandle((FieldPtr)GetObjectPtr(form,
00268 (UInt16)(fieldID_budget_tra + i)), texthandle);
00269 }
00270 texthandle = MemHandleNew(5);
00271 text = MemHandleLock(texthandle);
00272 StrPrintF((char *)text, "%u", game.tax);
00273 MemHandleUnlock(texthandle);
00274 FldSetTextHandle((FieldPtr)GetObjectPtr(form,
00275 fieldID_taxrate), texthandle);
00276 return (form);
00277 }