/*
** OpenURL - MUI preferences for openurl.library
** Written by Troels Walsted Hansen <troels@thule.no>
** Placed in the public domain.
**
** This module contains the code to the BrowserEditWin Window.mui subclass.
*/

#include "prefs_common.h"
#include "prefs_main.h"
#include "prefs_app.h"
#include "prefs_browsereditwin.h"

/**************************************************************************/

static ULONG mNew           (struct IClass *cl, Object *obj, struct opSet *msg);
static ULONG mGet           (struct IClass *cl, Object *obj, struct opGet *msg);
static ULONG mWindow_Setup  (struct IClass *cl, Object *obj, struct MUIP_Window_Setup *msg);
static ULONG mOk            (struct IClass *cl, Object *obj, struct MUIP_BrowserEditWin_Ok *msg);

static SAVEDS ASM VOID ObjStrFunc(REG(a0) struct Hook *hook, 
                                  REG(a2) Object *obj, 
                                  REG(a1) Object *string);

/**************************************************************************/

static const char *Browser_PlaceHolders[] =
{
	"%u|URL",
	NULL,
};

/**************************************************************************/

static ULONG mNew(struct IClass *cl, Object *obj, struct opSet *msg)
{
	Object *browserl, *infog, *names, *pathp, *ports, *portp, 
	       *cmdg, *shows, *tofronts, *openurlp, *openurlwp, *okb, *cancelb;

	struct URL_BrowserNode *bn = (struct URL_BrowserNode *)GetTagData(MUIA_BrowserEditWin_Browser, NULL, msg->ops_AttrList);
	browserl = (Object *)GetTagData(MUIA_BrowserEditWin_ListObj, NULL, msg->ops_AttrList);

	if(!bn || !browserl) return(0);

	obj = (Object *)DoSuperNew(cl, obj,
		MUIA_Window_ID,          MAKE_ID('E', 'D', 'B', 'R'),
		MUIA_Window_Title,       APPNAME " · Edit Browser",
		WindowContents, VGroup,
			Child, infog = ColGroup(2),
				GroupFrameT("Browser information"),

				Child, KeyLabel2("Name", 'n'),
				Child, names = StringObject, 
					StringFrame,
					MUIA_CycleChain,         TRUE,
					MUIA_ControlChar,        'n',
					MUIA_String_MaxLen,      UBN_NAME_LEN,
					MUIA_String_Contents,    bn->ubn_Name,
					MUIA_String_AdvanceOnCR, TRUE,
				End,

				Child, KeyLabel2("Path", 'p'),
				Child, pathp = PopplaceholderObject, 
					MUIA_Popph_Array,        Browser_PlaceHolders,
					MUIA_Popph_StringKey,    'p',
					MUIA_Popph_StringMaxLen, UBN_PATH_LEN,
					MUIA_Popph_Contents,     bn->ubn_Path,
					MUIA_Popph_PopAsl,       TRUE,
					MUIA_Popasl_Type,        ASL_FileRequest,
					MUIA_String_AdvanceOnCR, TRUE,
				End,

				Child, KeyLabel2("ARexx port", 'a'),
				Child, portp = PopportObject, 
					MUIA_Popstring_String, ports = StringObject, 
						StringFrame,
						MUIA_CycleChain,         TRUE,
						MUIA_ControlChar,        'a',
						MUIA_String_MaxLen,      UBN_PORT_LEN,
						MUIA_String_Contents,    bn->ubn_Port,
						MUIA_String_AdvanceOnCR, TRUE,
					End,
					MUIA_Popstring_Button,  myPopButton(MUII_PopUp),
					MUIA_Popport_ARexxOnly, TRUE,
				End,
			End,

			Child, cmdg = ColGroup(2),
				GroupFrameT("ARexx commands"),

				Child, KeyLabel2("Show/Uniconify", 's'),
				Child, shows = StringObject, 
					StringFrame,
					MUIA_CycleChain,         TRUE,
					MUIA_ControlChar,        's',
					MUIA_String_MaxLen,      UBN_SHOWCMD_LEN,
					MUIA_String_Contents,    bn->ubn_ShowCmd,
					MUIA_String_AdvanceOnCR, TRUE,
				End,

				Child, KeyLabel2("Screen to front", 'f'),
				Child, tofronts = StringObject, 
					StringFrame,
					MUIA_CycleChain,         TRUE,
					MUIA_ControlChar,        'f',
					MUIA_String_MaxLen,      UBN_TOFRONTCMD_LEN,
					MUIA_String_Contents,    bn->ubn_ToFrontCmd,
					MUIA_String_AdvanceOnCR, TRUE,
				End,

				Child, KeyLabel2("Open URL...", 'u'),
				Child, openurlp = PopplaceholderObject,
					MUIA_Popph_Array,        Browser_PlaceHolders,
					MUIA_Popph_StringKey,    'u',
					MUIA_Popph_StringMaxLen, UBN_OPENURLCMD_LEN,
					MUIA_Popph_Contents,     bn->ubn_OpenURLCmd,
					MUIA_String_AdvanceOnCR, TRUE,
				End,

				Child, KeyLabel2("...in new window", 'w'),
				Child, openurlwp = PopplaceholderObject,
					MUIA_Popph_Array,       Browser_PlaceHolders,
					MUIA_Popph_StringKey,   'w',
					MUIA_Popph_StringMaxLen, UBN_OPENURLWCMD_LEN,
					MUIA_Popph_Contents,     bn->ubn_OpenURLWCmd,
					MUIA_String_AdvanceOnCR, TRUE,
				End,
			End,

			Child, ColGroup(3),
				Child, okb   = SimpleButton("_Ok"),
				Child, RectangleObject, End,
				Child, cancelb = SimpleButton("_Cancel"),
			End,
		End,
		TAG_MORE, msg->ops_AttrList);

	if(obj)
	{
		struct BrowserEditWin_Data *data = INST_DATA(cl, obj);
		memset(data, '\0', sizeof(struct BrowserEditWin_Data));

		/* init instance data */

		data->Browser        = bn;
		data->BrowserLstObj  = browserl;

		data->InfoGrpObj     = infog;
		data->NameStrObj     = names;
		data->PathPopObj     = pathp;
		data->PortStrObj     = ports;

		data->CmdGrpObj      = cmdg;
		data->ShowStrObj     = shows;
		data->ToFrontStrObj  = tofronts;
		data->OpenURLPopObj  = openurlp;
		data->OpenURLWPopObj = openurlwp;

		data->OkButObj       = okb;
		data->CancelButObj   = cancelb;

		/* buttons */

		DoMethod(obj, MUIM_MultiSet, MUIA_CycleChain, TRUE, okb, cancelb, NULL);

		/* add hook */

		data->ObjStrHook.h_Entry = (HOOKFUNC)ObjStrFunc;
		data->ObjStrHook.h_Data = (APTR)xget(portp, MUIA_Popobject_ObjStrHook);
		set(portp, MUIA_Popobject_ObjStrHook, &data->ObjStrHook);
	}

	return((ULONG)obj);
}

