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

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

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

static ULONG mNew          (struct IClass *cl, Object *obj, struct opSet *msg);
static ULONG mWindow_Setup (struct IClass *cl, Object *obj, struct MUIP_Window_Setup *msg);
static ULONG mAdd          (struct IClass *cl, Object *obj, struct MUIP_PrefsWin_Add *msg);
static ULONG mEdit         (struct IClass *cl, Object *obj, struct MUIP_PrefsWin_Edit *msg);
static ULONG mClone        (struct IClass *cl, Object *obj, struct MUIP_PrefsWin_Clone *msg);
static ULONG mDelete       (struct IClass *cl, Object *obj, struct MUIP_PrefsWin_Delete *msg);
static ULONG mActiveChanged(struct IClass *cl, Object *obj, struct MUIP_PrefsWin_ActiveChanged *msg);
static ULONG mGetPrefs     (struct IClass *cl, Object *obj, struct MUIP_PrefsWin_GetPrefs *msg);
static ULONG mStorePrefs   (struct IClass *cl, Object *obj, struct MUIP_PrefsWin_StorePrefs *msg);
static ULONG mAbout        (struct IClass *cl, Object *obj, struct MUIP_PrefsWin_About *msg);

static SAVEDS ASM APTR ConstructFunc(REG(a0) struct Hook *hook, REG(a2) APTR pool, REG(a1) struct URL_BrowserNode *bn);
static SAVEDS ASM VOID DestructFunc (REG(a0) struct Hook *hook, REG(a2) APTR pool, REG(a1) struct URL_BrowserNode *bn);
static SAVEDS ASM LONG DisplayFunc  (REG(a0) struct Hook *hook, REG(a2) char **array, REG(a1) struct URL_BrowserNode *bn);

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

enum { MEN_ABOUT=1,MEN_ABOUTMUI,MEN_DEFAULTS,MEN_HIDE,MEN_QUIT,
       MEN_MUISETTINGS,MEN_SNAPSHOT,MEN_UNSNAPSHOT };

struct NewMenu PrefsWinMenu[] =
{
	{ NM_TITLE, "Project"                 , 0 ,0,0,(APTR)0               },
	{ NM_ITEM , "About..."                ,"?",0,0,(APTR)MEN_ABOUT       },
	{ NM_ITEM , "About MUI..."            ,"¿",0,0,(APTR)MEN_ABOUTMUI    },
	{ NM_ITEM , (STRPTR)NM_BARLABEL       , 0 ,0,0,(APTR)0               },
	{ NM_ITEM , "Restore defaults"        ,"R",0,0,(APTR)MEN_DEFAULTS    },
	{ NM_ITEM , (STRPTR)NM_BARLABEL       , 0 ,0,0,(APTR)0               },
	{ NM_ITEM , "Hide"                    ,"H",0,0,(APTR)MEN_HIDE        },
	{ NM_ITEM , (STRPTR)NM_BARLABEL       , 0 ,0,0,(APTR)0               },
	{ NM_ITEM , "Quit"                    ,"Q",0,0,(APTR)MEN_QUIT        },

	{ NM_TITLE, "Settings"                , 0 ,0,0,(APTR)0               },
	{ NM_ITEM , "MUI..."                  ,"M",0,0,(APTR)MEN_MUISETTINGS },
	{ NM_ITEM , (STRPTR)NM_BARLABEL       , 0 ,0,0,(APTR)0               },
	{ NM_ITEM , "Snapshot window"         ,"W",0,0,(APTR)MEN_SNAPSHOT    },
	{ NM_ITEM , "Unsnapshot window"       ,"U",0,0,(APTR)MEN_UNSNAPSHOT  },

	{ NM_END,NULL,0,0,0,(APTR)0 },    
};    

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

