Main Page   Data Structures   File List   Data Fields   Globals   Related Pages  

palm/budget.c

Go to the documentation of this file.
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                 /* Cheat ... enqueue a ~ character to post-process the text */
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                 /* Deal with the repeating controls ... */
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          * Allocate 12 characters for each budget label in one place
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         /* set up editable upkeep fields */
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 }

Generated on Mon Aug 30 19:44:15 2004 for pocketcity by doxygen1.2.18