#include <clib/locale_protos.h>
#include <clib/asl_protos.h>
#include <clib/icon_protos.h>
#include <clib/exec_protos.h>
#include <clib/chooser_protos.h>
#include <clib/gadtools_protos.h>
#include <gadgets/listbrowser.h>
#include <images/label.h>
#include <reaction/reaction_macros.h>
#include <gadgets/integer.h>
#include <gadgets/layout.h>
#include <gadgets/button.h>
#include <gadgets/checkbox.h>
#include <gadgets/chooser.h>
#include <classes/window.h>
#include <workbench/icon.h>

#define RAWKEY_CURSORUP 76
#define RAWKEY_CURSORDOWN 77
#define QUALIFIER_SHIFT 0x03
#define QUALIFIER_ALT 0x30
#define QUALIFIER_CTRL 0x08
#define LISTBROWSER_GADGET 3
#define NEWICONS_CHECKBOX 6
#define COLOUR_CHECKBOX 5
#define QUALITY_CHOOSER 7
#define BORDER_CHOOSER 8
#define STACK_INTEGER 10
#define DELAY_INTEGER 12
#define SAVE_BUTTON 14
#define USE_BUTTON 15
#define CANCEL_BUTTON 16
#define MAGICWB_CHECKBOX 17
#define IMAGES_CHOOSER 18
#define TITLEBAR_CHOOSER 22
#define VOLUME_CHECKBOX 23
#define Menu_Project 65504
#define Menu_Open 63488
#define Menu_SaveAs 63520
#define Menu_Quit 63584
#define Menu_Edit 65505
#define Menu_ResetToDefaults 63489
#define Menu_LastSaved 63521
#define Menu_Restore 63553
#define Menu_Settings 65506
#define Menu_CreateIcons 63490
#include "GUIFuncs.h"
char Version[] = "$VER:Workbench Preferences clone - Ghostbuster V2.1 (OS3.9) by Matthew Allatt";
struct Hook AppMessageHook =
{
    { NULL, NULL },
    (ULONG)&ProcessAppMessage,
    NULL,
    NULL
};
struct Hook IDCMPHook =
{
    { NULL, NULL },
    (ULONG)&ProcessIDCMPMessage,
    NULL,
    NULL
};
struct Gadget *Gadget1[25];
struct Window *ra_window=NULL;
/* Function prototypes.
 */
