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

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