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

/* Libraries */
#include <libraries/mui.h>
#include <libraries/gadtools.h> /* for Barlabel in MenuItem */
#include <exec/memory.h>

/* Prototypes */
#include <proto/muimaster.h>
#include <proto/exec.h>
#include <clib/alib_protos.h>

#include "WicConPrefsGUI.h"
#include "WicConPrefsExtern.h"
#include "Hook_utility.h"
struct ObjApp * CreateApp(void)
{
	struct ObjApp * Object;

	APTR	MNlabel1File, MNlabel1Save, MNlabel1BarLabel0, MNlabel1Quit, MainRoot;
	APTR	PatGrp, ActionGrp, StringsGrp, LabelsGrp, Space_0, LA_label_0, Space_1;
	APTR	LA_label_1, Space_2, LA_label_2, Space_3, StrGadsGrp, NumStrGrp, obj_aux0;
	APTR	obj_aux1, obj_aux2, obj_aux3, obj_aux4, obj_aux5, QualGrp, ActChksGrp;
	APTR	LShiftGrp, Space_5, obj_aux6, obj_aux7, RShiftGrp, Space_6, obj_aux8;
	APTR	obj_aux9, LAltGrp, Space_7, obj_aux10, obj_aux11, RAltGrp, Space_8;
	APTR	obj_aux12, obj_aux13, CtrlGrp, Space_9, obj_aux14, obj_aux15, LAmigaGrp;
	APTR	Space_10, obj_aux16, obj_aux17, RAmigaGrp, Space_11, obj_aux18, obj_aux19;
	APTR	MidButGrp, Space_12, obj_aux20, obj_aux21, REC_label_0, GadGrp;
	static struct Hook InitDrawerHook;
	static struct Hook DrawBigLVHook;
	static struct Hook ChangeBigLVHook;
	static struct Hook RecordFuncHook;
	static struct Hook NewFuncHook;
	static struct Hook RemoveFuncHook;
	static struct Hook MxFuncHook;
	static struct Hook SaveFuncHook;
	static struct Hook AddLVHook;
	static struct Hook RemLVHook;

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

	Object->STR_PageGrp[0] = "Patterns";
	Object->STR_PageGrp[1] = "Qualifiers";
	Object->STR_PageGrp[2] = NULL;
	Object->ActionMXContent[0] = "Iconify Parent Only";
	Object->ActionMXContent[1] = "Iconify Parent & Children";
	Object->ActionMXContent[2] = "Activate Parent Only";
	Object->ActionMXContent[3] = "Activate Parent & Children";
	Object->ActionMXContent[4] = "Close (Parent)";
	Object->ActionMXContent[5] = "Kill Button";
	Object->ActionMXContent[6] = NULL;

	InstallHook(&InitDrawerHook,InitDrawer,NULL);
	InstallHook(&DrawBigLVHook,DrawBigLV,NULL);
	InstallHook(&ChangeBigLVHook,ChangeBigLV,NULL);
	InstallHook(&RecordFuncHook,RecordFunc,NULL);
	InstallHook(&NewFuncHook,NewFunc,NULL);
	InstallHook(&RemoveFuncHook,RemoveFunc,NULL);
	InstallHook(&MxFuncHook,MxFunc,NULL);
	InstallHook(&SaveFuncHook,SaveFunc,NULL);
	InstallHook(&AddLVHook,AddLV,NULL);
	InstallHook(&RemLVHook,RemLV,NULL);

	Object->BigLV = ListObject,
		MUIA_Frame, MUIV_Frame_InputList,
		MUIA_List_Format, "P=\33b MiW=20,MiW=20,MiW=20,P=\33r MIW=10,P=\33r MIW=10,P=\33r MIW=10",
		MUIA_List_ConstructHook, &AddLVHook,
		MUIA_List_DestructHook, &RemLVHook,
		MUIA_List_DisplayHook, &DrawBigLVHook,
	End;

	Object->BigLV = ListviewObject,
		MUIA_HelpNode, "BigLV",
		MUIA_Listview_List, Object->BigLV,
	End;

	Object->RecordGad = SimpleButton("\33bR_ecord");

	Object->NewGad = SimpleButton("_New");

	Object->RemGad = SimpleButton("_Remove");

	ActionGrp = GroupObject,
		MUIA_HelpNode, "ActionGrp",
		MUIA_Group_Horiz, TRUE,
		Child, Object->RecordGad,
		Child, Object->NewGad,
		Child, Object->RemGad,
	End;

	Space_0 = VSpace(0);

	LA_label_0 = Label("Name");

	Space_1 = VSpace(0);

