home *** CD-ROM | disk | FTP | other *** search
- /*
- * statuswindow.c V1.4
- *
- * status window
- *
- * (c) 1991 by Stefan Becker
- *
- */
- #include "ToolManager.h"
-
- /* Structures for window */
- extern char WBScreenName[];
- static char wtbc[]=DEFPROGNAME ": HotKey=";
- static char *wtb;
- extern struct NewWindow nw;
- static struct Window *w;
- static struct AppWindow *aw;
- static struct MsgPort *wp;
- static ULONG wl=20,wt=20; /* Window leftedge & topedge */
- static ULONG ww,wh; /* Window width & height */
- static struct Screen *pubsc; /* Workbench screen */
-
- /* Structures for window gadgets */
- static void *vi; /* Visual information is a *PRIVATE* data field! */
- static struct Gadget *gl; /* Gadget list */
- static char StatusText[]="Active Tools: 00"; /* Text gadget text */
- static struct Gadget *lvgad; /* ListView gadget */
- WORD lvord=-1; /* LV gadget ordinal number */
- static WORD lvtop=0; /* LV gadget top item number */
- static ULONG oldsecs=0,oldmicros=0; /* LV double click check */
- #define LVGAD_ID 1
- static char NTButtonText[]="New"; /* New Tool gadget text */
- #define NTGAD_ID 2
- static char ETButtonText[]="Edit"; /* Edit Tool gadget text */
- #define ETGAD_ID 3
- static char STButtonText[]="Start"; /* Start Tool gadget text */
- #define STGAD_ID 4
- static char RTButtonText[]="Remove"; /* Remove Tool gadget text */
- #define RTGAD_ID 5
- static char SCButtonText[]="Save"; /* Save config gadget text */
- #define SCGAD_ID 6
- static char ENButtonText[]="Enable"; /* Enable broker gadget text */
- #define ENGAD_ID 7
- static char DIButtonText[]="Disable"; /* Disable broker gadget text */
- #define DIGAD_ID 8
- static char QUButtonText[]="Quit"; /* Quit gadget text */
- #define QUGAD_ID 9
-
- /* Structures for window menu */
- static struct Menu *wmn=NULL;
- #define HIMENU_ID 1
- static char ABMenuText[]="About";
- #define ABMENU_ID 2
- #define QUMENU_ID 3
- #define ENMENU_ID 4
- #define DIMENU_ID 5
- #define STMENU_ID 6
- #define NTMENU_ID 7
- #define ETMENU_ID 8
- #define SCMENU_ID 9
- #define RTMENU_ID 10
- static struct NewMenu mdata[]={
- {NM_TITLE,MyName,NULL,0,~0,NULL},
- {NM_ITEM,"Hide" ,"H",0,~0,HIMENU_ID},
- {NM_ITEM,ABMenuText ,NULL,0,~0,ABMENU_ID},
- {NM_ITEM,QUButtonText,"Q",0,~0,QUMENU_ID},
- {NM_TITLE,"HotKeys",NULL,0,~0,NULL},
- {NM_ITEM,ENButtonText,"A",0,~0,ENMENU_ID},
- {NM_ITEM,DIButtonText,"D",0,~0,DIMENU_ID},
- {NM_TITLE,"Tools",NULL,0,~0,NULL},
- {NM_ITEM,STButtonText,"S",0,~0,STMENU_ID},
- {NM_ITEM,NTButtonText,"N",0,~0,NTMENU_ID},
- {NM_ITEM,ETButtonText,"E",0,~0,ETMENU_ID},
- {NM_ITEM,SCButtonText,"C",0,~0,SCMENU_ID},
- {NM_ITEM,RTButtonText,"R",0,~0,RTMENU_ID},
- {NM_END,NULL,NULL,0,~0,NULL}};
-
- /* Data for "About" requester */
- static UBYTE AboutText[]="ToolManager V" TM_VERSION " (" TM_DATE ")\n"\
- "© " TM_CRYEAR " Stefan Becker\n"\
- "This program is freely distributable";
-
- static struct EasyStruct AboutES={sizeof(struct EasyStruct),0,ABMenuText,
- AboutText,"Ok"};
-
-
- /* Create status line */
- static void PrintStatusLine(void)
- {
- StatusText[14]=ToolCount/10+'0'; /* Hack */
- StatusText[15]=ToolCount%10+'0';
- }
-
- /* Create all status window gadgets & menus */
- static BOOL CreateGadgets(void)
- {
- struct NewGadget ng;
- struct Gadget *g;
- struct TextFont *f; /* Window font */
- struct RastPort tmprp; /* RastPort for font-sensitive trick */
- UWORD wg,width,fheight;
- UWORD leftedge,topborder;
- UWORD lvright;
-
- /* Open window font */
- if (!(f=OpenFont(pubsc->Font))) goto cg1;
- fheight=f->tf_YSize; /* Font height */
- leftedge=pubsc->WBorLeft;
- topborder=pubsc->WBorTop+fheight+1;
-
- /* Initialize temporary RastPort */
- InitRastPort(&tmprp);
- SetFont(&tmprp,f);
-
- /* Calculate window & gadget width */
- ww=TextLength(&tmprp,wtb,strlen(wtb))+WDRAGBARLEN;
- wg=TextLength(&tmprp,DIButtonText,sizeof(DIButtonText)-1)+INTERWIDTH;
- width=TextLength(&tmprp,RTButtonText,sizeof(RTButtonText)-1)+INTERWIDTH;
- if (width>wg) wg=width;
- if ((width=3*wg+4*INTERWIDTH)>ww) ww=width;
-
- /* Create gadget list */
- gl=NULL;
- g=CreateContext(&gl);
-
- /* 1. gadget: Text, status line */
- PrintStatusLine();
- width=TextLength(&tmprp,StatusText,sizeof(StatusText)-1)+INTERWIDTH;
- ng.ng_LeftEdge=leftedge+(ww-width)/2;
- ng.ng_TopEdge=topborder+INTERHEIGHT;
- ng.ng_Width=width;
- ng.ng_Height=fheight;
- ng.ng_GadgetText=StatusText;
- ng.ng_TextAttr=pubsc->Font;
- ng.ng_Flags=PLACETEXT_IN;
- ng.ng_VisualInfo=vi;
- ng.ng_UserData=0;
- if (!(g=CreateGadget(TEXT_KIND,g,&ng,TAG_DONE))) goto cg2;
- g->GadgetText->DrawMode=JAM2; /* Argh, why doesn't exist a tag for this? */
-
- /* 2. gadget: ListView, tool list */
- ng.ng_LeftEdge=leftedge+INTERWIDTH/2;
- ng.ng_TopEdge+=g->Height+INTERHEIGHT;
- ng.ng_Width=ww-INTERWIDTH;
- ng.ng_Height=7*fheight;
- ng.ng_GadgetText=NULL;
- ng.ng_GadgetID=LVGAD_ID;
- if (!(lvgad=g=CreateGadget(LISTVIEW_KIND,g,&ng,
- GTLV_Labels,&ToolList,
- /* If an item was selected, use it as top item */
- GTLV_Top,lvtop,
- GTLV_ShowSelected,NULL,
- GTLV_Selected,lvord,
- TAG_DONE))) goto cg2;
- lvright=ng.ng_LeftEdge+g->Width;
-
- /* 3. gadget: Button, new tool */
- ng.ng_TopEdge+=g->Height+fheight+2*INTERHEIGHT;
- ng.ng_Width=wg;
- ng.ng_Height=fheight+INTERHEIGHT;
- ng.ng_GadgetText=NTButtonText;
- ng.ng_GadgetID=NTGAD_ID;
- if (!(g=CreateGadget(BUTTON_KIND,g,&ng,TAG_DONE))) goto cg2;
-
- /* 4. gadget: Button, edit tool definition */
- ng.ng_LeftEdge=leftedge+(ww-wg)/2;
- ng.ng_GadgetText=ETButtonText;
- ng.ng_GadgetID=ETGAD_ID;
- if (!(g=CreateGadget(BUTTON_KIND,g,&ng,TAG_DONE))) goto cg2;
-
- /* 5. gadget: Button, start tool */
- ng.ng_LeftEdge=lvright-wg;
- ng.ng_GadgetText=STButtonText;
- ng.ng_GadgetID=STGAD_ID;
- if (!(g=CreateGadget(BUTTON_KIND,g,&ng,TAG_DONE))) goto cg2;
-
- /* 6. gadget: Button, remove tool */
- ng.ng_LeftEdge=leftedge+INTERWIDTH/2;
- ng.ng_TopEdge+=g->Height+INTERHEIGHT;
- ng.ng_GadgetText=RTButtonText;
- ng.ng_GadgetID=RTGAD_ID;
- if (!(g=CreateGadget(BUTTON_KIND,g,&ng,TAG_DONE))) goto cg2;
-
- /* 7. gadget: Button, save config */
- ng.ng_LeftEdge=lvright-wg;
- ng.ng_GadgetText=SCButtonText;
- ng.ng_GadgetID=SCGAD_ID;
- if (!(g=CreateGadget(BUTTON_KIND,g,&ng,TAG_DONE))) goto cg2;
-
- /* 8. gadget: Button, enable broker */
- ng.ng_LeftEdge=leftedge+INTERWIDTH/2;
- ng.ng_TopEdge+=g->Height+2*INTERHEIGHT;
- ng.ng_GadgetText=ENButtonText;
- ng.ng_GadgetID=ENGAD_ID;
- if (!(g=CreateGadget(BUTTON_KIND,g,&ng,TAG_DONE))) goto cg2;
-
- /* 9. gadget: Button, disable broker */
- ng.ng_LeftEdge=leftedge+(ww-wg)/2;
- ng.ng_Width=wg;
- ng.ng_GadgetText=DIButtonText;
- ng.ng_GadgetID=DIGAD_ID;
- if (!(g=CreateGadget(BUTTON_KIND,g,&ng,TAG_DONE))) goto cg2;
-
- /* 10. gadget: Button, Quit */
- ng.ng_LeftEdge=lvright-wg;
- ng.ng_GadgetText=QUButtonText;
- ng.ng_GadgetID=QUGAD_ID;
- if (!(g=CreateGadget(BUTTON_KIND,g,&ng,TAG_DONE))) goto cg2;
-
- /* Calculate window height */
- wh=ng.ng_TopEdge+g->Height+INTERHEIGHT-topborder;
-
- /* Create menus */
- if (!(wmn=CreateMenus(mdata,
- GTMN_FullMenu,TRUE,
- TAG_DONE))) goto cg2;
-
- /* Layout menus */
- if (!LayoutMenus(wmn,vi,TAG_DONE)) goto cg3;
-
- CloseFont(f); /* Close window font */
- return(TRUE); /* All gadgets created! */
-
- /* Something went wrong.... */
- cg3: FreeMenus(wmn);
- cg2: FreeGadgets(gl);
- CloseFont(f);
- cg1: return(FALSE);
- }
-
- /* Open status window */
- void OpenStatusWindow(void)
- {
- if (statwinsig) return;
-
- /* Create window title */
- if (!(wtb=malloc(strlen(wtbc)+strlen(PopUpHotKey)+1)))
- goto osw1;
- strcpy(wtb,wtbc);
- strcat(wtb,PopUpHotKey);
-
- if (!(pubsc=LockPubScreen(WBScreenName))) /* Lock Workbench screen */
- goto osw2;
-
- if (!(vi=GetVisualInfo(pubsc,TAG_DONE))) /* Get visual information */
- goto osw3;
-
- if (!CreateGadgets()) /* Create Gadgets */
- goto osw4;
-
- /* Open window */
- if (!(w=OpenWindowTags(&nw,
- WA_Left,wl,
- WA_Top,wt,
- WA_InnerWidth,ww,
- WA_InnerHeight,wh,
- WA_Title,wtb,
- WA_PubScreen,pubsc,
- WA_AutoAdjust,TRUE,
- TAG_DONE)))
- goto osw5;
-
- wp=w->UserPort; /* Retrieve window port */
-
- /* Circumvent an intuition.library bug. See AutoDocs for LockPubScreen() */
- UnlockPubScreen(NULL,pubsc);
- pubsc=NULL;
-
- /* Add gadget list to window */
- AddGList(w,gl,(UWORD) -1,(UWORD) -1,NULL);
- RefreshGList(gl,w,NULL,(UWORD) -1);
- GT_RefreshWindow(w,NULL);
-
- /* Add menu to window */
- if (!SetMenuStrip(w,wmn))
- goto osw6;
-
- /* Notify Workbench about window */
- if (!(aw=AddAppWindow(NULL,NULL,w,MyMP,TAG_DONE)))
- goto osw7;
-
- /* Window open! */
- statwinsig=1L<<wp->mp_SigBit;
- return;
-
- /* Something went wrong.... */
- osw7: ClearMenuStrip(w);
- osw6: CloseWindow(w);
- osw5: FreeMenus(wmn);
- FreeGadgets(gl);
- osw4: FreeVisualInfo(vi);
- osw3: if (pubsc) UnlockPubScreen(NULL,pubsc);
- osw2: free(wtb);
- osw1: return;
- }
-
- /* Close status window */
- void CloseStatusWindow(void)
- {
- if (statwinsig)
- {
- wl=w->LeftEdge; /* Retreive window parameters for next open */
- wt=w->TopEdge;
- RemoveAppWindow(aw);
- ClearMenuStrip(w);
- CloseWindow(w);
- FreeMenus(wmn); /* Release allocated resources */
- FreeGadgets(gl);
- FreeVisualInfo(vi);
- free(wtb);
- statwinsig=0;
- }
- }
-
- /* Refresh status window gadgets */
- void RefreshStatusWindow(void)
- {
- PrintStatusLine();
- RefreshGList(gl,w,NULL,2); /* Refresh only the first two gadgets */
- }
-
- /* Find tool with lvord */
- static struct ToolNode *FindTool(void)
- {
- if (lvord>=0) /* Is the ordinal number valid? */
- { /* Yes, search tool */
- struct ToolNode *tn;
- WORD i=0; /* Counter */
-
- /* Scan tool list until the ordinal number is reached */
- for (tn=GetHead(&ToolList); tn; tn=GetSucc(tn),i++)
- if (i>=lvord) break;
-
- return(tn);
- }
- return(NULL);
- }
-
- /* If the window is open, detach tool list from ListView gadget */
- void DetachToolList(void)
- {
- if (statwinsig) GT_SetGadgetAttrs(lvgad,w,NULL,GTLV_Labels,-1,TAG_DONE);
- }
-
- /* If the window is open, attach tool list to ListView gadget */
- void AttachToolList(void)
- {
- if (statwinsig) GT_SetGadgetAttrs(lvgad,w,NULL,
- GTLV_Labels,&ToolList,
- /* If an item was selected, use it as
- top item */
- GTLV_Top,lvtop,
- GTLV_Selected,lvord,
- TAG_DONE);
- }
-
- /* Create new empty tool */
- static void AddEmptyTool(void)
- {
- struct ConfigBlock *cb;
-
- /* Get memory */
- if (cb=malloc(sizeof(struct ConfigBlock)))
- {
- /* Initialize config block */
- InitConfigBlock(cb);
- cb->cb_Type=TNTYPE_DUMMY;
- strcpy(cb->cb_Alias,"New Tool");
-
- /* Add tool */
- if (AddToolNode(cb,StartupCD))
- {
- /* Refresh Gadgets */
- RefreshStatusWindow();
-
- /* Set new tool as active ListView item */
- if (!editwinsig)
- {
- DetachToolList();
- lvtop=lvord=ToolCount-1;
- AttachToolList();
- }
- }
- else DisplayBeep(NULL);
-
- /* Free memory */
- free(cb);
- }
- }
-
- /* Open edit window */
- static void EditTool(void)
- {
- struct ToolNode *tn;
-
- if (!editwinsig)
- {
- tn=FindTool();
- if (tn) OpenEditWindow(w->LeftEdge,w->TopEdge,ww,tn);
- }
- }
-
- /* Remove tool */
- static void SWRemoveTool(void)
- {
- struct ToolNode *tn;
-
- if (!editwinsig) /* Edit window not open? */
- {
- tn=FindTool(); /* Search tool */
- if (tn) /* Tool found? */
- {
- lvord=-1; /* Invalidate ordinal number */
-
- DetachToolList(); /* Remove tool from list */
- RemToolNode(tn);
- AttachToolList();
-
- RefreshStatusWindow(); /* Refresh Gadgets */
- }
- }
- }
-
- /* Start tool */
- static void SWStartTool(void)
- {
- struct ToolNode *tn;
-
- tn=FindTool();
- if (tn) StartTool(tn,NULL);
- }
-
- /* Handle window events */
- void HandleStatWinEvent(void)
- {
- BOOL clwin=FALSE; /* TRUE if window should be closed */
- struct IntuiMessage *msg;
-
- while (msg=GT_GetIMsg(wp)) /* Pre-process Intuition messages */
- {
- switch (msg->Class)
- {
- case CLOSEWINDOW: /* User clicked the close gadget */
- clwin=TRUE; /* Yes, close window */
- break;
- case REFRESHWINDOW: /* Window must be refreshed */
- GT_BeginRefresh(w);
- GT_EndRefresh(w,TRUE);
- break;
- case GADGETUP: /* User released a gadget */
- switch(((struct Gadget *) msg->IAddress)->GadgetID)
- {
- case LVGAD_ID: /* User selected ListView item */
- struct ToolNode *tn;
- ULONG secs=msg->Seconds,micros=msg->Micros;
-
- /* If no edit window is open then check for double click */
- if ((lvord==msg->Code) && DoubleClick(oldsecs,oldmicros,secs,micros))
- /* User double clicked the LV gadget --> Start tool */
- SWStartTool();
- /* No double click --> retrieve the ordinal number of selected item */
- else lvtop=lvord=msg->Code;
-
- /* Save current time */
- oldsecs=secs;
- oldmicros=micros;
- break;
- case NTGAD_ID: /* User selected new tool gadget */
- AddEmptyTool();
- break;
- case ETGAD_ID: /* User selected edit tool definition gadget */
- EditTool();
- break;
- case STGAD_ID: /* User selected start tool gadget */
- SWStartTool();
- break;
- case RTGAD_ID: /* User selected remove tool gadget */
- SWRemoveTool();
- break;
- case SCGAD_ID: /* User selected save config gadget */
- WriteConfigFile(w);
- break;
- case ENGAD_ID: /* User selected enable broker gadget */
- ActivateCxObj(MyBroker,1);
- break;
- case DIGAD_ID: /* User selected enable broker gadget */
- ActivateCxObj(MyBroker,0);
- break;
- case QUGAD_ID: /* User selected quit gadget */
- if (!clwin)
- {
- SetQuitFlag();
- if (!running) clwin=TRUE;
- }
- break;
- }
- break;
- case MENUPICK: /* User selected a menu */
- USHORT mnum=msg->Code;
-
- while (mnum!=MENUNULL) /* Scan all menus */
- {
- struct MenuItem *mi=ItemAddress(wmn,mnum);
-
- switch(GTMENUITEM_USERDATA(mi))
- {
- case HIMENU_ID: /* User selected hide menu item */
- clwin=TRUE;
- break;
- case ABMENU_ID:
- EasyRequest(NULL,&AboutES,NULL,NULL);
- break;
- case QUMENU_ID: /* User selected quit menu item */
- if (!clwin)
- {
- SetQuitFlag();
- if (!running) clwin=TRUE;
- }
- break;
- case ENMENU_ID: /* User selected enable broker menu item */
- ActivateCxObj(MyBroker,1);
- break;
- case DIMENU_ID: /* User selected disable broker menu item */
- ActivateCxObj(MyBroker,0);
- break;
- case STMENU_ID: /* User selected start tool menu item */
- SWStartTool();
- break;
- case NTMENU_ID: /* User selected new tool menu item */
- AddEmptyTool();
- break;
- case ETMENU_ID: /* User selected edit tool definition menu item */
- EditTool();
- break;
- case SCMENU_ID: /* User selected save config menu item */
- WriteConfigFile(w);
- break;
- case RTMENU_ID: /* User selected remove tool menu item */
- SWRemoveTool();
- break;
- }
-
- /* Next selected menu */
- mnum=mi->NextSelect;
- }
- break;
- }
- GT_ReplyIMsg(msg); /* Reply pre-processed message */
- }
-
- if (clwin) CloseStatusWindow();
- }
-