home *** CD-ROM | disk | FTP | other *** search
/ Chip 2001 Mobile / Chip_Mobile_2001.iso / palm / hobby / ghardeno / ghardeno.EXE / Ghardeno.c < prev    next >
C/C++ Source or Header  |  2000-10-03  |  15KB  |  580 lines

  1. /*
  2.     Ghardeno: Information Gardening for PalmOS
  3.     Copyright (C) 2000 Laurent Moussault
  4.  
  5.     This program is free software; you can redistribute it and/or modify
  6.     it under the terms of the GNU General Public License as published by
  7.     the Free Software Foundation; either version 2 of the License, or
  8.     (at your option) any later version.
  9.  
  10.     This program is distributed in the hope that it will be useful,
  11.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13.     GNU General Public License for more details.
  14.  
  15.     You should have received a copy of the GNU General Public License
  16.     along with this program; if not, write to the Free Software
  17.     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  18. */
  19.  
  20. #include <Common.h>
  21. #include <System/SysAll.h>
  22. #include <UI/UIAll.h>
  23.  
  24. #include "DBC.h"
  25. #include "Resources.h"
  26. #include "MyTable.h"
  27. #include "Database.h"
  28. #include "Ghardeno.h"
  29.  
  30. #define ghardenoAppID    'Grdn'
  31. #define ghardenoDBType    'Data'
  32.  
  33. DmOpenRef GhardenoDB = 0;
  34.  
  35. char GhardenoDBName[] = "GhardenoDB";
  36.  
  37. Char CategoryNameBuffer[dmCategoryLength] = "";
  38.  
  39. void InitNewRecord (Char *p) {
  40.   FormType *f = 0;
  41.   REQUIRE(p != 0);
  42.   f = FrmGetActiveForm(); CHECK(f != 0);
  43.   DmSet(p,0,MemPtrSize(p),0);
  44.   /*
  45.   if(FrmGetControlValue(f,FrmGetObjectIndex(f,id_checked))) {
  46.     DmSet(p,0,1,(*p&3)|4);
  47.   }
  48.   */
  49.   if(FrmGetControlValue(f,FrmGetObjectIndex(f,id_normalFont))) {
  50.     DmSet(p,0,1,(*p&4)|0);
  51.   } else if(FrmGetControlValue(f,FrmGetObjectIndex(f,id_boldFont))) {
  52.     DmSet(p,0,1,(*p&4)|1);
  53.   } else if(FrmGetControlValue(f,FrmGetObjectIndex(f,id_largeFont))) {
  54.     DmSet(p,0,1,(*p&4)|2);
  55.   }
  56. }
  57.  
  58. Err OpenDatabase(void)
  59. {
  60.   UInt in = 0;
  61.   VoidHand h;
  62.   void *p;
  63.   UInt cn;
  64.   LocalID db;
  65.   LocalID ai;
  66.   AppInfoType *aip;
  67.   VoidHand vh;
  68.   Word at = 0;
  69.   GhardenoDB = DmOpenDatabaseByTypeCreator(ghardenoDBType,
  70.                        ghardenoAppID,dmModeReadWrite );
  71.   if(!GhardenoDB) {
  72.     if(DmCreateDatabase(0,GhardenoDBName,ghardenoAppID,
  73.             ghardenoDBType,false ))
  74.       return 1;
  75.     GhardenoDB = DmOpenDatabaseByTypeCreator(ghardenoDBType,
  76.                          ghardenoAppID,dmModeReadWrite );
  77.     CHECK(GhardenoDB != 0);
  78.     // Initialize the Database Global Info
  79.     if(DmOpenDatabaseInfo(GhardenoDB,&db,NULL,NULL,&cn,NULL))
  80.       return dmErrInvalidParam;
  81.     vh = DmNewHandle(GhardenoDB,sizeof(AppInfoType));
  82.     if(!vh)
  83.       return dmErrMemError;
  84.     ai = MemHandleToLocalID(vh);
  85.     DmDatabaseInfo(cn,db,0,&at,0,0,0,0,0,
  86.            0,0,0,0 );
  87.     at |= dmHdrAttrBackup;
  88.     DmSetDatabaseInfo(cn,db,NULL,&at,NULL,NULL,NULL,NULL,NULL,
  89.               &ai,NULL,NULL,NULL );
  90.     aip = (AppInfoPtr)MemHandleLock(vh);
  91.     CHECK(aip != NULL);
  92.     DmSet(aip,0,sizeof(AppInfoType),0);
  93.     CategoryInitialize(aip,id_categoryNames);
  94.     MemHandleUnlock(vh);
  95.   }
  96.   return 0;
  97. }
  98.  
  99. int StartApplication (void) {
  100.   int e;
  101.   DbInit();
  102.   e = OpenDatabase();
  103.   if(e)
  104.     return e;
  105.   FrmGotoForm(id_ghardenoForm);
  106. }
  107.  
  108. void LoadPreferences(MyTableType *t) {
  109.   PreferenceType p;
  110.   Word s = 0;
  111.   Word v = 0;
  112.   s = sizeof(PreferenceType);
  113.   v = PrefGetAppPreferences(ghardenoAppID,0,&p,&s,true);
  114.   if(v != noPreferenceFound) {
  115.     t->category = p.category;
  116.     t->positionInCategory = p.positionInCategory;
  117.     t->currentIndex = p.currentIndex;
  118.     t->isSelected = p.isSelected;
  119.     t->isEditing = p.isEditing;
  120.   }
  121. }
  122.  
  123. void SavePreferences(MyTableType *t) {
  124.   PreferenceType p;
  125.   p.category = t->category;
  126.   p.positionInCategory = t->positionInCategory;
  127.   p.currentIndex = t->currentIndex;
  128.   p.isSelected = t->isSelected;
  129.   p.isEditing = t->isEditing;
  130.   PrefSetAppPreferences(ghardenoAppID,0,1,&p,sizeof(PreferenceType),true);
  131. }
  132.  
  133. void InitGhardenoForm () {
  134.   FormType *f = NULL;
  135.   FieldType *fi = NULL;
  136.   VoidHand h = NULL;
  137.   VoidHand oh = NULL;
  138.   MyTableType *t;
  139.   ControlType *ct = 0;
  140.   UInt n, r;
  141.   int i;
  142.   //ListType *l = 0;
  143.   MtaInit();
  144.   f = FrmGetActiveForm(); CHECK(f);
  145.   //l = FrmGetObjectPtr(f,FrmGetObjectIndex(f,id_categoryList)); CHECK(l);
  146.   //CategoryCreateList(GhardenoDB,l,0,true,true,1,id_editCategoryString,true);
  147.   fi = FrmGetObjectPtr(f,FrmGetObjectIndex(f,id_field)); CHECK(fi);
  148.   oh = (VoidHand)FldGetTextHandle(fi);
  149.   if(oh != NULL)
  150.     MemHandleFree(oh);
  151.   // Prepare the table-gadget
  152.   h = MtaNew(f,id_table,mtaRowNumber,GhardenoDB); CHECK(h != 0);
  153.   t = MemHandleLock(h);
  154.   MtaSetLoadRecordProcedure(t,DbLoadRecord);
  155.   LoadPreferences(t);
  156.   CategoryGetName(t->db,t->category,CategoryNameBuffer);
  157.   ct =FrmGetObjectPtr(f,FrmGetObjectIndex(f,id_categoryTrigger)); CHECK(ct != 0);
  158.   CategorySetTriggerLabel(ct,CategoryNameBuffer);
  159.   MtaFillTableFromTop(t,t->positionInCategory);
  160.   if(t->isSelected && t->isEditing) {
  161.     MtaEditSelectedRow(t);
  162.   }
  163.   // Dessin
  164.   //FrmHideObject(f,FrmGetObjectIndex(f,id_field));
  165.   FrmDrawForm(f);
  166.   MtaRedraw(t);
  167.   UpdateToolBar(t);
  168.   MemHandleUnlock (h);
  169. }
  170.  
  171. void UpdateToolBar (MyTableType *t) {
  172.   VoidHand h = 0;
  173.   FormType *f = NULL;
  174.   Char *r;
  175.   ControlType *a[3];
  176.   ControlType *c, *de /*, *bu, *bd */;
  177.   int i;
  178.   REQUIRE(t != NULL);
  179.   f = FrmGetActiveForm(); CHECK(f);
  180.   a[0] = FrmGetObjectPtr(f,FrmGetObjectIndex(f,id_normalFont));
  181.   a[1] = FrmGetObjectPtr(f,FrmGetObjectIndex(f,id_boldFont));
  182.   a[2] = FrmGetObjectPtr(f,FrmGetObjectIndex(f,id_largeFont));
  183.   c = FrmGetObjectPtr(f,FrmGetObjectIndex(f,id_checked));
  184.   //bu = FrmGetObjectPtr(f,FrmGetObjectIndex(f,id_up));
  185.   //bd = FrmGetObjectPtr(f,FrmGetObjectIndex(f,id_down));
  186.   de = FrmGetObjectPtr(f,FrmGetObjectIndex(f,id_remove));
  187.   if(! t->isSelected) {
  188.     FrmSetControlGroupSelection(f,1,id_normalFont);
  189.     CtlSetValue(c,0);
  190.     //CtlSetEnabled(bu,false);
  191.     //CtlSetEnabled(bd,false);
  192.     CtlSetEnabled(de,false);
  193.   } else {
  194.     h = DmQueryRecord(t->db,t->currentIndex); CHECK(h != 0);
  195.     r = MemHandleLock(h);
  196.     CHECK(r != NULL);
  197.     for (i=0; i<3; i++) {
  198.       CtlSetEnabled(a[i],true);
  199.       CtlSetValue(a[i],i==(*r&3));
  200.     }
  201.     CtlSetEnabled(c,true);
  202.     CtlSetValue(c,*r&4);
  203.     //CtlSetEnabled(bu,true);
  204.     //CtlSetEnabled(bd,true);
  205.     CtlSetEnabled(de,true);
  206.     MemHandleUnlock(h);
  207.   }
  208. }
  209.  
  210. Boolean toolBarHandleEvent(EventType *ev) {
  211.   Boolean result = false;
  212.   FormType *f;
  213.   Word ti;
  214.   VoidHand th = 0;
  215.   VoidHand h = 0;
  216.   MyTableType *t;
  217.   Char *r;
  218.   Boolean d = false;
  219.   REQUIRE(ev != 0);
  220.   f = FrmGetActiveForm(); CHECK(f != 0);
  221.   ti = FrmGetObjectIndex(f,id_table);
  222.   th = FrmGetGadgetData(f,ti); CHECK(th != 0);
  223.   t = MemHandleLock(th); CHECK(t != 0);
  224.   if(t->isSelected) {
  225.     h = DmQueryRecord(GhardenoDB,t->currentIndex); CHECK(h != 0);
  226.     r = MemHandleLock(h); CHECK(r != 0);
  227.     switch(ev->data.ctlSelect.controlID) {
  228.     case id_checked:
  229.       if (FrmGetControlValue(f,FrmGetObjectIndex(f,id_checked)))
  230.     {
  231.       DmSet (r, 0, 1, (*r&3)|4);
  232.       CHECK (t->isSelected);
  233.       MtaUnselect (t);
  234.       MtaChangeSelectionIndex (t, t->currentIndex);
  235.     }
  236.       else
  237.     {
  238.       DmSet (r, 0, 1, *r&3);
  239.     }
  240.       MtaUpdateCurrentRow(t);
  241.       MtaRedraw(t);
  242.       result = true;
  243.       break;
  244.     case id_normalFont:
  245.       DmSet(r,0,1,(*r&4)|0);
  246.       MtaUpdateCurrentRow(t);
  247.       MtaRedraw(t);
  248.       result = true;
  249.       break;
  250.     case id_boldFont:
  251.       DmSet(r,0,1,(*r&4)|1);
  252.       MtaUpdateCurrentRow(t);
  253.       MtaRedraw(t);
  254.       result = true;
  255.       break;
  256.     case id_largeFont:
  257.       DmSet(r,0,1,(*r&4)|2);
  258.       MtaUpdateCurrentRow(t);
  259.       MtaRedraw(t);
  260.       result = true;
  261.       break;
  262.     }
  263.     MemHandleUnlock(h);
  264.   }
  265.   if(!result) {
  266.     switch(ev->data.ctlSelect.controlID) {
  267.     case id_new:
  268.       MtaNewRecord(t);
  269.       MtaEditSelectedRow(t);
  270.       MtaRedraw(t);
  271.       UpdateToolBar(t);
  272.       result = true;
  273.       break;
  274.     case id_remove:
  275.       if(t->isSelected) {
  276.     h = DmQueryRecord(GhardenoDB,t->currentIndex); CHECK(h != 0);
  277.     r = MemHandleLock(h); CHECK(r != 0);
  278.     d = (FrmCustomAlert(id_deleteForm,&r[1],0,0) == 0);
  279.     MemHandleUnlock(h);
  280.     if(d) {
  281.       MtaDeleteCurrentRecord(t);
  282.       MtaRedraw(t);
  283.       UpdateToolBar(t);
  284.     }
  285.       }
  286.       result = true;
  287.       break;
  288.     case id_up:
  289.       MtaScrollUpOneRow(t);
  290.       MtaRedraw(t);
  291.       result = true;
  292.       break;
  293.     case id_down:
  294.       MtaScrollDownOneRow(t);
  295.       MtaRedraw(t);
  296.       result = true;
  297.       break;
  298.     }
  299.   }
  300.   MemHandleUnlock(th);
  301.   return result;
  302. }
  303.  
  304. void HandleCategoryTrigger() {
  305.   FormType *f = 0;
  306.   VoidHand h = 0;
  307.   MyTableType *t = 0;
  308.   Boolean e = false;
  309.   //Char n[dmCategoryLength];
  310.   Char *n = 0;
  311.   ControlType *ct = 0;
  312.   f = FrmGetActiveForm(); CHECK(f);
  313.   h = FrmGetGadgetData(f,FrmGetObjectIndex(f,id_table)); CHECK(h != 0);
  314.   t = MemHandleLock(h); CHECK(t!= 0);
  315.   if(t->isSelected) {
  316.     MtaUnselect(t);
  317.   }
  318.   ct = FrmGetObjectPtr(f,FrmGetObjectIndex(f,id_categoryTrigger)); CHECK(ct != 0);
  319.   n = (Char *)CtlGetLabel(ct); CHECK(n != 0);
  320.   e = CategorySelect(t->db,f,id_categoryTrigger,id_categoryList,true,
  321.              &t->category,n/*CategoryName*/,1,id_editCategoryString );
  322.   MtaFillTableFromTop(t,0);
  323.   MtaRedraw(t);
  324.   UpdateToolBar(t);
  325.   MemHandleUnlock(h);
  326. }
  327.  
  328. Boolean ghardenoHandleEvent (EventType *ev) {
  329.   Boolean result = false;
  330.   FormType *f;
  331.   Word ti;
  332.   RectangleType b;
  333.   VoidHand h;
  334.   MyTableType *t;
  335.   FieldType *fi = NULL;
  336.   Char *r = 0;
  337.   Boolean d = false;
  338.   int dx = 0;
  339.   Word s = 0;
  340.   Char n[dmCategoryLength];
  341.   REQUIRE(ev != NULL);
  342.   switch (ev->eType) {
  343.   case frmOpenEvent:
  344.     InitGhardenoForm ();
  345.     result = true;
  346.     break;
  347.   case ctlSelectEvent:
  348.     if(ev->data.ctlSelect.controlID == id_categoryTrigger) {
  349.       //CHECK(ev->data.popSelect.priorSelection == t->category);
  350.       HandleCategoryTrigger();
  351.       result = true;
  352.     } else {
  353.       result = toolBarHandleEvent(ev);
  354.     }
  355.     break;
  356.   case menuEvent:
  357.     f = FrmGetActiveForm(); CHECK(f);
  358.     h = FrmGetGadgetData(f,FrmGetObjectIndex(f,id_table)); CHECK(h);
  359.     t = MemHandleLock(h); CHECK(t);
  360.     fi = FrmGetObjectPtr(f,FrmGetObjectIndex(f,id_field)); CHECK(fi);
  361.     switch(ev->data.menu.itemID) {
  362.     case id_newItem:
  363.       SndPlaySystemSound(sndClick);
  364.       MtaNewRecord(t);
  365.       MtaRedraw(t);
  366.       UpdateToolBar(t);
  367.       MtaEditSelectedRow(t);
  368.       result = true;
  369.       break;
  370.     case id_removeItem:
  371.       if(t->isSelected) {
  372.     h = DmQueryRecord(GhardenoDB,t->currentIndex); CHECK(h != 0);
  373.     r = MemHandleLock(h); CHECK(r != 0);
  374.     d = (FrmCustomAlert(id_deleteForm,&r[1],0,0) == 0);
  375.     MemHandleUnlock(h);
  376.     if(d) {
  377.       MtaDeleteCurrentRecord(t);
  378.       MtaRedraw(t);
  379.       UpdateToolBar(t);
  380.     }
  381.       }
  382.       result = true;
  383.       break;
  384.     case id_purge:
  385.       //SndPlaySystemSound(sndClick);
  386.       CategoryGetName(t->db,t->category,n);
  387.       if(t->category == dmAllCategories) {
  388.     d = (FrmCustomAlert(id_purgeAllForm,n,0,0) == 0);
  389.       } else {
  390.     d = (FrmCustomAlert(id_purgeForm,n,0,0) == 0);
  391.       }
  392.       if(d) {
  393.     t->categorySize -= DbPurgeStrokenItems(t->db,t->category);
  394.     if(t->isSelected) {
  395.       MtaUnselect(t);
  396.     }
  397.     MtaFillTableFromTop(t,0);
  398.     MtaRedraw(t);
  399.     UpdateToolBar(t);
  400.       }
  401.       result = true;
  402.       break;
  403.     case id_undo:
  404.       if(t->isEditing) {
  405.     FldUndo(fi);
  406.     result = true;
  407.       }
  408.       break;
  409.     case id_cut:
  410.       if(t->isEditing) {
  411.     FldCut(fi);
  412.     result = true;
  413.       }
  414.       break;
  415.     case id_copy:
  416.       if(t->isEditing) {
  417.     FldCopy(fi);
  418.     result = true;
  419.       }
  420.       break;
  421.     case id_paste:
  422.       if(t->isEditing) {
  423.     FldPaste(fi);
  424.     result = true;
  425.       }
  426.       break;
  427.     case id_selectAll:
  428.       if(t->isEditing) {
  429.     FldSetSelection(fi,0,FldGetTextLength(fi));
  430.     result = true;
  431.       }
  432.       break;
  433.     case id_keyboard:
  434.       SysKeyboardDialog(kbdDefault);
  435.       result = true;
  436.       break;
  437.     case id_graffiti:
  438.       SysGraffitiReferenceDialog(referenceDefault);
  439.       result = true;
  440.       break;
  441.     case id_preferences:
  442.       FrmAlert(id_preferencesForm);
  443.       result = true;
  444.       break;
  445.     case id_about:
  446.       FrmAlert(id_aboutForm);
  447.       result = true;
  448.       break;
  449.     }
  450.     MemPtrUnlock(t);
  451.     break;
  452.   case penDownEvent:
  453.     f = FrmGetActiveForm(); CHECK(f);
  454.     ti = FrmGetObjectIndex(f,id_table);
  455.     FrmGetObjectBounds (f,ti,&b);
  456.     if(RctPtInRectangle(ev->screenX,ev->screenY,&b)) {
  457.       h = FrmGetGadgetData(f,ti); CHECK(h);
  458.       t = MemHandleLock(h); CHECK(t);
  459.       result = MtaHandlePenDownEvent(t,ev);
  460.       MemHandleUnlock(h);
  461.     }
  462.     break;
  463.   case frmTitleSelectEvent:
  464.     f = FrmGetActiveForm(); CHECK(f);
  465.     h = FrmGetGadgetData(f,FrmGetObjectIndex(f,id_table)); CHECK(h);
  466.     t = MemHandleLock(h); CHECK(t);
  467.     if(t->isSelected) {
  468.       MtaUnselect(t);
  469.       MtaRedraw(t);
  470.       UpdateToolBar(t);
  471.     }
  472.     MemHandleUnlock(h);
  473.     result = true;
  474.     break;
  475.   case sclExitEvent: 
  476.     f = FrmGetActiveForm(); CHECK(f); 
  477.     h = FrmGetGadgetData(f,FrmGetObjectIndex(f,id_table)); CHECK(h);
  478.     t = MemHandleLock(h); CHECK(t);
  479.     MtaScrollTo(t,ev->data.sclExit.newValue);
  480.     MemHandleUnlock(h);
  481.     result = true;
  482.     break; 
  483.     /*
  484.   case sclRepeatEvent: 
  485.     f = FrmGetActiveForm(); CHECK(f);  
  486.     h = FrmGetGadgetData(f,FrmGetObjectIndex(f,id_table)); CHECK(h);  
  487.     t = MemHandleLock(h); CHECK(t); 
  488.     dx = ev->data.sclRepeat.newValue - ev->data.sclRepeat.value; 
  489.     while(dx < 0) { 
  490.       MtaScrollUpOneRow(t); 
  491.       MtaRedraw(t); 
  492.       dx++; 
  493.     } 
  494.     while(dx > 0) { 
  495.       MtaScrollDownOneRow(t); 
  496.       MtaRedraw(t); 
  497.       dx--; 
  498.     } 
  499.     //MtaScrollTo(t,ev->data.sclRepeat.newValue); 
  500.     MemHandleUnlock(h);  
  501.     // Warning: if we set 'result' to 'true' the scrollbar will scroll 
  502.     // only once ! 
  503.     break;
  504.     */
  505.   case keyDownEvent:
  506.     f = FrmGetActiveForm(); CHECK(f);
  507.     h = FrmGetGadgetData(f,FrmGetObjectIndex(f,id_table)); CHECK(h);
  508.     t = MemHandleLock(h); CHECK(t);
  509.     if(ev->data.keyDown.chr == pageDownChr) {
  510.       MtaScrollDownOnePage(t);
  511.       MtaRedraw(t);
  512.       result = true;
  513.     } else if(ev->data.keyDown.chr == pageUpChr) {
  514.       MtaScrollUpOnePage(t);
  515.       MtaRedraw(t);
  516.       result = true;
  517.     }
  518.     MemHandleUnlock(h);
  519.     break;
  520.   }
  521.   return result;
  522. }
  523.  
  524. Boolean ApplicationHandleEvent (EventType *ev) {
  525.   int id;
  526.   FormType *f;
  527.   Boolean result = false;
  528.   REQUIRE(ev != NULL);
  529.   if (ev->eType == frmLoadEvent) {
  530.     id = ev->data.frmLoad.formID;
  531.     f = FrmInitForm (id);
  532.     FrmSetActiveForm (f);
  533.     switch (id) {
  534.     case id_ghardenoForm:
  535.       FrmSetEventHandler (f, (FormEventHandlerPtr)ghardenoHandleEvent);
  536.       break;
  537.     }
  538.     result = true;
  539.   }
  540.   return result;
  541. }
  542.  
  543. void EventLoop(void)
  544. {
  545.   Word er;
  546.   EventType ev;
  547.   do {
  548.     EvtGetEvent (&ev, evtWaitForever);
  549.     if (! SysHandleEvent (&ev))
  550.       if (! MenuHandleEvent (0, &ev, &er))
  551.     if (! ApplicationHandleEvent (&ev))
  552.       FrmDispatchEvent (&ev);
  553.   } while (ev.eType != appStopEvent);
  554. }
  555.  
  556. void StopApplication (void) {
  557.   FormType *f = FrmGetActiveForm();
  558.   VoidHand h = FrmGetGadgetData(f,FrmGetObjectIndex(f,id_table));
  559.   MyTableType *t = MemHandleLock(h);
  560.   SavePreferences(t);
  561.   //ListType * l = 0;
  562.   MtaCloseMyTable(t);
  563.   //l = FrmGetObjectPtr(f,FrmGetObjectIndex(f,id_categoryList)); CHECK(l);
  564.   //CategoryFreeList(GhardenoDB,l,true,id_editCategoryString);
  565.   MemHandleUnlock(h);
  566.   DmCloseDatabase(GhardenoDB);
  567. }
  568.  
  569. DWord  PilotMain (Word cmd, Ptr cmdPBP, Word launchFlags) {
  570.   Word er;
  571.   if(cmd == sysAppLaunchCmdNormalLaunch) {
  572.     er = StartApplication();
  573.     if(er)
  574.       return er;
  575.     EventLoop();
  576.     StopApplication ();
  577.   }
  578.   return 0;
  579. }
  580.