static ULONG mNew(struct IClass *cl, Object *obj, struct opSet *msg)
{
	static const STRPTR tabs[] = { "Information", "Browsers", "Defaults", NULL };

	Object *registerg, *browserl, *addb, *editb, *cloneb, *deleteb, *showc, 
	       *bringtofrontc, *newwindowc, *launchc, *saveb, *useb, *cancelb;

	obj = (Object *)DoSuperNew(cl, obj,
		MUIA_Window_ID,          MAKE_ID('U', 'R', 'L', 'P'),
		MUIA_Window_Title,       APPNAME " Library Preferences",
		MUIA_Window_ScreenTitle, APPNAME " " APPVER "." APPREV " " __AMIGADATE__ " · " APPAUTHOR " · " APPEMAIL,
		MUIA_Window_Menustrip,   MUI_MakeObject(MUIO_MenustripNM, PrefsWinMenu, 0),
		WindowContents, VGroup,
			Child, registerg = RegisterObject,
				MUIA_Background,      MUII_RegisterBack,
				MUIA_CycleChain,      TRUE,
				MUIA_Register_Titles, tabs,

				/* Information */

				Child, VGroup,
					Child, MUI_NewObject("Listview.mui",
						MUIA_CycleChain,     TRUE,
						MUIA_Listview_Input, FALSE,
						MUIA_Listview_List,  FloattextObject,
							TextFrame,
							MUIA_Background, MUII_TextBack,
							MUIA_Floattext_Text, 
"Welcome to the OpenURL preferences program.  OpenURL is a shared library for "
"easily sending URLs from applications to browsers.  Follow the below steps to "
"configure OpenURL to suit you."
"\n\n"
"1.  Go to the \"Browsers\" tab of this window."
"\n\n"
"2.  Delete any browsers you don't have installed, and add any that are "
"missing from the defaults."
"\n\n"
"3.  Make sure all your browsers are configured with full path."
"\n\n"
"4.  Arrange the browsers according to your preference by dragging and "
"dropping them in the list.  Browsers are given preference from top to "
"bottom, if one isn't found or doesn't start, the library will use the "
"next one.  (Note, the library first searches for any running browser "
"before it launches a new one.)"
"\n\n"
"5.  Go to the \"Defaults\" tab set them the way you prefer."
"\n""\n"
"6.  Press \"Save\"."
"\n\n"
"7.  Enjoy troublefree operation, and lobby the authors of your favourite "
"applications to support OpenURL. :)",
						End,
					End,
				End,

				/* Browsers */

				Child, VGroup,
					Child, browserl = ListviewObject,
						MUIA_CycleChain,        TRUE,
						MUIA_Listview_DragType, MUIV_Listview_DragType_Immediate,
						MUIA_Listview_List,     ListObject,
							InputListFrame,
							MUIA_List_DragSortable, TRUE,
							MUIA_List_Title,        TRUE,
							MUIA_List_Format,       ",",
						End,
					End,
					Child, ColGroup(4),
						Child, addb    = SimpleButton("_Add"),
						Child, editb   = SimpleButton("_Edit"),
						Child, cloneb  = SimpleButton("C_lone"),
						Child, deleteb = SimpleButton("_Delete"),
					End,
				End,

				/* Defaults */

				Child, VGroup,
					Child, HGroup,
						Child, showc = myKeyCheckMark(FALSE, 'i'),
						Child, KeyLabel2("Show/Uniconify browser.", 'i'),
						Child, RectangleObject, End,
					End,
					Child, HGroup,
						Child, bringtofrontc = myKeyCheckMark(FALSE, 'f'),
						Child, KeyLabel2("Bring browser screen to front.", 'f'),
						Child, RectangleObject, End,
					End,
					Child, HGroup,
						Child, newwindowc = myKeyCheckMark(FALSE, 'w'),
						Child, KeyLabel2("Open URL in new browser window.", 'w'),
						Child, RectangleObject, End,
					End,
					Child, HGroup,
						Child, launchc = myKeyCheckMark(FALSE, 'l'),
						Child, KeyLabel2("Launch browser if one isn't running.", 'l'),
						Child, RectangleObject, End,
					End,

					Child, FloattextObject,
						TextFrame,
						MUIA_Background, MUII_TextBack,
						MUIA_Floattext_Text, 
"These settings are the global defaults that will be used if the applications "
"don't override them when opening URLs."
"\n\n"
"For instance, if you prefer to have all URLs opened in a new browser window, "
"simply check the corresponding setting.",
					End,
				End,
			End,

			Child, ColGroup(3),
				Child, saveb   = SimpleButton("_Save"),
				Child, useb    = SimpleButton("_Use"),
				Child, cancelb = SimpleButton("_Cancel"),
			End,
		End,
		TAG_MORE, msg->ops_AttrList);

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

		/* init instance data */

		data->RegisterGrpObj     = registerg;

		data->BrowserLstObj      = browserl;
		data->AddButObj          = addb;
		data->EditButObj         = editb;
		data->CloneButObj        = cloneb;
		data->DeleteButObj       = deleteb;

		data->ShowChkObj         = showc;
		data->BringToFrontChkObj = bringtofrontc;
		data->NewWindowChkObj    = newwindowc;
		data->LaunchChkObj       = launchc;

		data->SaveButObj         = saveb;
		data->UseButObj          = useb;
		data->CancelButObj       = cancelb;

		/* buttons */

		DoMethod(obj, MUIM_MultiSet, MUIA_CycleChain, TRUE, addb, editb, 
		         cloneb, deleteb, saveb, useb, cancelb, NULL);

		DoMethod(obj, MUIM_MultiSet, MUIA_Disabled, TRUE, 
		        editb, cloneb, deleteb, NULL);

		set(obj, MUIA_Window_DefaultObject, browserl);

		/* add hooks */

		data->ConstructHook.h_Entry = (HOOKFUNC)ConstructFunc;
		set(browserl, MUIA_List_ConstructHook, &data->ConstructHook);

		data->DestructHook.h_Entry = (HOOKFUNC)DestructFunc;
		set(browserl, MUIA_List_DestructHook, &data->DestructHook);

		data->DisplayHook.h_Entry = (HOOKFUNC)DisplayFunc;
		set(browserl, MUIA_List_DisplayHook, &data->DisplayHook);
	}

	return((ULONG)obj);
}

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

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

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

	if(!data->NotifiesAdded)
	{
		Object *strip;

		/* menu notifies */

		get(obj, MUIA_Window_Menustrip, &strip);

		/* Project menu */

		DoMethod((Object *)DoMethod(strip,MUIM_FindUData,MEN_ABOUT      ),MUIM_Notify,MUIA_Menuitem_Trigger,MUIV_EveryTime,obj,1,MUIM_PrefsWin_About);
		DoMethod((Object *)DoMethod(strip,MUIM_FindUData,MEN_ABOUTMUI   ),MUIM_Notify,MUIA_Menuitem_Trigger,MUIV_EveryTime,_app(obj),2,MUIM_Application_AboutMUI,obj);
		DoMethod((Object *)DoMethod(strip,MUIM_FindUData,MEN_DEFAULTS   ),MUIM_Notify,MUIA_Menuitem_Trigger,MUIV_EveryTime,obj,2,MUIM_PrefsWin_GetPrefs,TRUE);
		DoMethod((Object *)DoMethod(strip,MUIM_FindUData,MEN_HIDE       ),MUIM_Notify,MUIA_Menuitem_Trigger,MUIV_EveryTime,_app(obj),3,MUIM_Set,MUIA_Application_Iconified,TRUE);
		DoMethod((Object *)DoMethod(strip,MUIM_FindUData,MEN_QUIT       ),MUIM_Notify,MUIA_Menuitem_Trigger,MUIV_EveryTime,_app(obj),2,MUIM_Application_ReturnID,MUIV_Application_ReturnID_Quit);

		/* Settings menu */

		DoMethod((Object *)DoMethod(strip,MUIM_FindUData,MEN_MUISETTINGS),MUIM_Notify,MUIA_Menuitem_Trigger,MUIV_EveryTime,_app(obj),2,MUIM_Application_OpenConfigWindow,0);
		DoMethod((Object *)DoMethod(strip,MUIM_FindUData,MEN_SNAPSHOT   ),MUIM_Notify,MUIA_Menuitem_Trigger,MUIV_EveryTime,obj,2,MUIM_Window_Snapshot,1);
		DoMethod((Object *)DoMethod(strip,MUIM_FindUData,MEN_UNSNAPSHOT ),MUIM_Notify,MUIA_Menuitem_Trigger,MUIV_EveryTime,obj,2,MUIM_Window_Snapshot,0);

		/* window notifies */

		DoMethod(obj, MUIM_Notify, MUIA_Window_CloseRequest, TRUE, _app(obj), 2, MUIM_Application_ReturnID, MUIV_Application_ReturnID_Quit);

		/* listview */

		DoMethod(data->BrowserLstObj, MUIM_Notify, MUIA_List_Active, MUIV_EveryTime, obj, 1, MUIM_PrefsWin_ActiveChanged);
		DoMethod(data->BrowserLstObj, MUIM_Notify, MUIA_Listview_DoubleClick, TRUE, obj, 1, MUIM_PrefsWin_Edit);

		/* list buttons */

		DoMethod(data->AddButObj,     MUIM_Notify, MUIA_Pressed, FALSE, obj, 1, MUIM_PrefsWin_Add);
		DoMethod(data->EditButObj,    MUIM_Notify, MUIA_Pressed, FALSE, obj, 1, MUIM_PrefsWin_Edit);
		DoMethod(data->CloneButObj,   MUIM_Notify, MUIA_Pressed, FALSE, obj, 1, MUIM_PrefsWin_Clone);
		DoMethod(data->DeleteButObj,  MUIM_Notify, MUIA_Pressed, FALSE, obj, 1, MUIM_PrefsWin_Delete);

		/* window buttons */

		DoMethod(data->SaveButObj,    MUIM_Notify, MUIA_Pressed, FALSE, obj, 2, MUIM_PrefsWin_StorePrefs, MUIV_PrefsWin_StorePrefs_Save);
		DoMethod(data->UseButObj,     MUIM_Notify, MUIA_Pressed, FALSE, obj, 2, MUIM_PrefsWin_StorePrefs, MUIV_PrefsWin_StorePrefs_Use);
		DoMethod(data->CancelButObj,  MUIM_Notify, MUIA_Pressed, FALSE, _app(obj), 2, MUIM_Application_ReturnID, MUIV_Application_ReturnID_Quit);

		/* get the openurl.library prefs */

		if(!DoMethod(obj, MUIM_PrefsWin_GetPrefs, FALSE))
		{
			CoerceMethod(cl, obj, MUIM_Window_Cleanup);
			return(FALSE);
		}

		data->NotifiesAdded = TRUE;
	}

	return(TRUE);
}

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

