#include "demo.h"


/*
** App message callback hook. Note that the object given here
** is the object that called the hook, i.e. the one that got
** the icon(s) dropped on it.
*/

SAVEDS ASM LONG AppMsgFunc(REG(a2) APTR obj, REG(a1) struct AppMessage **x)
{
	struct WBArg *ap;
	struct AppMessage *amsg = *x;
	int i;
	static char buf[256];
	char *b=buf;

	for (ap=amsg->am_ArgList,i=0;i<amsg->am_NumArgs;i++,ap++)
	{
		NameFromLock(ap->wa_Lock,buf,sizeof(buf));
		AddPart(buf,ap->wa_Name,sizeof(buf));
		DoMethod(obj,MUIM_List_Insert,&b,1,MUIV_List_Insert_Bottom);
	}

	return(0);
}


/*
** Having a function instead of a macro saves some code.
*/

APTR MakeLV(VOID)
{
	return(
		ListviewObject,
			MUIA_Listview_Input, FALSE,
			MUIA_Listview_List , ListObject,
				ReadListFrame,
				MUIA_List_ConstructHook, MUIV_List_ConstructHook_String,
				MUIA_List_DestructHook , MUIV_List_DestructHook_String ,
				End,
			End
	);
}


int main(int argc,char *argv[])
{
	APTR app,window;
	APTR lv1,lv2,lv3;
	static const struct Hook AppMsgHook = { { NULL,NULL },(VOID *)AppMsgFunc,NULL,NULL };

	init();

	app = ApplicationObject,
		MUIA_Application_Title      , "AppWindowDemo",
		MUIA_Application_Version    , "$VER: AppWindowDemo 17.6 (18.08.96)",
		MUIA_Application_Copyright  , "©1992/93, Stefan Stuntz",
		MUIA_Application_Author     , "Stefan Stuntz",
		MUIA_Application_Description, "Show AppWindow Handling",
		MUIA_Application_Base       , "APPWINDOWDEMO",

		SubWindow, window = WindowObject,
			MUIA_Window_Title    , "Drop icons on me!",
			MUIA_Window_ID       , MAKE_ID('A','P','P','W'),
			MUIA_Window_AppWindow, TRUE,

			WindowContents, VGroup,
				Child, HGroup,
					Child, lv1 = MakeLV(),
					Child, lv2 = MakeLV(),
					End,
				Child, lv3 = MakeLV(),
				End,

			End,

		End;

	if (!app)
		fail(app,"Failed to create Application.");

	DoMethod(window,MUIM_Notify,MUIA_Window_CloseRequest,TRUE,
		app,2,MUIM_Application_ReturnID,MUIV_Application_ReturnID_Quit);


/*
** Call the AppMsgHook when an icon is dropped on a listview.
*/

	DoMethod(lv1,MUIM_Notify,MUIA_AppMessage,MUIV_EveryTime,
		lv1,3,MUIM_CallHook,&AppMsgHook,MUIV_TriggerValue);

	DoMethod(lv2,MUIM_Notify,MUIA_AppMessage,MUIV_EveryTime,
		lv2,3,MUIM_CallHook,&AppMsgHook,MUIV_TriggerValue);

	DoMethod(lv3,MUIM_Notify,MUIA_AppMessage,MUIV_EveryTime,
		lv3,3,MUIM_CallHook,&AppMsgHook,MUIV_TriggerValue);


/*
** When we're iconified, the object lv3 shall receive the
** messages from icons dropped on our app icon.
*/

	set(app,MUIA_Application_DropObject,lv3);


/*
** This is the ideal input loop for an object oriented MUI application.
** Everything is encapsulated in classes, no return ids need to be used,
** we just check if the program shall terminate.
** Note that MUIM_Application_NewInput expects sigs to contain the result
** from Wait() (or 0). This makes the input loop significantly faster.
*/

	set(window,MUIA_Window_Open,TRUE);

	{
		ULONG sigs = 0;

		while (DoMethod(app,MUIM_Application_NewInput,&sigs) != MUIV_Application_ReturnID_Quit)
		{
			if (sigs)
			{
				sigs = Wait(sigs | SIGBREAKF_CTRL_C);
				if (sigs & SIGBREAKF_CTRL_C) break;
			}
		}
	}

	set(window,MUIA_Window_Open,FALSE);


/*
** Shut down...
*/

	fail(app,NULL);
}
