/* menus.c */ #include "aib.h" #include "extern.h" /* defines */ #define NORM 0 #define MX 1 #define TOG 2 /* prototypes */ void old_menu(void); struct title_box *grabtitle(struct title_box *); struct item_box *grabitem(struct item_box *); struct sub_box *grabsub(struct sub_box *); void free_allmenu(struct title_box *); void generate(void); LONG GetMX_it(struct item_box *); LONG GetMX_sub(struct sub_box *); void freeall_subs(struct sub_box *); void freeall_items(struct item_box *); void menu_opts(struct Gadget *, UWORD); struct title_box *new_title(struct title_box*); struct item_box *new_item(struct item_box*); struct sub_box *new_sub(struct sub_box*); void add_title(char [256]); void add_item(char [256]); void add_sub(char [256]); void change_title(UWORD,char *); void change_item(UWORD,char *); void change_sub(UWORD,char*); struct title_box *locate_title(UWORD); struct item_box *locate_item(UWORD); struct sub_box *locate_sub (UWORD); void rem_title(struct title_box*); void rem_item(struct item_box*); void rem_sub(struct sub_box*); void swapit (void); void swapit_it(void); void swapit_sub(void); void prepare_title(void); void prepare_item(void); void prepare_sub(void); void disable_all(void); /* globals needed */ struct List it_list,sub_list; char new_t[256],new_i[256],new_s[256]; struct title_box *curr_t = NULL; struct item_box *curr_i = NULL; struct sub_box *curr_s = NULL; int ord_title = -1; int ord_item = -1; int ord_sub = -1; struct title_box *swap_tit = NULL; struct item_box *swap_it = NULL; struct sub_box *swap_sub = NULL; BOOL fchecked = FALSE; int curr_box =0; int num_entries = 0; /************************** menu gads ***********************************/ void menu_opts (struct Gadget *gad, UWORD code) { switch (gad->GadgetID) { case MM_titl: if (!topt) break; ord_title=code; curr_t=locate_title(code); if (swap_tit) swapit(); /* activate legal buttons */ prepare_title(); break; case MM_item: if (!curr_t->items) break; ord_item=code; curr_i=locate_item(code); if (swap_it) swapit_it(); /* activate legal buttons */ prepare_item(); break; case MM_subs: if (!curr_i->submenu) break; ord_sub=code; curr_s=locate_sub(code); if (swap_sub) swapit_sub(); /* activate legal buttons */ prepare_sub(); break; case MM_tstring: strcpy(new_t,((struct StringInfo *)gad->SpecialInfo)->Buffer); if (ord_title >= 0) change_title(ord_title,new_t); else break; GT_SetGadgetAttrs(tl,window,NULL, GTLV_Labels,&tit_list, GA_Disabled,FALSE, GTLV_Selected,curr_t->index, TAG_DONE); GT_SetGadgetAttrs(select,window,NULL, GTTX_Text,"T", TAG_DONE); GT_SetGadgetAttrs(stype,window,NULL, GTTX_Text,curr_t->title, TAG_DONE); break; case MM_istring: strcpy(new_i,((struct StringInfo *)gad->SpecialInfo)->Buffer); if (ord_item >= 0) change_item(ord_item,new_i); else break; GT_SetGadgetAttrs(il,window,NULL, GTLV_Labels,&it_list, GTLV_Selected,curr_i->index, TAG_DONE); GT_SetGadgetAttrs(select,window,NULL, GTTX_Text,"I", TAG_DONE); GT_SetGadgetAttrs(stype,window,NULL, GTTX_Text,curr_i->item, TAG_DONE); break; case MM_sstring: strcpy(new_s,((struct StringInfo *)gad->SpecialInfo)->Buffer); if (ord_sub >= 0) change_sub(ord_sub,new_s); else break; GT_SetGadgetAttrs(sl,window,NULL, GTLV_Labels,&sub_list, GTLV_Selected,curr_s->index, TAG_DONE); GT_SetGadgetAttrs(select,window,NULL, GTTX_Text,"S", TAG_DONE); GT_SetGadgetAttrs(stype,window,NULL, GTTX_Text,curr_s->submenu, TAG_DONE); break; case MM_ts: if (ord_title <1) break; /* is this the first time? */ if (!swap_tit) { swap_tit = curr_t; NewList(&it_list); disable_all(); GT_SetGadgetAttrs(ts,window,NULL, GA_Disabled,FALSE, TAG_DONE); } else { /* undo swap */ swap_tit =NULL; prepare_title(); } break; case MM_ta: num_entries++; curr_t = new_title(curr_t); GT_SetGadgetAttrs(tl,window,NULL, GTLV_Labels,-1, GA_Disabled,FALSE, TAG_DONE); add_title(curr_t->title); GT_SetGadgetAttrs(tl,window,NULL, GTLV_Labels,&tit_list, GTLV_Selected,curr_t->index, GA_Disabled,FALSE, TAG_DONE); ord_title=curr_t->index; prepare_title(); /* update items display... */ break; case MM_td: num_entries--; if (ord_title <0) break; curr_box=0; rem_title(curr_t); disable_all(); GT_SetGadgetAttrs(select,window,NULL, GTTX_Text,"", TAG_DONE); GT_SetGadgetAttrs(stype,window,NULL, GTTX_Text,"", TAG_DONE); GT_SetGadgetAttrs(tstring,window,NULL, GTST_String,"", TAG_DONE); GT_SetGadgetAttrs(il,window,NULL, GTLV_Labels,0, TAG_DONE); GT_SetGadgetAttrs(tl,window,NULL, GTLV_Labels,&tit_list, TAG_DONE); GT_SetGadgetAttrs(ta,window,NULL, GA_Disabled,FALSE, TAG_DONE); ord_title=-1; break; case MM_ia: num_entries++; if (ord_title <0) break; curr_i=new_item(curr_i); GT_SetGadgetAttrs(il,window,NULL, GTLV_Labels,-1, GA_Disabled,FALSE, TAG_DONE); add_item(curr_i->item); GT_SetGadgetAttrs(il,window,NULL, GTLV_Labels,&it_list, GTLV_Selected,curr_i->index, GA_Disabled,FALSE, TAG_DONE); ord_item=curr_i->index; prepare_item(); break; case MM_id: num_entries--; if (ord_item <0) break; curr_box=0; rem_item(curr_i); disable_all(); GT_SetGadgetAttrs(select,window,NULL, GTTX_Text,"", TAG_DONE); GT_SetGadgetAttrs(stype,window,NULL, GTTX_Text,"", TAG_DONE); GT_SetGadgetAttrs(istring,window,NULL, GTST_String,"", GA_Disabled,TRUE, TAG_DONE); GT_SetGadgetAttrs(sl,window,NULL, GTLV_Labels,0, TAG_DONE); GT_SetGadgetAttrs(ta,window,NULL, GA_Disabled,FALSE, TAG_DONE); GT_SetGadgetAttrs(ia,window,NULL, GA_Disabled,FALSE, TAG_DONE); GT_SetGadgetAttrs(il,window,NULL, GTLV_Labels,&it_list, TAG_DONE); ord_item=-1; break; case MM_is: if (ord_item <1) break; /* is this the first time? */ if (!swap_it) { swap_it = curr_i; disable_all(); GT_SetGadgetAttrs(is,window,NULL, GA_Disabled,FALSE, TAG_DONE); } else { /* undo swap */ swap_it =NULL; prepare_item(); } break; case MM_sa: num_entries++; if (ord_item <0) break; curr_s=new_sub(curr_s); GT_SetGadgetAttrs(sl,window,NULL, GTLV_Labels,-1, GA_Disabled,FALSE, TAG_DONE); add_sub(curr_s->submenu); GT_SetGadgetAttrs(sl,window,NULL, GTLV_Labels,&sub_list, GTLV_Selected,curr_s->index, GA_Disabled,FALSE, TAG_DONE); ord_sub=curr_s->index; prepare_sub(); break; case MM_sd: num_entries--; if (ord_sub <0) break; curr_box=0; rem_sub(curr_s); disable_all(); GT_SetGadgetAttrs(select,window,NULL, GTTX_Text,"", TAG_DONE); GT_SetGadgetAttrs(stype,window,NULL, GTTX_Text,"", TAG_DONE); GT_SetGadgetAttrs(ta,window,NULL, GA_Disabled,FALSE, TAG_DONE); GT_SetGadgetAttrs(ia,window,NULL, GA_Disabled,FALSE, TAG_DONE); GT_SetGadgetAttrs(sa,window,NULL, GA_Disabled,FALSE, TAG_DONE); GT_SetGadgetAttrs(sl,window,NULL, GTLV_Labels,&sub_list, TAG_DONE); ord_sub=-1; break; case MM_ss: if (ord_sub <1) break; /* is this the first time? */ if (!swap_sub) { swap_sub = curr_s; disable_all(); GT_SetGadgetAttrs(ss,window,NULL, GA_Disabled,FALSE, TAG_DONE); } else { /* undo swap */ swap_sub =NULL; prepare_sub(); } break; case MM_fche: fchecked=(fchecked)?FALSE:TRUE; GT_SetGadgetAttrs(nfont,window,NULL, GA_Disabled,(fchecked)?FALSE:TRUE, TAG_DONE); if (fchecked) menuta = &menucta; else menuta = screen->Font; break; /***** title, item, and sub choices... ******/ case MM_dis: if (curr_box==1) curr_t->disabled=(curr_t->disabled)?FALSE:TRUE; else if (curr_box==2) curr_i->disabled=(curr_i->disabled)?FALSE:TRUE; else if (curr_box==3) curr_s->disabled=(curr_s->disabled)?FALSE:TRUE; break; /***** item , and sub choices... ******/ case MM_bar: if (curr_box==2) curr_i->menubar=(curr_i->menubar)?FALSE:TRUE; else if (curr_box==3) curr_s->menubar=(curr_s->menubar)?FALSE:TRUE; break; case MM_chec: if (curr_box==2) curr_i->checked=(curr_i->checked)?FALSE:TRUE; else if (curr_box==3) curr_s->checked=(curr_s->checked)?FALSE:TRUE; break; case MM_tog: if (curr_box==2) curr_i->type=code; else if (curr_box==3) curr_s->type=code; if (code == 2) GT_SetGadgetAttrs(chec,window,NULL, GA_Disabled,TRUE, TAG_DONE); else GT_SetGadgetAttrs(chec,window,NULL, GA_Disabled,FALSE, TAG_DONE); break; case MM_func: if (curr_box==2) strcpy(curr_i->function, ((struct StringInfo *)gad->SpecialInfo)->Buffer ); else if (curr_box==3) strcpy(curr_s->function, ((struct StringInfo *)gad->SpecialInfo)->Buffer ); break; case MM_key: if (curr_box==2) strcpy(curr_i->hotkey, ((struct StringInfo *)gad->SpecialInfo)->Buffer ); else if (curr_box==3) strcpy(curr_s->hotkey, ((struct StringInfo *)gad->SpecialInfo)->Buffer ); break; default: gad_opts(gad,code); break; } } /****** handle MX *********************************************************/ LONG GetMX_it(struct item_box *temp) { LONG flag = 0; LONG count = 1; while (temp) { if (temp->type != 2) flag = flag | count; count=count*2; temp=temp->next; } return(flag); } LONG GetMX_sub (struct sub_box *temp) { LONG flag = 0; LONG count = 1; while (temp) { if (temp->type != 2) flag = flag | count; count=count*2; temp=temp->next; } return(flag); } /* generate menu! ********************************************************/ void generate(void) { UWORD mxi,mxs,x, flags; LONG ic,sc,sfl,ifl; struct title_box *tempt=topt; struct item_box *tempi= NULL; struct sub_box *temps = NULL; x=0; if (their_menu) free(their_menu); their_menu = NULL; if (topt) { their_menu = (struct NewMenu *)calloc(num_entries+1,sizeof(struct NewMenu)); while (tempt) { (their_menu +x)->nm_Type = (UBYTE) NM_TITLE; (their_menu +x)->nm_Label=tempt->title; (their_menu +x)->nm_CommKey=0; (their_menu +x)->nm_Flags=0; (their_menu +x)->nm_MutualExclude = 0; (their_menu +x)->nm_UserData = 0; x++; /* handle items */ if (tempt->items) { tempi = tempt->items; mxi=0; ic=1; ifl = GetMX_it(tempt->items); while(tempi) { flags=0; (their_menu +x)->nm_Type = NM_ITEM; (their_menu +x)->nm_Label=(tempi->menubar)? NM_BARLABEL:tempi->item; if (!(tempi->submenu) && strlen(tempi->hotkey)>0) (their_menu +x)->nm_CommKey=tempi->hotkey; else (their_menu + x)->nm_CommKey = 0; (their_menu +x)->nm_MutualExclude =0; if (tempi->disabled) flags = NM_ITEMDISABLED; if (tempi->type == 2) { if (!mxi) flags = flags | CHECKED; mxi=1; flags = flags | CHECKIT; (their_menu +x)->nm_MutualExclude = (tempi->type==2)?~(ic|ifl):0; } else if (tempi->type == 1) { flags = flags | MENUTOGGLE | CHECKIT; if (tempi->checked) flags = flags | CHECKED; } (their_menu +x)->nm_Flags=flags; (their_menu +x)->nm_UserData = (strlen(tempi->function)>0) ?tempi->function:0; x++; ic = ic * 2; /* handle submenus */ if (tempi->submenu && !tempi->type && !tempi->menubar) { temps = tempi->submenu; mxs=0; sc=1; sfl = GetMX_sub(tempi->submenu); while(temps) { flags = 0; (their_menu +x)->nm_Type = NM_SUB; (their_menu +x)->nm_Label=(temps->menubar)? NM_BARLABEL:temps->submenu; if (strlen(temps->hotkey)>0) (their_menu +x)->nm_CommKey=temps->hotkey; else (their_menu + x)->nm_CommKey = 0; (their_menu +x)->nm_MutualExclude =0; if (temps->disabled) flags = NM_ITEMDISABLED; if (temps->type == 2) { if (!mxs) flags = flags | CHECKED; mxs=1; flags = flags | CHECKIT; (their_menu +x)->nm_MutualExclude = (temps->type==2)?~(sc|sfl):0; } else if (temps->type == 1) { flags = flags | MENUTOGGLE; if (temps->checked) flags = flags | CHECKED; } (their_menu +x)->nm_Flags=flags; (their_menu +x)->nm_UserData = (strlen(temps->function)>0)? temps->function:0; x++; sc = sc * 2; temps = temps->next; } } tempi=tempi->next; } } tempt = tempt->next; } (their_menu +x)->nm_Type = NM_END; (their_menu +x)->nm_Label=0; (their_menu +x)->nm_CommKey=0; (their_menu +x)->nm_Flags=0; (their_menu +x)->nm_MutualExclude = 0; (their_menu +x)->nm_UserData = 0; } } /* disable all ***********************************************************/ void disable_all(void) { struct Gadget *gads[20]; int x; /* disabled */ gads[0]=sstring; gads[1]=sa; gads[2]=ss; gads[3]=sd; gads[5]=istring; gads[6]=is; gads[7]=id; gads[8]=bar; gads[9]=chec; gads[10]=tog; gads[11]=func; gads[12]=tstring; gads[13]=ta; gads[14]=ts; gads[15]=td; gads[16]=ia; gads[17]=dis; gads[18]=dis; gads[19]=key; for (x=0;x<20;x++) GT_SetGadgetAttrs(gads[x],window,NULL, GA_Disabled,TRUE, TAG_DONE); } /************************* prepare title *********************************/ void prepare_title(void) { struct Gadget *gads[13]; struct item_box *temp= curr_t->items; int x; /* disabled */ gads[0]=sstring; gads[1]=sa; gads[2]=ss; gads[3]=sd; gads[4]=sl; gads[5]=istring; gads[6]=is; gads[7]=id; gads[8]=bar; gads[9]=chec; gads[10]=tog; gads[11]=func; gads[12]=key; for (x=0;x<13;x++) GT_SetGadgetAttrs(gads[x],window,NULL, GA_Disabled,TRUE, TAG_DONE); /* abled */ gads[0]=tstring; gads[1]=ta; gads[2]=ts; gads[3]=td; gads[4]=il; gads[5]=ia; gads[6]=dis; for (x=0;x<7;x++) GT_SetGadgetAttrs(gads[x],window,NULL, GA_Disabled,FALSE, TAG_DONE); curr_box=1; ord_item=-1; ord_sub =-1; /* enter visual response */ GT_SetGadgetAttrs(select,window,NULL, GTTX_Text,"T", TAG_DONE); GT_SetGadgetAttrs(stype,window,NULL, GTTX_Text,curr_t->title, TAG_DONE); GT_SetGadgetAttrs(dis,window,NULL, GTCB_Checked,curr_t->disabled, TAG_DONE); /* update item & sub boxes... */ curr_i=curr_t->items; NewList(&sub_list); NewList(&it_list); while (temp) { add_item(temp->item); temp=temp->next; } GT_SetGadgetAttrs(il,window,NULL, GTLV_Labels,&it_list, TAG_DONE); GT_SetGadgetAttrs(sl,window,NULL, GTLV_Labels,0, TAG_DONE); } /************************ prepare item ************************************/ void prepare_item(void) { struct Gadget *gads[13]; struct sub_box *temp = curr_i->submenu; int x; /* disabled */ gads[0]=sstring; gads[1]=ss; gads[2]=sd; gads[3]=sl; gads[4]=tstring; gads[5]=ts; gads[6]=td; for (x=0;x<7;x++) GT_SetGadgetAttrs(gads[x],window,NULL, GA_Disabled,TRUE, TAG_DONE); /* abled */ gads[0]=istring; gads[1]=ia; gads[2]=is; gads[3]=id; gads[4]=il; gads[5]=sa; gads[6]=dis; gads[7]=chec; gads[8]=tog; gads[9]=func; gads[10]=bar; gads[11]=ta; gads[12]=key; for (x=0;x<13;x++) GT_SetGadgetAttrs(gads[x],window,NULL, GA_Disabled,FALSE, TAG_DONE); curr_box=2; ord_sub = -1; /* enter visual response */ GT_SetGadgetAttrs(select,window,NULL, GTTX_Text,"I", TAG_DONE); GT_SetGadgetAttrs(stype,window,NULL, GTTX_Text,curr_i->item, TAG_DONE); GT_SetGadgetAttrs(dis,window,NULL, GTCB_Checked,curr_i->disabled, TAG_DONE); GT_SetGadgetAttrs(bar,window,NULL, GTCB_Checked,curr_i->menubar, TAG_DONE); GT_SetGadgetAttrs(chec,window,NULL, GTCB_Checked,curr_i->checked, TAG_DONE); GT_SetGadgetAttrs(tog,window,NULL, GTCY_Active,curr_i->type, TAG_DONE); GT_SetGadgetAttrs(func,window,NULL, GTST_String,curr_i->function, TAG_DONE); GT_SetGadgetAttrs(key,window,NULL, GTST_String,curr_i->hotkey, TAG_DONE); /* handle MX disabling of checked */ if (curr_i->type == 2) GT_SetGadgetAttrs(chec,window,NULL, GA_Disabled,TRUE, TAG_DONE); /* update sub box... */ NewList(&sub_list); while (temp) { add_sub(temp->submenu); temp=temp->next; } GT_SetGadgetAttrs(sl,window,NULL, GTLV_Labels,&sub_list, TAG_DONE); } /*************************** prepare sub *********************************/ void prepare_sub(void) { struct Gadget *gads[13]; int x; /* disabled */ gads[0]=istring; gads[1]=is; gads[2]=id; gads[3]=il; gads[4]=tstring; gads[5]=ts; gads[6]=td; for (x=0;x<7;x++) GT_SetGadgetAttrs(gads[x],window,NULL, GA_Disabled,TRUE, TAG_DONE); /* abled */ gads[0]=sstring; gads[1]=sa; gads[2]=ss; gads[3]=dis; gads[4]=chec; gads[5]=tog; gads[6]=func; gads[7 ]=bar; gads[8 ]=ta; gads[9]=sd; gads[10]=ia; gads[11]=key; for (x=0;x<12;x++) GT_SetGadgetAttrs(gads[x],window,NULL, GA_Disabled,FALSE, TAG_DONE); curr_box=3; /* enter visual response */ GT_SetGadgetAttrs(select,window,NULL, GTTX_Text,"S", TAG_DONE); GT_SetGadgetAttrs(stype,window,NULL, GTTX_Text,curr_s->submenu, TAG_DONE); GT_SetGadgetAttrs(dis,window,NULL, GTCB_Checked,curr_s->disabled, TAG_DONE); GT_SetGadgetAttrs(bar,window,NULL, GTCB_Checked,curr_s->menubar, TAG_DONE); GT_SetGadgetAttrs(chec,window,NULL, GTCB_Checked,curr_s->checked, TAG_DONE); GT_SetGadgetAttrs(tog,window,NULL, GTCY_Active,curr_s->type, TAG_DONE); GT_SetGadgetAttrs(func,window,NULL, GTST_String,curr_s->function, TAG_DONE); GT_SetGadgetAttrs(key,window,NULL, GTST_String,curr_s->hotkey, TAG_DONE); /* handle MX disabling of Checked */ if (curr_s->type == 2) GT_SetGadgetAttrs(chec,window,NULL, GA_Disabled,TRUE, TAG_DONE); } /****************************** swap_sub *************************************/ void swapit_sub (void) { struct sub_box *temp; struct Node *node1,*node2; int ord; if ( !(temp=(struct sub_box *)calloc(sizeof(struct sub_box),1) )) abort_me("Out of memory"); if (swap_sub != curr_s) { /* find nodes */ node1 = node2 = sub_list.lh_Head; for (ord=0;ord < curr_s->index;ord++) node1 = node1->ln_Succ; for (ord=0;ord < swap_sub->index;ord++) node2 = node2->ln_Succ; /* swap items's data */ temp->disabled = curr_s->disabled; strcpy(temp->submenu,curr_s->submenu); temp->menubar = curr_s->menubar; temp->type = curr_s->type; strcpy(temp->function,curr_s->function); temp->checked = curr_s->checked; strcpy(temp->hotkey,curr_s->hotkey); curr_s->disabled = swap_sub->disabled; strcpy(curr_s->submenu,swap_sub->submenu); curr_s->menubar = swap_sub->menubar; curr_s->type = swap_sub->type; curr_s->checked = swap_sub->checked; strcpy(curr_s->function,swap_sub->function); strcpy(curr_s->hotkey,swap_sub->hotkey); swap_sub->disabled = temp->disabled; strcpy(swap_sub->submenu,temp->submenu); swap_sub->menubar = temp->menubar; swap_sub->type = temp->type; swap_sub->checked = temp->checked; strcpy(swap_sub->function,temp->function); strcpy(swap_sub->hotkey,temp->hotkey); free(temp); /* fix nodes now */ node2->ln_Name = swap_sub->submenu; node1->ln_Name = curr_s->submenu; } swap_sub = NULL; ord_item = curr_s->index; GT_SetGadgetAttrs(sl,window,NULL, GTLV_Labels,&sub_list, GTLV_Selected,curr_s->index, TAG_DONE); GT_SetGadgetAttrs(sstring,window,NULL, GTST_String,curr_s->submenu, TAG_DONE); } /************************* swapit_it ***************************************/ void swapit_it (void) { struct item_box *temp; struct Node *node1,*node2; int ord; if ( !(temp=(struct item_box *)calloc(sizeof(struct item_box),1) )) abort_me("Out of memory"); if (swap_it != curr_i) { /* find nodes */ node1 = node2 = it_list.lh_Head; for (ord=0;ord < curr_i->index;ord++) node1 = node1->ln_Succ; for (ord=0;ord < swap_it->index;ord++) node2 = node2->ln_Succ; /* swap items's data */ temp->disabled = curr_i->disabled; temp->submenu = curr_i->submenu; strcpy(temp->item,curr_i->item); temp->menubar = curr_i->menubar; temp->type = curr_i->type; strcpy(temp->function,curr_i->function); temp->checked = curr_i->checked; strcpy(temp->hotkey,curr_i->hotkey); curr_i->submenu = swap_it->submenu; curr_i->disabled = swap_it->disabled; strcpy(curr_i->item,swap_it->item); curr_i->menubar = swap_it->menubar; curr_i->type = swap_it->type; curr_i->checked = swap_it->checked; strcpy(curr_i->function,swap_it->function); strcpy(curr_i->hotkey, swap_it->hotkey); swap_it->submenu = temp->submenu; swap_it->disabled = temp->disabled; strcpy(swap_it->item,temp->item); swap_it->menubar = temp->menubar; swap_it->type = temp->type; swap_it->checked = temp->checked; strcpy(swap_it->function,temp->function); strcpy(swap_it->hotkey,temp->hotkey); free(temp); /* fix nodes now */ node2->ln_Name = swap_it->item; node1->ln_Name = curr_i->item; } swap_it = NULL; ord_item = curr_i->index; GT_SetGadgetAttrs(il,window,NULL, GTLV_Labels,&it_list, GTLV_Selected,curr_i->index, TAG_DONE); GT_SetGadgetAttrs(istring,window,NULL, GTST_String,curr_i->item, TAG_DONE); } /********************** swapit ********************************************/ void swapit (void) { struct title_box *temp; struct Node *node1,*node2; int ord; if ( !(temp=(struct title_box *)calloc(sizeof(struct title_box),1) )) abort_me("Out of memory"); if (swap_tit != curr_t) { /* find nodes */ node1 = node2 = tit_list.lh_Head; for (ord=0;ord < curr_t->index;ord++) node1 = node1->ln_Succ; for (ord=0;ord < swap_tit->index;ord++) node2 = node2->ln_Succ; /* swap title's data */ temp->disabled = curr_t->disabled; temp->items = curr_t->items; strcpy(temp->title,curr_t->title); curr_t->items = swap_tit->items; curr_t->disabled = swap_tit->disabled; strcpy(curr_t->title,swap_tit->title); swap_tit->items = temp->items; swap_tit->disabled = temp->disabled; strcpy(swap_tit->title,temp->title); free(temp); /* fix nodes now */ node2->ln_Name = swap_tit->title; node1->ln_Name = curr_t->title; } swap_tit = NULL; ord_title = curr_t->index; GT_SetGadgetAttrs(tl,window,NULL, GTLV_Labels,&tit_list, GTLV_Selected,curr_t->index, TAG_DONE); GT_SetGadgetAttrs(tstring,window,NULL, GTST_String,curr_t->title, TAG_DONE); } /************************************* remove item ********************/ void rem_item(struct item_box *curr) { struct item_box *temp = curr; struct Node *node; int ord,x; x=temp->index; curr_i = curr_t->items; /* remove link */ if (temp->prev ) temp->prev->next = temp->next; else if (temp->next) curr_t->items = curr_i = temp->next; else curr_t->items = curr_i = NULL; if (temp->next ) temp->next->prev = temp->prev; /* update indices */ temp=temp->next; while(temp) { temp->index--;temp=temp->next;} /* free node */ node = it_list.lh_Head; for (ord=0;ord < x;ord++) node=node->ln_Succ; Remove(node); /*free(node);*/ /* free its sub_menus*/ if (curr->submenu) freeall_subs(curr->submenu); free(curr); } /********************************* remove sub *****************************/ void rem_sub(struct sub_box *curr) { struct sub_box *temp = curr; struct Node *node; int ord,x; x=temp->index; curr_s = curr_i->submenu; /* remove link */ if (temp->prev ) temp->prev->next = temp->next; else if (temp->next) curr_i->submenu = curr_s = temp->next; else curr_i->submenu = curr_s = NULL; if (temp->next ) temp->next->prev = temp->prev; /* update indices */ temp=temp->next; while(temp) { temp->index--;temp=temp->next;} /* free node */ node = sub_list.lh_Head; for (ord=0;ord < x;ord++) node=node->ln_Succ; Remove(node); /*free(node);*/ free(curr); } /********************************* freeall items ************************/ void freeall_items(struct item_box *curr) { struct item_box *temp = curr; while (curr) { temp=curr->next; if (curr->submenu) freeall_subs (curr->submenu); free(curr); curr=temp; } } /******************************* freeall subs ***************************/ void freeall_subs(struct sub_box *curr) { struct sub_box *temp = curr; while (curr) { temp=curr->next; free(curr); curr=temp; } } /********************************** remove title ***************************/ void rem_title(struct title_box *curr) { struct title_box *temp = curr; struct Node *node; int ord,x; x=temp->index; curr_t = topt; /* remove link */ if (temp->prev ) temp->prev->next = temp->next; else if (temp->next) topt = curr_t = temp->next; else topt=curr_t=NULL; if (temp->next ) temp->next->prev = temp->prev; /* update indices */ temp=temp->next; while(temp) { temp->index--;temp=temp->next;} /* free item,sub menus */ /* free node */ node = tit_list.lh_Head; for (ord=0;ord < x;ord++) node=node->ln_Succ; Remove(node); /*free(node);*/ /* free title */ if (curr->items) freeall_items(curr->items); free(curr); } /******************************** locate sub ****************************/ struct sub_box *locate_sub(UWORD code) { struct sub_box *temp = curr_i->submenu; while ((temp->index != code) && temp) temp=temp->next; return(temp); } /**************************** locate item ********************************/ struct item_box *locate_item(UWORD code) { struct item_box *temp = curr_t->items; while ((temp->index != code) && temp) temp=temp->next; return(temp); } /*************************** locate title ********************************/ struct title_box *locate_title(UWORD code) { struct title_box *temp = topt; while ((temp->index != code) && temp) temp=temp->next; return(temp); } /****************************** change sub *****************************/ void change_sub(UWORD code, char *nt) { struct sub_box *temp=curr_i->submenu; while((temp->index != code) && temp) temp=temp->next; if (temp) { strcpy(temp->submenu,nt); curr_s = temp; } } /***************************** change item ****************************/ void change_item(UWORD code, char *nt) { struct item_box *temp=curr_t->items; while((temp->index != code) && temp) temp=temp->next; if (temp) { strcpy(temp->item,nt); curr_i = temp; } } /***************************** change title ****************************/ void change_title(UWORD code, char *nt) { struct title_box *temp=topt; while((temp->index != code) && temp) temp=temp->next; if (temp){ strcpy(temp->title,nt); curr_t = temp; } } /************************** add title ***********************************/ void add_title(char *nt) { struct Node *node; node=(struct Node *)AllocRemember(&rmem,sizeof(struct Node), MEMF_CLEAR); if (!node) abort_me("couldn't allocate LISTVIEW list."); node->ln_Name = nt; AddTail(&tit_list,node); } /****************** add item *******************************************/ void add_item(char *nt) { struct Node *node; node=(struct Node *)AllocRemember(&rmem,sizeof(struct Node), MEMF_CLEAR); if (!node) abort_me("couldn't allocate LISTVIEW list."); node->ln_Name = nt; AddTail(&it_list,node); } /********************** add sub *****************************************/ void add_sub(char *nt) { struct Node *node; node=(struct Node *)AllocRemember(&rmem,sizeof(struct Node), MEMF_CLEAR); if (!node) abort_me("couldn't allocate LISTVIEW list."); node->ln_Name = nt; AddTail(&sub_list,node); } /************* new title ***********************************************/ struct title_box *new_title(struct title_box *curr) { struct title_box *temp1, *temp2; if ( !(temp1=(struct title_box *)calloc(1,sizeof(struct title_box)) )) abort_me("Out of memory"); strcpy(temp1->title,""); temp1->disabled = FALSE; if (curr == NULL) { curr = topt = temp1; curr->index = 0; curr->next = curr->prev = NULL; curr->items = NULL; } else { /* add new one at end */ while (curr->next != NULL) curr = curr->next; temp2 = curr; curr = temp1; curr->index = temp2->index+1; curr->next = temp2->next; temp2->next = curr; curr->prev = temp2; curr->items = NULL; /* maintain proper indices */ /* while(temp1->next) { temp1=temp1->next; temp1->index++; }*/ } return(curr); } /************* new item ************************************************/ struct item_box *new_item(struct item_box *curr) { struct item_box *temp1, *temp2; if ( !(temp1=(struct item_box *)calloc(1,sizeof(struct item_box )) )) abort_me("Out of memory"); strcpy(temp1->item,""); temp1->disabled = FALSE; temp1->menubar = FALSE; temp1->checked = FALSE; temp1->type = NORM; strcpy(temp1->hotkey,""); if (curr_t->items == NULL) { curr_t->items = temp1; strcpy(curr_t->items->function,""); curr_t->items->next = curr_t->items->prev = NULL; curr_t->items->submenu = NULL; curr_t->items->index = 0; return(curr_t->items); } else { /* add new one at end*/ while (curr->next != NULL) curr = curr->next; temp2 = curr; curr = temp1; curr->next = temp2->next; temp2->next = curr; curr->prev = temp2; curr->submenu = NULL; strcpy(curr->function,""); curr->index = temp2->index+1; /* maintain proper indices */ /* while(temp1->next) { temp1=temp1->next; temp1->index++; }*/ } return(curr); } /************* new sub *************************************************/ struct sub_box *new_sub(struct sub_box *curr) { struct sub_box *temp1, *temp2; if ( !(temp1=(struct sub_box *)calloc(1,sizeof(struct sub_box )) )) abort_me("Out of memory"); strcpy(temp1->submenu,""); temp1->disabled = FALSE; temp1->menubar = FALSE; temp1->checked = FALSE; temp1->type = NORM; strcpy(temp1->hotkey,""); if (curr_i->submenu == NULL) { curr_i->submenu = temp1; curr_i->submenu->next = curr_i->submenu->prev = NULL; strcpy(curr_i->submenu->function,""); curr_i->submenu->index = 0; return(curr_i->submenu); } else { /* add new one at end */ while (curr->next) curr = curr->next; temp2 = curr; curr = temp1; curr->next = temp2->next; temp2->next = curr; curr->prev = temp2; strcpy(curr->function,""); curr->index = temp2->index+1; /* maintain proper indices */ while(temp1->next) { temp1=temp1->next; temp1->index++; } } return(curr); } /***************** clone current parameters *********************************/ void old_menu(void) { struct title_box *temp= topt; struct title_box *newt = NULL; if (topt) { /* grab first one */ if ( !(newtop=newt=(struct title_box *)calloc(1,sizeof(struct title_box)) )) abort_me("Out of memory"); /* printf("%s\n",temp->title); */ newt->disabled = temp->disabled; strcpy(newt->title,temp->title); newt->next = NULL; newt->prev = NULL; newt->items = NULL; newt->index = temp->index; if (temp->items) newt->items = grabitem(temp->items); temp = temp->next; while (temp) { newt->next =grabtitle(temp); newt->next->prev = newt; newt=newt->next; temp = temp->next; } } else newtop = NULL; } /********************** grabtitle *****************************************/ struct title_box *grabtitle(struct title_box *temp) { struct title_box *newt = NULL; if ( !(newt=(struct title_box *)calloc(1,sizeof(struct title_box)) )) abort_me("Out of memory"); newt->disabled = temp->disabled; strcpy(newt->title,temp->title); newt->next = NULL; newt->index = temp->index; newt->items = NULL; if (temp->items) newt->items = grabitem(temp->items); return(newt); } /******************* grabitem ********************************************/ struct item_box *grabitem(struct item_box *tempi) { struct item_box *newi = NULL; struct item_box *newi2 = NULL; /* get first one */ if ( !(newi=newi2=(struct item_box *)calloc(1,sizeof(struct item_box)) )) abort_me("Out of memory"); newi->disabled = tempi->disabled; strcpy(newi->item,tempi->item); newi->menubar = tempi->menubar; newi->type = tempi->type; newi->checked = tempi->checked; strcpy(newi->function,tempi->function); strcpy(newi->hotkey, tempi->hotkey); newi->prev = newi->next = NULL; newi->index = tempi->index; newi->submenu = NULL; if (tempi->submenu) newi->submenu = grabsub(tempi->submenu); tempi=tempi->next; while (tempi){ if ( !(newi2->next=(struct item_box *)calloc(1,sizeof(struct item_box)) )) abort_me("Out of memory"); newi2->next->prev = newi2; newi2->next->next = NULL; newi2 = newi2->next; newi2->index = tempi->index; newi2->disabled = tempi->disabled; strcpy(newi2->item,tempi->item); newi2->menubar = tempi->menubar; newi2->type = tempi->type; newi2->checked = tempi->checked; strcpy(newi2->function,tempi->function); strcpy(newi2->hotkey, tempi->hotkey); if (tempi->submenu) newi2->submenu = grabsub(tempi->submenu); tempi=tempi->next; } return(newi); } /******************** grabsub *********************************************/ struct sub_box *grabsub(struct sub_box *temps) { struct sub_box *news,*news2; /* get first */ if ( !(news=news2=(struct sub_box *)calloc(1,sizeof(struct sub_box )) )) abort_me("Out of memory"); news->disabled = temps->disabled; strcpy(news->submenu,temps->submenu); news->menubar = temps->menubar; news->type = temps->type; strcpy(news->function,temps->function); news->checked = temps->checked; strcpy(news->hotkey,temps->hotkey); news->next=news->prev = NULL; news->index = temps->index; temps=temps->next; while(temps) { if ( !(news2->next=(struct sub_box *)calloc(1,sizeof(struct sub_box )) )) abort_me("Out of memory"); news2->next->prev = news2; news2->next->next = NULL; news2=news2->next; news2->index = temps->index; news2->disabled = temps->disabled; strcpy(news2->submenu,temps->submenu); news2->menubar = temps->menubar; news2->type = temps->type; strcpy(news2->function,temps->function); news2->checked = temps->checked; strcpy(news2->hotkey,temps->hotkey); temps=temps->next; } return(news); } /**************** free menu structure *************************************/ void free_allmenu (struct title_box *top) { struct title_box *temp = top; struct title_box *temp2 = NULL; struct item_box *tempi, *tempi2; struct sub_box *temps, *temps2; while (temp) { temp2 = temp; if (temp->items) { tempi = tempi2 = temp->items; while(tempi) { if (tempi->submenu){ temps = temps2 = tempi->submenu; while(temps) { if (temps->next) temps=temps->next; else temps=NULL; free(temps2); temps2 = temps; }} if (tempi->next) tempi=tempi->next; else tempi=NULL; free(tempi2); tempi2 = tempi; }} if (temp->next) temp=temp->next; else temp=NULL; free(temp2); temp2=temp; } }