static ULONG mAdd(struct IClass *cl, Object *obj, struct MUIP_PrefsWin_Add *msg)
{
	struct PrefsWin_Data *data = INST_DATA(cl,obj);
	struct URL_BrowserNode bn = {0};
	strcpy(bn.ubn_Name, "«New browser»");
	DoMethod(data->BrowserLstObj, MUIM_List_InsertSingle, &bn, MUIV_List_Insert_Bottom);
	set(data->BrowserLstObj, MUIA_List_Active, xget(data->BrowserLstObj, MUIA_List_InsertPosition));
	return(TRUE);
}

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

static ULONG mEdit(struct IClass *cl, Object *obj, struct MUIP_PrefsWin_Edit *msg)
{
	struct PrefsWin_Data *data = INST_DATA(cl,obj);
	struct URL_BrowserNode *bn;
	DoMethod(data->BrowserLstObj, MUIM_List_GetEntry, MUIV_List_GetEntry_Active, &bn);
	if(bn) DoMethod(_app(obj), MUIM_App_OpenEditWin, bn, data->BrowserLstObj);
	return(TRUE);
}

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

static ULONG mClone(struct IClass *cl, Object *obj, struct MUIP_PrefsWin_Clone *msg)
{
	struct PrefsWin_Data *data = INST_DATA(cl,obj);
	struct URL_BrowserNode *bn;
	ULONG active;

	get(data->BrowserLstObj, MUIA_List_Active, &active);
	DoMethod(data->BrowserLstObj, MUIM_List_GetEntry, active, &bn);

	if(bn)
	{
		DoMethod(data->BrowserLstObj, MUIM_List_InsertSingle, bn, ++active);
		set(data->BrowserLstObj, MUIA_List_Active, active);
		DoMethod(data->BrowserLstObj, MUIM_List_GetEntry, active, &bn);
		if(bn) DoMethod(_app(obj), MUIM_App_OpenEditWin, bn, data->BrowserLstObj);
	}

	return(TRUE);
}

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

