home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Frozen Fish 1: Amiga
/
FrozenFish-Apr94.iso
/
bbs
/
alib
/
d5xx
/
d547
/
powersource.lha
/
PowerSource
/
source.lzh
/
source
/
Med.c
< prev
next >
Wrap
C/C++ Source or Header
|
1991-09-15
|
16KB
|
530 lines
/*----------------------------------------------------------------------*
Med.c version 3.0 - © Copyright 1991 Jaba Development
Author : Jan van den Baard
Purpose: The editing of menus.
*----------------------------------------------------------------------*/
/*---------------------------------------------------*
Gadgets created with GadgetEd V2.5
which is (c) Copyright 1990-91 by Jaba Development
written by Jan van den Baard
*---------------------------------------------------*/
static SHORT Border0_pairs[] = {
-1,-1,266,-1,266,85,-1,85,-1,-1 };
static SHORT Border1_pairs[] = {
-1,-1,266,-1,266,9,-1,9,-1,-1 };
static struct Border Border_bord[] = {
3,2,0,0,JAM1,5,(SHORT *)&Border0_pairs,&Border_bord[1],
3,2,0,0,JAM1,5,(SHORT *)&Border1_pairs,NULL };
static struct IntuiText Render_text = {
0,1,JAM1,100,3,NULL,(UBYTE *)"Edit Menu",NULL };
static SHORT FORMAT_pairs0[] = {
-1,-1,124,-1,124,9,-1,9,-1,-1 };
static struct Border FORMAT_bord = {
0,0,0,0,JAM1,5,(SHORT *)&FORMAT_pairs0,NULL };
#define FORMAT_ID 8
static struct Gadget FORMAT = {
NULL,9,34,124,9,
GADGHCOMP,
RELVERIFY,
BOOLGADGET,
(APTR)&FORMAT_bord,NULL,
NULL,NULL,NULL,FORMAT_ID,NULL };
static SHORT CANCEL_pairs0[] = {
-1,-1,58,-1,58,35,-1,35,-1,-1 };
static struct Border CANCEL_bord = {
0,0,0,0,JAM1,5,(SHORT *)&CANCEL_pairs0,NULL };
static struct IntuiText CANCEL_text = {
0,1,JAM1,5,14,NULL,(UBYTE *)"CANCEL",NULL };
#define CANCEL_ID 7
static struct Gadget CANCEL = {
&FORMAT,205,48,58,35,
GADGHCOMP,
RELVERIFY,
BOOLGADGET,
(APTR)&CANCEL_bord,NULL,
&CANCEL_text,NULL,NULL,CANCEL_ID,NULL };
static SHORT OKIDOKI_pairs0[] = {
-1,-1,58,-1,58,35,-1,35,-1,-1 };
static struct Border OKIDOKI_bord = {
0,0,0,0,JAM1,5,(SHORT *)&OKIDOKI_pairs0,NULL };
static struct IntuiText OKIDOKI_text = {
0,1,JAM1,21,14,NULL,(UBYTE *)"OK",NULL };
#define OKIDOKI_ID 6
static struct Gadget OKIDOKI = {
&CANCEL,140,48,58,35,
GADGHCOMP,
RELVERIFY,
BOOLGADGET,
(APTR)&OKIDOKI_bord,NULL,
&OKIDOKI_text,NULL,NULL,OKIDOKI_ID,NULL };
static UBYTE HEIGHT_buf[5] = "0";
static struct StringInfo HEIGHT_info = {
(UBYTE *)&HEIGHT_buf,NULL,0,5,0,0,0,0,0,0,NULL,NULL,NULL };
static SHORT HEIGHT_pairs0[] = {
-1,-1,59,-1,59,8,-1,8,-1,-1 };
static struct Border HEIGHT_bord = {
0,0,2,0,JAM1,5,(SHORT *)&HEIGHT_pairs0,NULL };
static struct IntuiText HEIGHT_text = {
0,1,JAM2,5,-9,NULL,(UBYTE *)"HEIGHT",NULL };
#define HEIGHT_ID 5
static struct Gadget HEIGHT = {
&OKIDOKI,73,75,59,8,
GADGHCOMP+GADGDISABLED,
RELVERIFY+STRINGCENTER+LONGINT,
STRGADGET,
(APTR)&HEIGHT_bord,NULL,
&HEIGHT_text,NULL,(APTR)&HEIGHT_info,HEIGHT_ID,NULL };
static UBYTE WIDTH_buf[5] = "0";
static struct StringInfo WIDTH_info = {
(UBYTE *)&WIDTH_buf,NULL,0,5,0,0,0,0,0,0,NULL,NULL,NULL };
static SHORT WIDTH_pairs0[] = {
-1,-1,59,-1,59,8,-1,8,-1,-1 };
static struct Border WIDTH_bord = {
0,0,2,0,JAM1,5,(SHORT *)&WIDTH_pairs0,NULL };
static struct IntuiText WIDTH_text = {
0,1,JAM2,10,-9,NULL,(UBYTE *)"WIDTH",NULL };
#define WIDTH_ID 4
static struct Gadget WIDTH = {
&HEIGHT,9,75,59,8,
GADGHCOMP+GADGDISABLED,
RELVERIFY+STRINGCENTER+LONGINT,
STRGADGET,
(APTR)&WIDTH_bord,NULL,
&WIDTH_text,NULL,(APTR)&WIDTH_info,WIDTH_ID,NULL };
static UBYTE TOP_buf[5] = "0";
static struct StringInfo TOP_info = {
(UBYTE *)&TOP_buf,NULL,0,5,0,0,0,0,0,0,NULL,NULL,NULL };
static SHORT TOP_pairs0[] = {
-1,-1,59,-1,59,8,-1,8,-1,-1 };
static struct Border TOP_bord = {
0,0,2,0,JAM1,5,(SHORT *)&TOP_pairs0,NULL };
static struct IntuiText TOP_text = {
0,1,JAM2,16,-9,NULL,(UBYTE *)"TOP",NULL };
#define TOP_ID 3
static struct Gadget TOP = {
&WIDTH,73,56,59,8,
GADGHCOMP+GADGDISABLED,
RELVERIFY+STRINGCENTER+LONGINT,
STRGADGET,
(APTR)&TOP_bord,NULL,
&TOP_text,NULL,(APTR)&TOP_info,TOP_ID,NULL };
static UBYTE LEFT_buf[5] = "0";
static struct StringInfo LEFT_info = {
(UBYTE *)&LEFT_buf,NULL,0,5,0,0,0,0,0,0,NULL,NULL,NULL };
static SHORT LEFT_pairs0[] = {
-1,-1,59,-1,59,8,-1,8,-1,-1 };
static struct Border LEFT_bord = {
0,0,2,0,JAM1,5,(SHORT *)&LEFT_pairs0,NULL };
static struct IntuiText LEFT_text = {
0,1,JAM2,15,-9,NULL,(UBYTE *)"LEFT",NULL };
#define LEFT_ID 2
static struct Gadget LEFT = {
&TOP,9,56,59,8,
GADGHCOMP+GADGDISABLED,
RELVERIFY+STRINGCENTER+LONGINT,
STRGADGET,
(APTR)&LEFT_bord,NULL,
&LEFT_text,NULL,(APTR)&LEFT_info,LEFT_ID,NULL };
static SHORT ENABLE_pairs0[] = {
-1,-1,124,-1,124,9,-1,9,-1,-1 };
static struct Border ENABLE_bord = {
0,0,0,0,JAM1,5,(SHORT *)&ENABLE_pairs0,NULL };
static struct IntuiText ENABLE_text = {
0,1,JAM1,18,1,NULL,(UBYTE *)"MENUENABLED",NULL };
#define ENABLE_ID 1
static struct Gadget ENABLE = {
&LEFT,140,34,124,9,
GADGHCOMP+SELECTED,
TOGGLESELECT+GADGIMMEDIATE,
BOOLGADGET,
(APTR)&ENABLE_bord,NULL,
&ENABLE_text,NULL,NULL,ENABLE_ID,NULL };
static UBYTE MNAME_buf[33];
static struct StringInfo MNAME_info = {
(UBYTE *)&MNAME_buf,NULL,0,33,0,0,0,0,0,0,NULL,NULL,NULL };
static SHORT MNAME_pairs0[] = {
-1,-1,255,-1,255,8,-1,8,-1,-1 };
static struct Border MNAME_bord = {
0,0,2,0,JAM1,5,(SHORT *)&MNAME_pairs0,NULL };
static struct IntuiText MNAME_text = {
0,1,JAM1,92,-9,NULL,(UBYTE *)"MENU NAME",NULL };
#define MNAME_ID 0
static struct Gadget MNAME = {
&ENABLE,9,22,255,8,
GADGHCOMP,
RELVERIFY+STRINGCENTER,
STRGADGET,
(APTR)&MNAME_bord,NULL,
&MNAME_text,NULL,(APTR)&MNAME_info,MNAME_ID,NULL };
static struct NewWindow nw_menu = {
24,15,272,89,0,1,
GADGETDOWN+GADGETUP+CLOSEWINDOW,
NOCAREREFRESH+SMART_REFRESH+ACTIVATE+RMBTRAP+BORDERLESS,
NULL,NULL,
NULL,NULL,NULL,
150,50,320,256,CUSTOMSCREEN };
extern struct Window *MainWindow;
extern struct Screen *MainScreen;
extern struct RastPort *MainRP;
extern struct Gadget *Gadget;
extern struct MemoryChain Memory;
extern struct MyMenu *MenuStrip;
extern struct MenuItem dummy;
extern struct Menu MainMenuStrip[];
extern struct MenuItem MainItem[];
extern struct ListItem *MenusList;
extern ULONG Class;
extern UWORD Code, MenuCount, MenuTotal;
static struct Window *MedWindow;
static UWORD CycleNum = 0L;
static UBYTE Buffer[33];
static struct IntuiText CycleText[] = {
0,1,JAM2,18,1,NULL,(UBYTE *)"AUTO FORMAT",NULL,
0,1,JAM2,18,1,NULL,(UBYTE *)"USER FORMAT",NULL
};
struct MyMenu *MakeMenu( void )
{
struct MyMenu *menu;
WORD left;
left = StripWidth();
if(NOT MNAME_buf[0]) return(NULL);
if((left + TEXT_WIDTH(MainRP,(char *)&MNAME_buf[0]) + MENUSPACING) <= MainScreen->Width) {
if((menu = (struct MyMenu *)AllocItem(&Memory,(ULONG)sizeof(struct MyMenu),MEMF_PUBLIC))) {
if(NOT CycleNum) {
menu->LeftEdge = left;
menu->Width = TEXT_WIDTH(MainRP,(char *)&MNAME_buf[0]) + MENUSPACING;
menu->Height = TEXT_HEIGHT(MainRP);
} else {
menu->LeftEdge = LEFT_info.LongInt;
menu->TopEdge = TOP_info.LongInt;
menu->Width = WIDTH_info.LongInt;
menu->Height = HEIGHT_info.LongInt;
menu->SpecialFlags = USERFORMAT;
}
menu->MenuName = &menu->TheMenuName[0];
if(SelectTest(&ENABLE))
menu->Flags = MENUENABLED;
strcpy((char *)&menu->TheMenuName[0],(char *)&MNAME_buf[0]);
menu->FirstItem = (struct MyMenuItem *)&dummy;
MenuCount++;
MenuTotal++;
return(menu);
} else {
enable_window();
ok();
Error("Out of memory!");
}
} else {
enable_window();
ok();
Error("Menu won't fit!");
}
return(NULL);
}
void NIL( void )
{
register struct Gadget *g;
for(g = &MNAME; g; g = g->NextGadget) {
if(TestBits((ULONG)g->GadgetType,BOOLGADGET))
g->Flags = NULL;
}
ENABLE.Flags = SELECTED;
LEFT.Flags = GADGDISABLED;
TOP.Flags = GADGDISABLED;
WIDTH.Flags = GADGDISABLED;
HEIGHT.Flags = GADGDISABLED;
CycleNum = 0L;
redisplay(&MNAME);
}
void RemoveMenu( struct ListItem *l )
{
struct MyMenu *menu, *pmenu;
struct ListItem *pred;
UWORD count;
UBYTE message[36];
menu = l->Menu;
StringFormat((char *)&message,"Delete: %.27s",menu->MenuName);
if(Ask(&message[0],"Are you sure?") == FALSE)
return;
ClearMenuStrip(MainWindow);
if(l == MenusList) {
for(count = 3; count < 7; count++)
MainItem[count].SubItem = l->AItem.NextItem;
MenusList = (struct ListItem *)l->AItem.NextItem;
} else {
pred = (struct ListItem *)FindPredItem(MenusList, l);
pred->AItem.NextItem = l->AItem.NextItem;
}
if(menu == MenuStrip)
MenuStrip = menu->NextMenu;
else {
pmenu = (struct MyMenu *)FindPredMenu(menu);
pmenu->NextMenu = menu->NextMenu;
}
FreeMenu(menu);
MenuCount--;
MenuTotal--;
ReformatM();
ReformatList(MENUED);
SetMenuStrip(MainWindow,&MainMenuStrip[0]);
SetMainMenus();
}
void CheckNumbers( LONG l, LONG t, LONG w, LONG h )
{
if(l < 0 || l > MainScreen->Width) DisplayBeep(NULL);
if(t < 0 || t > MainScreen->Height) DisplayBeep(NULL);
if(w > MainScreen->Width) DisplayBeep(NULL);
if(h > MainScreen->Height) DisplayBeep(NULL);
if((l+w) > MainScreen->Width) DisplayBeep(NULL);
if((t+h) > MainScreen->Height) DisplayBeep(NULL);
}
struct MyMenu *EditMenu( struct ListItem *l, ULONG ModeIns)
{
struct MyMenu *TheMenu, *Last, *Edit;
BOOL running = TRUE;
WORD width;
NIL();
if((NOT l) || ModeIns) {
MNAME_buf[0] = 0;
ENABLE.Flags = GADGHCOMP+SELECTED;
LEFT_info.LongInt = StripWidth();
TOP_info.LongInt = 0;
WIDTH_info.LongInt = 10;
HEIGHT_info.LongInt = 9;
StringFormat((char *)&LEFT_buf[0],"%ld",StripWidth());
strcpy((char *)&TOP_buf[0],"0");
strcpy((char *)&WIDTH_buf[0],"10");
strcpy((char *)&HEIGHT_buf[0],"9");
} else if(l && (NOT ModeIns)) {
Edit = l->Menu;
strcpy((char *)&MNAME_buf[0],Edit->MenuName);
strcpy((char *)&Buffer[0],Edit->MenuName);
if(TestBits((ULONG)Edit->Flags,MENUENABLED))
ENABLE.Flags = GADGHCOMP+SELECTED;
else
ENABLE.Flags = GADGHCOMP;
LEFT_info.LongInt = Edit->LeftEdge;
TOP_info.LongInt = Edit->TopEdge;
WIDTH_info.LongInt = Edit->Width;
HEIGHT_info.LongInt = Edit->Height;
StringFormat((char *)&LEFT_buf[0],"%ld",Edit->LeftEdge);
StringFormat((char *)&TOP_buf[0],"%ld",Edit->TopEdge);
StringFormat((char *)&WIDTH_buf[0],"%ld",Edit->Width);
StringFormat((char *)&HEIGHT_buf[0],"%ld",Edit->Height);
if(TestBits((ULONG)Edit->SpecialFlags,USERFORMAT)) {
CycleNum = 1L;
LEFT.Flags = GADGHCOMP;
TOP.Flags = GADGHCOMP;
WIDTH.Flags = GADGHCOMP;
HEIGHT.Flags = GADGHCOMP;
}
}
FORMAT.GadgetText = &CycleText[CycleNum];
nw_menu.Screen = MainScreen;
if(NOT(MedWindow = (struct Window *)OpenWindow(&nw_menu)))
return(NULL);
disable_window();
buisy();
draw(MedWindow,&MNAME,&Border_bord[0],&Render_text);
ActivateGadget(&MNAME,MedWindow,NULL);
do {
WaitPort(MedWindow->UserPort);
while(read_msg(MedWindow)) {
switch(Class) {
case GADGETUP:
switch(Gadget->GadgetID) {
case OKIDOKI_ID:
if(NOT MNAME_buf[0]) {
DisplayBeep(MainScreen);
break;
}
case CANCEL_ID:
running = FALSE;
break;
case FORMAT_ID:
if(CycleNum) {
OffGList(MedWindow,&LEFT,NULL,4);
FORMAT.GadgetText = &CycleText[0];
CycleNum = 0;
} else {
OnGList(MedWindow,&LEFT,NULL,4);
FORMAT.GadgetText = &CycleText[1];
CycleNum = 1;
}
SetAPen(MedWindow->RPort,1);
RectFill(MedWindow->RPort,9,34,133,43);
RefreshGList(&FORMAT,MedWindow,NULL,1);
break;
case MNAME_ID:
width = StripWidth();
if(l) {
if(((width - Edit->Width) + TEXT_WIDTH(MainRP,(char *)&MNAME_buf[0]) + MENUSPACING) > MainScreen->Width) {
DisplayBeep(MainScreen);
strcpy((char *)&MNAME_buf[0],(char *)&Buffer[0]);
RefreshGList(&MNAME,MedWindow,NULL,1);
}
} else {
if((width + TEXT_WIDTH(MainRP,(char *)&MNAME_buf[0]) + MENUSPACING) > MainScreen->Width)
DisplayBeep(NULL);
}
break;
case LEFT_ID:
case TOP_ID:
case WIDTH_ID:
case HEIGHT_ID:
CheckNumbers(LEFT_info.LongInt,TOP_info.LongInt,WIDTH_info.LongInt, HEIGHT_info.LongInt);
break;
}
}
}
} while(running == TRUE);
CloseWindow(MedWindow);
if(Gadget->GadgetID == OKIDOKI_ID && ModeIns && l) {
if((TheMenu = MakeMenu())) {
if(l->Menu == MenuStrip) {
TheMenu->NextMenu = MenuStrip;
MenuStrip = TheMenu;
} else {
Last = (struct MyMenu *)FindPredMenu(l->Menu);
Last->NextMenu = TheMenu;
TheMenu->NextMenu = l->Menu;
}
TheMenu->ItsListItem = (struct ListItem *)CreateListItem((APTR)TheMenu, MENUED, TRUE, l, TRUE);
ReformatM();
enable_window();
ok();
return(NULL);
} else
return(NULL);
} else if(Gadget->GadgetID == OKIDOKI_ID && (NOT l)) {
if((TheMenu = MakeMenu())) {
if(NOT MenuStrip)
MenuStrip = TheMenu;
else {
Last = (struct MyMenu *)LastMenu();
Last->NextMenu = TheMenu;
}
TheMenu->ItsListItem = (struct ListItem *)CreateListItem((APTR)TheMenu, MENUED, FALSE, NULL,TRUE);
enable_window();
ok();
return(NULL);
} else
return(NULL);
} else if(Gadget->GadgetID && l && (NOT ModeIns)) {
if(SelectTest(&ENABLE))
Edit->Flags = MENUENABLED;
else
Edit->Flags = NULL;
strcpy(Edit->MenuName,(char *)&MNAME_buf[0]);
strncpy((char *)&l->Letters[0],Edit->MenuName,9);
if(NOT CycleNum) {
Edit->Width = TEXT_WIDTH(MainRP,Edit->MenuName) + MENUSPACING;
Edit->SpecialFlags = NULL;
} else {
Edit->LeftEdge = LEFT_info.LongInt;
Edit->TopEdge = TOP_info.LongInt;
Edit->Width = WIDTH_info.LongInt;
Edit->Height = HEIGHT_info.LongInt;
Edit->SpecialFlags = USERFORMAT;
}
ReformatM();
enable_window();
ok();
}
enable_window();
ok();
return(NULL);
}