#ifndef MAKE_ID
#define MAKE_ID(a,b,c,d) ((ULONG) (a)<<24 | (ULONG) (b)<<16 | (ULONG) (c)<<8 | (ULONG) (d))
#endif

#ifdef _DCC
#define __inline
#endif

#include "a_gui.h"

struct ObjApp * CreateApp(void)
{
        struct ObjApp * Object;

        APTR    GROUP_ROOT_0, GR_Change, REC_label_0, GR_ButtonBar, Space_0, Space_1;
        APTR    Space_2, GROUP_ROOT_1, GR_grp_6, GR_grp_4, GR_grp_5, GROUP_ROOT_2;
        APTR    Scale_0;

        if (!(Object = AllocVec(sizeof(struct ObjApp), MEMF_PUBLIC|MEMF_CLEAR)))
                return(NULL);

        Object->STR_TX_Report = NULL;

        Object->LV_Message = ListObject,
                MUIA_List_ConstructHook, MUIV_List_ConstructHook_String,
                MUIA_List_DestructHook, MUIV_List_DestructHook_String,
                MUIA_Frame, MUIV_Frame_InputList,
        End;

        Object->LV_Message = ListviewObject,
                MUIA_HelpNode, "LV_Message",
                MUIA_Listview_Input, FALSE,
                MUIA_Listview_List, Object->LV_Message,
        End;

        Object->BT_EditMsg = SimpleButton("Edit message...");

        Object->BT_ChMood = SimpleButton("Change mood...");

        Object->BT_ChHeader = SimpleButton("Change header...");

        Object->BT_ChNP = SimpleButton("Change NP...");

        Object->BT_ChSig = SimpleButton("Change signature...");

        Object->BT_ChTag = SimpleButton("Change tagline...");

        GR_Change = GroupObject,
                MUIA_HelpNode, "GR_Change",
                MUIA_Group_Rows, 2,
                MUIA_Group_SameSize, TRUE,
                Child, Object->BT_EditMsg,
                Child, Object->BT_ChMood,
                Child, Object->BT_ChHeader,
                Child, Object->BT_ChNP,
                Child, Object->BT_ChSig,
                Child, Object->BT_ChTag,
        End;

        REC_label_0 = RectangleObject,
                MUIA_Rectangle_HBar, TRUE,
                MUIA_FixHeight, 8,
        End;

        Space_0 = HVSpace;

        Object->BT_OK = SimpleButton("OK");

        Space_1 = HVSpace;

        Object->BT_Cancel = SimpleButton("Cancel");

        Space_2 = HVSpace;

        GR_ButtonBar = GroupObject,
                MUIA_HelpNode, "GR_ButtonBar",
                MUIA_Group_Horiz, TRUE,
                MUIA_Group_SameSize, TRUE,
                Child, Space_0,
                Child, Object->BT_OK,
                Child, Space_1,
                Child, Object->BT_Cancel,
                Child, Space_2,
        End;

        GROUP_ROOT_0 = GroupObject,
                Child, Object->LV_Message,
                Child, GR_Change,
                Child, REC_label_0,
                Child, GR_ButtonBar,
        End;

        Object->WI_MainWindow = WindowObject,
                MUIA_Window_Title, "Tag-o-Miga",
                MUIA_HelpNode, "WI_MainWindow",
                MUIA_Window_ID, MAKE_ID('0', 'W', 'I', 'N'),
                MUIA_Window_NoMenus, TRUE,
                WindowContents, GROUP_ROOT_0,
        End;

        Object->STR_PA_Tagfile = String("", 80);

        Object->PA_Tagfile = PopButton(MUII_PopFile);

        Object->PA_Tagfile = PopaslObject,
                MUIA_HelpNode, "PA_Tagfile",
                MUIA_Popasl_Type, 0,
                MUIA_Popstring_String, Object->STR_PA_Tagfile,
                MUIA_Popstring_Button, Object->PA_Tagfile,
        End;

        Object->BT_Load = TextObject,
                ButtonFrame,
                MUIA_Weight, 10,
                MUIA_Background, MUII_ButtonBack,
                MUIA_Text_Contents, "Load",
                MUIA_Text_PreParse, "\033c",
                MUIA_HelpNode, "BT_Load",
                MUIA_InputMode, MUIV_InputMode_RelVerify,
        End;

        GR_grp_6 = GroupObject,
                MUIA_HelpNode, "GR_grp_6",
                MUIA_Group_Horiz, TRUE,
                Child, Object->PA_Tagfile,
                Child, Object->BT_Load,
        End;

        Object->LV_Taglist = ListObject,
                MUIA_List_ConstructHook, MUIV_List_ConstructHook_String,
                MUIA_List_DestructHook, MUIV_List_DestructHook_String,
                MUIA_Frame, MUIV_Frame_InputList,
        End;