static ULONG mDelete(struct IClass *cl, Object *obj, struct MUIP_PrefsWin_Delete *msg)
{
	struct PrefsWin_Data *data = INST_DATA(cl,obj);
	struct URL_BrowserNode *bn;
	ULONG active;

	get(data->BrowserLstObj, MUIA_List_Active, &active);
	DoMethod(data->BrowserLstObj, MUIM_List_GetEntry, active, &bn);

	if(bn)
	{
		DoMethod(_app(obj), MUIM_App_CloseEditWin, bn);
		DoMethod(data->BrowserLstObj, MUIM_List_Remove, active);
	}

	return(TRUE);
}

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

static ULONG mActiveChanged(struct IClass *cl, Object *obj, struct MUIP_PrefsWin_ActiveChanged *msg)
{
	struct PrefsWin_Data *data = INST_DATA(cl,obj);
	struct URL_BrowserNode *bn;
	DoMethod(data->BrowserLstObj, MUIM_List_GetEntry, MUIV_List_GetEntry_Active, &bn);
	DoMethod(obj, MUIM_MultiSet, MUIA_Disabled, !bn, data->EditButObj,
	         data->CloneButObj, data->DeleteButObj, NULL);
	return(TRUE);
}

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

static ULONG mGetPrefs(struct IClass *cl, Object *obj, struct MUIP_PrefsWin_GetPrefs *msg)
{
	struct PrefsWin_Data *data = INST_DATA(cl,obj);
	struct URL_Prefs *up;
	STRPTR error = NULL;
	struct URL_BrowserNode *bn;

	if(msg->Defaults)
		up = URL_GetDefaultPrefs();
	else
		up = URL_GetPrefs();

	/* get the openurl.library prefs */

	if(!up) error = "Couldn't get prefs from openurl.library.";
	else if(up->up_Version != PREFS_VERSION)
		error = "This version of this program doesn't know\nto handle openurl.library prefs version %ld.";

	if(error)
	{
		MUI_Request(_app(obj), NULL, 0, "Error", "Abort", error, up ? up->up_Version : 0);
		if(up) URL_FreePrefs(up);
		return(FALSE);
	}

	set(data->BrowserLstObj, MUIA_List_Quiet, TRUE);
	DoMethod(data->BrowserLstObj, MUIM_List_Clear);

	for(bn = (struct URL_BrowserNode *)up->up_BrowserList.mlh_Head;
	    bn->ubn_Node.mln_Succ;
	    bn = (struct URL_BrowserNode *)bn->ubn_Node.mln_Succ)
	{
		DoMethod(data->BrowserLstObj, MUIM_List_InsertSingle, bn, MUIV_List_Insert_Bottom);
	}

	set(data->BrowserLstObj, MUIA_List_Quiet, FALSE);

	set(data->ShowChkObj,         MUIA_Selected, up->up_DefShow);
	set(data->BringToFrontChkObj, MUIA_Selected, up->up_DefBringToFront);
	set(data->NewWindowChkObj,    MUIA_Selected, up->up_DefNewWindow);
	set(data->LaunchChkObj,       MUIA_Selected, up->up_DefLaunch);

	/* set the first entry active */

	set(data->BrowserLstObj, MUIA_List_Active, MUIV_List_Active_Top);

	/* if the prefs are not the defaults, show the "Browsers" tab */

	if(!msg->Defaults && !(up->up_Flags & UPF_ISDEFAULTS))
		set(data->RegisterGrpObj, MUIA_Group_ActivePage, 1);

	URL_FreePrefs(up);

	return(TRUE);
}

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

