home *** CD-ROM | disk | FTP | other *** search
- /*
- * mainwindow.c V2.0
- *
- * main window handling
- *
- * (c) 1990-1992 Stefan Becker
- */
-
- #include "ToolManagerConf.h"
-
- /* Edit windows function tables */
- OpenWindowFunction *OpenEditWindowFunctions[TMOBJTYPES]={
- OpenExecEditWindow,
- OpenImageEditWindow,
- OpenSoundEditWindow,
- OpenMenuEditWindow,
- OpenIconEditWindow,
- OpenDockEditWindow
- };
-
- CopyNodeFunction *CopyNodeFunctions[TMOBJTYPES]={
- CopyExecNode,
- CopyImageNode,
- CopySoundNode,
- CopyMenuNode,
- CopyIconNode,
- CopyDockNode
- };
-
- /* Window data */
- static struct Gadget *gl; /* Gadget list */
- static struct Menu *mn; /* Menu list */
- static struct Window *w; /* Window */
- static UWORD ww,wh; /* Window size */
- /* Current list in ListView gadget */
- static struct List *CurrentList=&ObjectLists[TMOBJTYPE_EXEC];
- static struct Node *CurrentNode=NULL; /* Current selected node */
- static struct Node *OldNode; /* Current edited node */
- static ULONG CurrentListNumber=0; /* Number of the current list */
- static LONG CurrentTop=0; /* Top node ordinal number */
- static LONG CurrentOrd=-1; /* Current node ordinal number */
- static ULONG CurrentSeconds=0;
- static ULONG CurrentMicros=0;
- static OpenWindowFunction *OpenEditWindow=OpenExecEditWindow;
- static CopyNodeFunction *CopyNode=CopyExecNode;
- static FreeNodeFunction *FreeNode=FreeExecNode;
- static struct EasyStruct es={sizeof(struct EasyStruct),0,NULL,NULL,NULL};
- static char *deftooltypes[]={"USE",NULL};
- #define WINDOW_IDCMP (IDCMP_CLOSEWINDOW|IDCMP_REFRESHWINDOW|BUTTONIDCMP|\
- LISTVIEWIDCMP|CYCLEIDCMP|IDCMP_MENUPICK)
-
- /* Gadget data */
- #define GAD_TYPE 0
- #define GAD_LIST 1
- #define GAD_TOP 2
- #define GAD_UP 3
- #define GAD_DOWN 4
- #define GAD_BOTTOM 5
- #define GAD_SORT 6
- #define GAD_NEW 7
- #define GAD_EDIT 8
- #define GAD_COPY 9
- #define GAD_REMOVE 10
- #define GAD_SAVE 11
- #define GAD_USE 12
- #define GAD_TEST 13
- #define GAD_CANCEL 14
- #define GADGETS 15
- static struct GadgetData gdata[GADGETS];
-
- /* Gadget tags */
- static char *cyclelabels[TMOBJTYPES+1];
- static struct TagItem cycletags[]={GTCY_Labels, cyclelabels,
- GTCY_Active, TMOBJTYPE_EXEC,
- TAG_DONE};
-
- static struct TagItem lvtags[]={GTLV_Labels, &ObjectLists[TMOBJTYPE_EXEC],
- GTLV_ShowSelected, NULL,
- TAG_DONE};
-
- /* Menu data */
- #define MENU_PROJECT 0
- #define MENU_OPEN 1
- #define MENU_SAVEAS 2
- #define MENU_ABOUT 4
- #define MENU_QUIT 6
- #define MENU_EDIT 7
- #define MENU_LSAVED 8
- #define MENU_RESTORE 9
- #define MENU_SETTING 10
- #define MENU_CRICONS 11
- static struct NewMenu mdata[]={
- {NM_TITLE,NULL,NULL,0,~0,NULL},
- {NM_ITEM,NULL,NULL,0,~0,MENU_OPEN},
- {NM_ITEM,NULL,NULL,0,~0,MENU_SAVEAS},
- {NM_ITEM,NM_BARLABEL,NULL,0,~0,NULL},
- {NM_ITEM,NULL,NULL,0,~0,MENU_ABOUT},
- {NM_ITEM,NM_BARLABEL,NULL,0,~0,NULL},
- {NM_ITEM,NULL,NULL,0,~0,MENU_QUIT},
- {NM_TITLE,NULL,NULL,0,~0,NULL},
- {NM_ITEM,NULL,NULL,0,~0,MENU_LSAVED},
- {NM_ITEM,NULL,NULL,0,~0,MENU_RESTORE},
- {NM_TITLE,NULL,NULL,0,~0,NULL},
- {NM_ITEM,NULL,NULL,0,~1,MENU_CRICONS},
- {NM_END}
- };
-
- /* Init main window */
- void InitMainWindow(UWORD left, UWORD fheight)
- {
- ULONG i,tmp,maxw1,maxw2,maxw3;
- struct GadgetData *gd;
-
- /* Init strings */
- gdata[GAD_TYPE].name =AppStrings[MSG_MAINWIN_TYPE_GAD];
- gdata[GAD_LIST].name =AppStrings[MSG_MAINWIN_LIST_GAD];
- gdata[GAD_TOP].name =AppStrings[MSG_WINDOW_TOP_GAD];
- gdata[GAD_UP].name =AppStrings[MSG_WINDOW_UP_GAD];
- gdata[GAD_DOWN].name =AppStrings[MSG_WINDOW_DOWN_GAD];
- gdata[GAD_BOTTOM].name=AppStrings[MSG_WINDOW_BOTTOM_GAD];
- gdata[GAD_SORT].name =AppStrings[MSG_MAINWIN_SORT_GAD];
- gdata[GAD_NEW].name =AppStrings[MSG_MAINWIN_NEW_GAD];
- gdata[GAD_EDIT].name =AppStrings[MSG_MAINWIN_EDIT_GAD];
- gdata[GAD_COPY].name =AppStrings[MSG_MAINWIN_COPY_GAD];
- gdata[GAD_REMOVE].name=AppStrings[MSG_WINDOW_REMOVE_GAD];
- gdata[GAD_SAVE].name =AppStrings[MSG_MAINWIN_SAVE_GAD];
- gdata[GAD_USE].name =AppStrings[MSG_MAINWIN_USE_GAD];
- gdata[GAD_TEST].name =AppStrings[MSG_MAINWIN_TEST_GAD];
- gdata[GAD_CANCEL].name=AppStrings[MSG_WINDOW_CANCEL_GAD];
- cyclelabels[TMOBJTYPE_EXEC] =AppStrings[MSG_MAINWIN_TYPE_EXEC_CYCLE_LABEL];
- cyclelabels[TMOBJTYPE_IMAGE]=AppStrings[MSG_MAINWIN_TYPE_IMAGE_CYCLE_LABEL];
- cyclelabels[TMOBJTYPE_SOUND]=AppStrings[MSG_MAINWIN_TYPE_SOUND_CYCLE_LABEL];
- cyclelabels[TMOBJTYPE_MENU] =AppStrings[MSG_MAINWIN_TYPE_MENU_CYCLE_LABEL];
- cyclelabels[TMOBJTYPE_ICON] =AppStrings[MSG_MAINWIN_TYPE_ICON_CYCLE_LABEL];
- cyclelabels[TMOBJTYPE_DOCK] =AppStrings[MSG_MAINWIN_TYPE_DOCK_CYCLE_LABEL];
- cyclelabels[TMOBJTYPES] =NULL;
-
- mdata[MENU_PROJECT].nm_Label =AppStrings[MSG_MAINWIN_PROJECT_MENU_LABEL];
- mdata[MENU_OPEN].nm_Label =AppStrings[MSG_MAINWIN_OPEN_MENU_LABEL];
- mdata[MENU_OPEN].nm_CommKey =AppStrings[MSG_MAINWIN_OPEN_MENU_SHORTCUT];
- mdata[MENU_SAVEAS].nm_Label =AppStrings[MSG_MAINWIN_SAVEAS_MENU_LABEL];
- mdata[MENU_SAVEAS].nm_CommKey =AppStrings[MSG_MAINWIN_SAVEAS_MENU_SHORTCUT];
- mdata[MENU_ABOUT].nm_Label =AppStrings[MSG_MAINWIN_ABOUT_MENU_LABEL];
- mdata[MENU_QUIT].nm_Label =AppStrings[MSG_MAINWIN_QUIT_MENU_LABEL];
- mdata[MENU_QUIT].nm_CommKey =AppStrings[MSG_MAINWIN_QUIT_MENU_SHORTCUT];
- mdata[MENU_EDIT].nm_Label =AppStrings[MSG_MAINWIN_EDIT_MENU_LABEL];
- mdata[MENU_LSAVED].nm_Label =AppStrings[MSG_MAINWIN_LASTSAVED_MENU_LABEL];
- mdata[MENU_LSAVED].nm_CommKey =AppStrings[MSG_MAINWIN_LASTSAVED_MENU_SHORTCUT];
- mdata[MENU_RESTORE].nm_Label =AppStrings[MSG_MAINWIN_RESTORE_MENU_LABEL];
- mdata[MENU_RESTORE].nm_CommKey=AppStrings[MSG_MAINWIN_RESTORE_MENU_SHORTCUT];
- mdata[MENU_SETTING].nm_Label =AppStrings[MSG_MAINWIN_SETTINGS_MENU_LABEL];
- mdata[MENU_CRICONS].nm_Label =AppStrings[MSG_MAINWIN_CREATEICONS_MENU_LABEL];
- mdata[MENU_CRICONS].nm_CommKey=
- AppStrings[MSG_MAINWIN_CREATEICONS_MENU_SHORTCUT];
- mdata[MENU_CRICONS].nm_Flags=CHECKIT|MENUTOGGLE| (CreateIcons ? CHECKED : 0);
-
- /* Calculate maximum width for cycle gadget */
- {
- char **s;
- maxw1=0;
- for (s=cyclelabels; *s; s++)
- if ((tmp=TextLength(&TmpRastPort,*s,strlen(*s))) > maxw1)
- maxw1=tmp;
- maxw1+=4*INTERWIDTH;
- }
-
- /* Calculate size for type gadget text */
- gd=gdata;
- gd->left=TextLength(&TmpRastPort,gd->name,strlen(gd->name))+INTERWIDTH;
- ww=gd->left+maxw1+2*INTERWIDTH;
-
- /* Calculate width for listview gadget */
- gd++;
- gd->width=2*TextLength(&TmpRastPort,gd->name,strlen(gd->name));
- if ((tmp=40*ScreenFont->tf_XSize) > gd->width) gd->width=tmp;
-
- /* Calculate maximum width for move gadgets */
- maxw2=0;
- for (gd++, i=GAD_TOP; i<=GAD_SORT; i++, gd++)
- if ((tmp=TextLength(&TmpRastPort,gd->name,strlen(gd->name))) > maxw2)
- maxw2=tmp;
- maxw2+=2*INTERWIDTH;
- if ((tmp=gdata[GAD_LIST].width+maxw2+2*INTERWIDTH) > ww) ww=tmp;
-
- /* Calculate maximum width for manipulation gadgets */
- maxw3=0;
- for (; i<=GAD_CANCEL; i++, gd++)
- if ((tmp=TextLength(&TmpRastPort,gd->name,strlen(gd->name))) > maxw3)
- maxw3=tmp;
- maxw3+=2*INTERWIDTH;
- if ((tmp=4*maxw3+4*INTERWIDTH) > ww) ww=tmp;
-
- /* Calculate window sizes */
- wh=11*fheight+7*INTERHEIGHT;
-
- /* Type gadget */
- gd=&gdata[GAD_TYPE];
- maxw1=ww-gd->left-INTERWIDTH;
- gd->type=CYCLE_KIND;
- gd->flags=PLACETEXT_LEFT;
- gd->tags=cycletags;
- gd->left+=left;
- gd->top=WindowTop+INTERHEIGHT;
- gd->width=maxw1;
- gd->height=fheight;
-
- /* Object list gadget */
- gd++;
- gd->type=LISTVIEW_KIND;
- gd->flags=PLACETEXT_ABOVE;
- gd->tags=lvtags;
- gd->left=left;
- gd->top=WindowTop+2*fheight+3*INTERHEIGHT;
- gd->width=ww-2*INTERWIDTH-maxw2;
- gd->height=7*fheight;
-
- /* Move gadgets */
- maxw1=ww-maxw2-INTERWIDTH+left;
- tmp=gd->top;
- gd++;
- for (i=GAD_TOP; i<=GAD_SORT; i++, gd++, tmp+=fheight+INTERHEIGHT) {
- gd->type=BUTTON_KIND;
- gd->flags=PLACETEXT_IN;
- gd->tags=DisabledTags;
- gd->left=maxw1;
- gd->top=tmp;
- gd->width=maxw2;
- gd->height=fheight;
- }
- gdata[GAD_SORT].tags=NULL;
-
- /* Manipulation gadgets */
- maxw1=left;
- maxw2=(ww-INTERWIDTH-maxw3)/3;
- tmp=WindowTop+9*fheight+4*INTERHEIGHT;
- for (i=GAD_NEW; i<=GAD_REMOVE; i++, gd++, maxw1+=maxw2) {
- gd->type=BUTTON_KIND;
- gd->flags=PLACETEXT_IN;
- gd->tags=DisabledTags;
- gd->left=maxw1;
- gd->top=tmp;
- gd->width=maxw3;
- gd->height=fheight;
- }
- gdata[GAD_NEW].tags=NULL;
- gdata[GAD_REMOVE].left=ww-maxw3-INTERWIDTH+left;
-
- /* Configuration gadgets */
- maxw1=left;
- tmp+=fheight+2*INTERHEIGHT;
- for (; i<=GAD_CANCEL; i++, gd++, maxw1+=maxw2) {
- gd->type=BUTTON_KIND;
- gd->flags=PLACETEXT_IN;
- gd->left=maxw1;
- gd->top=tmp;
- gd->width=maxw3;
- gd->height=fheight;
- }
- gdata[GAD_CANCEL].left=ww-maxw3-INTERWIDTH+left;
- }
-
- /* Open main window */
- ULONG OpenMainWindow(void)
- {
- /* Create gadgets */
- if (gl=CreateGadgetList(gdata,GADGETS)) {
- /* Create menus */
- if (mn=CreateMenus(mdata,GTMN_FullMenu,TRUE,
- TAG_DONE)) {
- /* Layout menus */
- if (LayoutMenus(mn,ScreenVI,TAG_DONE))
- /* Open window */
- if (w=OpenWindowTags(NULL,WA_Left,10,
- WA_Top,PublicScreen->BarHeight+2,
- WA_InnerWidth,ww,
- WA_InnerHeight,wh,
- WA_AutoAdjust,TRUE,
- WA_Title,AppStrings[MSG_MAINWIN_TITLE],
- WA_PubScreen,PublicScreen,
- WA_Flags,WFLG_CLOSEGADGET|WFLG_DRAGBAR|
- WFLG_DEPTHGADGET|WFLG_ACTIVATE,
- WA_IDCMP,WINDOW_IDCMP,
- TAG_DONE)) {
- /* Set menu strip */
- if (SetMenuStrip(w,mn)) {
- /* Release public screen */
- UnlockPubScreen(NULL,PublicScreen);
-
- /* Add gadgets to window */
- AddGList(w,gl,(UWORD) -1,(UWORD) -1,NULL);
- RefreshGList(gl,w,NULL,(UWORD) -1);
- GT_RefreshWindow(w,NULL);
-
- /* Set local variables */
- IDCMPPort=w->UserPort;
- w->UserData=HandleMainWindowIDCMP;
- CurrentWindow=w;
-
- /* All OK. (Return IDCMP signal mask) */
- return(1L << IDCMPPort->mp_SigBit);
- }
- CloseWindow(w);
- }
- FreeMenus(mn);
- }
- FreeGadgets(gl);
- }
- /* Call failed */
- return(0);
- }
-
- /* Close main window */
- void CloseMainWindow(void)
- {
- /* Free resources */
- RemoveGList(w,gl,(UWORD) -1);
- ClearMenuStrip(w);
- CloseWindow(w);
- FreeMenus(mn);
- FreeGadgets(gl);
- }
-
- /* Detach list */
- static void DetachObjectList(void)
- {
- GT_SetGadgetAttrs(gdata[GAD_LIST].gadget,w,NULL,GTLV_Labels,-1,
- TAG_DONE);
- }
-
- /* Attach list */
- static void AttachObjectList(void)
- {
- GT_SetGadgetAttrs(gdata[GAD_LIST].gadget,w,NULL,GTLV_Labels, CurrentList,
- GTLV_Top, CurrentTop,
- GTLV_Selected, CurrentOrd,
- TAG_DONE);
- }
-
- /* Disable object gadgets */
- static void DisableObjectGadgets(BOOL disable)
- {
- DisableGadget(gdata[GAD_TOP].gadget,w,disable);
- DisableGadget(gdata[GAD_UP].gadget,w,disable);
- DisableGadget(gdata[GAD_DOWN].gadget,w,disable);
- DisableGadget(gdata[GAD_BOTTOM].gadget,w,disable);
- DisableGadget(gdata[GAD_EDIT].gadget,w,disable);
- DisableGadget(gdata[GAD_COPY].gadget,w,disable);
- DisableGadget(gdata[GAD_REMOVE].gadget,w,disable);
- }
-
- /* Display write error requester */
- static void ConfigWriteError(char *s)
- {
- es.es_TextFormat=AppStrings[MSG_MAINWIN_WRITE_ERROR];
- es.es_GadgetFormat=AppStrings[MSG_WINDOW_CANCEL_GAD];
-
- EasyRequest(w,&es,NULL,s);
- }
-
- /* Handle main window IDCMP events */
- void *HandleMainWindowIDCMP(struct IntuiMessage *msg)
- {
- void *closewindow=NULL;
-
- /* Which IDCMP class? */
- switch (msg->Class) {
- case IDCMP_CLOSEWINDOW: if (!UpdateWindow) closewindow=(void *) 1;
- break;
- case IDCMP_REFRESHWINDOW: GT_BeginRefresh(w);
- GT_EndRefresh(w,TRUE);
- break;
- case IDCMP_GADGETUP:
- switch (((struct Gadget *) msg->IAddress)->GadgetID) {
- case GAD_TYPE: {
- ULONG code=msg->Code;
-
- /* Set new Exec list in ListView gadget, detach list */
- DetachObjectList();
-
- /* Set new pointers */
- CurrentList=&ObjectLists[code];
- CurrentListNumber=code;
- CurrentNode=NULL;
- CurrentTop=0;
- CurrentOrd=-1;
-
- /* Set new function pointers */
- OpenEditWindow=OpenEditWindowFunctions[code];
- CopyNode=CopyNodeFunctions[code];
- FreeNode=FreeNodeFunctions[code];
-
- /* Disable object gadgets, attach list */
- DisableObjectGadgets(TRUE);
- AttachObjectList();
- }
- break;
- case GAD_LIST: {
- ULONG i;
-
- /* Find node */
- CurrentOrd=msg->Code;
- CurrentTop=(CurrentOrd>3) ? CurrentOrd-3 : 0;
- CurrentNode=GetHead(CurrentList);
- for (i=0; i<CurrentOrd; i++)
- CurrentNode=GetSucc(CurrentNode);
-
- /* Double click? */
- if (DoubleClick(CurrentSeconds,CurrentMicros,
- msg->Seconds,msg->Micros) &&
- !UpdateWindow && CurrentNode) {
- /* Save pointer to node */
- OldNode=CurrentNode;
-
- /* Open edit window */
- if ((*OpenEditWindow)(CurrentNode,w)) {
- /* Disable window */
- DisableWindow(w);
-
- /* Set update function */
- UpdateWindow=UpdateMainWindow;
- } else
- DisplayBeep(NULL);
- }
-
- /* Activate object gadgets */
- DisableObjectGadgets(FALSE);
-
- /* Save current time */
- CurrentSeconds=msg->Seconds;
- CurrentMicros=msg->Micros;
- }
- break;
- case GAD_TOP: if (CurrentNode) {
- /* Detach object list */
- DetachObjectList();
-
- /* Move node to top of list */
- Remove(CurrentNode);
- AddHead(CurrentList,CurrentNode);
- CurrentTop=0;
- CurrentOrd=0;
-
- /* Attach object list */
- AttachObjectList();
- }
- break;
- case GAD_UP: {
- struct Node *pred;
-
- /* Node valid and has a predecessor? */
- if (CurrentNode && (pred=GetPred(CurrentNode))) {
- /* Detach object list */
- DetachObjectList();
-
- /* Move node one position up */
- pred=GetPred(pred);
- Remove(CurrentNode);
- Insert(CurrentList,CurrentNode,pred);
- --CurrentOrd;
- CurrentTop=(CurrentOrd>3) ? CurrentOrd-3 : 0;
-
- /* Attach object list */
- AttachObjectList();
- }
- }
- break;
- case GAD_DOWN: {
- struct Node *succ;
-
- /* Node valid and has a successor? */
- if (CurrentNode && (succ=GetSucc(CurrentNode))) {
- /* Detach object list */
- DetachObjectList();
-
- /* Move node one position down */
- Remove(CurrentNode);
- Insert(CurrentList,CurrentNode,succ);
- ++CurrentOrd;
- CurrentTop=(CurrentOrd>3) ? CurrentOrd-3 : 0;
-
- /* Attach object list */
- AttachObjectList();
- }
- }
- break;
- case GAD_BOTTOM: if (CurrentNode) {
- ULONG i;
- struct Node *tmpnode;
-
- /* Detach object list */
- DetachObjectList();
-
- /* Move tool to bottom of list */
- Remove(CurrentNode);
- AddTail(CurrentList,CurrentNode);
-
- /* Search ordinal number */
- tmpnode=GetHead(CurrentList);
- for (i=0; tmpnode; i++) tmpnode=GetSucc(tmpnode);
- CurrentOrd=--i;
- CurrentTop=(i>3) ? i-3 : 0;
-
- /* Attach object list */
- AttachObjectList();
- }
- break;
- case GAD_SORT: {
- BOOL notfinished=TRUE;
-
- /* Detach object list */
- DetachObjectList();
-
- /* Sort list (quick & dirty bubble sort) */
- while (notfinished) {
- struct Node *first;
-
- /* Reset not finished flag */
- notfinished=FALSE;
-
- /* Get first node */
- if (first=GetHead(CurrentList)) {
- struct Node *second;
-
- /* One bubble sort round */
- while (second=GetSucc(first))
- /* Compare */
- if (stricmp(first->ln_Name,second->ln_Name)>0) {
- /* Swap */
- Remove(first);
- Insert(CurrentList,first,second);
- notfinished=TRUE;
- } else
- /* Next */
- first=second;
- }
- }
-
- /* Reset pointers */
- CurrentNode=NULL;
- CurrentOrd=-1;
- CurrentTop=0;
-
- /* Deactivate object gadgets */
- DisableObjectGadgets(TRUE);
-
- /* Attach object list */
- AttachObjectList();
- }
- break;
- case GAD_NEW: if (!UpdateWindow) {
- /* No old node */
- OldNode=NULL;
-
- /* Open edit window */
- if ((*OpenEditWindow)(NULL,w)) {
- /* Disable window */
- DisableWindow(w);
-
- /* Set update function */
- UpdateWindow=UpdateMainWindow;
- } else
- DisplayBeep(NULL);
- }
- break;
- case GAD_EDIT: if (!UpdateWindow) {
- /* Save pointer to node */
- OldNode=CurrentNode;
-
- /* Open edit window */
- if ((*OpenEditWindow)(CurrentNode,w)) {
- /* Disable window */
- DisableWindow(w);
-
- /* Set update function */
- UpdateWindow=UpdateMainWindow;
- } else
- DisplayBeep(NULL);
- }
- break;
- case GAD_COPY: if (CurrentNode) {
- struct Node *newnode;
-
- /* Detach object list */
- DetachObjectList();
-
- /* Copy node */
- if (newnode=(*CopyNode)(CurrentNode)) {
- /* Insert new node */
- Insert(CurrentList,newnode,CurrentNode);
-
- /* Reset pointers */
- CurrentNode=newnode;
- CurrentOrd++;
- CurrentTop=(CurrentOrd>3) ? CurrentOrd-3 : 0;
- }
-
- /* Attach object list */
- AttachObjectList();
- }
- break;
- case GAD_REMOVE: /* Remove current node */
- if (CurrentNode) {
- /* Detach object list */
- DetachObjectList();
-
- /* Deactivate object gadgets */
- DisableObjectGadgets(TRUE);
-
- /* Remove node from list */
- Remove(CurrentNode);
-
- /* Free node */
- (*FreeNode)(CurrentNode);
-
- /* Reset pointers */
- CurrentNode=NULL;
- CurrentTop=(CurrentOrd>3) ? CurrentOrd-3 : 0;
- CurrentOrd=-1;
-
- /* Attach object list */
- AttachObjectList();
- }
- break;
- case GAD_SAVE: {
- /* Set wait pointer */
- DisableWindow(w);
-
- /* Save config file */
- if (WriteConfigFile(SavePrefsFileName))
- if (CopyFile(SavePrefsFileName,PrefsFileName))
- closewindow=(void *) 1;
- else
- ConfigWriteError(PrefsFileName);
- else
- ConfigWriteError(SavePrefsFileName);
-
- /* Remove wait pointer */
- EnableWindow(w,WINDOW_IDCMP);
- }
- break;
- case GAD_USE: {
- /* Set wait pointer */
- DisableWindow(w);
-
- /* Save config file */
- if (WriteConfigFile(PrefsFileName))
- closewindow=(void *) 1;
- else
- ConfigWriteError(PrefsFileName);
-
- /* Remove wait pointer */
- EnableWindow(w,WINDOW_IDCMP);
- }
- break;
- case GAD_TEST: {
- /* Set wait pointer */
- DisableWindow(w);
-
- /* Save config file */
- if (!WriteConfigFile(PrefsFileName))
- ConfigWriteError(PrefsFileName);
-
- /* Remove wait pointer */
- EnableWindow(w,WINDOW_IDCMP);
- }
- break;
- case GAD_CANCEL: if (!UpdateWindow) closewindow=(void *) 1;
- break;
- }
- break;
- case IDCMP_MENUPICK: {
- USHORT menunum=msg->Code;
-
- /* Scan all menu events */
- while (menunum!=MENUNULL) {
- struct MenuItem *menuitem=ItemAddress(mn,menunum);
-
- /* Which menu selected? */
- switch(GTMENUITEM_USERDATA(menuitem)) {
- case MENU_OPEN: {
- char *file;
-
- FileReqParms.frp_Window=w;
- FileReqParms.frp_Title=
- AppStrings[MSG_FILEREQ_TITLE_FILE];
- FileReqParms.frp_OKText=AppStrings[MSG_WINDOW_OK_GAD];
- FileReqParms.frp_Flags1=FRF_DOPATTERNS;
- FileReqParms.frp_Flags2=FRF_REJECTICONS;
- FileReqParms.frp_OldFile=PrefsFileName;
-
- /* Get file name */
- if (file=OpenFileRequester()) {
- /* Detach object list */
- DetachObjectList();
-
- /* Deactivate object gadgets */
- DisableObjectGadgets(TRUE);
-
- /* Free all preferences objects */
- FreeAllObjects();
-
- /* Set wait pointer */
- DisableWindow(w);
-
- /* Read new config file */
- if (!ReadConfigFile(file)) DisplayBeep(NULL);
-
- /* Remove wait pointer */
- EnableWindow(w,WINDOW_IDCMP);
-
- /* Set new pointers */
- CurrentList=&ObjectLists[CurrentListNumber];
- CurrentNode=NULL;
- CurrentTop=0;
- CurrentOrd=-1;
-
- /* Free file name */
- free(file);
-
- /* Attach object list */
- AttachObjectList();
- }
- }
- break;
- case MENU_SAVEAS: {
- char *file;
-
- FileReqParms.frp_Window=w;
- FileReqParms.frp_Title=
- AppStrings[MSG_FILEREQ_TITLE_FILE];
- FileReqParms.frp_OKText=
- AppStrings[MSG_MAINWIN_SAVE_GAD];
- FileReqParms.frp_Flags1=FRF_DOSAVEMODE;
- FileReqParms.frp_Flags2=FRF_REJECTICONS;
- FileReqParms.frp_OldFile=SavePrefsFileName;
-
- /* Get file name */
- if (file=OpenFileRequester()) {
- /* Set wait pointer */
- DisableWindow(w);
-
- /* Read new config file */
- if (WriteConfigFile(file)) {
- /* Create icon for file? */
- if (CreateIcons) {
- struct DiskObject *dobj;
-
- /* Get project icon */
- if (dobj=
- GetDiskObjectNew(file)) {
- char *deftool=dobj->do_DefaultTool;
- char **tooltypes=dobj->do_ToolTypes;
- UBYTE type=dobj->do_Type;
-
- /* Set new values */
- dobj->do_DefaultTool=ProgramName;
- dobj->do_ToolTypes=deftooltypes;
- dobj->do_Type=WBPROJECT;
-
- /* Write icon */
- PutDiskObject(file,dobj);
-
- /* Set old values */
- dobj->do_DefaultTool=deftool;
- dobj->do_ToolTypes=tooltypes;
- dobj->do_Type=type;
-
- /* Free icon */
- FreeDiskObject(dobj);
- }
- }
- } else
- /* error occurred */
- ConfigWriteError(file);
-
- /* Remove wait pointer */
- EnableWindow(w,WINDOW_IDCMP);
-
- /* Free file name */
- free(file);
- }
- }
- break;
- case MENU_ABOUT: es.es_TextFormat="ToolManager " TMVERSION "."
- TMREVISION " (" TMCONFDATE ")\n"
- "Freely distributable\n"
- "⌐ 1990-1992 Stefan Becker";
- es.es_GadgetFormat=AppStrings[MSG_WINDOW_CANCEL_GAD];
-
- /* Disable window */
- DisableWindow(w);
-
- /* Display requester */
- EasyRequest(w,&es,NULL,NULL);
-
- /* Enable window */
- EnableWindow(w,WINDOW_IDCMP);
- break;
- case MENU_QUIT: if (!UpdateWindow) closewindow=(void *) 1;
- break;
- case MENU_LSAVED: {
- /* Detach object list */
- DetachObjectList();
-
- /* Deactivate object gadgets */
- DisableObjectGadgets(TRUE);
-
- /* Free all preferences objects */
- FreeAllObjects();
-
- /* Set wait pointer */
- DisableWindow(w);
-
- /* Read new config file */
- if (!ReadConfigFile(SavePrefsFileName))
- DisplayBeep(NULL);
-
- /* Remove wait pointer */
- EnableWindow(w,WINDOW_IDCMP);
-
- /* Set new pointers */
- CurrentList=&ObjectLists[CurrentListNumber];
- CurrentNode=NULL;
- CurrentTop=0;
- CurrentOrd=-1;
-
- /* Attach object list */
- AttachObjectList();
- }
- break;
- case MENU_RESTORE: {
- /* Detach object list */
- DetachObjectList();
-
- /* Deactivate object gadgets */
- DisableObjectGadgets(TRUE);
-
- /* Free all preferences objects */
- FreeAllObjects();
-
- /* Set wait pointer */
- DisableWindow(w);
-
- /* Read new config file */
- if (!ReadConfigFile(PrefsFileName)) DisplayBeep(NULL);
-
- /* Remove wait pointer */
- EnableWindow(w,WINDOW_IDCMP);
-
- /* Set new pointers */
- CurrentList=&ObjectLists[CurrentListNumber];
- CurrentNode=NULL;
- CurrentTop=0;
- CurrentOrd=-1;
-
- /* Attach object list */
- AttachObjectList();
- }
- break;
- case MENU_CRICONS: CreateIcons=(menuitem->Flags & CHECKED) != 0;
- break;
- }
-
- /* Get next menu event number */
- menunum=menuitem->NextSelect;
- }
- }
- break;
- }
-
- /* Close Window? */
- if (closewindow) GT_ReplyIMsg(msg);
-
- return(closewindow);
- }
-
- /* Update main window (after an edit window has closed) */
- void UpdateMainWindow(void *data)
- {
- /* Detach object list */
- DetachObjectList();
-
- DEBUG_PRINTF("OldNode: 0x%08lx ",OldNode);
- DEBUG_PRINTF("NewNode: 0x%08lx\n",data);
-
- /* Node changed? */
- if (data!=(void *) -1) {
- struct Node *NewNode=data;
-
- /* Make sure that ln_Name is valid */
- if (!NewNode->ln_Name) NewNode->ln_Name=strdup("");
-
- /* Yes. New or Edit? */
- if (OldNode) {
- /* Edit. Insert new node */
- Insert(CurrentList,NewNode,OldNode);
-
- /* Remove old node */
- Remove(OldNode);
-
- /* Free old node */
- (*FreeNode)(OldNode);
-
- /* Set pointer */
- CurrentNode=NewNode;
- } else {
- /* New. Insert after selected node? */
- if (CurrentNode) {
- /* Yes */
- Insert(CurrentList,NewNode,CurrentNode);
- CurrentOrd++;
- CurrentTop=(CurrentOrd>3) ? CurrentOrd-3 : 0;
- } else {
- /* No */
- struct Node *tmpnode;
- ULONG i;
-
- /* Add node to the end of list */
- AddTail(CurrentList,NewNode);
-
- /* Search ordinal number */
- tmpnode=GetHead(CurrentList);
- for (i=0; tmpnode; i++) tmpnode=GetSucc(tmpnode);
- CurrentOrd=--i;
- CurrentTop=(i>3) ? i-3 : 0;
- }
- CurrentNode=NewNode;
- }
- }
-
- /* Activate Gadgets */
- DisableObjectGadgets(CurrentNode==NULL);
-
- /* Attach object list */
- AttachObjectList();
-
- /* Enable window */
- EnableWindow(w,WINDOW_IDCMP);
-
- /* Restore update function pointer */
- UpdateWindow=NULL;
- CurrentWindow=w;
- }
-