        Object->LV_Taglist = ListviewObject,
                MUIA_HelpNode, "LV_Taglist",
                MUIA_Listview_DoubleClick, TRUE,
                MUIA_Listview_List, Object->LV_Taglist,
        End;

        Object->LV_Preview = ListObject,
                MUIA_List_ConstructHook, MUIV_List_ConstructHook_String,
                MUIA_List_DestructHook, MUIV_List_DestructHook_String,
                MUIA_Frame, MUIV_Frame_InputList,
        End;

        Object->LV_Preview = ListviewObject,
                MUIA_HelpNode, "LV_Preview",
                MUIA_Weight, 50,
                MUIA_Listview_Input, FALSE,
                MUIA_Listview_List, Object->LV_Preview,
        End;

        Object->BT_Back = SimpleButton("Back");

        Object->BT_Random = SimpleButton("Random");

        GR_grp_4 = GroupObject,
                MUIA_HelpNode, "GR_grp_4",
                MUIA_Group_Horiz, TRUE,
                MUIA_Group_SameSize, TRUE,
                Child, Object->BT_Back,
                Child, Object->BT_Random,
        End;

        Object->BT_Tag_OK = SimpleButton("OK");

        Object->BT_None = SimpleButton("None");

        Object->BT_Tag_Cancel = SimpleButton("Cancel");

        GR_grp_5 = GroupObject,
                MUIA_HelpNode, "GR_grp_5",
                MUIA_Group_Horiz, TRUE,
                MUIA_Group_SameSize, TRUE,
                Child, Object->BT_Tag_OK,
                Child, Object->BT_None,
                Child, Object->BT_Tag_Cancel,
        End;

        GROUP_ROOT_1 = GroupObject,
                Child, GR_grp_6,
                Child, Object->LV_Taglist,
                Child, Object->LV_Preview,
                Child, GR_grp_4,
                Child, GR_grp_5,
        End;

        Object->WI_TagWindow = WindowObject,
                MUIA_Window_Title, "Choose taglines - Tag-o-Miga",
                MUIA_HelpNode, "WI_TagWindow",
                MUIA_Window_ID, MAKE_ID('1', 'W', 'I', 'N'),
                MUIA_Window_NoMenus, TRUE,
                WindowContents, GROUP_ROOT_1,
        End;

        Object->TX_Report = TextObject,
                MUIA_Background, MUII_TextBack,
                MUIA_Frame, MUIV_Frame_Text,
                MUIA_Text_Contents, Object->STR_TX_Report,
                MUIA_Text_SetMin, TRUE,
        End;

        Object->GA_Progress = GaugeObject,
                GaugeFrame,
                MUIA_HelpNode, "GA_Progress",
                MUIA_FixHeight, 10,
                MUIA_Gauge_Horiz, TRUE,
                MUIA_Gauge_Max, 100,
        End;

        Scale_0 = ScaleObject,
                MUIA_Scale_Horiz, TRUE,
        End;

        GROUP_ROOT_2 = GroupObject,
                Child, Object->TX_Report,
                Child, Object->GA_Progress,
                Child, Scale_0,
        End;

        Object->WI_Progress = WindowObject,
                MUIA_Window_Title, "Progress indicator",
                MUIA_Window_ID, MAKE_ID('2', 'W', 'I', 'N'),
                MUIA_Window_CloseGadget, FALSE,
                MUIA_Window_NoMenus, TRUE,
                WindowContents, GROUP_ROOT_2,
        End;

        Object->App = ApplicationObject,
                MUIA_Application_Author, "Richard Downer",
                MUIA_Application_Base, "TAGOMIGA",
                MUIA_Application_Title, "Tag-o-Miga",
                MUIA_Application_Copyright, "1997 Richard Downer",
                MUIA_Application_Description, "The World's Premier Tagtool!",
                MUIA_Application_HelpFile, "TagoMigaGUI.guide",
                SubWindow, Object->WI_MainWindow,
                SubWindow, Object->WI_TagWindow,
                SubWindow, Object->WI_Progress,
        End;


        if (!Object->App)
        {
                FreeVec(Object);
                return(NULL);
        }

        DoMethod(Object->WI_MainWindow,
                MUIM_Notify, MUIA_Window_CloseRequest, TRUE,
                Object->App,
                2,
                MUIM_Application_ReturnID, ID_CANCEL
                );

        DoMethod(Object->BT_EditMsg,
                MUIM_Notify, MUIA_Pressed, FALSE,
                Object->App,
                2,
                MUIM_Application_ReturnID, ID_EDITMSG
                );

        DoMethod(Object->BT_ChMood,
                MUIM_Notify, MUIA_Pressed, FALSE,
                Object->App,
                2,
                MUIM_Application_ReturnID, ID_CHMOOD
                );