static ULONG mStorePrefs(struct IClass *cl, Object *obj, struct MUIP_PrefsWin_StorePrefs *msg)
{
	struct PrefsWin_Data *data = INST_DATA(cl,obj);
	struct URL_Prefs up;
	ULONG i;

	set(_app(obj), MUIA_Application_Sleep, TRUE);

	/* copy settings from gadgets into structure */

	up.up_Version = PREFS_VERSION;
	NewList((struct List *)&up.up_BrowserList);

	/* browsers */

	for(i = 0;; i++)
	{
		struct URL_BrowserNode *bn;

		DoMethod(data->BrowserLstObj, MUIM_List_GetEntry, i, &bn);
		if(!bn) break;

		AddTail((struct List *)&up.up_BrowserList, (struct Node *)bn);
	}

	/* defaults */

	up.up_DefShow         = (BOOL)xget(data->ShowChkObj,         MUIA_Selected);
	up.up_DefBringToFront = (BOOL)xget(data->BringToFrontChkObj, MUIA_Selected);
	up.up_DefNewWindow    = (BOOL)xget(data->NewWindowChkObj,    MUIA_Selected);
	up.up_DefLaunch       = (BOOL)xget(data->LaunchChkObj,       MUIA_Selected);

	/* save to disk */
	
	if(!URL_SetPrefs(&up, (msg->How == MUIV_PrefsWin_StorePrefs_Save)))
		MUI_RequestA(_app(obj), obj, 0, "Error", "Abort", "Failed to save prefs", NULL);

	/* quit */

	set(_app(obj), MUIA_Application_Sleep, FALSE);
	DoMethod(_app(obj), MUIM_Application_ReturnID, MUIV_Application_ReturnID_Quit);

	return(TRUE);
}

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