STRPTR Quality_Desc[5];
STRPTR Border_Size[5];
STRPTR Images_Text[3];
STRPTR TitleBar_Text[4];
UBYTE *col2[4];
STRPTR defaulttool = "SYS:Prefs/Workbench";
STRPTR initialdrawer = "SYS:Prefs/Presets/";
extern struct EasyStruct fileerror;
extern struct EasyStruct ifferror;
extern STRPTR envstring;
extern STRPTR envarcstring;
extern struct Catalog *CatalogFile; 
extern char *requiredstring; 
struct ColumnInfo ci[] =
{
    { 0, "Col 1", CIF_SORTABLE },
    { 0, "Col 2", CIF_FIXED },
    { -1, (STRPTR)~0, -1 }
};
struct NewMenu NewMenu[] =
{
    { NM_TITLE, NULL, 0, 0, 0, 0 },
    { NM_ITEM, NULL, NULL, 0, 0, 0 },
    { NM_ITEM, NULL, NULL, 0, 0, 0 },
    { NM_ITEM, NM_BARLABEL, 0, 0, 0, 0 },
    { NM_ITEM, NULL, NULL, 0, 0, 0 },
    { NM_TITLE, NULL, 0, 0, 0, 0 },
    { NM_ITEM, NULL, NULL, 0, 0, 0 },
    { NM_ITEM, NULL, NULL, 0, 0, 0 },
    { NM_ITEM, NULL, NULL, 0, 0, 0 },
    { NM_TITLE, NULL, 0, 0, 0, 0 },
    { NM_ITEM, NULL, NULL, CHECKIT, 0, 0 },
    { NM_END, 0, 0, 0, 0, 0 }
};
struct EasyStruct liberror =
{
    sizeof(struct EasyStruct),
    0,
    NULL,
    NULL,
    NULL
};
ULONG signal; 
char *fileerrorstring;
struct Menu *PrefMenu;
extern struct List label_list;
struct List Quality_List;
struct List Border_List;
struct List Images_List;
struct List TitleBar_List;
extern UWORD NewIcons_Option;
extern UWORD ColourIcon_Option;
extern UWORD Quality_Option;
extern UWORD Border_Option;
extern UWORD Stack_Value;
extern UWORD Delay_Value;
extern UWORD MagicWB_Option;
extern UWORD GraphicsMemType;
extern UWORD TitleBar_Option;
extern UWORD VolumeGuage_Option;
void InitStrings(struct Catalog *cat)
{
    col2[0] = GetCatalogStr(cat,1,"Always Show");
    col2[1] = GetCatalogStr(cat,2,"Show If Valid");
    col2[2] = GetCatalogStr(cat,3,"Never Show");
    col2[3] = NULL;
    liberror.es_Title = fileerror.es_Title = ifferror.es_Title = GetCatalogStr(cat,4,"Program Error");
    liberror.es_TextFormat = GetCatalogStr(cat,5,requiredstring);
    ifferror.es_TextFormat = GetCatalogStr(cat,7,"Error In IFF File\n%s");
    liberror.es_GadgetFormat = fileerror.es_GadgetFormat = ifferror.es_GadgetFormat = GetCatalogStr(cat,21,"OK");
    fileerrorstring = GetCatalogStr(cat,6,"Error In File\n%s");
    fileerror.es_TextFormat = (STRPTR) malloc(strlen(fileerrorstring)+4);
    strcpy(fileerror.es_TextFormat,fileerrorstring);
    strcat(fileerror.es_TextFormat,"\n%s");
    NewMenu[0].nm_Label = GetCatalogStr(cat,8,"Project");
    NewMenu[1].nm_CommKey = GetCatalogStr(cat,9,"O\0Open ...");
    NewMenu[1].nm_Label = NewMenu[1].nm_CommKey +2;
    NewMenu[2].nm_CommKey = GetCatalogStr(cat,10,"A\0Save As ...");
    NewMenu[2].nm_Label = NewMenu[2].nm_CommKey +2;
    NewMenu[4].nm_CommKey = GetCatalogStr(cat,11,"Q\0Quit");
    NewMenu[4].nm_Label = NewMenu[4].nm_CommKey +2;
    NewMenu[5].nm_Label = GetCatalogStr(cat,12,"Edit");
    NewMenu[6].nm_CommKey = GetCatalogStr(cat,13,"D\0Reset To Defaults");
    NewMenu[6].nm_Label = NewMenu[6].nm_CommKey +2;
    NewMenu[7].nm_CommKey = GetCatalogStr(cat,14,"L\0Last Saved");
    NewMenu[7].nm_Label = NewMenu[7].nm_CommKey +2;
    NewMenu[8].nm_CommKey = GetCatalogStr(cat,15,"R\0Restore");
    NewMenu[8].nm_Label = NewMenu[8].nm_CommKey +2;
    NewMenu[9].nm_Label = GetCatalogStr(cat,16,"Settings");
    NewMenu[10].nm_CommKey = GetCatalogStr(cat,17,"I\0Create Icons?");
    NewMenu[10].nm_Label = NewMenu[10].nm_CommKey +2;
    Quality_Desc[0] = GetCatalogStr(cat,28,"Bad");
    Quality_Desc[1] = GetCatalogStr(cat,29,"Poor");
    Quality_Desc[2] = GetCatalogStr(cat,30,"Good");
    Quality_Desc[3] = GetCatalogStr(cat,31,"Best");
    Quality_Desc[4] = NULL;
    Border_Size[0] = GetCatalogStr(cat,32,"No Border");
    Border_Size[1] = GetCatalogStr(cat,33,"Small");
    Border_Size[2] = GetCatalogStr(cat,34,"Mid");
    Border_Size[3] = GetCatalogStr(cat,35,"Large");
    Border_Size[4] = NULL;
    Images_Text[0] = GetCatalogStr(cat,44,"Graphics Memory");
    Images_Text[1] = GetCatalogStr(cat,45,"Other Memory");
    Images_Text[2] = NULL;
    TitleBar_Text[0] = GetCatalogStr(cat,100,"Show TitleBar");
    TitleBar_Text[1] = GetCatalogStr(cat,101,"No TitleBar");
    TitleBar_Text[2] = GetCatalogStr(cat,102,"Flip TitleBar");
    TitleBar_Text[3] = NULL;
 
}
void EditPreferences(char *screenname,struct Screen *PrefScreen,UWORD Icon_Flag)
{
    APTR vinfo; 
      
    Object *WindowObject1 = NULL;
    struct MsgPort *AppPort;
    AppPort=CreateMsgPort();
    if(vinfo = GetVisualInfo(PrefScreen, TAG_DONE))
    {
        if(Icon_Flag)
            NewMenu[10].nm_Flags |= CHECKED;
        if(PrefMenu = CreateMenus(NewMenu, GTMN_FullMenu, TRUE, TAG_DONE))
            LayoutMenus(PrefMenu, vinfo, GTMN_FrontPen, 1, TAG_DONE);
    }
    Make_Chooser_List(&Quality_List,Quality_Desc);
    Make_Chooser_List(&Border_List,Border_Size);
    Make_Chooser_List(&Images_List,Images_Text);
    Make_Chooser_List(&TitleBar_List,TitleBar_Text);
    WindowObject1 = (struct Object *)WindowObject,
        WA_PubScreenName, screenname,
        WA_Left, 0,
        WA_Top, 0,
        WA_Width, 380,
        WA_Height, 0,
        WA_SizeGadget, TRUE,
        WA_DragBar, TRUE,
        WA_DepthGadget, TRUE,
        WA_CloseGadget, TRUE,
        WA_Activate, TRUE,
        WA_AutoAdjust, TRUE,
        WA_MinWidth, 0,
        WA_MinHeight, 0,
        WA_MaxWidth, 0,
        WA_IDCMP, IDCMP_DISKINSERTED | IDCMP_DISKREMOVED,
        WA_MaxHeight, 0,
        WA_Zoom, TRUE,
        WA_Title, GetCatalogStr(CatalogFile,22,"Workbench Preferences - GhostBuster Edition"),
        WINDOW_GadgetHelp, TRUE,
        WINDOW_AppPort, AppPort,
        WINDOW_AppWindow, TRUE,
        WINDOW_AppMsgHook, &AppMessageHook,
        WINDOW_IDCMPHook, &IDCMPHook,
        WINDOW_IDCMPHookBits, IDCMP_DISKINSERTED | IDCMP_DISKREMOVED,
        WINDOW_IconifyGadget, TRUE,
        WINDOW_IconTitle, "Workbench",
        WINDOW_Icon, GetDiskObject("PROGDIR:Workbench"),
        WINDOW_Position, WPOS_CENTERSCREEN,
        WINDOW_MenuStrip, PrefMenu,
        WINDOW_ParentGroup, Gadget1[0] = (struct Gadget *)VGroupObject,
            LAYOUT_SpaceOuter, TRUE,
            LAYOUT_DeferLayout, TRUE,
            LAYOUT_AddChild, Gadget1[1] = (struct Gadget *)LayoutObject,
                GA_ID, 0,
                GA_RelVerify, TRUE,
                GA_GadgetHelp, TRUE,
                LAYOUT_Label, "",
                LAYOUT_Orientation, 1,
                LAYOUT_HorizAlignment, LALIGN_LEFT,
                LAYOUT_VertAlignment, LALIGN_TOP,
                LAYOUT_LabelPlace, BVJ_TOP_LEFT,
                LAYOUT_BevelState, IDS_NORMAL,
                LAYOUT_BevelStyle, BVS_NONE,
                LAYOUT_ShrinkWrap,TRUE,
                LAYOUT_AddChild, Gadget1[2] = (struct Gadget *)LayoutObject,
                    GA_ID, 1,
                    GA_RelVerify, TRUE,
                    GA_GadgetHelp, TRUE,
                    LAYOUT_Label, "",
                    LAYOUT_Orientation, 0,
                    LAYOUT_HorizAlignment, LALIGN_LEFT,
                    LAYOUT_VertAlignment, LALIGN_TOP,
                    LAYOUT_LabelPlace, BVJ_TOP_LEFT,
                    LAYOUT_BevelState, IDS_NORMAL,
                    LAYOUT_BevelStyle, BVS_NONE,
                    LAYOUT_AddChild, Gadget1[3] = (struct Gadget *)LayoutObject,
                        GA_ID, 2,
                        GA_RelVerify, TRUE,
                        GA_GadgetHelp, TRUE,
                        LAYOUT_Label, GetCatalogStr(CatalogFile,40,"Hidden Devices"),
                        LAYOUT_Orientation, 1,
                        LAYOUT_InnerSpacing, 1,
                        LAYOUT_HorizAlignment, LALIGN_LEFT,
                        LAYOUT_VertAlignment, LALIGN_TOP,
                        LAYOUT_LabelPlace, BVJ_TOP_CENTER,
                        LAYOUT_BevelState, IDS_NORMAL,
                        LAYOUT_BevelStyle, 7,
                        LAYOUT_AddChild, Gadget1[4] = (struct Gadget *)ListBrowserObject,
                            GA_ID, LISTBROWSER_GADGET,
                            GA_RelVerify, TRUE,
                            GA_GadgetHelp, TRUE,
                            LISTBROWSER_Labels, (ULONG)&label_list,
                            LISTBROWSER_ColumnInfo, (ULONG)&ci,
                            LISTBROWSER_MultiSelect, FALSE,
                            LISTBROWSER_Separators, TRUE,
                            LISTBROWSER_AutoFit, TRUE,
                            LISTBROWSER_ShowSelected, FALSE,
                            LISTBROWSER_VerticalProp, TRUE,
                            LISTBROWSER_MinVisible,10,
                        End,
                    End,
                    LAYOUT_AddChild, Gadget1[5] = (struct Gadget *)LayoutObject,
                        GA_ID, 4,
                        GA_RelVerify, TRUE,
                        GA_GadgetHelp, TRUE,
                        LAYOUT_Label, GetCatalogStr(CatalogFile,25,"Icons"),
                        LAYOUT_Orientation, 1,
                        LAYOUT_HorizAlignment, LALIGN_RIGHT,
                        LAYOUT_VertAlignment, LALIGN_TOP,
                        LAYOUT_LabelPlace, BVJ_TOP_CENTER,
                        LAYOUT_BevelState, IDS_NORMAL,
                        LAYOUT_BevelStyle, 7,
                        LAYOUT_AddChild, Gadget1[6] = (struct Gadget *)CheckBoxObject,
                            GA_ID, COLOUR_CHECKBOX,
                            GA_RelVerify, TRUE,
                            GA_GadgetHelp, TRUE,
                            GA_Text, GetCatalogStr(CatalogFile,26,"No Colour Icons"),
                            GA_Selected, ColourIcon_Option,
                            CHECKBOX_TextPen, 1,
                            CHECKBOX_FillTextPen, 1,
                            CHECKBOX_BackgroundPen, 0,
                            CHECKBOX_TextPlace, PLACETEXT_RIGHT,
                        End,
                        CHILD_Label, LabelObject, LabelEnd,
                        LAYOUT_AddChild, Gadget1[7] = (struct Gadget *)CheckBoxObject,
                            GA_ID, NEWICONS_CHECKBOX,
                            GA_RelVerify, TRUE,
                            GA_GadgetHelp, TRUE,
                            GA_Text, GetCatalogStr(CatalogFile,27,"No NewIcons"),
                            GA_Selected, NewIcons_Option,
                            GA_Disabled, ColourIcon_Option,
                            CHECKBOX_TextPen, 1,
                            CHECKBOX_FillTextPen, 1,
                            CHECKBOX_BackgroundPen, 0,
                            CHECKBOX_TextPlace, PLACETEXT_RIGHT,
                        End,
                        CHILD_Label, LabelObject, LabelEnd,
                        LAYOUT_AddChild, Gadget1[18] = (struct Gadget *)CheckBoxObject,
                            GA_ID, MAGICWB_CHECKBOX,
                            GA_RelVerify, TRUE,
                            GA_GadgetHelp, TRUE,
                            GA_Text, GetCatalogStr(CatalogFile,43,"Set MagicWB Colours"),
                            GA_Selected, MagicWB_Option,
                            GA_Disabled, FALSE,
                            CHECKBOX_TextPen, 1,
                            CHECKBOX_FillTextPen, 1,
                            CHECKBOX_BackgroundPen, 0,
                            CHECKBOX_TextPlace, PLACETEXT_RIGHT,
                        End,
                        CHILD_Label, LabelObject, LabelEnd,
                        LAYOUT_AddChild, Gadget1[8] = (struct Gadget *)ChooserObject,
                            GA_ID, QUALITY_CHOOSER,
                            GA_RelVerify, TRUE,
                            GA_GadgetHelp, TRUE,
                            CHOOSER_Labels, &Quality_List,
                            CHOOSER_PopUp, TRUE,
                            CHOOSER_MaxLabels, 4,
                            CHOOSER_Offset, 0,
                            CHOOSER_Selected, Quality_Option,
                        End,
                        CHILD_Label, LabelObject, LABEL_Text, GetCatalogStr(CatalogFile, 36,"Quality:"), LabelEnd,
                        LAYOUT_AddChild, Gadget1[9] = (struct Gadget *)ChooserObject,
                            GA_ID, BORDER_CHOOSER,
                            GA_RelVerify, TRUE,
                            GA_GadgetHelp, TRUE,
                            CHOOSER_Labels, &Border_List,
                            CHOOSER_PopUp, TRUE,
                            CHOOSER_MaxLabels, 4,
                            CHOOSER_Offset, 0,
                            CHOOSER_Selected, Border_Option,
                        End,
                        CHILD_Label, LabelObject, LABEL_Text, GetCatalogStr(CatalogFile, 37,"Border Size:"), LabelEnd,
                        LAYOUT_AddChild, Gadget1[19] = (struct Gadget *)ChooserObject,
                            GA_ID, IMAGES_CHOOSER,
                            GA_RelVerify, TRUE,
                            GA_GadgetHelp, TRUE,
                            CHOOSER_Labels, &Images_List,
                            CHOOSER_PopUp, TRUE,
                            CHOOSER_MaxLabels, 2,
                            CHOOSER_Offset, 0,
                            CHOOSER_Selected, GraphicsMemType,
                        End,
                        CHILD_Label, LabelObject,LABEL_Text, GetCatalogStr(CatalogFile,46,"Images in:"), LabelEnd,
                    End,
                    CHILD_WeightedHeight,0, 
                End,
                LAYOUT_AddChild, Gadget1[20] = (struct Gadget *)LayoutObject,
                    GA_ID, 19,
                    GA_RelVerify, TRUE,
                    GA_GadgetHelp, TRUE,
                    LAYOUT_Orientation, 0,
                    LAYOUT_HorizAlignment, LALIGN_LEFT,
                    LAYOUT_VertAlignment, LALIGN_TOP,
                    LAYOUT_LabelPlace, BVJ_TOP_CENTER,
                    LAYOUT_LabelColumn,PLACETEXT_RIGHT,
                    LAYOUT_BevelState, IDS_NORMAL,
                    LAYOUT_BevelStyle, BVS_NONE,
                    LAYOUT_AddChild, Gadget1[21] = (struct Gadget *)LayoutObject,
                        GA_ID, 20,
                        GA_RelVerify, TRUE,
                        GA_GadgetHelp, TRUE,
                        LAYOUT_Orientation, 1,
                        LAYOUT_Label, GetCatalogStr(CatalogFile,47,"Appearance"),
                        LAYOUT_HorizAlignment, LALIGN_LEFT,
                        LAYOUT_VertAlignment, LALIGN_TOP,
                        LAYOUT_LabelPlace, BVJ_TOP_CENTER,
                        LAYOUT_LabelColumn,PLACETEXT_LEFT,
                        LAYOUT_BevelState, IDS_NORMAL,
                        LAYOUT_BevelStyle, 7,
                        LAYOUT_AddChild, Gadget1[23] = (struct Gadget *)ChooserObject,
                            GA_ID, TITLEBAR_CHOOSER,
                            GA_RelVerify, TRUE,
                            GA_GadgetHelp, TRUE,
                            CHOOSER_Labels, &TitleBar_List,
                            CHOOSER_PopUp, TRUE,
                            CHOOSER_MaxLabels, 3,
                            CHOOSER_Selected, TitleBar_Option,
                            CHOOSER_Offset,0,
                            CHOOSER_AutoFit, TRUE,
                        End,
                        CHILD_Label, LabelObject,LABEL_Text, GetCatalogStr(CatalogFile,103,"TitleBar:"),LabelEnd,
                        CHILD_WeightedWidth, 0,
                        LAYOUT_AddChild, Gadget1[24] = (struct Gadget *)CheckBoxObject,
                            GA_ID, VOLUME_CHECKBOX,
                            GA_RelVerify, TRUE,
                            GA_GadgetHelp, TRUE,
                            GA_Selected, VolumeGuage_Option,
                            GA_Disabled, FALSE,
                            CHECKBOX_TextPen, 1,
                            CHECKBOX_FillTextPen, 1,
                            CHECKBOX_BackgroundPen, 0,
                            CHECKBOX_TextPlace, PLACETEXT_RIGHT,
                        End,
                        CHILD_Label, LabelObject,LABEL_Text, GetCatalogStr(CatalogFile,49,"No Volume Guage"),LabelEnd,
                    End,
                    CHILD_WeightedHeight, 0, 
                    LAYOUT_AddChild, Gadget1[22] = (struct Gadget *)LayoutObject,
                        GA_ID, 21,
                        GA_RelVerify, TRUE,
                        GA_GadgetHelp, TRUE,
                        LAYOUT_Orientation, 1,
                        LAYOUT_HorizAlignment, LALIGN_LEFT,
                        LAYOUT_VertAlignment, LALIGN_TOP,
                        LAYOUT_LabelPlace, BVJ_TOP_CENTER,
                        LAYOUT_LabelColumn,PLACETEXT_RIGHT,
                        LAYOUT_BevelState, IDS_NORMAL,
                        LAYOUT_BevelStyle, BVS_NONE,
                //
                LAYOUT_AddChild, Gadget1[10] = (struct Gadget *)LayoutObject,
                    GA_ID, 9,
                    GA_RelVerify, TRUE,
                    GA_GadgetHelp, TRUE,
                    LAYOUT_Label, GetCatalogStr(CatalogFile, 41,"Stack Size"),
                    LAYOUT_Orientation, 1,
                    LAYOUT_HorizAlignment, LALIGN_LEFT,
                    LAYOUT_VertAlignment, LALIGN_TOP,
                    LAYOUT_AlignLabels,Gadget1[12],
                    LAYOUT_LabelPlace, BVJ_TOP_CENTER,
                    LAYOUT_LabelColumn,PLACETEXT_RIGHT,
                    LAYOUT_BevelState, IDS_NORMAL,
                    LAYOUT_BevelStyle, 7,
                    LAYOUT_AddChild, Gadget1[11] = (struct Gadget *)IntegerObject,
                        GA_ID, 10,
                        GA_RelVerify, TRUE,
                        GA_GadgetHelp, TRUE,
                        GA_TabCycle, TRUE,
                        INTEGER_Number, Stack_Value,
                        INTEGER_MaxChars, 10,
                        INTEGER_Minimum, 8,
                        INTEGER_Maximum, 10000,
                        INTEGER_Arrows, TRUE,
                    End,
                    CHILD_Label, LabelObject, LABEL_Text, GetCatalogStr(CatalogFile,39,"KB"), LabelEnd,
                End,
                CHILD_WeightedHeight,0,
                LAYOUT_AddChild, Gadget1[12] = (struct Gadget *)LayoutObject,
                    GA_ID, 11,
                    GA_RelVerify, TRUE,
                    GA_GadgetHelp, TRUE,
                    LAYOUT_Label, GetCatalogStr(CatalogFile,42,"Keyboard Selection Delay"),
                    LAYOUT_Orientation, 1,
                    LAYOUT_HorizAlignment, LALIGN_LEFT,
                    LAYOUT_VertAlignment, LALIGN_TOP,
                    LAYOUT_LabelPlace, BVJ_TOP_CENTER,
                    LAYOUT_BevelState, IDS_NORMAL,
                    LAYOUT_BevelStyle, 7,
                    LAYOUT_LabelColumn,PLACETEXT_RIGHT,
                    LAYOUT_AddChild, Gadget1[13] = (struct Gadget *)IntegerObject,
                        GA_ID, 12,
                        GA_RelVerify, TRUE,
                        GA_GadgetHelp, TRUE,
                        GA_TabCycle, TRUE,
                        INTEGER_Number, Delay_Value,
                        INTEGER_MaxChars, 10,
                        INTEGER_Minimum, 1,
                        INTEGER_Maximum, 10,
                        INTEGER_Arrows, TRUE,
                    End,
                    CHILD_Label, LabelObject, LABEL_Text, GetCatalogStr(CatalogFile,38,"s"), LabelEnd,
                End,
                CHILD_WeightedHeight,0,
                //
                End,
                End,
                //
                LAYOUT_AddChild, Gadget1[14] = (struct Gadget *)LayoutObject,
                     GA_ID, 13,
                     GA_RelVerify, TRUE,
                     GA_GadgetHelp, TRUE,
                     LAYOUT_Label, "",
                     LAYOUT_Orientation, 0,
                     LAYOUT_EvenSize, TRUE,
                     LAYOUT_HorizAlignment, LALIGN_LEFT,
                     LAYOUT_VertAlignment, LALIGN_TOP,
                     LAYOUT_LabelPlace, BVJ_TOP_LEFT,
                     LAYOUT_BevelState, IDS_NORMAL,
                     LAYOUT_BevelStyle, 7,
                     LAYOUT_AddChild, Gadget1[15] = (struct Gadget *)ButtonObject,
                                      GA_ID, SAVE_BUTTON,
                                      GA_RelVerify, TRUE,
                                      GA_GadgetHelp, TRUE,
                                      GA_Text, GetCatalogStr(CatalogFile,18,"_Save"),
                                      BUTTON_Justification, 1,
                     End,
                     CHILD_WeightedWidth,0,
                     LAYOUT_AddChild, Gadget1[16] = (struct Gadget *)ButtonObject,
                                      GA_ID, USE_BUTTON,
                                      GA_RelVerify, TRUE,
                                      GA_GadgetHelp, TRUE,
                                      GA_Text, GetCatalogStr(CatalogFile,19,"_Use"),
                                      BUTTON_Justification, 1,
                     End,
                     CHILD_WeightedWidth,0,
                     LAYOUT_AddChild, Gadget1[17] = (struct Gadget *)ButtonObject,
                                      GA_ID, CANCEL_BUTTON,
                                      GA_RelVerify, TRUE,
                                      GA_GadgetHelp, TRUE,
                                      GA_Text, GetCatalogStr(CatalogFile,20,"_Cancel"),
                                      BUTTON_Justification, 1,
                     End,
                     CHILD_WeightedWidth,0,
                End,
                CHILD_WeightedHeight,0,
            End,
        EndGroup,
    EndWindow;
    if(WindowObject1)
    {
        DoGadgetMethod(Gadget1[4],NULL,NULL,LBM_SORT,NULL,0,FALSE,NULL);
        if (ra_window = (struct Window *) RA_OpenWindow(WindowObject1))
        {
            SetMenuStrip(ra_window, PrefMenu);
            ULONG app = (1L << AppPort->mp_SigBit);
            ULONG done = FALSE;
            ULONG result;

            UWORD cnt,code;
            struct ListerNode *lNode;
            /* Obtain the window wait signal mask. */
            GetAttr(WINDOW_SigMask, WindowObject1, &signal);
            while (!done)
            {
                Wait( signal | app );
                result=RA_HandleInput(WindowObject1,&code);
                while ( result != WMHI_LASTMSG )
                {
                    switch (result & WMHI_CLASSMASK)
                    {
                        case WMHI_MENUPICK:
                            switch(result & WMHI_MENUMASK)
                            {
                                case Menu_Open:
                                    struct FileRequester *fr;
                                    if(fr = AllocAslRequestTags(ASL_FileRequest,
                                        ASLFR_Window, ra_window,
                                        ASLFR_TitleText, GetCatalogStr(CatalogFile,23,"Load Workbench Preferences"),
                                        ASLFR_InitialDrawer,initialdrawer,
                                        ASLFR_DoPatterns,TRUE,
                                        ASLFR_SleepWindow, TRUE,
                                        ASLFR_RejectIcons,TRUE,
                                        TAG_DONE))
                                    {
                                        if(AslRequest(fr,TAG_DONE))
                                        {
                                            char buffer[150];
                                            strcpy(buffer,fr->fr_Drawer);
                                            AddPart(buffer,fr->fr_File,150);
                                            SetGadgetAttrs(Gadget1[4], ra_window, NULL,
                                                LISTBROWSER_Labels, ~0,
                                                TAG_DONE);
                                            LoadSettings(buffer);
                                            SetGadgetAttrs(Gadget1[4], ra_window, NULL,
                                                LISTBROWSER_Labels, (ULONG)&label_list,
                                                TAG_DONE);
                                            DoGadgetMethod(Gadget1[4],ra_window,NULL,LBM_SORT,NULL,0,FALSE,NULL);
                                            UpdateOptions();
                                        }
                                        FreeAslRequest(fr);
                                    }
                                    break;
                                case Menu_SaveAs:
                                    char buffer[150];
                                    struct FileRequester *fr;
                                    if(fr = AllocAslRequestTags(ASL_FileRequest,
                                        ASLFR_Window, ra_window,
                                        ASLFR_TitleText, GetCatalogStr(CatalogFile,24,"Save Workbench Preferences"),
                                        ASLFR_InitialDrawer,initialdrawer,
                                        ASLFR_DoPatterns,TRUE,
                                        ASLFR_SleepWindow,TRUE,
                                        ASLFR_DoSaveMode,TRUE,
                                        ASLFR_RejectIcons,TRUE,
                                        TAG_DONE))
                                    {
                                        if(AslRequest(fr,TAG_DONE))
                                        {
                                            strcpy(buffer,fr->fr_Drawer);
                                            AddPart(buffer,fr->fr_File,150);
                                            if(SavePrefs(buffer,FALSE))
                                            {
                                                if(Icon_Flag)
                                                {
                                                    struct DiskObject *diskobj;
                                                    if(diskobj=GetIconTags(NULL,ICONGETA_GetDefaultType,WBPROJECT,ICONGETA_GetDefaultName,"pref",ICONGETA_FailIfUnavailable,FALSE,TAG_DONE))
                                                    {
                                                        diskobj->do_DefaultTool=defaulttool;
                                                        PutDiskObject(buffer,diskobj);
                                                        FreeDiskObject(diskobj);
                                                    }
                                                }
                                            }
                                        }
                                        FreeAslRequest(fr);
                                    }
                                    break;
                                case Menu_Quit:
                                    ra_window = NULL;
                                    done = TRUE;
                                    break;
                                case Menu_ResetToDefaults:
                                    /* hard-coded values */
                                    SetGadgetAttrs(Gadget1[4], ra_window, NULL,
                                        LISTBROWSER_Labels, ~0,
                                        TAG_DONE);
                                    Free_List(&label_list);
                                    Make_List(&label_list, col2);
                                    SetGadgetAttrs(Gadget1[4], ra_window, NULL,
                                        LISTBROWSER_Labels, (ULONG)&label_list,
                                        TAG_DONE);
                                    DoGadgetMethod(Gadget1[4],ra_window,NULL,LBM_SORT,NULL,0,FALSE,NULL); 
                                    /* set checkbox gadgets off */
                                    ColourIcon_Option = 0;
                                    NewIcons_Option = 0;
                                    Quality_Option = 1;
                                    Border_Option = 1;
                                    Stack_Value = 8;
                                    Delay_Value = 3;
                                    MagicWB_Option = 0;
                                    GraphicsMemType = 0;
                                    TitleBar_Option = 0;
                                    VolumeGuage_Option = 0;
                                    UpdateOptions();
                                    break;
                                case Menu_LastSaved:
                                    /* read from envarc: */
                                    SetGadgetAttrs(Gadget1[4], ra_window, NULL,
                                        LISTBROWSER_Labels, ~0,
                                        TAG_DONE);
                                    LoadSettings(envarcstring);
                                    SetGadgetAttrs(Gadget1[4], ra_window, NULL,
                                        LISTBROWSER_Labels, (ULONG)&label_list,
                                        TAG_DONE);
                                    DoGadgetMethod(Gadget1[4],ra_window,NULL,LBM_SORT,NULL,0,FALSE,NULL);
                                    UpdateOptions();
                                    break;
                                case Menu_Restore:
                                    /* read from env: */
                                    SetGadgetAttrs(Gadget1[4], ra_window, NULL,
                                        LISTBROWSER_Labels, ~0,
                                        TAG_DONE);
                                    LoadSettings(envstring);
                                    SetGadgetAttrs(Gadget1[4], ra_window, NULL,
                                        LISTBROWSER_Labels, (ULONG)&label_list,
                                        TAG_DONE);
                                    DoGadgetMethod(Gadget1[4],ra_window,NULL,LBM_SORT,NULL,0,FALSE,NULL);
                                    UpdateOptions();
                                    break;
                                case Menu_CreateIcons:
                                    Icon_Flag = 1 - Icon_Flag;
                                    break;
                                    /* flag set/unset? */
                                default:
                                    break;
                            }
                            break;
                        case WMHI_CLOSEWINDOW:
                            ra_window = NULL;
                            done = TRUE;
                            break;

                        case WMHI_GADGETUP:
                            switch (result & WMHI_GADGETMASK)
                            {
                                case LISTBROWSER_GADGET:
                                    lNode = (struct ListerNode *)label_list.lh_Head;
                                    for(cnt=0;cnt < code;cnt++)
                                        lNode = (struct ListerNode *)lNode->lb_Node.ln_Succ;
                                    lNode->option = (lNode->option +1) % 3;
                                    SetGadgetAttrs(Gadget1[4], ra_window, NULL,
                                        LISTBROWSER_Labels, ~0,
                                        TAG_DONE);
                                    SetListBrowserNodeAttrs((struct Node *)lNode,
                                       LBNA_Column,1,
                                       LBNCA_Text,col2[lNode->option],
                                       TAG_END);
                                    SetGadgetAttrs(Gadget1[4], ra_window, NULL,
                                        LISTBROWSER_Labels, (ULONG)&label_list,
                                        TAG_DONE);

                                    break;
                                case COLOUR_CHECKBOX:
                                    ColourIcon_Option = code;
                                    SetGadgetAttrs(Gadget1[7], ra_window, NULL,
                                        GA_Disabled, ColourIcon_Option,
                                        TAG_DONE);
                                    RefreshGList(Gadget1[7],ra_window,NULL,1);
                                    break;
                                case NEWICONS_CHECKBOX:
                                    NewIcons_Option = code;
                                    break;
                                case MAGICWB_CHECKBOX:
                                    MagicWB_Option = code;
                                    break;
                                case QUALITY_CHOOSER:
                                    Quality_Option = code;
                                    break;
                                case BORDER_CHOOSER:
                                    Border_Option = code;
                                    break;
                                case IMAGES_CHOOSER:
                                    GraphicsMemType = code;
                                    break;
                                case STACK_INTEGER:
                                    Stack_Value = code;
                                    break;
                                case DELAY_INTEGER:
                                    Delay_Value = code;
                                    break;
                                case TITLEBAR_CHOOSER:
                                    TitleBar_Option = code;
                                    break;
                                case VOLUME_CHECKBOX:
                                    VolumeGuage_Option = code;
                                    break;
                                case SAVE_BUTTON:
                                    done = TRUE;
                                    SavePrefs(envstring,TRUE);
                                    SavePrefs(envarcstring,FALSE);
                                    ra_window = NULL;
                                    break;
                                case USE_BUTTON:
                                    done = TRUE;
                                    SavePrefs(envstring,TRUE);
                                    ra_window = NULL;
                                    break;
                                case CANCEL_BUTTON:
                                    done = TRUE;
                                    ra_window = NULL;
                                    break;
                                default:
                                    break;
                            }
                            break;

                        case WMHI_ICONIFY:
                            RA_Iconify(WindowObject1);
                            ra_window = NULL;
                            break;

                        case WMHI_UNICONIFY:
                            DoGadgetMethod(Gadget1[4],NULL,NULL,LBM_SORT,NULL,0,FALSE,NULL);
                            ra_window = (struct Window *) RA_OpenWindow(WindowObject1);
                            if (ra_window)
                                GetAttr(WINDOW_SigMask, WindowObject1, &signal);
                            else
                                done = TRUE;
                            break;

                    }
                    result=RA_HandleInput(WindowObject1,&code);
                }
            }

            /* Disposing of the window object will also close the window if it is
             * already opened, and it will dispose of the layout object attached to it.
             */
            DisposeObject(WindowObject1);
        }
    }
    Free_Chooser_List(&Quality_List);
    Free_Chooser_List(&Border_List);
    Free_Chooser_List(&Images_List);
    if(fileerror.es_TextFormat) free(fileerror.es_TextFormat);
    if(AppPort) DeleteMsgPort(AppPort);
    if(PrefMenu) FreeMenus(PrefMenu);
    if(vinfo) FreeVisualInfo(vinfo);
    if(PrefScreen) UnlockPubScreen(screenname,PrefScreen);
}

