home *** CD-ROM | disk | FTP | other *** search
/ Chip 2001 Mobile / Chip_Mobile_2001.iso / palm / tools / blastpad / blastpad.EXE / blastpad.c next >
C/C++ Source or Header  |  2000-11-19  |  23KB  |  763 lines

  1. /*************
  2.  * Code (C) 2000 Daniel Church
  3.  * Distributed under the GNU copyleft (GPL)
  4.  *
  5.  * This is my first real application for the Palm, so I welcome any comments,
  6.  * criticisms, etc. you might have at dchurch@mbhs.edu.
  7.  *************/
  8. #include <System/SysAll.h>
  9. #include <UI/UIAll.h>
  10. #include <System/KeyMgr.h>
  11.  
  12. #include "blastpad.h"
  13.  
  14. #define BlastAppID 'BPad'
  15.  
  16. typedef struct {
  17.   UInt32 creators[22];
  18.   char name[26];
  19. } category;
  20.  
  21. VoidHand catsHand;
  22. category *cats;
  23. DWord numcats;
  24. DWord curcat=0;
  25. DWord numbtns;
  26. Char displaytype;
  27. Char btnnumdisplay;
  28. Char multistart;
  29. DWord mainformid;
  30.  
  31. struct application {
  32.   UInt32 creator;
  33.   Char name[32];
  34.   BitmapPtr icon;
  35.   LocalID dbID;
  36.   UInt16 cardno;
  37.   Char clean;        // set after database info has been loaded
  38. } *apps=NULL;
  39. DWord numapps;
  40.  
  41. Char *noselect="-default-";
  42. Char *novalue="-none-";
  43.  
  44. Char allclean=0;    // set after first visit to prefs
  45. Char **names=NULL;
  46. Char **catnames=NULL;
  47. FormType *form=NULL,*oldform=NULL;
  48.  
  49. DWord LoadGlobals();
  50. void FreeGlobals();
  51. Int16 appCompare(const struct application *, const struct application *,
  52.                  Int16, SortRecordInfoPtr, SortRecordInfoPtr, VoidHand);
  53. void LoadDBInfo(Int16);
  54. void EventLoop();
  55. DWord NameIndex(DWord,Boolean);
  56. SDWord Target(UInt32,SDWord *,Boolean);
  57. SDWord AppIndex(UInt32);
  58. void ChangeNumBtns(DWord);
  59. void DelCat(DWord);
  60. void BuildNames();
  61. Int16 IconX(UInt32);
  62. Int16 IconY(UInt32);
  63. Int16 TextX(UInt32, Char *);
  64. Int16 TextY(UInt32, Char *);
  65. Boolean mainHandler(EventType *);
  66. Boolean prefsHandler(EventType *);
  67. Boolean hwbtnsHandler(EventType *);
  68. Boolean osbtnsHandler(EventType *);
  69. Boolean newcatHandler(EventType *);
  70. Boolean editcatHandler(EventType *);
  71. Boolean hwcueHandler(EventType *);
  72.  
  73. Boolean (*handlers[])(EventType *)={
  74.   &mainHandler,
  75.   &mainHandler,
  76.   &mainHandler,
  77.   &prefsHandler,
  78.   &hwbtnsHandler,
  79.   &osbtnsHandler,
  80.   &hwcueHandler,
  81.   &newcatHandler,
  82.   &editcatHandler
  83. };
  84.  
  85. DWord PilotMain( Word cmd, Ptr cmdPBP, Word launchFlags ) {
  86.   
  87.   if (cmd == sysAppLaunchCmdNormalLaunch) {
  88.     if(LoadGlobals())
  89.       EventLoop();
  90.     else
  91.       FrmAlert(AlrNOMEM);
  92.     FreeGlobals();
  93.   }
  94.   return(0);
  95. }
  96.  
  97. Int16 appCompare(const struct application *a, const struct application *b,
  98.                  Int16 other, SortRecordInfoPtr p1, SortRecordInfoPtr p2,
  99.                  VoidHand h)
  100. {
  101.  int i;
  102.  
  103.  for(i = 0; i < 32; i++)
  104.   if (a->name[i] != b->name[i] || a->name[i]==0)
  105.    return a->name[i] - b->name[i];
  106.  return 0;
  107. }
  108.  
  109. DWord LoadGlobals() {
  110.   DWord appnum,dbnum,numdbs,cardno;
  111.   UInt32 type;
  112.   UInt16 size;
  113.   Int16 retsize;
  114.   UInt32 hwbtns;
  115.   Int16 startupbtn=0;
  116.   DWord index;
  117.  
  118.   hwbtns=KeyCurrentState();
  119.   if(hwbtns==keyBitHard1)
  120.     startupbtn=HB1;
  121.   if(hwbtns==keyBitHard2)
  122.     startupbtn=HB2;
  123.   if(hwbtns==keyBitHard3)
  124.     startupbtn=HB3;
  125.   if(hwbtns==keyBitHard4)
  126.     startupbtn=HB4;
  127.   size=sizeof(DWord);
  128.   retsize=PrefGetAppPreferences(BlastAppID, 0, &numcats, &size, true);
  129.   if(retsize==noPreferenceFound) {
  130.     numcats=1;
  131.     numbtns=4;
  132.     catsHand=MemHandleNew(sizeof(category));
  133.     cats=MemHandleLock(catsHand);
  134.     StrCopy(cats[0].name,"Default");
  135.     for(index=0;index<22;index++)
  136.       cats[0].creators[index]=1;    // no value
  137.   } else {
  138.     PrefGetAppPreferences(BlastAppID,1,&numbtns,&size,true);
  139.     size=sizeof(category)*numcats;
  140.     catsHand=MemHandleNew(size);
  141.     cats=MemHandleLock(catsHand);
  142.     PrefGetAppPreferences(BlastAppID,2,cats,&size,true);
  143.     for(index=0;index<22;index++)
  144.       if(cats[0].creators[index]==0)
  145.         cats[0].creators[index]=1;    // fix old versions
  146.   }
  147.   
  148.   size=sizeof(Char);
  149.   retsize=PrefGetAppPreferences(BlastAppID,3,&multistart,&size,true);
  150.   if(retsize==noPreferenceFound)
  151.     multistart=0;
  152.   retsize=PrefGetAppPreferences(BlastAppID,4,&displaytype,&size,true);
  153.   if(retsize==noPreferenceFound)
  154.     displaytype=2;
  155.   retsize=PrefGetAppPreferences(BlastAppID,5,&btnnumdisplay,&size,true);
  156.   if(retsize==noPreferenceFound)
  157.     btnnumdisplay=0;
  158.   numdbs=0;
  159.   for(cardno=0;cardno<MemNumCards();cardno++)
  160.     numdbs+=DmNumDatabases(cardno);
  161.   if(!(apps = MemPtrNew(sizeof(struct application)*numdbs)))
  162.     return(0);
  163.   appnum=0;
  164.   for(cardno=0;cardno<MemNumCards();cardno++) {
  165.     for(dbnum=0;dbnum<DmNumDatabases(cardno);dbnum++) {
  166.       apps[appnum].dbID=DmGetDatabase(cardno,dbnum);
  167.       apps[appnum].cardno=cardno;
  168.       DmDatabaseInfo(cardno,apps[appnum].dbID,apps[appnum].name,NULL,NULL,NULL,NULL,
  169.                      NULL,NULL,NULL,NULL,&type,&(apps[appnum].creator));
  170.       if(type!='appl' || apps[appnum].creator=='lnch')
  171.         continue;
  172.       apps[appnum].clean=0;
  173.       appnum++;
  174.     }
  175.   }
  176.   numapps=appnum;
  177.   MemPtrResize(apps,sizeof(struct application)*numapps);
  178.   if(numbtns==4)
  179.     mainformid=Frm4BTN;
  180.   if(numbtns==9)
  181.     mainformid=Frm9BTN;
  182.   if(numbtns==16)
  183.     mainformid=Frm16BTN;
  184.   if(startupbtn!=0 && multistart!=0 && Target(startupbtn,&index,false)==-1)
  185.     curcat=index;
  186.   BuildNames();
  187.   FrmPopupForm(mainformid);
  188.   return(1);
  189. }
  190.  
  191. void LoadDBInfo(Int16 appnum) {
  192.   DmOpenRef db;
  193.   VoidHand icon;
  194.   apps[appnum].icon=NULL;
  195.   db=DmOpenDatabase(apps[appnum].cardno,apps[appnum].dbID,dmModeReadOnly);
  196.   if(db!=0) {
  197.     icon=DmGet1Resource('tAIN',1000);
  198.     if(icon!=NULL) {
  199.       StrCopy(apps[appnum].name,MemHandleLock(icon));
  200.       MemHandleUnlock(icon);
  201.     }
  202.     icon=DmGet1Resource('tAIB',1000);
  203.     if(icon!=NULL) {
  204.       apps[appnum].icon=MemPtrNew(MemHandleSize(icon));
  205.       MemMove(apps[appnum].icon,MemHandleLock(icon),MemHandleSize(icon));
  206.       MemHandleUnlock(icon);
  207.     }
  208.     DmCloseDatabase(db);
  209.   }
  210.   apps[appnum].clean=1;
  211. }
  212.  
  213. void FreeGlobals() {
  214.   int app;
  215.   PrefSetAppPreferences(BlastAppID, 0, 2, &numcats, sizeof(DWord), true);
  216.   PrefSetAppPreferences(BlastAppID, 1, 2, &numbtns, sizeof(DWord), true);
  217.   PrefSetAppPreferences(BlastAppID, 2, 2, cats, sizeof(category)*numcats, true);
  218.   PrefSetAppPreferences(BlastAppID, 3, 2, &multistart, sizeof(Char), true);
  219.   PrefSetAppPreferences(BlastAppID, 4, 2, &displaytype, sizeof(Char), true);
  220.   PrefSetAppPreferences(BlastAppID, 5, 2, &btnnumdisplay, sizeof(Char), true);
  221.   if(catsHand) MemHandleFree(catsHand);
  222.   if(apps) {
  223.     for(app=0;app<numapps;app++)
  224.       if(apps[app].icon!=NULL && apps[app].clean)
  225.         MemPtrFree(apps[app].icon);
  226.     MemPtrFree(apps);
  227.   }
  228.   if(names) MemPtrFree(names);
  229. }
  230.  
  231. void EventLoop() {
  232.   EventType event;
  233.   UInt16 err;
  234.   SDWord btnnum;
  235.   SDWord type, index;
  236.   do {
  237.     EvtGetEvent(&event, -1);
  238.     if(event.eType == keyDownEvent && !(event.data.keyDown.modifiers & poweredOnKeyMask) && (FrmGetFormId(FrmGetActiveForm())==mainformid || FrmGetFormId(FrmGetActiveForm())==FrmHWCUE)) {
  239.       if(event.data.keyDown.chr == vchrFind && FrmGetFormId(FrmGetActiveForm())==mainformid) {
  240.         oldform=form;
  241.         FrmPopupForm(FrmHWCUE);
  242.         continue;
  243.       }
  244.       switch(event.data.keyDown.chr) {
  245.         case vchrHard1: btnnum=HB1; break;
  246.         case vchrHard2: btnnum=HB2; break;
  247.         case vchrHard3: btnnum=HB3; break;
  248.         case vchrHard4: btnnum=HB4; break;
  249.         case chrPageUp: btnnum=UP; break;
  250.         case chrPageDown: btnnum=DN; break;
  251.         default: btnnum=-1; break;
  252.       }
  253.       type=Target(btnnum,&index,1);
  254.       if(type==1) {
  255.         SysUIAppSwitch(apps[index].cardno,apps[index].dbID,sysAppLaunchCmdNormalLaunch,NULL);
  256.         continue;
  257.       }
  258.       if(type==-1) {
  259.         if(FrmGetFormId(FrmGetActiveForm())==FrmHWCUE) {
  260.           form=oldform;
  261.           FrmReturnToForm(mainformid);
  262.         }
  263.         curcat=index;
  264.         for(btnnum=0;btnnum<numbtns;btnnum++) {
  265.           index=NameIndex(btnnum,1);
  266.           CtlSetLabel((ControlType *)FrmGetObjectPtr(form,FrmGetObjectIndex(form,btnnum)),names[index]);
  267.         }
  268.         continue;
  269.       }
  270.     }
  271.     if(SysHandleEvent(&event)) continue;
  272.     if(MenuHandleEvent(NULL, &event, &err)) continue;
  273.     if(event.eType==frmLoadEvent) {
  274.       form=FrmInitForm(event.data.frmLoad.formID);
  275.       FrmSetEventHandler(form,handlers[event.data.frmLoad.formID]);
  276.       FrmSetActiveForm(form);
  277.     }
  278.     FrmDispatchEvent(&event);
  279.   } while(event.eType != appStopEvent);
  280. }
  281.  
  282. Boolean mainHandler(EventType *event) {
  283.   DWord type, index,btnnum;
  284.   SDWord tindex;
  285.   RectangleType bounds;
  286.  
  287.   if(event->eType == frmOpenEvent) {
  288.     for(btnnum=0;btnnum<numbtns;btnnum++) {
  289.       index=NameIndex(btnnum,1);
  290.       if(Target(btnnum,&tindex,1)==1 && apps[tindex].clean==0)
  291.         LoadDBInfo(tindex);
  292.       if(Target(btnnum,&tindex,1)!=1 || apps[tindex].icon==NULL || displaytype==0)
  293.         CtlSetLabel((ControlType *)FrmGetObjectPtr(form,FrmGetObjectIndex(form,btnnum)),names[index]);
  294.       if(btnnumdisplay==0)
  295.         FrmHideObject(form,FrmGetObjectIndex(form,btnnum+TEXTOFFSET));
  296.     }
  297.     FrmDrawForm(form);
  298.     for(btnnum=0;btnnum<numbtns;btnnum++) {
  299.       index=NameIndex(btnnum,1);
  300.       if(Target(btnnum,&tindex,1)==1 && apps[tindex].icon!=NULL && displaytype>0) {
  301.         WinDrawBitmap(apps[tindex].icon,IconX(btnnum),IconY(btnnum));
  302.         if(displaytype==2)
  303.           WinDrawChars(names[index],StrLen(names[index]),TextX(btnnum,names[index]),TextY(btnnum,names[index]));
  304.       }
  305.     } 
  306.     return(true);
  307.   }
  308.   if(event->eType == ctlSelectEvent) {
  309.     type=Target(event->data.ctlSelect.controlID,&index,1);
  310.     if(type==1) {
  311.       SysUIAppSwitch(apps[index].cardno,apps[index].dbID,sysAppLaunchCmdNormalLaunch,NULL);
  312.       return(true);
  313.     }
  314.     if(type==-1) {
  315.       curcat=index;
  316.       for(btnnum=0;btnnum<numbtns;btnnum++) {
  317.         index=NameIndex(btnnum,1);
  318.         if(Target(btnnum,&tindex,1)==1 && apps[tindex].clean==0)
  319.           LoadDBInfo(tindex);
  320.         if(Target(btnnum,&tindex,1)!=1 || apps[tindex].icon==NULL || displaytype==0)
  321.           CtlSetLabel((ControlType *)FrmGetObjectPtr(form,FrmGetObjectIndex(form,btnnum)),names[index]);
  322.         else {
  323.           CtlSetLabel((ControlType *)FrmGetObjectPtr(form,FrmGetObjectIndex(form,btnnum)),"");
  324.           index=NameIndex(btnnum,1);
  325.           WinDrawBitmap(apps[tindex].icon,IconX(btnnum),IconY(btnnum));
  326.           if(displaytype==2)
  327.             WinDrawChars(names[index],StrLen(names[index]),TextX(btnnum,names[index]),TextY(btnnum,names[index]));
  328.         }
  329.       }
  330.       return(true);
  331.     }
  332.   }
  333.   if(event->eType == menuEvent) {
  334.     if(event->data.menu.itemID==0)
  335.       FrmGotoForm(FrmGENPREFS);
  336.     else
  337.       FrmAlert(AlrABOUT);
  338.     return(true);
  339.   }
  340.   return(false);
  341. }
  342.  
  343. Boolean prefsHandler(EventType *event) {
  344.   ListType *list;
  345.   DWord index=0;
  346.   if(event->eType == frmOpenEvent) {
  347.     if(allclean==0) {
  348.       for(index=0;index<numapps;index++)
  349.         if(apps[index].clean==0)
  350.             LoadDBInfo(index);
  351.       SysQSort(apps, numapps, sizeof(struct application), (CmpFuncPtr)(&appCompare), 0);
  352.       BuildNames();
  353.       allclean=1;
  354.     }
  355.     if(numbtns==4)
  356.       index=0;
  357.     if(numbtns==9)
  358.       index=1;
  359.     if(numbtns==16)
  360.       index=2;
  361.     list=FrmGetObjectPtr(form,FrmGetObjectIndex(form,NUMBTNS+LISTOFFSET));
  362.     LstSetSelection(list,index);
  363.     CtlSetLabel(FrmGetObjectPtr(form,FrmGetObjectIndex(form,NUMBTNS)),LstGetSelectionText(list,index));
  364.     list=FrmGetObjectPtr(form,FrmGetObjectIndex(form,DISPLAYTYPE+LISTOFFSET));
  365.     LstSetSelection(list,displaytype);
  366.     CtlSetLabel(FrmGetObjectPtr(form,FrmGetObjectIndex(form,DISPLAYTYPE)),LstGetSelectionText(list,displaytype));
  367.     list=FrmGetObjectPtr(form,FrmGetObjectIndex(form,CATEGORY+LISTOFFSET));
  368.     LstSetListChoices(list,catnames,numcats);
  369.     LstSetSelection(list,curcat);
  370.     CtlSetLabel(FrmGetObjectPtr(form,FrmGetObjectIndex(form,CATEGORY)),LstGetSelectionText(list,curcat));
  371.     CtlSetValue(FrmGetObjectPtr(form,FrmGetObjectIndex(form,MULTISTART)),multistart);
  372.     CtlSetValue(FrmGetObjectPtr(form,FrmGetObjectIndex(form,BTNNUMDISPLAY)),btnnumdisplay);
  373.     FrmDrawForm(form);
  374.     return(true);
  375.   }
  376.  
  377.   if(event->eType == frmUpdateEvent && event->data.frmUpdate.updateCode==2) {
  378.     list=FrmGetObjectPtr(FrmGetFormPtr(FrmGENPREFS),FrmGetObjectIndex(FrmGetFormPtr(FrmGENPREFS),CATEGORY+LISTOFFSET));
  379.     LstSetListChoices(list,catnames,numcats);
  380.     LstSetSelection(list,curcat);
  381.     CtlSetLabel(FrmGetObjectPtr(FrmGetFormPtr(FrmGENPREFS),FrmGetObjectIndex(FrmGetFormPtr(FrmGENPREFS),CATEGORY)),LstGetSelectionText(list,curcat));
  382.     return(true);
  383.   }    
  384.  
  385.   if(event->eType == popSelectEvent) {
  386.     if(event->data.popSelect.listID == NUMBTNS + LISTOFFSET)
  387.       ChangeNumBtns(event->data.popSelect.selection);
  388.     if(event->data.popSelect.listID == DISPLAYTYPE + LISTOFFSET)
  389.       displaytype=event->data.popSelect.selection;
  390.     if(event->data.popSelect.listID == CATEGORY + LISTOFFSET)
  391.       curcat=event->data.popSelect.selection;
  392.     return(false);
  393.   }
  394.   if(event->eType == ctlSelectEvent) {
  395.     if(event->data.ctlSelect.controlID == NEWCAT) {
  396.       oldform=form;
  397.       FrmPopupForm(FrmNEWCAT);
  398.       return(true);
  399.     }
  400.     if(event->data.ctlSelect.controlID == EDITCAT) {
  401.       oldform=form;
  402.       FrmPopupForm(FrmEDITCAT);
  403.       return(true);
  404.     }
  405.     if(event->data.ctlSelect.controlID == DELCAT) {
  406.       if(curcat==0) {
  407.         FrmAlert(AlrNODELDEFAULT);
  408.         return(true);
  409.       }
  410.       if(FrmAlert(AlrQUERYDELCAT)==0) {
  411.         DelCat(curcat);
  412.         FrmUpdateForm(FrmGENPREFS,2);
  413.       }
  414.       return(true);
  415.     }
  416.     if(event->data.ctlSelect.controlID == MODHWBTNS) {
  417.       FrmGotoForm(FrmHWBUTTONS);
  418.       return(true);
  419.     }
  420.     if(event->data.ctlSelect.controlID == MODOSBTNS) {
  421.       FrmGotoForm(FrmOSBUTTONS);
  422.       return(true);
  423.     }
  424.     if(event->data.ctlSelect.controlID == MULTISTART) {
  425.       multistart=CtlGetValue(FrmGetObjectPtr(form,FrmGetObjectIndex(form,MULTISTART)));
  426.       return(true);
  427.     }
  428.     if(event->data.ctlSelect.controlID == BTNNUMDISPLAY) {
  429.       btnnumdisplay=CtlGetValue(FrmGetObjectPtr(form,FrmGetObjectIndex(form,BTNNUMDISPLAY)));
  430.       return(true);
  431.     }
  432.     if(event->data.ctlSelect.controlID == OKAYBTN) {
  433.       FrmGotoForm(mainformid);
  434.       return(true);
  435.     }
  436.   }
  437.   return(false);
  438. }
  439.  
  440. Boolean osbtnsHandler(EventType *event) {
  441.   DWord appnum,sel,btnnum;
  442.   ListType *list;
  443.   if(event->eType == frmOpenEvent) {
  444.     for(btnnum=0;btnnum<16;btnnum++) {
  445.       if(btnnum<numbtns) {
  446.         list=FrmGetObjectPtr(form,FrmGetObjectIndex(form,btnnum+LISTOFFSET));
  447.         LstSetListChoices(list,names+(curcat==0),numapps+numcats+1+(curcat!=0));
  448.         LstSetSelection(list,NameIndex(btnnum,0)-(curcat==0));
  449.         CtlSetLabel((ControlType *)FrmGetObjectPtr(form,FrmGetObjectIndex(form,btnnum)),names[NameIndex(btnnum,0)]);
  450.       } else {
  451.         FrmHideObject(form,FrmGetObjectIndex(form,btnnum));
  452.         FrmHideObject(form,FrmGetObjectIndex(form,btnnum+TEXTOFFSET));
  453.       }
  454.     }
  455.     FrmDrawForm(form);
  456.     return(true);
  457.   }    
  458.  
  459.   if(event->eType == ctlSelectEvent && event->data.ctlSelect.controlID == OKAYBTN) {
  460.     for(appnum=0;appnum<numbtns;appnum++) {
  461.       sel=LstGetSelection(FrmGetObjectPtr(form,FrmGetObjectIndex(form,appnum+LISTOFFSET)))+(curcat==0);
  462.       if(sel==0 || sel==noListSelection)
  463.         cats[curcat].creators[appnum]=0;
  464.       else if(sel==1)
  465.         cats[curcat].creators[appnum]=1;
  466.       else if(sel <= numapps+1)
  467.         cats[curcat].creators[appnum]=apps[sel-2].creator;
  468.       else
  469.         cats[curcat].creators[appnum]=sel-numapps;
  470.     }
  471.     FrmGotoForm(FrmGENPREFS);
  472.     return(true);
  473.   }
  474.   return(false);
  475. }
  476.  
  477. Boolean hwbtnsHandler(EventType *event) {
  478.   DWord appnum,sel,btnnum;
  479.   ListType *list;
  480.   if(event->eType == frmOpenEvent) {
  481.     for(btnnum=16;btnnum<22;btnnum++) {
  482.       list=FrmGetObjectPtr(form,FrmGetObjectIndex(form,btnnum+LISTOFFSET));
  483.       LstSetListChoices(list,names+(curcat==0),numapps+numcats+1+(curcat!=0));
  484.       LstSetSelection(list,NameIndex(btnnum,0)-(curcat==0));
  485.       CtlSetLabel((ControlType *)FrmGetObjectPtr(form,FrmGetObjectIndex(form,btnnum)),names[NameIndex(btnnum,0)]);
  486.     }
  487.     FrmDrawForm(form);
  488.     return(true);
  489.   }
  490.  
  491.   if(event->eType == ctlSelectEvent && event->data.ctlSelect.controlID == OKAYBTN) {
  492.     for(appnum=16;appnum<22;appnum++) {
  493.       sel=LstGetSelection(FrmGetObjectPtr(form,FrmGetObjectIndex(form,appnum+LISTOFFSET)))+(curcat==0);
  494.       if(sel==0 || sel==noListSelection)
  495.         cats[curcat].creators[appnum]=0;
  496.       else if(sel==1)
  497.         cats[curcat].creators[appnum]=1;
  498.       else if(sel <= numapps+1)
  499.         cats[curcat].creators[appnum]=apps[sel-2].creator;
  500.       else
  501.         cats[curcat].creators[appnum]=sel-numapps;
  502.     }
  503.     FrmGotoForm(FrmGENPREFS);
  504.     return(true);
  505.   }
  506.   return(false);
  507. }
  508.  
  509. Boolean newcatHandler(EventType *event) {
  510.   Char *name;
  511.   if(event->eType == frmOpenEvent) {
  512.     FrmDrawForm(form);
  513.     FrmSetFocus(form,FrmGetObjectIndex(form,CATNAME));
  514.     return(true);
  515.   }
  516.   if(event->eType == ctlSelectEvent) {
  517.     if(event->data.ctlSelect.controlID == OKAYBTN) {
  518.       name=FldGetTextPtr(FrmGetObjectPtr(form,FrmGetObjectIndex(form,CATNAME)));
  519.       if(name==NULL || StrLen(name)==0) {
  520.         FrmAlert(AlrEMPTYCAT);
  521.         return(true);
  522.       }
  523.       numcats++;
  524.       MemHandleUnlock(catsHand);
  525.       if(MemHandleResize(catsHand,numcats*sizeof(category))==memErrNotEnoughSpace) {
  526.         FrmAlert(AlrNOMEM);
  527.         numcats--;
  528.         cats=MemHandleLock(catsHand);
  529.         return(true);
  530.       }
  531.       cats=MemHandleLock(catsHand);
  532.       StrCopy(cats[numcats-1].name,name);
  533.       MemSet(&(cats[numcats-1].creators),4*22,0);
  534.       BuildNames();
  535.       curcat=numcats-1;
  536.       FrmUpdateForm(FrmGENPREFS,2);
  537.     }
  538.     form=oldform;
  539.     FrmReturnToForm(FrmGENPREFS);
  540.     return(true);
  541.   }
  542.   return(false);
  543. }
  544.  
  545. Boolean editcatHandler(EventType *event) {
  546.   VoidHand nameHand,oldHand;
  547.   FieldType *field;
  548.   Char *name;
  549.   if(event->eType == frmOpenEvent) {
  550.     nameHand=MemHandleNew(26);
  551.     name=MemHandleLock(nameHand);
  552.     StrCopy(name,cats[curcat].name);
  553.     name=NULL;
  554.     MemHandleUnlock(nameHand);
  555.     field=(FieldType *)FrmGetObjectPtr(form,FrmGetObjectIndex(form,CATNAME));
  556.     oldHand=(VoidHand)FldGetTextHandle(field);
  557.     FldSetTextHandle(field,(Handle)nameHand);
  558.     if(oldHand)
  559.       MemHandleFree(oldHand);
  560.     FrmDrawForm(form);
  561.     FrmSetFocus(form,FrmGetObjectIndex(form,CATNAME));
  562.     return(true);
  563.   }
  564.   if(event->eType == ctlSelectEvent) {
  565.     if(event->data.ctlSelect.controlID == OKAYBTN) {
  566.       name=FldGetTextPtr(FrmGetObjectPtr(form,FrmGetObjectIndex(form,CATNAME)));
  567.       if(name==NULL || StrLen(name)==0) {
  568.         FrmAlert(AlrEMPTYCAT);
  569.         return(true);
  570.       }
  571.       StrCopy(cats[curcat].name,name);
  572.       BuildNames();
  573.       FrmUpdateForm(FrmGENPREFS,2);
  574.     }
  575.     form=oldform;
  576.     FrmReturnToForm(FrmGENPREFS);
  577.     return(true);
  578.   }
  579.   return(false);
  580. }
  581.  
  582. Boolean hwcueHandler(EventType *event) {
  583.   DWord btnnum,namei;
  584.   SDWord tindex;
  585.   if(event->eType == frmOpenEvent) {
  586.     for(btnnum=16;btnnum<22;btnnum++) {
  587.       if(Target(btnnum,&tindex,1)==1 && apps[tindex].clean==0)
  588.         LoadDBInfo(tindex);
  589.       namei=NameIndex(btnnum,1);
  590.       CtlSetLabel((ControlType *)FrmGetObjectPtr(form,FrmGetObjectIndex(form,btnnum)),names[namei]);
  591.     }
  592.     FrmDrawForm(form);
  593.     return(true);
  594.   }
  595.     
  596.   if(event->eType == penDownEvent || event->eType == keyDownEvent) {
  597.     form=oldform;
  598.     FrmReturnToForm(mainformid);
  599.     return(true);
  600.   }
  601.   return(false);
  602. }
  603.  
  604. DWord NameIndex(DWord btnnum, Boolean searchdefault) {
  605.   DWord type,index;
  606.   type=Target(btnnum,&index,searchdefault);
  607.   if(type==0) {
  608. //    FrmCustomAlert(AlrDEBUG,"NameIndex","type0","");
  609.     return(index);
  610.   }
  611.   if(type==1) {
  612. //    FrmCustomAlert(AlrDEBUG,"NameIndex","type1","");
  613.     return(index+2);
  614.   }
  615. //  FrmCustomAlert(AlrDEBUG,"NameIndex","type-1","");
  616.   return(index+numapps+2);
  617. }
  618.  
  619. void ChangeNumBtns(DWord num) {
  620.   mainformid=num;
  621.   if(num==0)
  622.     numbtns=4;
  623.   if(num==1)
  624.     numbtns=9;
  625.   if(num==2)
  626.     numbtns=16;
  627. }
  628.  
  629. void BuildNames() {
  630.   DWord appnum;
  631.   if(names) MemPtrFree(names);
  632.   if(catnames) MemPtrFree(catnames);
  633.   names=MemPtrNew(sizeof(Char *) * (numapps+numcats+2));
  634.   catnames=MemPtrNew(sizeof(Char *) * (numcats));
  635.   names[0]=noselect;
  636.   names[1]=novalue;
  637.   for(appnum=0;appnum<numapps;appnum++)
  638.     names[appnum+2] = apps[appnum].name;
  639.   for(appnum=0;appnum<numcats;appnum++)
  640.     names[appnum+numapps+2] = catnames[appnum] = cats[appnum].name;
  641. }
  642.  
  643. void DelCat(DWord cat) {
  644.   DWord catnum,appnum;
  645.  
  646.   if(cat==(--numcats)) {
  647.     MemHandleResize(catsHand,numcats*sizeof(category));
  648.     BuildNames();
  649.     curcat=0;
  650.     return;
  651.   }
  652.   for(catnum=0;catnum<=numcats;catnum++)
  653.     for(appnum=0;appnum<22;appnum++) {
  654.       if(cats[catnum].creators[appnum]==cat+2)
  655.         cats[catnum].creators[appnum]=1;
  656.       if(cats[catnum].creators[appnum]==numcats+2)
  657.         cats[catnum].creators[appnum]=cat+2;
  658.     }
  659.  
  660.   MemMove(&(cats[cat]),&(cats[numcats]),sizeof(category));
  661.   MemHandleResize(catsHand,numcats*sizeof(category));
  662. //  BuildNames();
  663.   curcat=0;
  664. }
  665.  
  666. SDWord AppIndex(UInt32 creator) {
  667.   DWord appnum;
  668.   for(appnum=0;appnum<numapps&&apps[appnum].creator!=creator;appnum++)
  669.     ;
  670.   if(appnum<numapps)
  671.     return(appnum);
  672.   return(-1);
  673. }
  674.  
  675. SDWord Target(UInt32 btnnum, SDWord *value, Boolean searchdefault) {
  676.   UInt32 creator;
  677.   if(btnnum<0 || btnnum>=22)
  678.     return(0);
  679.   creator=cats[curcat].creators[btnnum];
  680.   if (creator==0) {
  681.     if(searchdefault)
  682.       creator=cats[0].creators[btnnum];
  683.     *value=creator;
  684.     if(creator==0)
  685.       return(0);
  686.   }
  687.   *value=creator;
  688.   if (creator<=1)
  689.     return(0);
  690.  
  691.   if (creator<=numcats+1) {
  692.     *value=creator-2;
  693.     return(-1);  //category
  694.   }
  695.   if((*value=AppIndex(creator))!=-1) {
  696.     return(1);  //application
  697.   }
  698.   return(0);
  699. }
  700.  
  701. Int16 IconX(UInt32 btnnum) {
  702.   Int16 basex;
  703.   switch(numbtns) {
  704.     case 4:
  705.       basex=80*(btnnum%2);
  706.       return(basex+25);
  707.     case 9:
  708.       basex=53*(btnnum%3);
  709.       return(basex+11);
  710.     case 16:
  711.       basex=40*(btnnum%4);
  712.       return(basex+5);
  713.   }
  714.   return(0);
  715. }
  716.  
  717. Int16 IconY(UInt32 btnnum) {
  718.   Int16 basey;
  719.   switch(numbtns) {
  720.     case 4:
  721.       basey=80*(btnnum/2);
  722.       return(basey+27-(4*(displaytype==2)));
  723.     case 9:
  724.       basey=53*(btnnum/3);
  725.       return(basey+13-(4*(displaytype==2)));
  726.     case 16:
  727.       basey=40*(btnnum/4);
  728.       return(basey+7-(4*(displaytype==2)));
  729.   }
  730.   return(0);
  731. }
  732.  
  733. Int16 TextX(UInt32 btnnum, Char *string) {
  734.   Int16 basex=0;
  735.   switch(numbtns) {
  736.     case 4:
  737.       basex=80*(btnnum%2)+41; break;
  738.     case 9:
  739.       basex=53*(btnnum%3)+27; break;
  740.     case 16:
  741.       basex=40*(btnnum%4)+21; break;;
  742.   }
  743.   return(basex-FntCharsWidth(string,StrLen(string))/2);
  744. }
  745.  
  746. Int16 TextY(UInt32 btnnum, Char *string) {
  747.   Int16 basey;
  748.   switch(numbtns) {
  749.     case 4:
  750.       basey=80*(btnnum/2);
  751.       return(basey+47);
  752.     case 9:
  753.       basey=53*(btnnum/3);
  754.       return(basey+33);
  755.     case 16:
  756.       basey=40*(btnnum/4);
  757.       return(basey+27);
  758.   }
  759.   return(0);
  760. }
  761.  
  762.  
  763.