static ULONG mAbout(struct IClass *cl, Object *obj, struct MUIP_PrefsWin_About *msg)
{
	STRPTR version, author, copyright;

	get(_app(obj), MUIA_Application_Version,   &version);
	get(_app(obj), MUIA_Application_Author,    &author);
	get(_app(obj), MUIA_Application_Copyright, &copyright);

	MUI_Request(_app(obj), obj, 0, APPNAME, "Ok", 
	            "\33c\33b%s\33n\n\n%s\n\nWritten by\n%s\n%s",
	            &version[6], copyright, author, APPEMAIL);

	return(TRUE);
}

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

SAVEDS ASM ULONG PrefsWin_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 MUIM_Window_Setup          : return(mWindow_Setup (cl,obj,(APTR)msg));
		case MUIM_PrefsWin_Add          : return(mAdd          (cl,obj,(APTR)msg));
		case MUIM_PrefsWin_Edit         : return(mEdit         (cl,obj,(APTR)msg));
		case MUIM_PrefsWin_Clone        : return(mClone        (cl,obj,(APTR)msg));
		case MUIM_PrefsWin_Delete       : return(mDelete       (cl,obj,(APTR)msg));
		case MUIM_PrefsWin_ActiveChanged: return(mActiveChanged(cl,obj,(APTR)msg));
		case MUIM_PrefsWin_GetPrefs     : return(mGetPrefs     (cl,obj,(APTR)msg));
		case MUIM_PrefsWin_StorePrefs   : return(mStorePrefs   (cl,obj,(APTR)msg));
		case MUIM_PrefsWin_About        : return(mAbout        (cl,obj,(APTR)msg));
	}

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

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

static SAVEDS ASM APTR ConstructFunc(REG(a0) struct Hook *hook, REG(a2) APTR pool, REG(a1) struct URL_BrowserNode *bn)
{
	struct URL_BrowserNode *new;
	if((new = AsmAllocPooled(pool, sizeof(struct URL_BrowserNode), SysBase)))
		memcpy(new, bn, sizeof(struct URL_BrowserNode));
	return(new);
}

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

static SAVEDS ASM VOID DestructFunc (REG(a0) struct Hook *hook, REG(a2) APTR pool, REG(a1) struct URL_BrowserNode *bn)
{
	AsmFreePooled(pool, bn, sizeof(struct URL_BrowserNode), SysBase);
}

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

static SAVEDS ASM LONG DisplayFunc(REG(a0) struct Hook *hook, REG(a2) char **array, REG(a1) struct URL_BrowserNode *bn)
{
	if(bn)
	{
		*array++ = bn->ubn_Name;
		*array   = bn->ubn_Path;
	}
	else
	{
		*array++ = MUIX_B "Name";
		*array   = MUIX_B "Path";
	}

	return(0);
}
