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

  1. /* namePanel.c 
  2.  *
  3.  *  defines the GUIFront characteristics of the name 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 "namePanel.h"
  18. #include "regGadget.h"
  19. #include <string.h>
  20.  
  21.  
  22. /* prototypes */
  23. BOOL NameHandleGadget(struct IntuiMessage *);
  24. void NameInit(void);
  25. void NameDisableGads(BOOL);
  26.  
  27. struct List tempnames;
  28. BOOL updatename,nameretval;
  29. ExtErrorData NameExtData;
  30. GUIFront *nameGUI;
  31. UWORD    namelistActive;
  32. struct Window *nameWin;
  33. BOOL updatenames = FALSE;
  34.  
  35. /* quick configure of some gadgets */
  36. extern struct TagItem nameList[];
  37.  
  38. /* define gadgetspec */
  39. GadgetSpec NAMEgadgetspecs[] = 
  40. {
  41.     {LISTVIEW_KIND,30,8, {0,0,0,0,NULL,NULL,GID_NAMELIST,
  42.         PLACETEXT_ABOVE},nameList,GS_DefaultTags},
  43.  
  44.         {BUTTON_KIND,0,0,{0,0,0,0,"_New", NULL, GID_NAMENEW,         
  45.                 PLACETEXT_IN}, NULL, GS_DefaultTags},
  46.  
  47.         {BUTTON_KIND,0,0,{0,0,0,0,"_Remove", NULL, GID_NAMEDEL,         
  48.                 PLACETEXT_IN}, NULL, GS_DefaultTags},
  49.  
  50.         {STRING_KIND,20,0,{0,0,0,0,NULL, NULL, GID_NAMEEDIT,         
  51.                 PLACETEXT_IN}, NULL, GS_DefaultTags},
  52.  
  53.         {BUTTON_KIND,0,0,{0,0,0,0,"_Up", NULL, GID_NAMEUP,         
  54.                 PLACETEXT_IN}, NULL, GS_DefaultTags},
  55.  
  56.         {BUTTON_KIND,0,0,{0,0,0,0,"_Down", NULL, GID_NAMEDOWN,         
  57.                 PLACETEXT_IN}, NULL, GS_DefaultTags},
  58.  
  59.         {BUTTON_KIND,0,0,{0,0,0,0,"_Top", NULL, GID_NAMETOP,         
  60.                 PLACETEXT_IN}, NULL, GS_DefaultTags},
  61.  
  62.         {BUTTON_KIND,0,0,{0,0,0,0,"_Bottom", NULL, GID_NAMEBOTTOM,         
  63.                 PLACETEXT_IN}, NULL, GS_DefaultTags},
  64.  
  65.         {BUTTON_KIND,0,0,{0,0,0,0,"_OK", NULL, GID_NAMEOK,         
  66.                 PLACETEXT_IN}, NULL, GS_DefaultTags},
  67.  
  68.         {BUTTON_KIND,0,0,{0,0,0,0,"_Cancel", NULL, GID_NAMECANCEL,        
  69.                 PLACETEXT_IN}, NULL, GS_DefaultTags},
  70.  
  71. };
  72.  
  73. struct TagItem nameList[] =
  74. {
  75.         {GTLV_ShowSelected, &NAMEgadgetspecs[GID_NAMEEDIT]},
  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 *N_NameSpecs[] =
  85. {
  86.         &NAMEgadgetspecs[0],
  87.         &NAMEgadgetspecs[1],
  88.         &NAMEgadgetspecs[2],
  89.         &NAMEgadgetspecs[3],
  90.         &NAMEgadgetspecs[4],
  91.         &NAMEgadgetspecs[5],
  92.         &NAMEgadgetspecs[6],
  93.         &NAMEgadgetspecs[7],
  94.         &NAMEgadgetspecs[8],
  95.         &NAMEgadgetspecs[9],
  96.         NULL,
  97. };
  98.  
  99.  
  100. /* define the layout of this panel */
  101. ULONG N_NamePanel[] =
  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_NAMELIST,
  114.  
  115.                     GUIL_VertGroup,1,
  116.                             GUIL_Flags, GUILF_PropShare | GUILF_EqualWidth | GUILF_EqualHeight,
  117.                                               
  118.                 GUIL_GadgetSpecID, GID_NAMEUP,
  119.                 GUIL_GadgetSpecID, GID_NAMEDOWN,
  120.                 GUIL_GadgetSpecID, GID_NAMETOP,
  121.                 GUIL_GadgetSpecID, GID_NAMEBOTTOM,
  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_NAMEDEL,
  130.             GUIL_GadgetSpecID, GID_NAMENEW,
  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_NAMEOK,
  141.            GUIL_GadgetSpecID, GID_NAMECANCEL,
  142.            
  143.     TAG_DONE,   
  144.            
  145. TAG_DONE,
  146. };
  147.  
  148.  
  149. /****************************************************
  150. * NameGUI ()
  151. *
  152. *    Creates the GUI for the edit temp panel.
  153. *****************************************************/
  154. BOOL NameGUI(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(&tempnames);
  165.    DataCopyList(&namelist, &tempnames, NameNewEdit);
  166.  
  167.    updatename = FALSE;
  168.  
  169.         GF_SetGUIAttr(nameGUI, GUI_OpenGUI, TRUE, TAG_DONE);
  170.          /* grab window */
  171.          GF_GetGUIAttr(nameGUI,GUI_Window,&nameWin,TAG_DONE);
  172.         NameInit();
  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(&tempnames);
  204.                                         done = TRUE;
  205.                                         break;
  206.  
  207.                 case IDCMP_RAWKEY:
  208.                     if (GF_ProcessListView(nameGUI,N_NameSpecs[GID_NAMELIST],
  209.                         imsg,&ordinal)) {
  210.                             namelistActive = ordinal;
  211.                             NameDisableGads(FALSE);    
  212.                     }
  213.                     AmiHelpKey(imsg,NAME_PANEL);
  214.                     break;
  215.  
  216.                 case IDCMP_GADGETUP:
  217.                     noreply = FALSE;
  218.                     done=NameHandleGadget(imsg);
  219.                     break;
  220.                         }
  221.                                      
  222.                               
  223.                         if (noreply) GF_ReplyIMsg(imsg);
  224.                     }
  225.                 }
  226.  
  227.    
  228.    GF_SetGadgetAttrs(nameGUI,NAMEgadgetspecs[GID_NAMELIST].gs_Gadget,
  229.             GTLV_Labels, ~0,
  230.             TAG_DONE);
  231.    GF_SetGUIAttr(nameGUI, GUI_OpenGUI, FALSE, TAG_DONE);
  232.    if (updatename == TRUE) {
  233.          DataMoveList(&tempnames, &namelist);
  234.          NewList(&tempnames);
  235.    }
  236.  
  237.   AmiUnlock();
  238.   return (nameretval);
  239. }
  240.  
  241. /***************************************************
  242. * NameHandleGadget()
  243. *
  244. *    Handles gadget events for this panel
  245. ****************************************************/
  246. BOOL  NameHandleGadget(struct IntuiMessage *imsg)
  247. {
  248.  BOOL done = FALSE;
  249.  struct Gadget *gad = (struct Gadget *)(imsg->IAddress);
  250.  UWORD code = imsg->Code;
  251.  nameNode tempname;
  252.  nameNode *temp;
  253.  
  254.  switch (gad->GadgetID) {
  255.     
  256.     case GID_NAMELIST:
  257.         namelistActive = code;
  258.         NameDisableGads(FALSE);
  259.         break;
  260.  
  261.     case GID_NAMEEDIT:
  262.         if (namelistActive != ~0) {
  263.           if (DataIsUnique(nameGUI, &tempnames,((struct StringInfo*)gad->SpecialInfo)->Buffer,
  264.             TRUE,"Name name is not unique or invalid") ) {
  265.  
  266.             /* detach and modify this */
  267.             temp = (nameNode*)DataOrd2Node(&tempnames,namelistActive);
  268.             GF_SetGadgetAttrs(nameGUI,NAMEgadgetspecs[GID_NAMELIST].gs_Gadget,
  269.                 GTLV_Labels, ~0,
  270.                 TAG_DONE);
  271.             
  272.             strcpy(temp->nameStr, ((struct StringInfo*)gad->SpecialInfo)->Buffer);
  273.             GF_SetGadgetAttrs(nameGUI,NAMEgadgetspecs[GID_NAMELIST].gs_Gadget,
  274.                 GTLV_Labels, &tempnames,
  275.                 TAG_DONE);    
  276.           }
  277.           else {
  278.             DataSitNSpin(N_NameSpecs[GID_NAMEEDIT]->gs_Gadget,nameWin);
  279.             return (done);
  280.           }
  281.         }
  282.         break;
  283.  
  284.     case GID_NAMENEW:
  285.         strcpy(tempname.nameStr,"NEW:RENAME ME");
  286.         if (DataIsUnique(nameGUI, &tempnames,tempname.nameStr,TRUE,"You must rename the previous entry first")){
  287.             /* detach and modify list */
  288.             GF_SetGadgetAttrs(nameGUI,NAMEgadgetspecs[GID_NAMELIST].gs_Gadget,
  289.                 GTLV_Labels, ~0,
  290.                 TAG_DONE);
  291.             
  292.             temp=NameNewEdit(&tempnames,&tempname);
  293.             namelistActive = DataNode2Ord(&tempnames,temp->nameStr);
  294.                     
  295.             GF_SetGadgetAttrs(nameGUI,NAMEgadgetspecs[GID_NAMELIST].gs_Gadget,
  296.                 GTLV_Labels, &tempnames,
  297.                 GTLV_Selected, namelistActive,
  298.                 TAG_DONE);    
  299.  
  300.             NameDisableGads(FALSE);
  301.         }
  302.         break;
  303.  
  304.     case GID_NAMEDEL:
  305.         DataListRemove(nameGUI,NAMEgadgetspecs[GID_NAMELIST].gs_Gadget,
  306.             &tempnames, &namelistActive);
  307.  
  308.         /* disable up/down? */
  309.         if (IsListEmpty(&tempnames))
  310.             NameDisableGads(TRUE);
  311.         break;
  312.  
  313.     case GID_NAMEUP:
  314.         DataListUp(nameGUI,NAMEgadgetspecs[GID_NAMELIST].gs_Gadget,
  315.             &tempnames, &namelistActive);
  316.         break;
  317.  
  318.     case GID_NAMEDOWN:
  319.         DataListDown(nameGUI,NAMEgadgetspecs[GID_NAMELIST].gs_Gadget,
  320.             &tempnames, &namelistActive);
  321.         break;
  322.  
  323.     case GID_NAMETOP:
  324.         DataListTop(nameGUI,NAMEgadgetspecs[GID_NAMELIST].gs_Gadget,
  325.             &tempnames, &namelistActive,0);
  326.         break;
  327.  
  328.     case GID_NAMEBOTTOM:
  329.         DataListBottom(nameGUI,NAMEgadgetspecs[GID_NAMELIST].gs_Gadget,
  330.             &tempnames, &namelistActive,DataCountNodes(&tempnames));
  331.         break;
  332.  
  333.     case GID_NAMECANCEL:
  334.         DataFreeList(&tempnames);
  335.         done = TRUE;
  336.         break;
  337.  
  338.     case GID_NAMEOK:
  339.         amiChangedItems = TRUE;
  340.         updatename = done = TRUE;    
  341.         break;
  342.  }
  343.  
  344.  GF_ReplyIMsg(imsg);
  345.  return (done);
  346. }
  347.  
  348. /****************************************************
  349. * NameInit()
  350. *
  351. *    Set up some globals
  352. *****************************************************/
  353. void NameInit(void)
  354. {
  355.     nameretval = FALSE;
  356.     namelistActive = ~0;    
  357.  
  358.  /* grab window */
  359.  GF_GetGUIAttr(nameGUI,GUI_Window,&nameWin,TAG_DONE);
  360.  GF_SetGadgetAttrs(nameGUI,NAMEgadgetspecs[GID_NAMELIST].gs_Gadget,
  361.             GTLV_Labels, &tempnames,
  362.             GTLV_Selected,~0,
  363.             TAG_DONE);
  364.  NameDisableGads(TRUE);
  365. }
  366.  
  367. /****************************************************
  368. * NameDisableGads()
  369. *
  370. *    Disable/Enable extra gadgets
  371. *****************************************************/
  372. void NameDisableGads(BOOL dis)
  373. {
  374.  GF_SetGadgetAttrs(nameGUI,NAMEgadgetspecs[GID_NAMEDEL].gs_Gadget,
  375.     GA_Disabled, dis,
  376.     TAG_DONE);
  377.  
  378.  GF_SetGadgetAttrs(nameGUI,NAMEgadgetspecs[GID_NAMEUP].gs_Gadget,
  379.     GA_Disabled, dis,
  380.     TAG_DONE);
  381.  
  382.  GF_SetGadgetAttrs(nameGUI,NAMEgadgetspecs[GID_NAMEDOWN].gs_Gadget,
  383.     GA_Disabled, dis,
  384.     TAG_DONE);
  385.  
  386.  GF_SetGadgetAttrs(nameGUI,NAMEgadgetspecs[GID_NAMETOP].gs_Gadget,
  387.     GA_Disabled, dis,
  388.     TAG_DONE);
  389.  
  390.  GF_SetGadgetAttrs(nameGUI,NAMEgadgetspecs[GID_NAMEBOTTOM].gs_Gadget,
  391.     GA_Disabled, dis,
  392.     TAG_DONE);
  393. }
  394.  
  395. /*************************************************************
  396. * NameNewEdit()
  397. *
  398. *    Creates a new name node and places it at tail
  399. **************************************************************/
  400. nameNode *NameNewEdit(struct List *el,nameNode *m)
  401. {
  402.  nameNode *work;
  403.  
  404.  work = (nameNode *)AllocVec(sizeof(nameNode), MEMF_CLEAR);
  405.  strcpy(work->nameStr,m->nameStr);
  406.  work->node.ln_Name = work->nameStr;
  407.  AddTail((struct List *)el,(struct Node *)work);
  408.  return (work);
  409. }
  410.