/**************************************************************************/

static ULONG mGet(struct IClass *cl, Object *obj, struct opGet *msg)
{
	struct BrowserEditWin_Data *data = INST_DATA(cl,obj);

	switch(msg->opg_AttrID)
	{
		case MUIA_BrowserEditWin_Browser:
			*(msg->opg_Storage) = (ULONG)data->Browser;
			return(TRUE);
	}

	return(DoSuperMethodA(cl, obj, (Msg)msg));
}

/**************************************************************************/

static ULONG mWindow_Setup(struct IClass *cl, Object *obj, struct MUIP_Window_Setup *msg)
{
	struct BrowserEditWin_Data *data = INST_DATA(cl,obj);

	if (!DoSuperMethodA(cl,obj,(Msg)msg))
		return(FALSE);

	if(!data->NotifiesAdded)
	{
		/* buttons */
		DoMethod(data->OkButObj,     MUIM_Notify, MUIA_Pressed, FALSE, obj, 1, MUIM_BrowserEditWin_Ok);
		DoMethod(data->CancelButObj, MUIM_Notify, MUIA_Pressed, FALSE, obj, 3, MUIM_Set, MUIA_Window_CloseRequest, TRUE);

		/* window notifies */
		DoMethod(obj, MUIM_Notify, MUIA_Window_CloseRequest, TRUE, _app(obj), 6, MUIM_Application_PushMethod, _app(obj), 3, MUIM_App_CloseWin, MUIA_BrowserEditWin_Browser, data->Browser);

		data->NotifiesAdded = TRUE;
	}

	return(TRUE);
}

