home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
AmigActive 6
/
AACD06.ISO
/
AACD
/
Utilities
/
amiCheck
/
Source
/
categoryPanel.c
< prev
next >
Wrap
C/C++ Source or Header
|
1998-06-11
|
17KB
|
629 lines
/* categoryPanel.c
*
* defines the GUIFront characteristics of the category panel
*/
#include <stdio.h>
#include <intuition/gadgetclass.h>
#include "amiCheck.h"
#include "regGadget.h"
#include "dataBase.h"
#include "categoryPanel.h"
#include "groupPanel.h"
#include <string.h>
/* prototypes */
BOOL CatHandleGadget(struct IntuiMessage *);
void CatInit(void);
void CatDisableGads(BOOL);
void CatDisableBGads(BOOL);
struct List tempcats;
struct List tempgroups;
BOOL catretval;
ExtErrorData CatExtData;
GUIFront *catGUI;
UWORD catlistActive;
UWORD grouplistActive;
struct Window *catWin;
BOOL updatecats = FALSE;
/* quick configure of some gadgets */
extern struct TagItem catList[], budgetList[];
/* define gadgetspec */
GadgetSpec CPgadgetspecs[] =
{
{LISTVIEW_KIND,25,8, {0,0,0,0,NULL,NULL,GID_CPCATLIST,
PLACETEXT_ABOVE},catList,GS_DefaultTags},
{BUTTON_KIND,0,0,{0,0,0,0,"_New", NULL, GID_CPNEW,
PLACETEXT_IN}, NULL, GS_DefaultTags},
{BUTTON_KIND,0,0,{0,0,0,0,"_Remove", NULL, GID_CPDEL,
PLACETEXT_IN}, NULL, GS_DefaultTags},
{STRING_KIND,20,0,{0,0,0,0,NULL, NULL, GID_CPEDIT,
PLACETEXT_IN}, NULL, GS_DefaultTags},
{BUTTON_KIND,0,0,{0,0,0,0,"_Up", NULL, GID_CPUP,
PLACETEXT_IN}, NULL, GS_DefaultTags},
{BUTTON_KIND,0,0,{0,0,0,0,"_Down", NULL, GID_CPDOWN,
PLACETEXT_IN}, NULL, GS_DefaultTags},
{BUTTON_KIND,0,0,{0,0,0,0,"_Top", NULL, GID_CPTOP,
PLACETEXT_IN}, NULL, GS_DefaultTags},
{BUTTON_KIND,0,0,{0,0,0,0,"_Bottom", NULL, GID_CPBOTTOM,
PLACETEXT_IN}, NULL, GS_DefaultTags},
{BUTTON_KIND,0,0,{0,0,0,0,"_OK", NULL, GID_CPOK,
PLACETEXT_IN}, NULL, GS_DefaultTags},
{BUTTON_KIND,0,0,{0,0,0,0,"_Cancel", NULL, GID_CPCANCEL,
PLACETEXT_IN}, NULL, GS_DefaultTags},
{LISTVIEW_KIND,25,8, {0,0,0,0,NULL,NULL,GID_CPBUDGETLIST,
PLACETEXT_ABOVE},budgetList,GS_DefaultTags},
{BUTTON_KIND,0,0,{0,0,0,0,"New", NULL, GID_CPBNEW,
PLACETEXT_IN}, NULL, GS_DefaultTags},
{BUTTON_KIND,0,0,{0,0,0,0,"Remove", NULL, GID_CPBDEL,
PLACETEXT_IN}, NULL, GS_DefaultTags},
{STRING_KIND,20,0,{0,0,0,0,NULL, NULL, GID_CPBEDIT,
PLACETEXT_IN}, NULL, GS_DefaultTags},
{BUTTON_KIND,0,0,{0,0,0,0,"Up", NULL, GID_CPBUP,
PLACETEXT_IN}, NULL, GS_DefaultTags},
{BUTTON_KIND,0,0,{0,0,0,0,"Down", NULL, GID_CPBDOWN,
PLACETEXT_IN}, NULL, GS_DefaultTags},
{BUTTON_KIND,0,0,{0,0,0,0,"Top", NULL, GID_CPBTOP,
PLACETEXT_IN}, NULL, GS_DefaultTags},
{BUTTON_KIND,0,0,{0,0,0,0,"Bottom", NULL, GID_CPBBOTTOM,
PLACETEXT_IN}, NULL, GS_DefaultTags},
{BUTTON_KIND,0,0,{0,0,0,0,"Edit", NULL, GID_CPBBUILD,
PLACETEXT_IN}, NULL, GS_DefaultTags},
};
struct TagItem catList[] =
{
{GTLV_ShowSelected, &CPgadgetspecs[GID_CPEDIT]},
{TAG_DONE},
};
struct TagItem budgetList[] =
{
{GTLV_ShowSelected, &CPgadgetspecs[GID_CPBEDIT]},
{TAG_DONE},
};
/* set up array of pointers to our specs */
GadgetSpec *CP_CatSpecs[] =
{
&CPgadgetspecs[0],
&CPgadgetspecs[1],
&CPgadgetspecs[2],
&CPgadgetspecs[3],
&CPgadgetspecs[4],
&CPgadgetspecs[5],
&CPgadgetspecs[6],
&CPgadgetspecs[7],
&CPgadgetspecs[8],
&CPgadgetspecs[9],
&CPgadgetspecs[10],
&CPgadgetspecs[11],
&CPgadgetspecs[12],
&CPgadgetspecs[13],
&CPgadgetspecs[14],
&CPgadgetspecs[15],
&CPgadgetspecs[16],
&CPgadgetspecs[17],
&CPgadgetspecs[18],
NULL,
};
/* define the layout of this panel */
ULONG CP_CatPanel[] =
{
GUIL_Flags, GUILF_PropShare | GUILF_EqualWidth,
GUIL_HorizGroup, 1,
GUIL_Flags, GUILF_PropShare,
GUIL_FrameType, GUILFT_Recess,
GUIL_HorizGroup,1,
GUIL_VertGroup, 1,
GUIL_HorizGroup,1,
GUIL_FrameType, GUILFT_Ridge,
GUIL_FrameHeadline, "Categories",
GUIL_GadgetSpecID, GID_CPCATLIST,
GUIL_VertGroup,1,
GUIL_Flags, GUILF_PropShare | GUILF_EqualWidth | GUILF_EqualHeight,
GUIL_GadgetSpecID, GID_CPUP,
GUIL_GadgetSpecID, GID_CPDOWN,
GUIL_GadgetSpecID, GID_CPTOP,
GUIL_GadgetSpecID, GID_CPBOTTOM,
TAG_DONE,
TAG_DONE,
GUIL_HorizGroup,1,
GUIL_FrameType, GUILFT_Ridge,
GUIL_Flags, GUILF_EqualSize | GUILF_EqualWidth,
GUIL_GadgetSpecID, GID_CPDEL,
GUIL_GadgetSpecID, GID_CPNEW,
TAG_DONE,
TAG_DONE,
GUIL_VertGroup, 1,
GUIL_HorizGroup,1,
GUIL_FrameType, GUILFT_Ridge,
GUIL_FrameHeadline, "Budget Groups",
GUIL_GadgetSpecID, GID_CPBUDGETLIST,
GUIL_VertGroup,1,
GUIL_Flags, GUILF_PropShare | GUILF_EqualWidth | GUILF_EqualHeight,
GUIL_GadgetSpecID, GID_CPBUP,
GUIL_GadgetSpecID, GID_CPBDOWN,
GUIL_GadgetSpecID, GID_CPBTOP,
GUIL_GadgetSpecID, GID_CPBBOTTOM,
TAG_DONE,
TAG_DONE,
GUIL_HorizGroup,1,
GUIL_FrameType, GUILFT_Ridge,
GUIL_Flags, GUILF_EqualSize | GUILF_EqualWidth,
GUIL_GadgetSpecID, GID_CPBDEL,
GUIL_GadgetSpecID, GID_CPBBUILD,
GUIL_GadgetSpecID, GID_CPBNEW,
TAG_DONE,
TAG_DONE,
TAG_DONE,
TAG_DONE,
GUIL_HorizGroup,1,
GUIL_Flags, GUILF_EqualSize | GUILF_EqualWidth,
GUIL_GadgetSpecID, GID_CPOK,
GUIL_GadgetSpecID, GID_CPCANCEL,
TAG_DONE,
TAG_DONE,
};
/****************************************************
* CatGUI ()
*
* Creates the GUI for the edit temp panel.
*****************************************************/
BOOL CatGUI(void)
{
BOOL done = FALSE;
BOOL noreply;
UWORD ordinal;
ULONG signal;
AmiLock();
/* install temporary list */
NewList(&tempcats);
NewList(&tempgroups);
DataCopyGroupList(&grouplist, &tempgroups);
DataCopyCatList(&tempcats,&categories);
updatecats = FALSE;
GF_SetGUIAttr(catGUI, GUI_OpenGUI, TRUE, TAG_DONE);
/* grab window */
GF_GetGUIAttr(catGUI,GUI_Window,&catWin,TAG_DONE);
CatInit();
/* 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:
DataFreeList(&tempcats);
DataFreeGroupCats(&tempgroups);
DataFreeList(&tempgroups);
NewList(&tempcats);
NewList(&tempgroups);
done = TRUE;
break;
case IDCMP_RAWKEY:
if (GF_ProcessListView(catGUI,CP_CatSpecs[GID_CPCATLIST],
imsg,&ordinal)) {
catlistActive = ordinal;
if (catlistActive >= DEFAULT_CATS)
CatDisableGads(FALSE);
else if (catlistActive < DEFAULT_TEMPS)
CatDisableGads(TRUE);
}
else AmiHelpKey(imsg,CAT_PANEL);
break;
case IDCMP_GADGETUP:
noreply = FALSE;
done=CatHandleGadget(imsg);
break;
}
if (noreply) GF_ReplyIMsg(imsg);
}
}
GF_SetGadgetAttrs(catGUI,CPgadgetspecs[GID_CPCATLIST].gs_Gadget,
GTLV_Labels, ~0,
TAG_DONE);
GF_SetGadgetAttrs(catGUI,CPgadgetspecs[GID_CPBUDGETLIST].gs_Gadget,
GTLV_Labels, ~0,
TAG_DONE);
GF_SetGUIAttr(catGUI, GUI_OpenGUI, FALSE, TAG_DONE);
if (updatecats == TRUE) {
DataCopyGroupList(&tempgroups, &grouplist);
DataMoveCatList(&tempcats);
NewList(&tempcats);
NewList(&tempgroups);
}
AmiUnlock();
return (catretval);
}
/***************************************************
* CatHandleGadget()
*
* Handles gadget events for this panel
****************************************************/
BOOL CatHandleGadget(struct IntuiMessage *imsg)
{
BOOL done = FALSE;
struct Gadget *gad = (struct Gadget *)(imsg->IAddress);
UWORD tempOrd,code = imsg->Code;
categoryNode tempcat;
groupNode tempgroup, *groupPtr;
editCatNode *temp;
switch (gad->GadgetID) {
case GID_CPCATLIST:
catlistActive = code;
if (catlistActive >= DEFAULT_CATS)
CatDisableGads(FALSE);
else CatDisableGads(TRUE);
break;
case GID_CPEDIT:
if (catlistActive >= DEFAULT_CATS) {
if (DataIsUnique(catGUI, &tempcats,((struct StringInfo*)gad->SpecialInfo)->Buffer,
TRUE,"Category name is not unique or invalid") ) {
/* detach and modify this */
temp = (editCatNode*)DataOrd2Node(&tempcats,catlistActive);
GF_SetGadgetAttrs(catGUI,CPgadgetspecs[GID_CPCATLIST].gs_Gadget,
GTLV_Labels, ~0,
TAG_DONE);
strcpy(temp->new.catname, ((struct StringInfo*)gad->SpecialInfo)->Buffer);
/* now modify our group list */
DataReplaceGroupCats(&tempgroups, &tempcats);
GF_SetGadgetAttrs(catGUI,CPgadgetspecs[GID_CPCATLIST].gs_Gadget,
GTLV_Labels, &tempcats,
TAG_DONE);
}
else {
GF_ReplyIMsg(imsg);
DataSitNSpin(CP_CatSpecs[GID_CPEDIT]->gs_Gadget,catWin);
return (done);
}
}
break;
case GID_CPNEW:
strcpy(tempcat.catname,"NEW:RENAME ME");
if (DataIsUnique(catGUI, &tempcats,tempcat.catname,TRUE,"You must rename the previous entry first")){
/* detach and modify list */
GF_SetGadgetAttrs(catGUI,CPgadgetspecs[GID_CPCATLIST].gs_Gadget,
GTLV_Labels, ~0,
TAG_DONE);
temp=DataNewEditCat(&tempcats,&tempcat);
catlistActive = DataNode2Ord(&tempcats,temp->new.catname);
GF_SetGadgetAttrs(catGUI,CPgadgetspecs[GID_CPCATLIST].gs_Gadget,
GTLV_Labels, &tempcats,
GTLV_Selected, catlistActive,
GTLV_MakeVisible, catlistActive,
TAG_DONE);
CatDisableGads(FALSE);
}
break;
case GID_CPDEL:
DataListRemove(catGUI, CPgadgetspecs[GID_CPCATLIST].gs_Gadget,
&tempcats, &catlistActive);
/* now modify our group list */
DataReplaceGroupCats(&tempgroups, &tempcats);
if (catlistActive < DEFAULT_CATS)
CatDisableGads(TRUE);
break;
case GID_CPUP:
if (catlistActive <= DEFAULT_CATS) break;
DataListUp(catGUI,CPgadgetspecs[GID_CPCATLIST].gs_Gadget,
&tempcats, &catlistActive);
break;
case GID_CPDOWN:
DataListDown(catGUI,CPgadgetspecs[GID_CPCATLIST].gs_Gadget,
&tempcats, &catlistActive);
break;
case GID_CPTOP:
DataListTop(catGUI,CPgadgetspecs[GID_CPCATLIST].gs_Gadget,
&tempcats, &catlistActive, DEFAULT_CATS);
break;
case GID_CPBOTTOM:
DataListBottom(catGUI,CPgadgetspecs[GID_CPCATLIST].gs_Gadget,
&tempcats, &catlistActive, DataCountNodes(&tempcats));
break;
case GID_CPBUDGETLIST:
grouplistActive = code;
CatDisableBGads(FALSE);
break;
case GID_CPBEDIT:
if (grouplistActive == ~0)
break;
if (DataIsUnique(catGUI, &tempgroups,((struct StringInfo*)gad->SpecialInfo)->Buffer,
TRUE,"Group name is not unique or invalid") ) {
/* detach and modify this */
groupPtr = (groupNode*)DataOrd2Node(&tempgroups,grouplistActive);
GF_SetGadgetAttrs(catGUI,CPgadgetspecs[GID_CPBUDGETLIST].gs_Gadget,
GTLV_Labels, ~0,
TAG_DONE);
strcpy(groupPtr->groupname, ((struct StringInfo*)gad->SpecialInfo)->Buffer);
GF_SetGadgetAttrs(catGUI,CPgadgetspecs[GID_CPBUDGETLIST].gs_Gadget,
GTLV_Labels, &tempgroups,
TAG_DONE);
}
else {
GF_ReplyIMsg(imsg);
DataSitNSpin(CP_CatSpecs[GID_CPBEDIT]->gs_Gadget,catWin);
return (done);
}
break;
case GID_CPBNEW:
strcpy(tempgroup.groupname,"NEW:RENAME ME");
if (DataIsUnique(catGUI, &tempgroups,tempgroup.groupname,TRUE,"You must rename the previous entry first")){
/* detach and modify list */
GF_SetGadgetAttrs(catGUI,CPgadgetspecs[GID_CPBUDGETLIST].gs_Gadget,
GTLV_Labels, ~0,
TAG_DONE);
groupPtr=DataNewGroup(&tempgroups,&tempgroup);
grouplistActive = DataNode2Ord(&tempgroups,groupPtr->groupname);
GF_SetGadgetAttrs(catGUI,CPgadgetspecs[GID_CPBUDGETLIST].gs_Gadget,
GTLV_Labels, &tempgroups,
GTLV_Selected, grouplistActive,
GTLV_MakeVisible, grouplistActive,
TAG_DONE);
CatDisableBGads(FALSE);
}
break;
case GID_CPBDEL:
/* first strip away group categories */
groupPtr = (groupNode *)DataOrd2Node(&tempgroups,grouplistActive);
DataFreeGroupCats(&groupPtr->catlist);
/* now free up this node */
DataListRemove(catGUI, CPgadgetspecs[GID_CPBUDGETLIST].gs_Gadget,
&tempgroups, &grouplistActive);
if (grouplistActive < 0)
CatDisableBGads(TRUE);
break;
case GID_CPBUP:
DataListUp(catGUI,CPgadgetspecs[GID_CPBUDGETLIST].gs_Gadget,
&tempgroups, &grouplistActive);
break;
case GID_CPBDOWN:
DataListDown(catGUI,CPgadgetspecs[GID_CPBUDGETLIST].gs_Gadget,
&tempgroups, &grouplistActive);
break;
case GID_CPBTOP:
DataListTop(catGUI,CPgadgetspecs[GID_CPBUDGETLIST].gs_Gadget,
&tempgroups, &grouplistActive, 0);
break;
case GID_CPBBOTTOM:
DataListBottom(catGUI,CPgadgetspecs[GID_CPBUDGETLIST].gs_Gadget,
&tempgroups, &grouplistActive, DataCountNodes(&tempgroups));
break;
case GID_CPBBUILD:
/* lock this window */
GF_LockGUI(catGUI);
groupPtr = (groupNode *)DataOrd2Node(&tempgroups,grouplistActive);
GroupGUI(&tempcats,&groupPtr->catlist);
/* unlock this window */
GF_UnlockGUI(catGUI);
break;
case GID_CPCANCEL:
DataFreeList(&tempcats);
DataFreeGroupCats(&tempgroups);
DataFreeList(&tempgroups);
NewList(&tempcats);
NewList(&tempgroups);
done = TRUE;
break;
case GID_CPOK:
amiChangedItems = TRUE;
updatecats = done = TRUE;
break;
}
GF_ReplyIMsg(imsg);
return (done);
}
/****************************************************
* CatInit()
*
* Set up some globals
*****************************************************/
void CatInit(void)
{
catretval = FALSE;
catlistActive = ~0;
grouplistActive = ~0;
/* grab window */
GF_GetGUIAttr(catGUI,GUI_Window,&catWin,TAG_DONE);
GF_SetGadgetAttrs(catGUI,CPgadgetspecs[GID_CPCATLIST].gs_Gadget,
GTLV_Labels, &tempcats,
GTLV_Selected,~0,
TAG_DONE);
GF_SetGadgetAttrs(catGUI,CPgadgetspecs[GID_CPBUDGETLIST].gs_Gadget,
GTLV_Labels, &tempgroups,
GTLV_Selected,~0,
TAG_DONE);
CatDisableGads(TRUE);
CatDisableBGads(TRUE);
}
/****************************************************
* CatDisableGads()
*
* Disable/Enable extra gadgets
*****************************************************/
void CatDisableGads(BOOL dis)
{
GF_SetGadgetAttrs(catGUI,CPgadgetspecs[GID_CPDEL].gs_Gadget,
GA_Disabled, dis,
TAG_DONE);
GF_SetGadgetAttrs(catGUI,CPgadgetspecs[GID_CPUP].gs_Gadget,
GA_Disabled, dis,
TAG_DONE);
GF_SetGadgetAttrs(catGUI,CPgadgetspecs[GID_CPDOWN].gs_Gadget,
GA_Disabled, dis,
TAG_DONE);
GF_SetGadgetAttrs(catGUI,CPgadgetspecs[GID_CPTOP].gs_Gadget,
GA_Disabled, dis,
TAG_DONE);
GF_SetGadgetAttrs(catGUI,CPgadgetspecs[GID_CPBOTTOM].gs_Gadget,
GA_Disabled, dis,
TAG_DONE);
}
/****************************************************
* CatDisableBGads()
*
* Disable/Enable extra gadgets
*****************************************************/
void CatDisableBGads(BOOL dis)
{
GF_SetGadgetAttrs(catGUI,CPgadgetspecs[GID_CPBDEL].gs_Gadget,
GA_Disabled, dis,
TAG_DONE);
GF_SetGadgetAttrs(catGUI,CPgadgetspecs[GID_CPBUP].gs_Gadget,
GA_Disabled, dis,
TAG_DONE);
GF_SetGadgetAttrs(catGUI,CPgadgetspecs[GID_CPBDOWN].gs_Gadget,
GA_Disabled, dis,
TAG_DONE);
GF_SetGadgetAttrs(catGUI,CPgadgetspecs[GID_CPBTOP].gs_Gadget,
GA_Disabled, dis,
TAG_DONE);
GF_SetGadgetAttrs(catGUI,CPgadgetspecs[GID_CPBBOTTOM].gs_Gadget,
GA_Disabled, dis,
TAG_DONE);
GF_SetGadgetAttrs(catGUI,CPgadgetspecs[GID_CPBBUILD].gs_Gadget,
GA_Disabled, dis,
TAG_DONE);
}