home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
AmigActive 6
/
AACD06.ISO
/
AACD
/
Utilities
/
amiCheck
/
Source
/
groupPanel.c
< prev
next >
Wrap
C/C++ Source or Header
|
1998-06-11
|
6KB
|
269 lines
/* 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);
}