/* * window.c V1.3 * * status window * * (c) 1991 by Stefan Becker * */ #include "ToolManager.h" /* Structures for window */ extern UBYTE WindowTitle[]; extern struct NewWindow nw; #define WDRAGBARLEN 60 /* Width of Close & Drag gadget */ static struct Window *w=NULL; 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 */ static WORD lvord=-1; /* LV gadget ordinal number */ static WORD lvtop=0; /* LV gadget top item number */ #define LVGAD_ID 1 static char ETButtonText[]="Edit Tool Definition"; /* Edit Tool gadget text */ #define ETGAD_ID 2 static char RTButtonText[]="Remove Tool"; /* Remove Tool gadget text */ #define RTGAD_ID 3 char SCButtonText[]="Save Configuration"; /* Save config gadget text */ #define SCGAD_ID 4 /* Create & handle edit window */ static BOOL EditToolWindow(struct ToolNode *tn) { struct NewGadget ng; struct Gadget *g,*gl=NULL; static struct TextAttr ta={"topaz.font",8,0,0}; struct TextFont *f; /* Window font */ UWORD topborder,fheight; ULONG wh; struct Window *ew; struct MsgPort *wp; BOOL rc=TRUE,end=TRUE; char buf[BUFLEN]; if (!(pubsc=LockPubScreen("Workbench"))) /* Lock Workbench screen */ goto e1; if (!(f=OpenFont(pubsc->Font))) goto e2; /* Open window font */ topborder=pubsc->WBorTop+f->tf_YSize+1; CloseFont(f); /* Close font */ if (!(f=OpenFont(&ta))) goto e2; /* Open window font */ fheight=f->tf_YSize; /* Font height */ CloseFont(f); /* Close font */ /* Create gadget list */ gl=NULL; g=CreateContext(&gl); /* Create edit gadget */ BuildConfigLine(tn,buf); ng.ng_LeftEdge=pubsc->WBorLeft+INTERWIDTH; ng.ng_TopEdge=topborder+INTERHEIGHT; ng.ng_Height=fheight+INTERHEIGHT+2; ng.ng_Width=ww; ng.ng_TextAttr=&ta; ng.ng_GadgetText=NULL; ng.ng_Flags=PLACETEXT_IN; ng.ng_VisualInfo=vi; ng.ng_UserData=0; if (!(g=CreateGadget(STRING_KIND,g,&ng, GTST_String,buf, GTST_MaxChars,BUFLEN-1, TAG_DONE))) goto e3; /* Calculate window height */ wh=ng.ng_TopEdge+g->Height+2*INTERHEIGHT-topborder; /* Open window */ if (!(ew=OpenWindowTags(&nw, WA_Left,w->LeftEdge-INTERWIDTH, WA_Top,w->TopEdge+4*wh, WA_InnerWidth,ww+2*INTERWIDTH, WA_InnerHeight,wh, WA_PubScreen,pubsc, WA_AutoAdjust,TRUE, WA_Title,ETButtonText, TAG_DONE))) goto e3; wp=ew->UserPort; /* Retrieve window port */ /* Circumvent an intuition.library bug. See AutoDocs for LockPubScreen() */ UnlockPubScreen(NULL,pubsc); pubsc=NULL; /* Add gadget list to window */ AddGList(ew,gl,(UWORD) -1,(UWORD) -1,NULL); RefreshGList(gl,ew,NULL,(UWORD) -1); GT_RefreshWindow(ew,NULL); ActivateGadget(g,ew,NULL); /* All OK */ rc=FALSE; while (end) { struct IntuiMessage *msg; WaitPort(wp); while (msg=GT_GetIMsg(wp)) { switch (msg->Class) { case INTUITICKS: /* Intuition tick received */ break; case CLOSEWINDOW: /* User clicked the close gadget */ end=FALSE; /* Yes, close window */ break; case REFRESHWINDOW: /* Window must be refreshed */ GT_BeginRefresh(ew); GT_EndRefresh(ew,TRUE); break; case GADGETUP: /* User released the gadget */ /* Config line changed? */ if (strcmp(buf,((struct StringInfo *) g->SpecialInfo)->Buffer)) { /* Yes, copy new config line */ strcpy(buf,((struct StringInfo *) g->SpecialInfo)->Buffer); /* Build new ToolNode */ DetachToolList(); if (ScanConfigLine(buf,tn->tn_DirLock)) { /* ToolNode created? */ RemToolNode(tn); /* Yes, remove old tool */ lvord=-1; /* Invalidate ordinal number */ end=FALSE; /* Close window */ } else /* No, reactivate Gadget */ { DisplayBeep(NULL); ActivateGadget(g,ew,NULL); } AttachToolList(); } else end=FALSE; /* Definition not changed, but close edit window */ break; } GT_ReplyIMsg(msg); } } CloseWindow(ew); e3: FreeGadgets(gl); e2: if (pubsc) UnlockPubScreen(NULL,pubsc); e1: return(rc); } /* Create status line */ static void PrintStatusLine(void) { StatusText[14]=ToolCount/10+'0'; /* Hack */ StatusText[15]=ToolCount%10+'0'; } /* Create all status window gadgets */ static BOOL CreateWindowGadgets(void) { struct NewGadget ng; struct Gadget *g; struct TextAttr *ta=pubsc->Font; struct TextFont *f; /* Window font */ struct RastPort tmprp; /* RastPort for font-sensitive trick */ UWORD width,fheight; UWORD leftedge,topborder; UWORD lvright; /* Open window font */ if (!(f=OpenFont(ta))) return(FALSE); fheight=f->tf_YSize; /* Font height */ leftedge=pubsc->WBorLeft; topborder=pubsc->WBorTop+fheight+1; /* Initialize temporary RastPort */ InitRastPort(&tmprp); SetFont(&tmprp,f); /* Calculate window width */ ww=TextLength(&tmprp,WindowTitle,strlen(WindowTitle))+WDRAGBARLEN; /* 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=ta; ng.ng_Flags=PLACETEXT_IN; ng.ng_VisualInfo=vi; ng.ng_UserData=0; if (!(g=CreateGadget(TEXT_KIND,g,&ng,TAG_DONE))) goto e1; g->GadgetText->DrawMode=JAM2; /* Argh, why doesn't exist a tag for this? */ /* 2. gadget: ListView, tool list */ ng.ng_LeftEdge=leftedge+WDRAGBARLEN/2; ng.ng_TopEdge+=g->Height+INTERHEIGHT; ng.ng_Width=ww-WDRAGBARLEN; 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 e1; lvright=ng.ng_LeftEdge+g->Width; /* 3. gadget: Button, edit tool definition */ ng.ng_TopEdge+=g->Height+fheight+2*INTERHEIGHT; ng.ng_Width=TextLength(&tmprp,ETButtonText,sizeof(ETButtonText)-1)+INTERWIDTH; ng.ng_Height=fheight+INTERHEIGHT; ng.ng_GadgetText=ETButtonText; ng.ng_GadgetID=ETGAD_ID; if (!(g=CreateGadget(BUTTON_KIND,g,&ng,TAG_DONE))) goto e1; /* 4. gadget: Button, remove tool */ width=TextLength(&tmprp,RTButtonText,sizeof(RTButtonText)-1)+INTERWIDTH; ng.ng_LeftEdge=lvright-width; ng.ng_Width=width; ng.ng_GadgetText=RTButtonText; ng.ng_GadgetID=RTGAD_ID; if (!(g=CreateGadget(BUTTON_KIND,g,&ng,TAG_DONE))) goto e1; /* 5. gadget: Button, save config */ width=TextLength(&tmprp,SCButtonText,sizeof(SCButtonText)-1)+INTERWIDTH; ng.ng_LeftEdge=leftedge+(ww-width)/2; ng.ng_TopEdge+=g->Height+INTERHEIGHT; ng.ng_Width=width; ng.ng_GadgetText=SCButtonText; ng.ng_GadgetID=SCGAD_ID; if (!(g=CreateGadget(BUTTON_KIND,g,&ng,TAG_DONE))) goto e1; /* Calculate window height */ wh=ng.ng_TopEdge+g->Height+INTERHEIGHT-topborder; CloseFont(f); /* Close window font */ if (g) return(TRUE); /* All gadgets created! */ /* Something went wrong.... */ e1: CloseFont(f); FreeGadgets(gl); return(FALSE); } /* Open status window */ ULONG OpenStatusWindow(void) { if (!(pubsc=LockPubScreen("Workbench"))) /* Lock Workbench screen */ goto osw1; if (!(vi=GetVisualInfo(pubsc,TAG_DONE))) /* Get visual information */ goto osw2; if (!CreateWindowGadgets()) /* Create Gadgets */ goto osw3; /* Open window */ if (!(w=OpenWindowTags(&nw, WA_Left,wl, WA_Top,wt, WA_InnerWidth,ww, WA_InnerHeight,wh, WA_PubScreen,pubsc, WA_AutoAdjust,TRUE, TAG_DONE))) goto osw4; 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); /* Notify Workbench about window */ if (!(aw=AddAppWindow(NULL,NULL,w,MyMP,TAG_DONE))) goto osw5; /* Window open! */ return(1L<mp_SigBit); /* Something went wrong.... */ osw5: CloseWindow(w); w=NULL; osw4: FreeGadgets(gl); osw3: FreeVisualInfo(vi); osw2: if (pubsc) UnlockPubScreen(NULL,pubsc); osw1: return(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 (w) 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 (w) 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); } /* Handle window events */ BOOL HandleWindowEvent(void) { BOOL rc=FALSE; /* True if window close event */ struct IntuiMessage *msg; struct ToolNode *tn; while (msg=GT_GetIMsg(wp)) /* Pre-process Intuition messages */ { switch (msg->Class) { case INTUITICKS: /* Intuition tick received */ break; case CLOSEWINDOW: /* User clicked the close gadget */ wl=w->LeftEdge; /* Retreive window parameters for next open */ wt=w->TopEdge; rc=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 a ListView item */ lvtop=lvord=msg->Code; /* Retrieve the ordinal number of the item */ break; case RTGAD_ID: /* User selected the remove tool gadget */ tn=FindTool(); /* Search tool */ if (tn) /* Tool found? */ { lvord=-1; /* Invalidate ordinal number */ DetachToolList(); /* Remove tool from list */ RemToolNode(tn); AttachToolList(); RefreshStatusWindow(); /* Refresh Gadgets */ } break; case ETGAD_ID: /* User selected the edit tool definition gadget */ tn=FindTool(); if (tn) if (EditToolWindow(tn)) DisplayBeep(NULL); break; case SCGAD_ID: /* User selected the save config gadget */ if (WriteConfigFile(w)) DisplayBeep(NULL); break; } break; } GT_ReplyIMsg(msg); /* Reply pre-processed message */ } return rc; } /* Close status window */ void CloseStatusWindow(void) { RemoveAppWindow(aw); CloseWindow(w); w=NULL; FreeGadgets(gl); /* Release allocated resources */ FreeVisualInfo(vi); }