home *** CD-ROM | disk | FTP | other *** search
- /* groupPanel.c
- *
- * defines the GUIFront characteristics of the group panel
- */
-
- #include <stdio.h>
- #include <intuition/gadgetclass.h>
- #include <exec/memory.h>
- #include <clib/exec_protos.h>
- #include <clib/asl_protos.h>
- #include <libraries/asl.h>
-
- #include "amiCheck.h"
- #include "dataBase.h"
- #include "groupPanel.h"
- #include <string.h>
-
-
- /* prototypes */
- BOOL GroupHandleGadget(struct IntuiMessage *);
- BOOL GroupInit(void);
-
- static BOOL newgroup;
- static struct Window *groupWin;
- static struct List groupList;
- static struct List *cats;
- ExtErrorData GroupExtData;
- GUIFront *groupGUI;
-
- /* quick configure of some gadgets */
-
- /* define gadgetspec */
- GadgetSpec GRPgadgetspecs[] =
- {
- {LISTVIEW_KIND,25,8, {0,0,0,0,NULL,NULL,GID_GRPMAINLIST,
- PLACETEXT_ABOVE},ListView,GS_DefaultTags},
-
- {LISTVIEW_KIND,25,8, {0,0,0,0,NULL,NULL,GID_GRPLIST,
- PLACETEXT_ABOVE},ListView,GS_DefaultTags},
-
- {BUTTON_KIND,0,0,{0,0,0,0,"_OK", NULL, GID_GRPOK,
- PLACETEXT_IN}, NULL, GS_DefaultTags},
-
- {BUTTON_KIND,0,0,{0,0,0,0,"_Cancel", NULL, GID_GRPCANCEL,
- PLACETEXT_IN}, NULL, GS_DefaultTags},
- };
-
- /* set up array of pointers to our specs */
- GadgetSpec *GRP_GroupSpecs[] =
- {
- &GRPgadgetspecs[0],
- &GRPgadgetspecs[1],
- &GRPgadgetspecs[2],
- &GRPgadgetspecs[3],
- NULL,
- };
-
- /* define the layout of this panel */
- ULONG GRP_GroupPanel[] =
- {
- GUIL_Flags, GUILF_PropShare | GUILF_EqualWidth,
-
- GUIL_HorizGroup, 1,
- GUIL_Flags, GUILF_PropShare,
- GUIL_FrameType, GUILFT_Recess,
-
- GUIL_VertGroup, 1,
-
- GUIL_HorizGroup,1,
-
- GUIL_HorizGroup,1,
- GUIL_FrameType, GUILFT_Ridge,
- GUIL_FrameHeadline, "Categories",
-
- GUIL_GadgetSpecID, GID_GRPMAINLIST,
- TAG_DONE,
-
- GUIL_HorizGroup,1,
-
- GUIL_FrameType, GUILFT_Ridge,
- GUIL_FrameHeadline, "Group List",
-
- GUIL_GadgetSpecID, GID_GRPLIST,
-
- TAG_DONE,
-
- TAG_DONE,
-
- TAG_DONE,
-
- TAG_DONE,
-
- GUIL_HorizGroup,1,
- GUIL_Flags, GUILF_EqualSize | GUILF_EqualWidth,
-
- GUIL_GadgetSpecID, GID_GRPOK,
- GUIL_GadgetSpecID, GID_GRPCANCEL,
-
- TAG_DONE,
-
- TAG_DONE,
- };
-
-
- /****************************************************
- * GroupGUI ()
- *
- * Creates the GUI for the group panel.
- *****************************************************/
- void GroupGUI(struct List *catlist, struct List *groupcats)
- {
- BOOL done = FALSE;
- BOOL noreply;
- UWORD ordinal;
- ULONG signal;
-
- newgroup = FALSE;
-
- AmiLock();
-
- cats = catlist;
- NewList(&groupList);
- DataCopyList(groupcats, &groupList, DataAddCat);
-
- GF_SetGUIAttr(groupGUI, GUI_OpenGUI, TRUE, TAG_DONE);
- /* grab window */
- GF_GetGUIAttr(groupGUI,GUI_Window,&groupWin,TAG_DONE);
- if (!GroupInit())
- done = TRUE;
-
-
- /* Process input events */
- while (!done)
- {
- struct IntuiMessage *imsg;
-
- /* Wait for an event to occur */
-
- signal = GF_Wait(guiapp,AmigaGuideSignal(agc));
- if (signal & AmigaGuideSignal(agc)) {
- AmiHelpMsg();
- continue;
- }
-
-
- /* We only bother to listen for CLOSEWINDOW events.
- * Of course, in a real application, you would be
- * examining the Class field for IDCMP_GADGETUP
- * messages and act accordingly.
- */
-
- while (imsg = GF_GetIMsg(guiapp))
- {
- noreply = TRUE;
- switch (imsg->Class) {
- case IDCMP_REFRESHWINDOW:
- RegRefresh(TRUE);
- break;
-
- case IDCMP_CLOSEWINDOW:
- done = TRUE;
- break;
-
- case IDCMP_GADGETUP:
- noreply = FALSE;
- done=GroupHandleGadget(imsg);
- break;
-
- case IDCMP_RAWKEY:
- AmiHelpKey(imsg,GROUP_PANEL);
- break;
- }
-
-
- if (noreply) GF_ReplyIMsg(imsg);
- }
- }
-
- GF_SetGadgetAttrs(groupGUI,GRPgadgetspecs[GID_GRPLIST].gs_Gadget,
- GTLV_Labels, ~0,
- TAG_DONE);
-
- GF_SetGadgetAttrs(groupGUI,GRPgadgetspecs[GID_GRPMAINLIST].gs_Gadget,
- GTLV_Labels, ~0,
- TAG_DONE);
-
- GF_SetGUIAttr(groupGUI, GUI_OpenGUI, FALSE, TAG_DONE);
-
- /* Copy list back...? */
- if (newgroup == TRUE)
- DataMoveList(&groupList,groupcats);
- else DataFreeList(&groupList);
-
- AmiUnlock();
- return;
- }
-
- /***************************************************
- * GroupHandleGadget()
- *
- * Handles gadget events for this panel
- ****************************************************/
- BOOL GroupHandleGadget(struct IntuiMessage *imsg)
- {
- BOOL done = FALSE;
- struct Gadget *gad = (struct Gadget *)(imsg->IAddress);
- UWORD code = imsg->Code;
- categoryNode *temp;
-
- switch (gad->GadgetID) {
-
- case GID_GRPLIST:
- DataListRemove(groupGUI,GRPgadgetspecs[GID_GRPLIST].gs_Gadget,&groupList,&code);
- break;
-
- case GID_GRPMAINLIST:
- temp = (categoryNode *)DataOrd2Node(cats,code);
- if (DataIsUnique(groupGUI,&groupList,temp->catname,TRUE,"Category is alreay a member.")) {
- GF_SetGadgetAttrs(groupGUI,GRPgadgetspecs[GID_GRPLIST].gs_Gadget,
- GTLV_Labels, ~0,
- TAG_DONE);
-
- DataAddCat(&groupList,temp);
-
- GF_SetGadgetAttrs(groupGUI,GRPgadgetspecs[GID_GRPLIST].gs_Gadget,
- GTLV_Labels, &groupList,
- GTLV_MakeVisible,DataCountNodes(&groupList)-1,
- TAG_DONE);
- }
- break;
-
- case GID_GRPOK:
- done = TRUE;
- /* copy stuff into new.. */
- newgroup = TRUE;
- break;
-
- case GID_GRPCANCEL:
- done = TRUE;
- break;
-
- }
-
- GF_ReplyIMsg(imsg);
- return (done);
- }
-
- /****************************************************
- * GroupInit()
- *
- * Set up some globals
- *****************************************************/
- BOOL GroupInit(void)
- {
-
- GF_SetGadgetAttrs(groupGUI,GRPgadgetspecs[GID_GRPMAINLIST].gs_Gadget,
- GTLV_Labels, cats,
- GTLV_Selected,~0,
- TAG_DONE);
-
- GF_SetGadgetAttrs(groupGUI,GRPgadgetspecs[GID_GRPLIST].gs_Gadget,
- GTLV_Labels, &groupList,
- GTLV_Selected,~0,
- TAG_DONE);
-
-
- return (TRUE);
- }
-