	LA_label_1 = Label("Pattern");

	Space_2 = VSpace(0);

	LA_label_2 = Label("Icon");

	Space_3 = VSpace(0);

	LabelsGrp = GroupObject,
		MUIA_HelpNode, "LabelsGrp",
		Child, Space_0,
		Child, LA_label_0,
		Child, Space_1,
		Child, LA_label_1,
		Child, Space_2,
		Child, LA_label_2,
		Child, Space_3,
	End;

	Object->NameStr = StringObject,
		MUIA_Frame, MUIV_Frame_String,
		MUIA_HelpNode, "NameStr",
	End;

	Object->PatStr = StringObject,
		MUIA_Frame, MUIV_Frame_String,
		MUIA_HelpNode, "PatStr",
	End;

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

	Object->IconPop = PopButton(MUII_PopFile);

	Object->IconPop = PopaslObject,
		MUIA_HelpNode, "IconPop",
		MUIA_Popasl_Type, 0,
		MUIA_Popstring_String, Object->STR_IconPop,
		MUIA_Popstring_Button, Object->IconPop,
	End;

	StrGadsGrp = GroupObject,
		MUIA_HelpNode, "StrGadsGrp",
		Child, Object->NameStr,
		Child, Object->PatStr,
		Child, Object->IconPop,
	End;

	StringsGrp = GroupObject,
		MUIA_HelpNode, "StringsGrp",
		MUIA_Group_Horiz, TRUE,
		Child, LabelsGrp,
		Child, StrGadsGrp,
	End;

	Object->ColorStr = StringObject,
		MUIA_Frame, MUIV_Frame_String,
		MUIA_HelpNode, "ColorStr",
		MUIA_String_Accept, "-0123456789",
	End;

	obj_aux1 = Label2("Text");

	obj_aux0 = GroupObject,
		MUIA_Group_Columns, 2,
		Child, obj_aux1,
		Child, Object->ColorStr,
	End;

	Object->BGColorStr = StringObject,
		MUIA_Frame, MUIV_Frame_String,
		MUIA_HelpNode, "BGColorStr",
		MUIA_String_Accept, "-0123456789",
	End;

	obj_aux3 = Label2("BG");

	obj_aux2 = GroupObject,
		MUIA_Group_Columns, 2,
		Child, obj_aux3,
		Child, Object->BGColorStr,
	End;

	Object->OffsetStr = StringObject,
		MUIA_Frame, MUIV_Frame_String,
		MUIA_HelpNode, "OffsetStr",
		MUIA_String_Accept, "-0123456789",
	End;

	obj_aux5 = Label2("Offset");

	obj_aux4 = GroupObject,
		MUIA_Group_Columns, 2,
		Child, obj_aux5,
		Child, Object->OffsetStr,
	End;

	NumStrGrp = GroupObject,
		MUIA_HelpNode, "NumStrGrp",
		MUIA_Group_Horiz, TRUE,
		Child, obj_aux0,
		Child, obj_aux2,
		Child, obj_aux4,
	End;

	PatGrp = GroupObject,
		MUIA_HelpNode, "PatGrp",
		Child, Object->BigLV,
		Child, ActionGrp,
		Child, StringsGrp,
		Child, NumStrGrp,
	End;

	Space_5 = HVSpace;

	Object->LShiftChk = CheckMark(FALSE);

	obj_aux7 = Label2("Left Shift");

	obj_aux6 = GroupObject,
		MUIA_Group_Columns, 2,
		Child, obj_aux7,
		Child, Object->LShiftChk,
	End;

	LShiftGrp = GroupObject,
		MUIA_HelpNode, "LShiftGrp",
		MUIA_Group_Horiz, TRUE,
		Child, Space_5,
		Child, obj_aux6,
	End;

	Space_6 = HVSpace;

	Object->RShiftChk = CheckMark(FALSE);

	obj_aux9 = Label2("Right Shift");

	obj_aux8 = GroupObject,
		MUIA_Group_Columns, 2,
		Child, obj_aux9,
		Child, Object->RShiftChk,
	End;

	RShiftGrp = GroupObject,
		MUIA_HelpNode, "RShiftGrp",
		MUIA_Group_Horiz, TRUE,
		Child, Space_6,
		Child, obj_aux8,
	End;

	Space_7 = HVSpace;

	Object->LAltChk = CheckMark(FALSE);

	obj_aux11 = Label2("Left Alt");

	obj_aux10 = GroupObject,
		MUIA_Group_Columns, 2,
		Child, obj_aux11,
		Child, Object->LAltChk,
	End;

