home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
AmigActive 6
/
AACD06.ISO
/
AACD
/
Utilities
/
amiCheck
/
Source
/
memoPanel.c
< prev
next >
Wrap
C/C++ Source or Header
|
1998-06-11
|
11KB
|
411 lines
/* memoPanel.c
*
* defines the GUIFront characteristics of the memo panel
*/
#include <exec/types.h>
#include <exec/lists.h>
#include <exec/nodes.h>
#include <exec/memory.h>
#include <clib/exec_protos.h>
#include <clib/alib_protos.h>
#include <clib/intuition_protos.h>
#include <stdio.h>
#include <intuition/gadgetclass.h>
#include "amiCheck.h"
#include "dataBase.h"
#include "memoPanel.h"
#include "regGadget.h"
#include <string.h>
/* prototypes */
BOOL MemoHandleGadget(struct IntuiMessage *);
void MemoInit(void);
void MemoDisableGads(BOOL);
struct List tempmemos;
BOOL updatememo,memoretval;
ExtErrorData MemoExtData;
GUIFront *memoGUI;
UWORD memolistActive;
struct Window *memoWin;
BOOL updatememos = FALSE;
/* quick configure of some gadgets */
extern struct TagItem memoList[];
/* define gadgetspec */
GadgetSpec MEMOgadgetspecs[] =
{
{LISTVIEW_KIND,30,8, {0,0,0,0,NULL,NULL,GID_MEMOLIST,
PLACETEXT_ABOVE},memoList,GS_DefaultTags},
{BUTTON_KIND,0,0,{0,0,0,0,"_New", NULL, GID_MEMONEW,
PLACETEXT_IN}, NULL, GS_DefaultTags},
{BUTTON_KIND,0,0,{0,0,0,0,"_Remove", NULL, GID_MEMODEL,
PLACETEXT_IN}, NULL, GS_DefaultTags},
{STRING_KIND,20,0,{0,0,0,0,NULL, NULL, GID_MEMOEDIT,
PLACETEXT_IN}, NULL, GS_DefaultTags},
{BUTTON_KIND,0,0,{0,0,0,0,"_Up", NULL, GID_MEMOUP,
PLACETEXT_IN}, NULL, GS_DefaultTags},
{BUTTON_KIND,0,0,{0,0,0,0,"_Down", NULL, GID_MEMODOWN,
PLACETEXT_IN}, NULL, GS_DefaultTags},
{BUTTON_KIND,0,0,{0,0,0,0,"_Top", NULL, GID_MEMOTOP,
PLACETEXT_IN}, NULL, GS_DefaultTags},
{BUTTON_KIND,0,0,{0,0,0,0,"_Bottom", NULL, GID_MEMOBOTTOM,
PLACETEXT_IN}, NULL, GS_DefaultTags},
{BUTTON_KIND,0,0,{0,0,0,0,"_OK", NULL, GID_MEMOOK,
PLACETEXT_IN}, NULL, GS_DefaultTags},
{BUTTON_KIND,0,0,{0,0,0,0,"_Cancel", NULL, GID_MEMOCANCEL,
PLACETEXT_IN}, NULL, GS_DefaultTags},
};
struct TagItem memoList[] =
{
{GTLV_ShowSelected, &MEMOgadgetspecs[GID_MEMOEDIT]},
/*
{GTLV_Labels, ~0},
{GTLV_Selected,~0},
*/
{TAG_DONE},
};
/* set up array of pointers to our specs */
GadgetSpec *M_MemoSpecs[] =
{
&MEMOgadgetspecs[0],
&MEMOgadgetspecs[1],
&MEMOgadgetspecs[2],
&MEMOgadgetspecs[3],
&MEMOgadgetspecs[4],
&MEMOgadgetspecs[5],
&MEMOgadgetspecs[6],
&MEMOgadgetspecs[7],
&MEMOgadgetspecs[8],
&MEMOgadgetspecs[9],
NULL,
};
/* define the layout of this panel */
ULONG M_MemoPanel[] =
{
GUIL_Flags, GUILF_PropShare | GUILF_EqualWidth,
GUIL_HorizGroup, 1,
GUIL_Flags, GUILF_PropShare,
GUIL_FrameType, GUILFT_Recess,
GUIL_VertGroup, 1,
GUIL_HorizGroup,1,
GUIL_FrameType, GUILFT_Ridge,
GUIL_GadgetSpecID, GID_MEMOLIST,
GUIL_VertGroup,1,
GUIL_Flags, GUILF_PropShare | GUILF_EqualWidth | GUILF_EqualHeight,
GUIL_GadgetSpecID, GID_MEMOUP,
GUIL_GadgetSpecID, GID_MEMODOWN,
GUIL_GadgetSpecID, GID_MEMOTOP,
GUIL_GadgetSpecID, GID_MEMOBOTTOM,
TAG_DONE,
TAG_DONE,
GUIL_HorizGroup,1,
GUIL_FrameType, GUILFT_Ridge,
GUIL_Flags, GUILF_EqualSize | GUILF_EqualWidth,
GUIL_GadgetSpecID, GID_MEMODEL,
GUIL_GadgetSpecID, GID_MEMONEW,
TAG_DONE,
TAG_DONE,
TAG_DONE,
GUIL_HorizGroup,1,
GUIL_Flags, GUILF_EqualSize | GUILF_EqualWidth,
GUIL_GadgetSpecID, GID_MEMOOK,
GUIL_GadgetSpecID, GID_MEMOCANCEL,
TAG_DONE,
TAG_DONE,
};
/****************************************************
* MemoGUI ()
*
* Creates the GUI for the edit temp panel.
*****************************************************/
BOOL MemoGUI(void)
{
BOOL done = FALSE;
BOOL noreply;
UWORD ordinal;
ULONG signal;
AmiLock();
/* install temporary list */
NewList(&tempmemos);
DataCopyList(&memolist, &tempmemos, MemoNewEdit);
updatememo = FALSE;
GF_SetGUIAttr(memoGUI, GUI_OpenGUI, TRUE, TAG_DONE);
/* grab window */
GF_GetGUIAttr(memoGUI,GUI_Window,&memoWin,TAG_DONE);
MemoInit();
/* 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(&tempmemos);
done = TRUE;
break;
case IDCMP_RAWKEY:
if (GF_ProcessListView(memoGUI,M_MemoSpecs[GID_MEMOLIST],
imsg,&ordinal)) {
memolistActive = ordinal;
MemoDisableGads(FALSE);
}
else AmiHelpKey(imsg,MEMO_PANEL);
break;
case IDCMP_GADGETUP:
noreply = FALSE;
done=MemoHandleGadget(imsg);
break;
}
if (noreply) GF_ReplyIMsg(imsg);
}
}
GF_SetGadgetAttrs(memoGUI,MEMOgadgetspecs[GID_MEMOLIST].gs_Gadget,
GTLV_Labels, ~0,
TAG_DONE);
GF_SetGUIAttr(memoGUI, GUI_OpenGUI, FALSE, TAG_DONE);
if (updatememo == TRUE) {
DataMoveList(&tempmemos, &memolist);
NewList(&tempmemos);
}
AmiUnlock();
return (memoretval);
}
/***************************************************
* MemoHandleGadget()
*
* Handles gadget events for this panel
****************************************************/
BOOL MemoHandleGadget(struct IntuiMessage *imsg)
{
BOOL done = FALSE;
struct Gadget *gad = (struct Gadget *)(imsg->IAddress);
UWORD code = imsg->Code;
memoNode tempmemo;
memoNode *temp;
switch (gad->GadgetID) {
case GID_MEMOLIST:
memolistActive = code;
MemoDisableGads(FALSE);
break;
case GID_MEMOEDIT:
if (memolistActive != ~0) {
if (DataIsUnique(memoGUI, &tempmemos,((struct StringInfo*)gad->SpecialInfo)->Buffer,
TRUE,"Memo name is not unique or invalid") ) {
/* detach and modify this */
temp = (memoNode*)DataOrd2Node(&tempmemos,memolistActive);
GF_SetGadgetAttrs(memoGUI,MEMOgadgetspecs[GID_MEMOLIST].gs_Gadget,
GTLV_Labels, ~0,
TAG_DONE);
strcpy(temp->memoStr, ((struct StringInfo*)gad->SpecialInfo)->Buffer);
GF_SetGadgetAttrs(memoGUI,MEMOgadgetspecs[GID_MEMOLIST].gs_Gadget,
GTLV_Labels, &tempmemos,
TAG_DONE);
}
else {
GF_ReplyIMsg(imsg);
DataSitNSpin(M_MemoSpecs[GID_MEMOEDIT]->gs_Gadget,memoWin);
return (done);
}
}
break;
case GID_MEMONEW:
strcpy(tempmemo.memoStr,"NEW:RENAME ME");
if (DataIsUnique(memoGUI, &tempmemos,tempmemo.memoStr,TRUE,"You must rename the previous entry first")){
/* detach and modify list */
GF_SetGadgetAttrs(memoGUI,MEMOgadgetspecs[GID_MEMOLIST].gs_Gadget,
GTLV_Labels, ~0,
TAG_DONE);
temp=MemoNewEdit(&tempmemos,&tempmemo);
memolistActive = DataNode2Ord(&tempmemos,temp->memoStr);
GF_SetGadgetAttrs(memoGUI,MEMOgadgetspecs[GID_MEMOLIST].gs_Gadget,
GTLV_Labels, &tempmemos,
GTLV_Selected, memolistActive,
TAG_DONE);
MemoDisableGads(FALSE);
}
break;
case GID_MEMODEL:
DataListRemove(memoGUI,MEMOgadgetspecs[GID_MEMOLIST].gs_Gadget,
&tempmemos, &memolistActive);
/* disable up/down? */
if (IsListEmpty(&tempmemos))
MemoDisableGads(TRUE);
break;
case GID_MEMOUP:
DataListUp(memoGUI,MEMOgadgetspecs[GID_MEMOLIST].gs_Gadget,
&tempmemos, &memolistActive);
break;
case GID_MEMODOWN:
DataListDown(memoGUI,MEMOgadgetspecs[GID_MEMOLIST].gs_Gadget,
&tempmemos, &memolistActive);
break;
case GID_MEMOTOP:
DataListTop(memoGUI,MEMOgadgetspecs[GID_MEMOLIST].gs_Gadget,
&tempmemos, &memolistActive,0);
break;
case GID_MEMOBOTTOM:
DataListBottom(memoGUI,MEMOgadgetspecs[GID_MEMOLIST].gs_Gadget,
&tempmemos, &memolistActive, DataCountNodes(&tempmemos));
break;
case GID_MEMOCANCEL:
DataFreeList(&tempmemos);
done = TRUE;
break;
case GID_MEMOOK:
amiChangedItems = TRUE;
updatememo = done = TRUE;
break;
}
GF_ReplyIMsg(imsg);
return (done);
}
/****************************************************
* MemoInit()
*
* Set up some globals
*****************************************************/
void MemoInit(void)
{
memoretval = FALSE;
memolistActive = ~0;
/* grab window */
GF_GetGUIAttr(memoGUI,GUI_Window,&memoWin,TAG_DONE);
GF_SetGadgetAttrs(memoGUI,MEMOgadgetspecs[GID_MEMOLIST].gs_Gadget,
GTLV_Labels, &tempmemos,
GTLV_Selected,~0,
TAG_DONE);
MemoDisableGads(TRUE);
}
/****************************************************
* MemoDisableGads()
*
* Disable/Enable extra gadgets
*****************************************************/
void MemoDisableGads(BOOL dis)
{
GF_SetGadgetAttrs(memoGUI,MEMOgadgetspecs[GID_MEMODEL].gs_Gadget,
GA_Disabled, dis,
TAG_DONE);
GF_SetGadgetAttrs(memoGUI,MEMOgadgetspecs[GID_MEMOUP].gs_Gadget,
GA_Disabled, dis,
TAG_DONE);
GF_SetGadgetAttrs(memoGUI,MEMOgadgetspecs[GID_MEMODOWN].gs_Gadget,
GA_Disabled, dis,
TAG_DONE);
GF_SetGadgetAttrs(memoGUI,MEMOgadgetspecs[GID_MEMOTOP].gs_Gadget,
GA_Disabled, dis,
TAG_DONE);
GF_SetGadgetAttrs(memoGUI,MEMOgadgetspecs[GID_MEMOBOTTOM].gs_Gadget,
GA_Disabled, dis,
TAG_DONE);
}
/*************************************************************
* MemoNewEdit()
*
* Creates a new memo node and places it at tail
**************************************************************/
memoNode *MemoNewEdit(struct List *el,memoNode *m)
{
memoNode *work;
work = (memoNode *)AllocVec(sizeof(memoNode), MEMF_CLEAR);
strcpy(work->memoStr,m->memoStr);
work->node.ln_Name = work->memoStr;
AddTail((struct List *)el,(struct Node *)work);
return (work);
}