home *** CD-ROM | disk | FTP | other *** search
- /*
- * hotkeyswindow.c V1.5
- *
- * HotKeys list window
- *
- * (c) 1991 by Stefan Becker
- *
- */
- #include "ToolManager.h"
-
- /* Structures for window */
- static char WindowTitle[]=DEFPROGNAME " HotKey List"; /* Window title */
- extern struct NewWindow nw;
- static struct Window *w;
- static struct MsgPort *wp;
- static ULONG wh,ww; /* Window height, width */
- static struct Screen *pubsc; /* Workbench screen */
-
- /* Structures for window gadgets */
- static void *vi; /* Visual information is a *PRIVATE* data field! */
- extern struct GfxBase *GfxBase;
- static struct TextAttr ta={NULL,0,0,0};
- static struct Gadget *gl; /* Gadget list */
- static struct Gadget *lvgad;
-
- /* miscellaneous */
- static struct List HotKeysList;
- static struct HotKeyNode {
- struct Node hkn_Node;
- struct ToolNode *hkn_ToolNode; /* Pointer to tool */
- };
-
- /* Free one HotKeyNode */
- static void FreeHotKeyNode(struct HotKeyNode *hkn)
- {
- /* Remove node from list */
- Remove((struct Node *) hkn);
-
- /* Free memory */
- free(hkn->hkn_Node.ln_Name);
- free(hkn);
- }
-
- /* Free HotKeys list */
- static void FreeHotKeysList(void)
- {
- struct HotKeyNode *hkn1,*hkn2=GetHead(&HotKeysList); /* Begin of list */
-
- while (hkn1=hkn2)
- {
- hkn2=GetSucc((struct ToolNode *) hkn1);
- FreeHotKeyNode(hkn1);
- }
- }
-
- /* Build one HotKeyNode */
- static BOOL BuildHotKeyNode(struct ToolNode *tn)
- {
- struct HotKeyNode *hkn;
- char *tnp,*hkp,*np;
-
- /* Get memory for the node */
- if (!(hkn=malloc(sizeof(struct HotKeyNode)))) return(FALSE);
-
- /* Get memory for node name */
- tnp=tn->tn_Node.ln_Name;
- hkp=tn->tn_HotKey;
- if (!(np=malloc(strlen(tnp)+strlen(hkp)+4)))
- {
- free(hkn);
- return(FALSE);
- }
-
- /* Build node name */
- strcpy(np,hkp);
- strcat(np," : ");
- strcat(np,tnp);
-
- /* Initialize node */
- hkn->hkn_Node.ln_Name=np;
- hkn->hkn_ToolNode=tn;
-
- /* Add node to the list */
- AddHead(&HotKeysList,(struct Node *) hkn);
- return(TRUE);
- }
-
- /* Build list of all available HotKeys */
- static BOOL BuildHotKeysList(void)
- {
- struct ToolNode *tn,tmtn;
-
- /* Initialize HotKeys list */
- NewList(&HotKeysList);
-
- /* Add ToolManager pop up HotKey */
- tmtn.tn_Node.ln_Name=MyName;
- tmtn.tn_HotKey=PopUpHotKey;
- if (!BuildHotKeyNode(&tmtn)) return(FALSE);
-
- /* Scan tool list */
- tn=GetHead(&ToolList); /* Begin of list */
- while (tn)
- {
- /* Does the tool have a HotKey? Yes, add a new HotKeyNode */
- if (tn->tn_CxObj && !BuildHotKeyNode(tn))
- {
- FreeHotKeysList();
- return(FALSE);
- }
-
- tn=GetSucc(tn); /* Next in list */
- }
-
- return(TRUE);
- }
-
- /* Create gadgets */
- static BOOL CreateGadgets(void)
- {
- struct NewGadget ng;
- struct Gadget *g;
- struct TextFont *f;
- UWORD topborder;
- char buf[BUFLEN];
-
- if (!(f=OpenFont(pubsc->Font))) goto cge1; /* Open window font */
- topborder=pubsc->WBorTop+f->tf_YSize+1; /* Top border offset */
- CloseFont(f); /* Close font */
-
- f=GfxBase->DefaultFont; /* System Default Font */
- ta.ta_Name=f->tf_Message.mn_Node.ln_Name;
- ta.ta_YSize=f->tf_YSize;
-
- /* Create gadget list */
- gl=NULL;
- g=CreateContext(&gl);
-
- /* Calculate window values */
- ww=50*f->tf_XSize+INTERWIDTH;
-
- /* 1. Gadget: ListView, HotKeys */
- ng.ng_LeftEdge=pubsc->WBorLeft+INTERWIDTH/2;
- ng.ng_TopEdge=topborder+INTERHEIGHT;
- ng.ng_Width=ww-INTERWIDTH;
- ng.ng_Height=10*f->tf_YSize+INTERHEIGHT;
- ng.ng_GadgetText=NULL;
- ng.ng_GadgetID=0;
- ng.ng_TextAttr=&ta;
- ng.ng_Flags=PLACETEXT_IN;
- ng.ng_VisualInfo=vi;
- ng.ng_UserData=0;
- if (!(lvgad=g=CreateGadget(LISTVIEW_KIND,g,&ng,
- GTLV_Labels,&HotKeysList,
- GTLV_ReadOnly,TRUE,
- TAG_DONE)))
- goto cge2;
-
- /* Calculate window height */
- wh=ng.ng_TopEdge+g->Height-topborder+INTERHEIGHT;
- return(TRUE);
-
- /* Something went wrong... */
- cge2: FreeGadgets(gl);
- cge1: return(FALSE);
- }
-
- /* Open HotKeys window */
- void OpenHotKeysWindow(ULONG left, ULONG top)
- {
-
- if (hkeywinsig) return; /* Already opened? */
-
- if (!(pubsc=LockPubScreen(WBScreenName))) /* Lock Workbench screen */
- goto ow1;
-
- if (!(vi=GetVisualInfo(pubsc,TAG_DONE))) /* Get visual information */
- goto ow2;
-
- if (!BuildHotKeysList()) /* Build list of all HotKeys */
- goto ow3;
-
- if (!CreateGadgets()) /* Create Gadgets */
- goto ow4;
-
- /* Open window */
- if (!(w=OpenWindowTags(&nw,
- WA_Left,left-INTERWIDTH,
- WA_Top,top+20,
- WA_InnerWidth,ww,
- WA_InnerHeight,wh,
- WA_RMBTrap,TRUE,
- WA_Title,WindowTitle,
- WA_PubScreen,pubsc,
- WA_AutoAdjust,TRUE,
- TAG_DONE)))
- goto ow5;
-
- wp=w->UserPort; /* Retrieve window port */
-
- /* Add gadget list to window */
- AddGList(w,gl,(UWORD) -1,(UWORD) -1,NULL);
- RefreshGList(gl,w,NULL,(UWORD) -1);
- GT_RefreshWindow(w,NULL);
-
- /* Window open! */
- UnlockPubScreen(NULL,pubsc);
- hkeywinsig=1L<<wp->mp_SigBit;
- globalsigs|=hkeywinsig;
- return;
-
- /* Something went wrong.... */
- ow5: FreeGadgets(gl);
- ow4: FreeHotKeysList();
- ow3: FreeVisualInfo(vi);
- ow2: UnlockPubScreen(NULL,pubsc);
- ow1: return;
- }
-
- /* Close HotKeys window */
- void CloseHotKeysWindow(void)
- {
- if (hkeywinsig)
- {
- CloseWindow(w);
- FreeGadgets(gl);
- FreeHotKeysList();
- FreeVisualInfo(vi);
- globalsigs&=~hkeywinsig;
- hkeywinsig=0;
- }
- }
-
- /* Refresh HotKeys window */
- void RefreshHotKeysWindow(struct ToolNode *tn, BOOL add)
- {
- /* Is the window open and has the tool a HotKey? */
- if (hkeywinsig && tn->tn_CxObj)
- {
- /* Detach HotKeys list from list view gadget */
- GT_SetGadgetAttrs(lvgad,w,NULL,GTLV_Labels,-1,TAG_DONE);
-
- /* Add or remove a Hotkey? */
- if (add) BuildHotKeyNode(tn); /* Add a new one */
- else
- { /* Remove an old one */
- struct HotKeyNode *hkn=GetHead(&HotKeysList);
-
- /* Find corresponding HotKeyNode */
- while (hkn)
- {
- if (hkn->hkn_ToolNode==tn) break; /* Found it! */
-
- hkn=GetSucc((struct ToolNode *) hkn); /* Next in list */
- }
-
- /* Remove node from list and free it */
- if (hkn) FreeHotKeyNode(hkn);
- }
-
- /* Attach HotKeys list to list view gadget */
- GT_SetGadgetAttrs(lvgad,w,NULL,GTLV_Labels,&HotKeysList,
- GTLV_Top,0,
- TAG_DONE);
- }
- }
-
- /* Handle HotKeys window events */
- void HandleHotKeysWinEvent(void)
- {
- BOOL clwin=FALSE; /* TRUE if window should be closed */
- struct IntuiMessage *msg;
-
- while ((msg=GT_GetIMsg(wp)) /* && !clwin */)
- {
- switch (msg->Class)
- {
- case IDCMP_CLOSEWINDOW: /* User clicked the close gadget */
- clwin=TRUE; /* Yes, close window */
- break;
- case IDCMP_REFRESHWINDOW: /* Window must be refreshed */
- GT_BeginRefresh(w);
- GT_EndRefresh(w,TRUE);
- break;
- }
- GT_ReplyIMsg(msg);
- }
-
- if (clwin) CloseHotKeysWindow();
- }
-
-