	LAltGrp = GroupObject,
		MUIA_HelpNode, "LAltGrp",
		MUIA_Group_Horiz, TRUE,
		Child, Space_7,
		Child, obj_aux10,
	End;

	Space_8 = HVSpace;

	Object->RAltChk = CheckMark(FALSE);

	obj_aux13 = Label2("Right Alt");

	obj_aux12 = GroupObject,
		MUIA_Group_Columns, 2,
		Child, obj_aux13,
		Child, Object->RAltChk,
	End;

	RAltGrp = GroupObject,
		MUIA_HelpNode, "RAltGrp",
		MUIA_Group_Horiz, TRUE,
		Child, Space_8,
		Child, obj_aux12,
	End;

	Space_9 = HVSpace;

	Object->CtrlChk = CheckMark(FALSE);

	obj_aux15 = Label2("Ctrl");

	obj_aux14 = GroupObject,
		MUIA_Group_Columns, 2,
		Child, obj_aux15,
		Child, Object->CtrlChk,
	End;

	CtrlGrp = GroupObject,
		MUIA_HelpNode, "CtrlGrp",
		MUIA_Group_Horiz, TRUE,
		Child, Space_9,
		Child, obj_aux14,
	End;

	Space_10 = HVSpace;

	Object->LAmigaChk = CheckMark(FALSE);

	obj_aux17 = Label2("Left Command");

	obj_aux16 = GroupObject,
		MUIA_Group_Columns, 2,
		Child, obj_aux17,
		Child, Object->LAmigaChk,
	End;

	LAmigaGrp = GroupObject,
		MUIA_HelpNode, "LAmigaGrp",
		MUIA_Group_Horiz, TRUE,
		Child, Space_10,
		Child, obj_aux16,
	End;

	Space_11 = HVSpace;

	Object->RAmigaChk = CheckMark(FALSE);

	obj_aux19 = Label2("Right Command");

	obj_aux18 = GroupObject,
		MUIA_Group_Columns, 2,
		Child, obj_aux19,
		Child, Object->RAmigaChk,
	End;

	RAmigaGrp = GroupObject,
		MUIA_HelpNode, "RAmigaGrp",
		MUIA_Group_Horiz, TRUE,
		Child, Space_11,
		Child, obj_aux18,
	End;

	Space_12 = HVSpace;

	Object->MidButChk = CheckMark(FALSE);

	obj_aux21 = Label2("Middle Mouse");

	obj_aux20 = GroupObject,
		MUIA_Group_Columns, 2,
		Child, obj_aux21,
		Child, Object->MidButChk,
	End;

	MidButGrp = GroupObject,
		MUIA_HelpNode, "MidButGrp",
		MUIA_Group_Horiz, TRUE,
		Child, Space_12,
		Child, obj_aux20,
	End;

	ActChksGrp = GroupObject,
		MUIA_HelpNode, "ActChksGrp",
		MUIA_Weight, 30,
		Child, LShiftGrp,
		Child, RShiftGrp,
		Child, LAltGrp,
		Child, RAltGrp,
		Child, CtrlGrp,
		Child, LAmigaGrp,
		Child, RAmigaGrp,
		Child, MidButGrp,
	End;

	REC_label_0 = RectangleObject,
		MUIA_Weight, 15,
		MUIA_Rectangle_VBar, TRUE,
	End;

	Object->ActionMX = RadioObject,
		MUIA_Frame, MUIV_Frame_Group,
		MUIA_FrameTitle, "Action",
		MUIA_HelpNode, "ActionMX",
		MUIA_Radio_Entries, Object->ActionMXContent,
	End;

	QualGrp = GroupObject,
		MUIA_HelpNode, "QualGrp",
		MUIA_Frame, MUIV_Frame_Group,
		MUIA_Group_Horiz, TRUE,
		Child, ActChksGrp,
		Child, REC_label_0,
		Child, Object->ActionMX,
	End;

	Object->PageGrp = RegisterObject,
		MUIA_Register_Titles, Object->STR_PageGrp,
		MUIA_HelpNode, "PageGrp",
		Child, PatGrp,
		Child, QualGrp,
	End;

	Object->SaveGad = SimpleButton("_Save");

	Object->QuitGad = SimpleButton("_Quit");

	GadGrp = GroupObject,
		MUIA_HelpNode, "GadGrp",
		MUIA_Group_Horiz, TRUE,
		Child, Object->SaveGad,
		Child, Object->QuitGad,
	End;

	MainRoot = GroupObject,
		MUIA_Frame, MUIV_Frame_Group,
		Child, Object->PageGrp,
		Child, GadGrp,
	End;

