home *** CD-ROM | disk | FTP | other *** search
- /************************************************************************
- ************************* BGUI OPTIONS WINDOW *************************
- ************************************************************************/
-
-
- #include <exec/types.h>
- #include <exec/memory.h>
- #include <intuition/intuition.h>
- #include <intuition/classes.h>
- #include <intuition/classusr.h>
- #include <intuition/imageclass.h>
- #include <intuition/gadgetclass.h>
- #include <intuition/intuitionbase.h>
- #include <libraries/bgui.h>
- #include <libraries/bgui_macros.h>
-
- #include <proto/exec.h>
- #include <proto/intuition.h>
- #include <proto/bgui.h>
- #include <proto/graphics.h>
- #include <proto/wb.h>
- #include <clib/alib_protos.h>
- #include <string.h>
-
- #include "code.h"
- #include "version.h"
- #include "hotkey_types.h"
- #include "yak.h"
- #include "gui.h"
- #include "Options_window.h"
-
- #include "yak_locale_strings.h"
-
- #ifdef _DCC
- # include <lists.h>
- #else
- # include "sas_lists.h"
- #endif
-
- /************************************************************************
- ***************************** REFERENCES ******************************
- ************************************************************************/
-
- IMPORT LONG (*HandleReturnID)(LONG ID);
- IMPORT YakHotKey *curhk;
- IMPORT UWORD curtype;
- IMPORT char *PrefsHelp;
-
- /************************************************************************
- ***************************** PROTOTYPES ******************************
- ************************************************************************/
-
-
- /************************************************************************
- ***************************** LOCAL DATA ******************************
- ************************************************************************/
-
- struct Window *OptionsWnd = NULL;
- Object *OptionsWndObj = NULL;
- Object *OptionsObjects[Options_CNT];
- UBYTE *OptionsWdt = NULL;
- struct IBox OptionsBox;
- BOOL OptionsBoxValid = FALSE;
-
- UWORD CurPage = 0;
- STRPTR *PageLabels;
- struct GadgetData *PageNGad;
- UWORD OptGadNum;
-
- struct TagItem TabToPageMap[] = { /* update map between page */
- MX_Active, PAGE_Active, /* tab gadget and page object */
- TAG_DONE
- };
-
- /************************************************************************
- *************************** GETYAKOPTION() ****************************
- *************************************************************************
- * Fuck knows what this does.
- *
- *************************************************************************/
-
- VOID GetYakOption(VOID)
- {
- UWORD ol, optslist;
- UWORD NGad;
-
- optslist = YHK_Takes_Opt(curhk);
- NGad = 0;
-
- for (ol=0; ol<optslist; ol++)
- {
- OptDescription *curdesc;
- UWORD as,an,dn,oldflags;
-
- curdesc = yhktypes[curhk->yhk_Type].yhkt_OptsList[ol].Desc;
- as=0; /* ArgStr number */
- an=0; /* ArgNum number */
- dn=0; /* Desc. number */
- oldflags = curhk->yhk_Option[ol].Flags;
-
- curhk->yhk_Option[ol].Flags = 0;
-
- while (curdesc->Type != NO_OPT)
- {
- UWORD gad;
- STRPTR argstr=NULL;
-
- gad = NGad + curdesc->DisplayID;
-
- switch(curdesc->Type)
- {
- case TOGGLE_OPT:
- curhk->yhk_Option[ol].Flags |= PageNGad[gad].gd_Flag;
- break;
-
- case STRING_OPT:
- if (PageNGad[gad].gd_Flag)
- argstr = DupStr(PageNGad[gad].gd_ArgStr);
- if (oldflags & curdesc->LocalID)
- FreeVec(curhk->yhk_Option[ol].ArgStr[as]);
- if (argstr)
- curhk->yhk_Option[ol].Flags |= PageNGad[gad].gd_Flag;
- curhk->yhk_Option[ol].ArgStr[as] = argstr;
- as++;
- break;
-
- case INTEGER_OPT:
- if (PageNGad[gad].gd_Flag)
- curhk->yhk_Option[ol].Flags |= PageNGad[gad].gd_Flag;
- curhk->yhk_Option[ol].ArgNum[an] = PageNGad[gad].gd_ArgNum;
- an++;
- break;
-
- default:
- break;
- }
-
- curdesc++;
- dn++;
- }
-
- NGad += dn;
- }
- }
-
- /************************************************************************
- *********************** DISABLEOPTIONSGADGETS() ***********************
- *************************************************************************
- * This must disable gadgets, I guess? Which ones? Dunno. Why? Dunno.
- *
- *************************************************************************/
-
- static void DisableOptionsGadgets(UWORD listID, UWORD IDs, BOOL state)
- {
- UWORD gad;
-
- for (gad=0; gad<OptGadNum; gad++)
- {
- if ((PageNGad[gad].gd_ListID == listID) &&
- (PageNGad[gad].gd_Desc->LocalID & IDs))
- PageNGad[gad].gd_Disabled = state;
- }
- }
-
- /************************************************************************
- ******************** MUTUALEXCLUDEOPTIONSGADGETS() ********************
- *************************************************************************
- * Err, dunno.
- *
- *************************************************************************/
-
- static void MutualExcludeOptionsGadgets(UWORD listID, UWORD ID, UWORD excludeIDs)
- {
- UWORD gad;
-
- for (gad=0; gad<OptGadNum; gad++)
- {
- if (PageNGad[gad].gd_ListID == listID)
- {
- if (PageNGad[gad].gd_Desc->LocalID & ID)
- PageNGad[gad].gd_Flag = PageNGad[gad].gd_Desc->LocalID;
-
- if (PageNGad[gad].gd_Flag & excludeIDs)
- PageNGad[gad].gd_Flag = 0;
- }
- }
- }
-
- /************************************************************************
- ************************ INITOPTIONSGADGETS() *************************
- *************************************************************************
- * Inits the gadgets, I suppose.
- *
- *************************************************************************/
-
- VOID InitOptionsGadgets(VOID)
- {
- UWORD gad;
-
- for (gad=0; gad<OptGadNum; gad++)
- {
- if (PageNGad[gad].gd_Desc->ActivateIDs)
- DisableOptionsGadgets(PageNGad[gad].gd_ListID,
- PageNGad[gad].gd_Desc->ActivateIDs,
- (PageNGad[gad].gd_Flag ? FALSE: TRUE));
- }
-
-
- SetGadgetAttrs((struct Gadget *)MX_Page, OptionsWnd, NULL,
- MX_Active, CurPage, TAG_DONE);
-
- for(gad=0; gad<OptGadNum; gad++)
- {
- if (PageNGad[gad].gd_ListID == CurPage)
- {
- switch(PageNGad[gad].gd_Type)
- {
- case CHECKBOX_KIND:
- SetGadgetAttrs(PageNGad[gad].gd_Gadget, OptionsWnd, NULL,
- GA_Selected, (BOOL)PageNGad[gad].gd_Flag, TAG_DONE);
- break;
-
- case STRING_KIND:
- SetGadgetAttrs(PageNGad[gad].gd_Gadget, OptionsWnd, NULL,
- STRINGA_TextVal, (LONG)PageNGad[gad].gd_ArgStr, TAG_DONE);
- break;
-
- case INTEGER_KIND:
- SetGadgetAttrs(PageNGad[gad].gd_Gadget, OptionsWnd, NULL,
- STRINGA_LongVal, (LONG)PageNGad[gad].gd_ArgNum, TAG_DONE);
- break;
-
- default:
- break;
- }
-
- SetGadgetAttrs(PageNGad[gad].gd_Gadget, OptionsWnd, NULL,
- GA_Disabled, (BOOL)PageNGad[gad].gd_Disabled, TAG_DONE);
- }
- }
- }
-
- /************************************************************************
- ********************* SETDEFAULTOPTIONSGADGETS() **********************
- *************************************************************************
- * Sets default options? Probably.
- *
- *************************************************************************/
-
- static void SetDefaultOptionsGadgets(void)
- {
- UWORD gad;
-
- for (gad=0; gad<OptGadNum; gad++)
- {
- OptDescription *curdesc=PageNGad[gad].gd_Desc;
-
- PageNGad[gad].gd_Flag = curdesc->DefFlag;
-
- switch (curdesc->Type)
- {
- case STRING_OPT:
- PageNGad[gad].gd_ArgStr = curdesc->DefArgStr;
- break;
-
- case INTEGER_OPT:
- PageNGad[gad].gd_ArgNum = curdesc->DefArgNum;
- break;
- }
- }
-
- InitOptionsGadgets();
- }
-
- /************************************************************************
- ************************* BUILDGADGETARRAY() **************************
- *************************************************************************
- * Builds an array of gadgets. Yup, that's what it does.
- *
- *************************************************************************/
-
- static void BuildGadgetArray(void)
- {
- OptDescription *curdesc;
- UWORD NGad,gad;
- UWORD ol, optslist;
-
- optslist = YHK_Takes_Opt(curhk);
-
- /* Find number of gadgets */
-
- OptGadNum = 0;
- for (ol=0; ol<optslist; ol++)
- {
- curdesc = yhktypes[curhk->yhk_Type].yhkt_OptsList[ol].Desc;
-
- while (curdesc->Type != NO_OPT)
- {
- OptGadNum++;
- curdesc++;
- }
- }
-
- /* Allocate some memory for gadgets & labels */
-
- PageNGad = (struct GadgetData *) AllocVec(
- OptGadNum * sizeof(struct GadgetData), MEMF_PUBLIC|MEMF_CLEAR);
-
- PageLabels = (STRPTR *) AllocVec(
- (optslist+1) * sizeof(STRPTR), MEMF_PUBLIC|MEMF_CLEAR);
-
- /* Now fill the arrays with gadgets and labels */
-
- NGad = 0;
-
- for (ol=0; ol<optslist; ol++)
- {
- UWORD as=0; /* ArgStr number */
- UWORD an=0; /* ArgNum number */
- UWORD dn=0; /* Desc. number */
-
- curdesc = yhktypes[curhk->yhk_Type].yhkt_OptsList[ol].Desc;
-
- PageLabels[ol] = getString(
- yhktypes[curhk->yhk_Type].yhkt_OptsList[ol].LabelID);
-
- while (curdesc->Type != NO_OPT)
- {
- gad = NGad + curdesc->DisplayID;
-
- switch(curdesc->Type)
- {
- case TOGGLE_OPT:
- PageNGad[gad].gd_Type = CHECKBOX_KIND;
- PageNGad[gad].gd_Flag = (curhk->yhk_Option[ol].Flags &
- curdesc->LocalID);
- break;
-
- case STRING_OPT:
- PageNGad[gad].gd_Type = STRING_KIND;
- if (PageNGad[gad].gd_Flag = (curhk->yhk_Option[ol].Flags &
- curdesc->LocalID))
- {
- PageNGad[gad].gd_ArgStr = curhk->yhk_Option[ol].ArgStr[as];
- }
- as++;
- break;
-
- case INTEGER_OPT:
- PageNGad[gad].gd_Type = INTEGER_KIND;
- if (PageNGad[gad].gd_Flag = (curhk->yhk_Option[ol].Flags &
- curdesc->LocalID))
- {
- PageNGad[gad].gd_ArgNum = curhk->yhk_Option[ol].ArgNum[an];
- }
- an++;
- break;
-
- default:
- break;
- }
-
- PageNGad[gad].gd_ListID = ol;
- PageNGad[gad].gd_Desc = curdesc;
- PageNGad[gad].gd_Text = getString(curdesc->LabelID);
- PageNGad[gad].gd_ReturnID = GD_FirstOption + gad;
-
- curdesc++;
- dn++;
- } /* endwhile curdesc!=NO_OPT */
-
- NGad += dn;
- } /* next ol */
-
- }
-
- /************************************************************************
- **************************** CREATEPAGE() *****************************
- *************************************************************************
- * Create a page object for the given page number.
- *
- *************************************************************************/
-
- static Object *CreatePage(UWORD page)
- {
- Object *pgobj;
- UWORD lc;
- BOOL minw,minh;
-
- pgobj = VGroupObject, Spacing(2), EndObject;
-
- if (!pgobj)
- return(NULL);
-
- for(lc = 0; lc < OptGadNum; lc++)
- {
- if (PageNGad[lc].gd_ListID == page)
- {
- switch(PageNGad[lc].gd_Type)
- {
- case CHECKBOX_KIND:
- PageNGad[lc].gd_Gadget = (struct Gadget *) CheckBoxObject,
- LAB_Label, PageNGad[lc].gd_Text,
- GA_ID, PageNGad[lc].gd_ReturnID,
- ButtonFrame,
- FRM_Flags, FRF_EDGES_ONLY,
- EndObject;
- minw = TRUE;
- minh = TRUE;
- break;
-
- case STRING_KIND:
- PageNGad[lc].gd_Gadget = (struct Gadget *) StringObject,
- LAB_Label, PageNGad[lc].gd_Text,
- GA_ID, PageNGad[lc].gd_ReturnID,
- RidgeFrame,
- STRINGA_MaxChars, 99,
- EndObject;
- minw = FALSE;
- minh = TRUE;
- break;
-
- case INTEGER_KIND:
- PageNGad[lc].gd_Gadget = (struct Gadget *) StringObject,
- LAB_Label, PageNGad[lc].gd_Text,
- GA_ID, PageNGad[lc].gd_ReturnID,
- RidgeFrame,
- STRINGA_MaxChars, 11,
- STRINGA_LongVal, 0,
- EndObject;
- minw = FALSE;
- minh = TRUE;
- break;
-
- default:
- PageNGad[lc].gd_Gadget = NULL;
- break;
- }
-
- if (PageNGad[lc].gd_Gadget)
- {
- DoMethod(pgobj,GRM_ADDMEMBER,PageNGad[lc].gd_Gadget,
- LGO_FixMinWidth, minw,
- LGO_FixMinHeight, minh,
- TAG_END);
- DoMethod(pgobj, GRM_ADDSPACEMEMBER, (DEFAULT_WEIGHT/10));
- }
- else
- {
- DisposeObject(pgobj);
- return(NULL);
- }
- }
- }
-
- return(pgobj);
- }
-
- /************************************************************************
- ************************ CREATEOPTIONSWINDOW() ************************
- *************************************************************************
- * Create the Options window object.
- *
- *************************************************************************/
-
- APTR CreateOptionsWindow(VOID)
- {
- Object *obj,*pg;
- UWORD i;
-
- /* count # pages */
- i = 0;
- while(PageLabels[i]) i++;
-
- obj = WindowObject,
- WINDOW_PubScreenName, PubScreenName,
- WINDOW_Title, OptionsWdt,
- WINDOW_ScreenTitle, getString(COPYRIGHT_STRING),
- WINDOW_SmartRefresh, TRUE,
- WINDOW_SizeBottom, FALSE, /* put size gadget in right border */
- WINDOW_SizeRight, TRUE,
- WINDOW_AutoAspect, TRUE, /* automatic edges pixel width */
- WINDOW_Position, POS_CENTERMOUSE,
- (OptionsBoxValid ? WINDOW_Bounds : TAG_IGNORE), &OptionsBox,
- WINDOW_AppWindow, TRUE, /* make it an appwindow */
- WINDOW_RMBTrap, TRUE, /* trap rmb - no menu */
- WINDOW_CloseGadget, FALSE, /* no windowclose gadget please */
- (TextFont ? WINDOW_Font : TAG_IGNORE), &Attr, /* use font if specified */
- WINDOW_HelpFile, PrefsHelp, /* online help system */
- WINDOW_HelpNode, yhktypes[curtype].yhkt_HelpNode,
- WINDOW_MasterGroup,
- VGroupObject, Spacing(4), HOffset(4), VOffset(4),
- StartMember,
- MX_Page = MxObject,
- GA_ID, GD_Page_Opts,
- MX_Labels, PageLabels,
- MX_TabsObject, TRUE,
- EndObject, FixMinHeight,
- EndMember,
- StartMember,
- HorizSeparator,
- EndMember,
- StartMember,
- pg = PageObject,
- PAGE_Member, CreatePage(0),
- ((i > 1) ? PAGE_Member : TAG_IGNORE),
- ((i > 1) ? CreatePage(1) : NULL),
- ((i > 2) ? PAGE_Member : TAG_IGNORE),
- ((i > 2) ? CreatePage(2) : NULL),
- ((i > 3) ? PAGE_Member : TAG_IGNORE),
- ((i > 3) ? CreatePage(3) : NULL),
- ((i > 4) ? PAGE_Member : TAG_IGNORE),
- EndObject, Weight(DEFAULT_WEIGHT*4),
- EndMember,
- VarSpace(DEFAULT_WEIGHT/10),
- StartMember,
- HorizSeparator,
- EndMember,
- StartMember,
- HGroupObject, Spacing(2), EqualWidth,
- StartMember,
- BT_OK_Opts = Button(
- getString(OK_STRING),GD_OK_Opts),
- EndMember,
- VarSpace(DEFAULT_WEIGHT/2),
- StartMember,
- BT_Default_Opts = Button(
- getString(MENU_DEFAULT_STRING),GD_Default_Opts),
- EndMember,
- VarSpace(DEFAULT_WEIGHT/2),
- StartMember,
- BT_Cancel_Opts = Button(
- getString(CANCEL_STRING),GD_Cancel_Opts),
- EndMember,
- EndObject,
- EndMember,
- EndObject,
- EndObject;
-
- if (obj)
- /* add a notification map from page tabs gadget to page object */
- AddMap(MX_Page,pg,TabToPageMap);
-
- return(obj);
- }
-
- /************************************************************************
- ************************ CLOSEOPTIONSWINDOW() *************************
- *************************************************************************
- * Close the options window.
- *
- *************************************************************************/
-
- VOID CloseOptionsWindow(VOID)
- {
- if (OptionsWnd)
- {
- GetAttr(WINDOW_Bounds,OptionsWndObj,(ULONG *) &OptionsBox);
- OptionsBox.Width = OptionsBox.Height = 0;
- OptionsBoxValid = TRUE;
- }
-
- DisposeObject(OptionsWndObj);
- OptionsWndObj = NULL;
- OptionsWnd = NULL;
-
- FreeVec(PageNGad);
- FreeVec(PageLabels);
-
- }
-
- /************************************************************************
- *********************** HANDLEOPTIONSRETURNID() ***********************
- *************************************************************************
- * Handle Options window events.
- *
- *************************************************************************/
-
- LONG HandleOptionsReturnID(LONG id)
- {
- LONG ret;
- ULONG code;
- ULONG ID;
-
- ret = RET_OKAY;
-
- switch(id)
- {
- case GD_Page_Opts:
- GetAttr(MX_Active,MX_Page,&code);
- CurPage = code;
- InitOptionsGadgets();
- break;
-
- case GD_Default_Opts:
- SetDefaultOptionsGadgets();
- break;
-
- case GD_OK_Opts:
- GetYakOption();
- CloseOptionsWindow();
- if (!ShowWindowID(HOTKEY_WINDOW))
- ret = RET_QUIT;
- CurPage = 0;
- break;
-
- case GD_Cancel_Opts:
- CloseOptionsWindow();
- if (!ShowWindowID(HOTKEY_WINDOW))
- ret = RET_QUIT;
- CurPage = 0;
- break;
-
- default:
- if (id < 65536)
- {
- ID = id - GD_FirstOption;
-
- if (PageNGad[ID].gd_ListID == CurPage)
- {
- switch(PageNGad[ID].gd_Type)
- {
- case CHECKBOX_KIND:
- PageNGad[ID].gd_Flag ^= PageNGad[ID].gd_Desc->LocalID;
-
- if (PageNGad[ID].gd_Desc->ExcludeIDs)
- MutualExcludeOptionsGadgets(PageNGad[ID].gd_ListID,
- PageNGad[ID].gd_Desc->LocalID,
- PageNGad[ID].gd_Desc->ExcludeIDs);
-
- InitOptionsGadgets();
- break;
-
- case STRING_KIND:
- GetAttr(STRINGA_TextVal,PageNGad[ID].gd_Gadget,&code);
- PageNGad[ID].gd_ArgStr = (char *)code;
-
- if (*PageNGad[ID].gd_ArgStr)
- PageNGad[ID].gd_Flag = PageNGad[ID].gd_Desc->LocalID;
- else
- PageNGad[ID].gd_Flag = 0;
-
- InitOptionsGadgets();
- break;
-
- case INTEGER_KIND:
- GetAttr(STRINGA_LongVal,PageNGad[ID].gd_Gadget,&code);
- PageNGad[ID].gd_ArgNum = code;
- PageNGad[ID].gd_Flag = PageNGad[ID].gd_Desc->LocalID;
- InitOptionsGadgets();
- break;
-
- default:
- break;
- }
- }
- }
-
- break;
- }
-
- return(ret);
- }
-
- /************************************************************************
- ************************* SHOWOPTIONSWINDOW() *************************
- *************************************************************************
- * Show our Options window.
- *
- *************************************************************************/
-
- BOOL ShowOptionsWindow(VOID)
- {
- static char title[80];
-
- BuildGadgetArray();
-
- strcpy(title, getString(Options_Window_TITLE));
- strcat(title, " ");
- strcat(title, (curhk->yhk_Name ? curhk->yhk_Name : "<<unnamed>>"));
- OptionsWdt = title;
-
- if (OptionsWndObj = (Object *)CreateOptionsWindow())
- {
- if (OptionsWnd = WindowOpen(OptionsWndObj))
- {
- InitOptionsGadgets();
- HandleReturnID = HandleOptionsReturnID;
- curwin = OptionsWnd;
- curwinobj = OptionsWndObj;
- curwinID = OPTIONS_WINDOW;
- return(TRUE);
- }
- }
-
- CloseOptionsWindow();
- curwin = NULL;
- curwinobj = NULL;
- wndsigflag = 0L;
- appwinsigflag = 0L;
-
- FreeVec(PageNGad);
- FreeVec(PageLabels);
-
- return(FALSE);
- }
-
- /************************************************************************
- *********************** SWITCHTOOPTIONSWINDOW() ***********************
- *************************************************************************
- * Switch from Hotkey window to Options window.
- *
- *************************************************************************/
-
- BOOL SwitchToOptionsWindow(VOID)
- {
- CloseWindowID(HOTKEY_WINDOW);
- return(ShowOptionsWindow());
- }
-
-