/**************************************************************************/

static ULONG mOk(struct IClass *cl, Object *obj, struct MUIP_BrowserEditWin_Ok *msg)
{
	struct BrowserEditWin_Data *data = INST_DATA(cl,obj);
	struct URL_BrowserNode *bn = data->Browser;
	LONG visible, first, i;

	/* update the structure */

	strcpy(bn->ubn_Name, (char *)xget(data->NameStrObj, MUIA_String_Contents));
	strcpy(bn->ubn_Path, (char *)xget(data->PathPopObj, MUIA_Popph_Contents));
	strcpy(bn->ubn_Port, (char *)xget(data->PortStrObj, MUIA_String_Contents));

	strcpy(bn->ubn_ShowCmd,     (char *)xget(data->ShowStrObj,     MUIA_String_Contents));
	strcpy(bn->ubn_ToFrontCmd,  (char *)xget(data->ToFrontStrObj,  MUIA_String_Contents));
	strcpy(bn->ubn_OpenURLCmd,  (char *)xget(data->OpenURLPopObj,  MUIA_Popph_Contents));
	strcpy(bn->ubn_OpenURLWCmd, (char *)xget(data->OpenURLWPopObj, MUIA_Popph_Contents));

	/* update the listview */

	get(data->BrowserLstObj, MUIA_List_Visible, &visible);
	if(visible != -1)
	{
		get(data->BrowserLstObj, MUIA_List_First, &first);

		for(i = first; i < (first + visible); i++)
		{
			DoMethod(data->BrowserLstObj, MUIM_List_GetEntry, i, &bn);
			if(!bn) break;

			if(bn == data->Browser)
			{
				DoMethod(data->BrowserLstObj, MUIM_List_Redraw, i);
				break;
			}
		}
	}

	/* close edit site window */

	set(obj, MUIA_Window_CloseRequest, TRUE);

	return(TRUE);
}

/**************************************************************************/

SAVEDS ASM ULONG BrowserEditWin_Dispatcher(REG(a0) struct IClass *cl, REG(a2) Object *obj, REG(a1) Msg msg)
{
	switch(msg->MethodID)
	{
		case OM_NEW           : return(mNew         (cl,obj,(APTR)msg));
		case OM_GET           : return(mGet         (cl,obj,(APTR)msg));
		case MUIM_Window_Setup: return(mWindow_Setup(cl,obj,(APTR)msg));
		case MUIM_BrowserEditWin_Ok  : return(mOk          (cl,obj,(APTR)msg));
	}

	return(DoSuperMethodA(cl,obj,msg));
}

/**************************************************************************/

static SAVEDS ASM VOID ObjStrFunc(REG(a0) struct Hook *hook, 
                                  REG(a2) Object *obj, 
                                  REG(a1) Object *string)
{
	STRPTR port, dot, digit;
	char buf[UBN_PORT_LEN];

	if(hook->h_Data) CallHookPkt(hook->h_Data, obj, string);

	get(string, MUIA_String_Contents, &port);
	dot = strrchr(port, '.');

	if(dot)
	{
		dot++;

		for(digit = dot; *digit; digit++)
			if(!isdigit(*digit))
				return;

		stccpy(buf, port, dot - port);
		set(string, MUIA_String_Contents, buf);
	}
}