        DoMethod(Object->BT_ChHeader,
                MUIM_Notify, MUIA_Pressed, FALSE,
                Object->App,
                2,
                MUIM_Application_ReturnID, ID_CHHEADER
                );

        DoMethod(Object->BT_ChNP,
                MUIM_Notify, MUIA_Pressed, FALSE,
                Object->App,
                2,
                MUIM_Application_ReturnID, ID_CHNP
                );

        DoMethod(Object->BT_ChSig,
                MUIM_Notify, MUIA_Pressed, FALSE,
                Object->App,
                2,
                MUIM_Application_ReturnID, ID_CHSIG
                );

        DoMethod(Object->BT_ChTag,
                MUIM_Notify, MUIA_Pressed, FALSE,
                Object->App,
                2,
                MUIM_Application_ReturnID, ID_CHTAG
                );

        DoMethod(Object->BT_OK,
                MUIM_Notify, MUIA_Pressed, FALSE,
                Object->App,
                2,
                MUIM_Application_ReturnID, ID_OK
                );

        DoMethod(Object->BT_Cancel,
                MUIM_Notify, MUIA_Pressed, FALSE,
                Object->App,
                2,
                MUIM_Application_ReturnID, ID_CANCEL
                );

        DoMethod(Object->WI_MainWindow,
                MUIM_Window_SetCycleChain, Object->LV_Message,
                Object->BT_EditMsg,
                Object->BT_ChMood,
                Object->BT_ChHeader,
                Object->BT_ChNP,
                Object->BT_ChSig,
                Object->BT_ChTag,
                Object->BT_OK,
                Object->BT_Cancel,
                0
                );

        DoMethod(Object->WI_TagWindow,
                MUIM_Notify, MUIA_Window_CloseRequest, TRUE,
                Object->App,
                2,
                MUIM_Application_ReturnID, ID_CANCEL
                );

        DoMethod(Object->BT_Load,
                MUIM_Notify, MUIA_Pressed, FALSE,
                Object->App,
                2,
                MUIM_Application_ReturnID, ID_LOAD
                );

        DoMethod(Object->LV_Taglist,
                MUIM_Notify, MUIA_List_Active, MUIV_EveryTime,
                Object->App,
                2,
                MUIM_Application_ReturnID, ID_LISTVIEW
                );

        DoMethod(Object->LV_Taglist,
                MUIM_Notify, MUIA_Listview_DoubleClick, TRUE,
                Object->App,
                2,
                MUIM_Application_ReturnID, ID_OK
                );

        DoMethod(Object->BT_Back,
                MUIM_Notify, MUIA_Pressed, FALSE,
                Object->App,
                2,
                MUIM_Application_ReturnID, ID_BACK
                );

        DoMethod(Object->BT_Random,
                MUIM_Notify, MUIA_Pressed, FALSE,
                Object->App,
                2,
                MUIM_Application_ReturnID, ID_RANDOM
                );

        DoMethod(Object->BT_Tag_OK,
                MUIM_Notify, MUIA_Pressed, FALSE,
                Object->App,
                2,
                MUIM_Application_ReturnID, ID_OK
                );

        DoMethod(Object->BT_None,
                MUIM_Notify, MUIA_Pressed, FALSE,
                Object->WI_TagWindow,
                3,
                MUIM_Set, MUIA_Window_Open, FALSE
                );

        DoMethod(Object->BT_None,
                MUIM_Notify, MUIA_Pressed, FALSE,
                Object->App,
                2,
                MUIM_Application_ReturnID, ID_NONE
                );

        DoMethod(Object->BT_Tag_Cancel,
                MUIM_Notify, MUIA_Pressed, FALSE,
                Object->WI_TagWindow,
                3,
                MUIM_Set, MUIA_Window_Open, FALSE
                );

        DoMethod(Object->BT_Tag_Cancel,
                MUIM_Notify, MUIA_Pressed, FALSE,
                Object->App,
                2,
                MUIM_Application_ReturnID, ID_CANCEL
                );

        DoMethod(Object->WI_TagWindow,
                MUIM_Window_SetCycleChain, Object->PA_Tagfile,
                Object->BT_Load,
                Object->LV_Taglist,
                Object->LV_Preview,
                Object->BT_Back,
                Object->BT_Random,
                Object->BT_Tag_OK,
                Object->BT_None,
                Object->BT_Tag_Cancel,
                0
                );

        DoMethod(Object->WI_Progress,
                MUIM_Window_SetCycleChain, 0
                );


        return(Object);
}

void DisposeApp(struct ObjApp * Object)
{
        MUI_DisposeObject(Object->App);
        FreeVec(Object);
}