	MNlabel1Save = MenuitemObject,
		MUIA_Menuitem_Title, "Save",
		MUIA_Menuitem_Shortcut, "S",
	End;

	MNlabel1BarLabel0 = MUI_MakeObject(MUIO_Menuitem, NM_BARLABEL, 0, 0, 0);

	MNlabel1Quit = MenuitemObject,
		MUIA_Menuitem_Title, "Quit",
		MUIA_Menuitem_Shortcut, "Q",
	End;

	MNlabel1File = MenuitemObject,
		MUIA_Menuitem_Title, "File",
		MUIA_Family_Child, MNlabel1Save,
		MUIA_Family_Child, MNlabel1BarLabel0,
		MUIA_Family_Child, MNlabel1Quit,
	End;

	Object->MN_label_1 = MenustripObject,
		MUIA_Family_Child, MNlabel1File,
	End;

	Object->MainWin = WindowObject,
		MUIA_Window_Title, "WinControl Prefs",
		MUIA_Window_Menustrip, Object->MN_label_1,
		MUIA_Window_ID, MAKE_ID('0', 'W', 'I', 'N'),
		WindowContents, MainRoot,
	End;

	Object->App = ApplicationObject,
		MUIA_Application_Author, "John Corigliano",
		MUIA_Application_Base, "WCPrefs",
		MUIA_Application_Title, "WCPrefs",
		MUIA_Application_Version, "$VER: WCPrefs 1.0 (15.05.96)",
		MUIA_Application_Copyright, "John Corigliano",
		MUIA_Application_Description, "Preferences program for WinControl",
		SubWindow, Object->MainWin,
	End;


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

	DoMethod(MNlabel1Save,
		MUIM_Notify, MUIA_Menuitem_Trigger, MUIV_EveryTime,
		Object->App,
		2,
		MUIM_CallHook, &SaveFuncHook
		);

	DoMethod(MNlabel1Quit,
		MUIM_Notify, MUIA_Menuitem_Trigger, MUIV_EveryTime,
		Object->App,
		2,
		MUIM_Application_ReturnID, MUIV_Application_ReturnID_Quit
		);

	DoMethod(Object->MainWin,
		MUIM_Notify, MUIA_Window_CloseRequest, TRUE,
		Object->App,
		2,
		MUIM_Application_ReturnID, MUIV_Application_ReturnID_Quit
		);

	DoMethod(Object->BigLV,
		MUIM_Notify, MUIA_List_Active, MUIV_EveryTime,
		Object->App,
		2,
		MUIM_CallHook, &ChangeBigLVHook
		);

	DoMethod(Object->RecordGad,
		MUIM_Notify, MUIA_Pressed, FALSE,
		Object->MainWin,
		2,
		MUIM_CallHook, &RecordFuncHook
		);

	DoMethod(Object->NewGad,
		MUIM_Notify, MUIA_Pressed, FALSE,
		Object->App,
		2,
		MUIM_CallHook, &NewFuncHook
		);

	DoMethod(Object->RemGad,
		MUIM_Notify, MUIA_Pressed, FALSE,
		Object->MainWin,
		2,
		MUIM_CallHook, &RemoveFuncHook
		);

	DoMethod(Object->ActionMX,
		MUIM_Notify, MUIA_Radio_Active, MUIV_EveryTime,
		Object->App,
		2,
		MUIM_CallHook, &MxFuncHook
		);

	DoMethod(Object->SaveGad,
		MUIM_Notify, MUIA_Pressed, FALSE,
		Object->App,
		2,
		MUIM_CallHook, &SaveFuncHook
		);

	DoMethod(Object->QuitGad,
		MUIM_Notify, MUIA_Pressed, FALSE,
		Object->App,
		2,
		MUIM_Application_ReturnID, MUIV_Application_ReturnID_Quit
		);

	DoMethod(Object->MainWin,
		MUIM_Window_SetCycleChain, Object->PageGrp,
		Object->BigLV,
		Object->RecordGad,
		Object->NewGad,
		Object->RemGad,
		Object->NameStr,
		Object->PatStr,
		Object->IconPop,
		Object->ColorStr,
		Object->BGColorStr,
		Object->OffsetStr,
		Object->LShiftChk,
		Object->RShiftChk,
		Object->LAltChk,
		Object->RAltChk,
		Object->CtrlChk,
		Object->LAmigaChk,
		Object->RAmigaChk,
		Object->MidButChk,
		Object->ActionMX,
		Object->SaveGad,
		Object->QuitGad,
		0
		);

	set(Object->MainWin,
		MUIA_Window_Open, TRUE
		);


	return(Object);
}

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