void UpdateOptions()
{
    SetGadgetAttrs(Gadget1[6], ra_window, NULL,
        GA_Selected, ColourIcon_Option,
        TAG_DONE);
    SetGadgetAttrs(Gadget1[7], ra_window, NULL,
        GA_Selected, NewIcons_Option,
        GA_Disabled, ColourIcon_Option,
        TAG_DONE);
    SetGadgetAttrs(Gadget1[18], ra_window, NULL,
        GA_Selected, MagicWB_Option,
        TAG_DONE);
    SetGadgetAttrs(Gadget1[8], ra_window, NULL,
        CHOOSER_Selected, Quality_Option,
        TAG_DONE);
    SetGadgetAttrs(Gadget1[9], ra_window, NULL,
        CHOOSER_Selected, Border_Option,
        TAG_DONE);
    SetGadgetAttrs(Gadget1[19], ra_window, NULL,
        CHOOSER_Selected, GraphicsMemType,
        TAG_DONE);
    SetGadgetAttrs(Gadget1[11], ra_window, NULL,
        INTEGER_Number, Stack_Value,
        TAG_DONE);
    SetGadgetAttrs(Gadget1[13], ra_window, NULL,
        INTEGER_Number, Delay_Value,
        TAG_DONE);
    SetGadgetAttrs(Gadget1[23], ra_window, NULL,
        CHOOSER_Selected, TitleBar_Option,
        TAG_DONE);
    SetGadgetAttrs(Gadget1[24], ra_window, NULL,
        GA_Selected, VolumeGuage_Option,
        TAG_DONE);
    RefreshGList(Gadget1[6],ra_window,NULL,1);
    RefreshGList(Gadget1[7],ra_window,NULL,1);
    RefreshGList(Gadget1[18],ra_window,NULL,1);
    RefreshGList(Gadget1[24],ra_window,NULL,1);
}
__saveds __asm ULONG ProcessAppMessage(__a0 struct Hook *hook,__a2 APTR window,__a1 struct AppMessage *appmsg)
{
    char buffer[150];
    if(appmsg->am_NumArgs > 0)
    {
        NameFromLock(appmsg->am_ArgList[0].wa_Lock,buffer,150);
        AddPart(buffer,appmsg->am_ArgList[0].wa_Name,150);
        SetGadgetAttrs(Gadget1[4], ra_window, NULL,
            LISTBROWSER_Labels, ~0,
            TAG_DONE);
        LoadSettings(buffer);
        SetGadgetAttrs(Gadget1[4], ra_window, NULL,
        LISTBROWSER_Labels, (ULONG)&label_list,
        TAG_DONE);
        DoGadgetMethod(Gadget1[4],ra_window,NULL,LBM_SORT,NULL,0,FALSE,NULL);
        UpdateOptions();
    }
    if(appmsg->am_Type == AMTYPE_APPICON)
    {
        ra_window = (struct Window *) RA_OpenWindow(window);
        if (ra_window)
            GetAttr(WINDOW_SigMask, window, &signal);
    }

    return(0);
}
__saveds __asm ULONG ProcessIDCMPMessage(__a0 struct Hook *hook,__a2 APTR window,__a1 struct IntuiMessage *imsg)
{
    SetGadgetAttrs(Gadget1[4], ra_window, NULL,
        LISTBROWSER_Labels, ~0,
        TAG_DONE);
    Make_List(&label_list,col2);
    SetGadgetAttrs(Gadget1[4], ra_window, NULL,
        LISTBROWSER_Labels, (ULONG)&label_list,
        TAG_DONE);
    return(0);
}
BOOL Make_Chooser_List(struct List *list, STRPTR *labels1)
{
    struct Node *node;
    WORD i = 0;
    NewList(list);
    while ((*labels1) && (node = AllocChooserNode(
        CNA_Text,*labels1,
        TAG_DONE)))
    {
        AddTail(list, node);
        labels1++;
    }
    return(TRUE);
}
void Free_Chooser_List(struct List *list)
{
    struct Node *node;
    while (node = RemHead(list))
        FreeChooserNode(node);
    NewList(list);
}

