home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 6 / AACD06.ISO / AACD / Utilities / amiCheck / Source / memoPanel.c < prev    next >
C/C++ Source or Header  |  1998-06-11  |  11KB  |  411 lines

  1. /* memoPanel.c 
  2.  *
  3.  *  defines the GUIFront characteristics of the memo panel 
  4.  */
  5.   
  6. #include <exec/types.h>
  7. #include <exec/lists.h>
  8. #include <exec/nodes.h>
  9. #include <exec/memory.h>
  10. #include <clib/exec_protos.h>
  11. #include <clib/alib_protos.h>
  12. #include <clib/intuition_protos.h>
  13. #include <stdio.h>  
  14. #include <intuition/gadgetclass.h>
  15. #include "amiCheck.h"
  16. #include "dataBase.h"
  17. #include "memoPanel.h"
  18. #include "regGadget.h"
  19. #include <string.h>
  20.  
  21.  
  22. /* prototypes */
  23. BOOL MemoHandleGadget(struct IntuiMessage *);
  24. void MemoInit(void);
  25. void MemoDisableGads(BOOL);
  26.  
  27. struct List tempmemos;
  28. BOOL updatememo,memoretval;
  29. ExtErrorData MemoExtData;
  30. GUIFront *memoGUI;
  31. UWORD    memolistActive;
  32. struct Window *memoWin;
  33. BOOL updatememos = FALSE;
  34.  
  35. /* quick configure of some gadgets */
  36. extern struct TagItem memoList[];
  37.  
  38. /* define gadgetspec */
  39. GadgetSpec MEMOgadgetspecs[] = 
  40. {
  41.     {LISTVIEW_KIND,30,8, {0,0,0,0,NULL,NULL,GID_MEMOLIST,
  42.         PLACETEXT_ABOVE},memoList,GS_DefaultTags},
  43.  
  44.         {BUTTON_KIND,0,0,{0,0,0,0,"_New", NULL, GID_MEMONEW,         
  45.                 PLACETEXT_IN}, NULL, GS_DefaultTags},
  46.  
  47.         {BUTTON_KIND,0,0,{0,0,0,0,"_Remove", NULL, GID_MEMODEL,         
  48.                 PLACETEXT_IN}, NULL, GS_DefaultTags},
  49.  
  50.         {STRING_KIND,20,0,{0,0,0,0,NULL, NULL, GID_MEMOEDIT,         
  51.                 PLACETEXT_IN}, NULL, GS_DefaultTags},
  52.  
  53.         {BUTTON_KIND,0,0,{0,0,0,0,"_Up", NULL, GID_MEMOUP,         
  54.                 PLACETEXT_IN}, NULL, GS_DefaultTags},
  55.  
  56.         {BUTTON_KIND,0,0,{0,0,0,0,"_Down", NULL, GID_MEMODOWN,         
  57.                 PLACETEXT_IN}, NULL, GS_DefaultTags},
  58.  
  59.         {BUTTON_KIND,0,0,{0,0,0,0,"_Top", NULL, GID_MEMOTOP,         
  60.                 PLACETEXT_IN}, NULL, GS_DefaultTags},
  61.  
  62.         {BUTTON_KIND,0,0,{0,0,0,0,"_Bottom", NULL, GID_MEMOBOTTOM,         
  63.                 PLACETEXT_IN}, NULL, GS_DefaultTags},
  64.  
  65.         {BUTTON_KIND,0,0,{0,0,0,0,"_OK", NULL, GID_MEMOOK,         
  66.                 PLACETEXT_IN}, NULL, GS_DefaultTags},
  67.  
  68.         {BUTTON_KIND,0,0,{0,0,0,0,"_Cancel", NULL, GID_MEMOCANCEL,        
  69.                 PLACETEXT_IN}, NULL, GS_DefaultTags},
  70.  
  71. };
  72.  
  73. struct TagItem memoList[] =
  74. {
  75.         {GTLV_ShowSelected, &MEMOgadgetspecs[GID_MEMOEDIT]},
  76.                 /*
  77.     {GTLV_Labels, ~0},
  78.     {GTLV_Selected,~0},
  79.         */
  80.         {TAG_DONE},
  81. };
  82.  
  83. /* set up array of pointers to our specs */
  84. GadgetSpec *M_MemoSpecs[] =
  85. {
  86.         &MEMOgadgetspecs[0],
  87.         &MEMOgadgetspecs[1],
  88.         &MEMOgadgetspecs[2],
  89.         &MEMOgadgetspecs[3],
  90.         &MEMOgadgetspecs[4],
  91.         &MEMOgadgetspecs[5],
  92.         &MEMOgadgetspecs[6],
  93.         &MEMOgadgetspecs[7],
  94.         &MEMOgadgetspecs[8],
  95.         &MEMOgadgetspecs[9],
  96.         NULL,
  97. };
  98.  
  99.  
  100. /* define the layout of this panel */
  101. ULONG M_MemoPanel[] =
  102. {
  103.    GUIL_Flags, GUILF_PropShare | GUILF_EqualWidth,
  104.  
  105.    GUIL_HorizGroup, 1,
  106.         GUIL_Flags, GUILF_PropShare,
  107.     GUIL_FrameType, GUILFT_Recess,
  108.         
  109.     GUIL_VertGroup, 1,
  110.  
  111.         GUIL_HorizGroup,1,
  112.             GUIL_FrameType, GUILFT_Ridge,
  113.             GUIL_GadgetSpecID, GID_MEMOLIST,
  114.  
  115.                     GUIL_VertGroup,1,
  116.                             GUIL_Flags, GUILF_PropShare | GUILF_EqualWidth | GUILF_EqualHeight,
  117.                                               
  118.                 GUIL_GadgetSpecID, GID_MEMOUP,
  119.                 GUIL_GadgetSpecID, GID_MEMODOWN,
  120.                 GUIL_GadgetSpecID, GID_MEMOTOP,
  121.                 GUIL_GadgetSpecID, GID_MEMOBOTTOM,
  122.                     TAG_DONE,
  123.  
  124.         TAG_DONE,
  125.     
  126.         GUIL_HorizGroup,1,
  127.             GUIL_FrameType, GUILFT_Ridge,
  128.             GUIL_Flags, GUILF_EqualSize | GUILF_EqualWidth,
  129.             GUIL_GadgetSpecID, GID_MEMODEL,
  130.             GUIL_GadgetSpecID, GID_MEMONEW,
  131.         TAG_DONE,
  132.  
  133.     TAG_DONE,
  134.         
  135.     TAG_DONE,
  136.     
  137.     GUIL_HorizGroup,1,
  138.         GUIL_Flags, GUILF_EqualSize | GUILF_EqualWidth,
  139.         
  140.            GUIL_GadgetSpecID, GID_MEMOOK,
  141.            GUIL_GadgetSpecID, GID_MEMOCANCEL,
  142.            
  143.     TAG_DONE,   
  144.            
  145. TAG_DONE,
  146. };
  147.  
  148.  
  149. /****************************************************
  150. * MemoGUI ()
  151. *
  152. *    Creates the GUI for the edit temp panel.
  153. *****************************************************/
  154. BOOL MemoGUI(void)
  155. {
  156.  BOOL done = FALSE;
  157.  BOOL noreply;
  158.  UWORD ordinal;
  159.  ULONG signal;
  160.      
  161.    AmiLock();
  162.  
  163.    /* install temporary list */
  164.    NewList(&tempmemos);
  165.    DataCopyList(&memolist, &tempmemos, MemoNewEdit);
  166.  
  167.    updatememo = FALSE;
  168.  
  169.         GF_SetGUIAttr(memoGUI, GUI_OpenGUI, TRUE, TAG_DONE);
  170.          /* grab window */
  171.          GF_GetGUIAttr(memoGUI,GUI_Window,&memoWin,TAG_DONE);
  172.         MemoInit();
  173.  
  174.  
  175.                 /* Process input events */
  176.                 while (!done)
  177.                 {
  178.                     struct IntuiMessage *imsg;
  179.  
  180.                     /* Wait for an event to occur */
  181.  
  182.                     signal = GF_Wait(guiapp,AmigaGuideSignal(agc));
  183.             if (signal & AmigaGuideSignal(agc)) {
  184.             AmiHelpMsg();
  185.             continue;
  186.             }
  187.  
  188.                     /* We only bother to listen for CLOSEWINDOW events.
  189.                      * Of course, in a real application, you would be
  190.                      * examining the Class field for IDCMP_GADGETUP
  191.                      * messages and act accordingly.
  192.                      */
  193.  
  194.                     while (imsg = GF_GetIMsg(guiapp))
  195.                     {
  196.             noreply = TRUE;
  197.                         switch (imsg->Class) {
  198.                 case IDCMP_REFRESHWINDOW:
  199.                     RegRefresh(TRUE);
  200.                     break;
  201.  
  202.                                 case IDCMP_CLOSEWINDOW:
  203.                     DataFreeList(&tempmemos);
  204.                                         done = TRUE;
  205.                                         break;
  206.  
  207.                 case IDCMP_RAWKEY:
  208.                     if (GF_ProcessListView(memoGUI,M_MemoSpecs[GID_MEMOLIST],
  209.                         imsg,&ordinal)) {
  210.                             memolistActive = ordinal;
  211.                             MemoDisableGads(FALSE);    
  212.                     }
  213.                     else AmiHelpKey(imsg,MEMO_PANEL);
  214.                     break;
  215.  
  216.                 case IDCMP_GADGETUP:
  217.                     noreply = FALSE;
  218.                     done=MemoHandleGadget(imsg);
  219.                     break;
  220.                         }
  221.                                      
  222.                               
  223.                         if (noreply) GF_ReplyIMsg(imsg);
  224.                     }
  225.                 }
  226.  
  227.    
  228.    GF_SetGadgetAttrs(memoGUI,MEMOgadgetspecs[GID_MEMOLIST].gs_Gadget,
  229.             GTLV_Labels, ~0,
  230.             TAG_DONE);
  231.    GF_SetGUIAttr(memoGUI, GUI_OpenGUI, FALSE, TAG_DONE);
  232.    if (updatememo == TRUE) {
  233.          DataMoveList(&tempmemos, &memolist);
  234.          NewList(&tempmemos);
  235.    }
  236.  
  237.   AmiUnlock();
  238.   return (memoretval);
  239. }
  240.  
  241. /***************************************************
  242. * MemoHandleGadget()
  243. *
  244. *    Handles gadget events for this panel
  245. ****************************************************/
  246. BOOL  MemoHandleGadget(struct IntuiMessage *imsg)
  247. {
  248.  BOOL done = FALSE;
  249.  struct Gadget *gad = (struct Gadget *)(imsg->IAddress);
  250.  UWORD code = imsg->Code;
  251.  memoNode tempmemo;
  252.  memoNode *temp;
  253.  
  254.  switch (gad->GadgetID) {
  255.     
  256.     case GID_MEMOLIST:
  257.         memolistActive = code;
  258.         MemoDisableGads(FALSE);
  259.         break;
  260.  
  261.     case GID_MEMOEDIT:
  262.         if (memolistActive != ~0) {
  263.           if (DataIsUnique(memoGUI, &tempmemos,((struct StringInfo*)gad->SpecialInfo)->Buffer,
  264.             TRUE,"Memo name is not unique or invalid") ) {
  265.  
  266.             /* detach and modify this */
  267.             temp = (memoNode*)DataOrd2Node(&tempmemos,memolistActive);
  268.             GF_SetGadgetAttrs(memoGUI,MEMOgadgetspecs[GID_MEMOLIST].gs_Gadget,
  269.                 GTLV_Labels, ~0,
  270.                 TAG_DONE);
  271.             
  272.             strcpy(temp->memoStr, ((struct StringInfo*)gad->SpecialInfo)->Buffer);
  273.             GF_SetGadgetAttrs(memoGUI,MEMOgadgetspecs[GID_MEMOLIST].gs_Gadget,
  274.                 GTLV_Labels, &tempmemos,
  275.                 TAG_DONE);    
  276.           }
  277.           else {
  278.             GF_ReplyIMsg(imsg);
  279.             DataSitNSpin(M_MemoSpecs[GID_MEMOEDIT]->gs_Gadget,memoWin);
  280.             return (done);
  281.           }
  282.         }
  283.         break;
  284.  
  285.     case GID_MEMONEW:
  286.         strcpy(tempmemo.memoStr,"NEW:RENAME ME");
  287.         if (DataIsUnique(memoGUI, &tempmemos,tempmemo.memoStr,TRUE,"You must rename the previous entry first")){
  288.             /* detach and modify list */
  289.             GF_SetGadgetAttrs(memoGUI,MEMOgadgetspecs[GID_MEMOLIST].gs_Gadget,
  290.                 GTLV_Labels, ~0,
  291.                 TAG_DONE);
  292.             
  293.             temp=MemoNewEdit(&tempmemos,&tempmemo);
  294.             memolistActive = DataNode2Ord(&tempmemos,temp->memoStr);
  295.                     
  296.             GF_SetGadgetAttrs(memoGUI,MEMOgadgetspecs[GID_MEMOLIST].gs_Gadget,
  297.                 GTLV_Labels, &tempmemos,
  298.                 GTLV_Selected, memolistActive,
  299.                 TAG_DONE);    
  300.  
  301.             MemoDisableGads(FALSE);
  302.         }
  303.         break;
  304.  
  305.     case GID_MEMODEL:
  306.         DataListRemove(memoGUI,MEMOgadgetspecs[GID_MEMOLIST].gs_Gadget,
  307.             &tempmemos, &memolistActive);
  308.  
  309.         /* disable up/down? */
  310.         if (IsListEmpty(&tempmemos))
  311.             MemoDisableGads(TRUE);
  312.         break;
  313.  
  314.     case GID_MEMOUP:
  315.         DataListUp(memoGUI,MEMOgadgetspecs[GID_MEMOLIST].gs_Gadget,
  316.             &tempmemos, &memolistActive);
  317.         break;
  318.  
  319.     case GID_MEMODOWN:
  320.         DataListDown(memoGUI,MEMOgadgetspecs[GID_MEMOLIST].gs_Gadget,
  321.             &tempmemos, &memolistActive);
  322.         break;
  323.  
  324.     case GID_MEMOTOP:
  325.         DataListTop(memoGUI,MEMOgadgetspecs[GID_MEMOLIST].gs_Gadget,
  326.             &tempmemos, &memolistActive,0);
  327.         break;
  328.  
  329.     case GID_MEMOBOTTOM:
  330.         DataListBottom(memoGUI,MEMOgadgetspecs[GID_MEMOLIST].gs_Gadget,
  331.             &tempmemos, &memolistActive, DataCountNodes(&tempmemos));
  332.         break;
  333.  
  334.     case GID_MEMOCANCEL:
  335.         DataFreeList(&tempmemos);
  336.         done = TRUE;
  337.         break;
  338.  
  339.     case GID_MEMOOK:
  340.         amiChangedItems = TRUE;
  341.         updatememo = done = TRUE;    
  342.         break;
  343.  }
  344.  
  345.  GF_ReplyIMsg(imsg);
  346.  return (done);
  347. }
  348.  
  349. /****************************************************
  350. * MemoInit()
  351. *
  352. *    Set up some globals
  353. *****************************************************/
  354. void MemoInit(void)
  355. {
  356.     memoretval = FALSE;
  357.     memolistActive = ~0;    
  358.  
  359.  /* grab window */
  360.  GF_GetGUIAttr(memoGUI,GUI_Window,&memoWin,TAG_DONE);
  361.  GF_SetGadgetAttrs(memoGUI,MEMOgadgetspecs[GID_MEMOLIST].gs_Gadget,
  362.             GTLV_Labels, &tempmemos,
  363.             GTLV_Selected,~0,
  364.             TAG_DONE);
  365.  MemoDisableGads(TRUE);
  366. }
  367.  
  368. /****************************************************
  369. * MemoDisableGads()
  370. *
  371. *    Disable/Enable extra gadgets
  372. *****************************************************/
  373. void MemoDisableGads(BOOL dis)
  374. {
  375.  GF_SetGadgetAttrs(memoGUI,MEMOgadgetspecs[GID_MEMODEL].gs_Gadget,
  376.     GA_Disabled, dis,
  377.     TAG_DONE);
  378.  
  379.  GF_SetGadgetAttrs(memoGUI,MEMOgadgetspecs[GID_MEMOUP].gs_Gadget,
  380.     GA_Disabled, dis,
  381.     TAG_DONE);
  382.  
  383.  GF_SetGadgetAttrs(memoGUI,MEMOgadgetspecs[GID_MEMODOWN].gs_Gadget,
  384.     GA_Disabled, dis,
  385.     TAG_DONE);
  386.  
  387.  GF_SetGadgetAttrs(memoGUI,MEMOgadgetspecs[GID_MEMOTOP].gs_Gadget,
  388.     GA_Disabled, dis,
  389.     TAG_DONE);
  390.  
  391.  GF_SetGadgetAttrs(memoGUI,MEMOgadgetspecs[GID_MEMOBOTTOM].gs_Gadget,
  392.     GA_Disabled, dis,
  393.     TAG_DONE);
  394. }
  395.  
  396. /*************************************************************
  397. * MemoNewEdit()
  398. *
  399. *    Creates a new memo node and places it at tail
  400. **************************************************************/
  401. memoNode *MemoNewEdit(struct List *el,memoNode *m)
  402. {
  403.  memoNode *work;
  404.  
  405.  work = (memoNode *)AllocVec(sizeof(memoNode), MEMF_CLEAR);
  406.  strcpy(work->memoStr,m->memoStr);
  407.  work->node.ln_Name = work->memoStr;
  408.  AddTail((struct List *)el,(struct Node *)work);
  409.  return (work);
  410. }
  411.