/*
 *  FM_InfoReq_React.c
 *
 *  Requester for info-request with reaction-support
 *  $VER: V2.0, 13.10.2001
 *  Coded by Edgar Schwan
 */

#include <intuition/gadgetclass.h>
#include <intuition/classusr.h>
#include <intuition/screens.h>
#include <classes/window.h>
#include <dos/dos.h>

#include <clib/intuition_protos.h>
#include <clib/exec_protos.h>
#include <clib/graphics_protos.h>
#include <clib/alib_protos.h>

#include <pragmas/intuition_pragmas.h>
#include <pragmas/exec_pragmas.h>
#include <pragmas/graphics_pragmas.h>

#include <stdlib.h>
#include <stdio.h>

#include "FM_InfoReq_React.h"
#include "FM_ReactionBasics.h"
#include "FM_Reaction.h"
#include "FM_ReactionCD.h"

extern ULONG *PALETTE;

struct ReactWinData *info_rwd = NULL;
struct ReactWinData *workgroup_rwd = NULL;

/*	Do_InfoRequest(): info-requester (full handling).

		SYNOPSIS: void = Do_InfoRequest
						(
						struct Window	  *Win;
						char				  *PubScreenName;
						WORD 					Left;
						WORD					Top;
						);

		INPUTS:		Win:
							Pointer to the parent-window.

						PubScreenName:
							name of the public-screen, where the window should appear.

						Left:
							Left edge of palette-window (not supported yet).

						Top:
							Top edge of palette-window (not supported yet).

		RETURNS:		-
*/

void Do_InfoRequest(struct Window *Win, char *PubScreenName, WORD Left, WORD Top)
{
LONG result = RESULT_NOTHING;
ULONG waitsigs, mask;

if (OpenInfoReqWindow(PubScreenName) == TRUE) {
	waitsigs = info_rwd->RWD_WSignals|SIGBREAKF_CTRL_C;

	while(result == RESULT_NOTHING) {
		mask = Wait(waitsigs);
#ifndef NDEBUG
		printf("mask: %lX\n", mask);
#endif /*NDEBUG*/
		if (mask & info_rwd->RWD_WSignals) {
			result = HandleInfoReqWindow(Win, PubScreenName);
			}
		if (mask & SIGBREAKF_CTRL_C) {
			result = RESULT_CANCEL;
			}
		}

	CloseInfoReqWindow();
	} else DisplayError(Win, TXT_ERR_Window, 5L);

LoadRGB32(ViewPortAddress (Win), (APTR) PALETTE);
}

/*	OpenInfoReqWindow(): open window of info-requester.

		SYNOPSIS: BOOL res = OpenInfoReqWindow
						(
						char				  *PubScreenName;
						);

		INPUTS:		PubScreenName:
							name of the public-screen, where the window should appear.

		RETURNS:		res:
							TRUE, if successfull.
*/

BOOL OpenInfoReqWindow(char *PubScreenName)
{
if (info_rwd = OpenReactionWindow(WIN_INFO_ID, GROUP_Info_ID, PubScreenName)) {
	return(TRUE);
	}
return(FALSE);
}

/*	CloseInfoReqWindow(): close window of info-requester.

		SYNOPSIS: void = CloseInfoReqWindow
						(
						void
						);

		INPUTS:		-

		RETURNS:		-
*/

void CloseInfoReqWindow(void)
{
CloseReactionWindow(info_rwd);
}

/*	HandleInfoReqWindow(): Handle the messages of the info-requester.

		SYNOPSIS: LONG res = HandlePalettePrefWindow
						(
						struct Window	*Win;
						char				*PubScreenName;
						);

		INPUTS:		Win:
							Pointer to a window-structure.

						PubScreenName:
							name of the public-screen, where windows should appear.

		RETURNS:		res:
							result of messages:	RESULT_NOTHING -> nothing happens.
														RESULT_CANCEL  -> user wants to quit without a change.
														RESULT_OK      -> accept changes and quit.
*/

LONG HandleInfoReqWindow(struct Window *Win, char *PubScreenName)
{
LONG rc = RESULT_NOTHING;
ULONG result, code;

while((result = DoMethod(info_rwd->RWD_WindowObject, WM_HANDLEINPUT, &code)) != WMHI_LASTMSG) {

#ifndef NDEBUG
	printf("result: %ld\n", result);
#endif /*NDEBUG*/

	switch (result & WMHI_CLASSMASK) {
		case WMHI_CLOSEWINDOW:
			rc = RESULT_CANCEL;
			break;

		case WMHI_GADGETUP:
			switch (result & RL_GADGETMASK) {
				case Info_BUTTON_OK:
					rc = RESULT_OK;
					break;
				case Info_BUTTON_More:
					SetAttrs(info_rwd->RWD_WindowObject, WA_BusyPointer, TRUE);
					Do_WorkgroupRequest(info_rwd->RWD_IWindow, PubScreenName, 50, 50);
					SetAttrs(info_rwd->RWD_WindowObject, WA_BusyPointer, FALSE);
					rc = RESULT_OK;
					break;
#ifndef NDEBUG
				default:
					printf("unknown result: %lX\nunknown gadget: %lX\n", result, result & WMHI_GADGETMASK);
					DisplayBeep(NULL);
					break;
#endif /*NDEBUG*/
				}
			break;

		case WMHI_ICONIFY:
			DoMethod(info_rwd->RWD_WindowObject, WM_ICONIFY);
			GetAttr(WINDOW_Window, info_rwd->RWD_WindowObject, (ULONG *) &info_rwd->RWD_IWindow);
			break;

		case WMHI_UNICONIFY:
			DoMethod(info_rwd->RWD_WindowObject, WM_OPEN);
			GetAttr(WINDOW_Window, info_rwd->RWD_WindowObject, (ULONG *) &info_rwd->RWD_IWindow);
			break;
#ifndef NDEBUG
		default:
			printf("unknown result: %lX\nunknown class: %lX\n", result, result & WMHI_CLASSMASK);
			DisplayBeep(NULL);
			break;
#endif /*NDEBUG*/
		}
	}
return(rc);
}

/*	Do_WorkgroupRequest(): workgroup-requester (full handling).

		SYNOPSIS: void = Do_WorkgroupRequest
						(
						struct Window	  *Win;
						char				  *PubScreenName;
						WORD 					Left;
						WORD					Top;
						);

		INPUTS:		Win:
							Pointer to the parent-window.

						PubScreenName:
							name of the public-screen, where the window should appear.

						Left:
							Left edge of palette-window.

						Top:
							Top edge of palette-window.

		RETURNS:		-
*/

void Do_WorkgroupRequest(struct Window *Win, char *PubScreenName, WORD Left, WORD Top)
{
LONG result = RESULT_NOTHING;
ULONG waitsigs, mask;

if (OpenWorkgroupReqWindow(PubScreenName) == TRUE) {
	waitsigs = workgroup_rwd->RWD_WSignals|SIGBREAKF_CTRL_C;

	while(result == RESULT_NOTHING) {
		mask = Wait(waitsigs);
#ifndef NDEBUG
		printf("mask: %lX\n", mask);
#endif /*NDEBUG*/
		if (mask & workgroup_rwd->RWD_WSignals) {
			result = HandleWorkgroupReqWindow(Win);
			}
		if (mask & SIGBREAKF_CTRL_C) {
			result = RESULT_CANCEL;
			}
		}

	CloseWorkgroupReqWindow();
	} else DisplayError(Win, TXT_ERR_Window, 5L);
}

/*	OpenWorkgroupReqWindow(): open window of workgroup-requester.

		SYNOPSIS: BOOL res = OpenWorkgroupReqWindow
						(
						char				  *PubScreenName;
						);

		INPUTS:		PubScreenName:
							name of the public-screen, where the window should appear.

		RETURNS:		res:
							TRUE, if successfull.
*/

BOOL OpenWorkgroupReqWindow(char *PubScreenName)
{
if (workgroup_rwd = OpenReactionWindow(WIN_WORK_ID, GROUP_Work_ID, PubScreenName)) {
	return(TRUE);
	}
return(FALSE);
}

/*	CloseWorkgroupReqWindow(): close window of workgroup-requester.

		SYNOPSIS: void = CloseWorkgroupReqWindow
						(
						void
						);

		INPUTS:		-

		RETURNS:		-
*/

void CloseWorkgroupReqWindow(void)
{
CloseReactionWindow(workgroup_rwd);
}

/*	HandleWorkgroupReqWindow(): Handle the messages of the workgroup-requester.

		SYNOPSIS: BOOL = HandleWorkgroupReqWindow
						(
						struct Window	*Win;
						);

		INPUTS:		Win:
							Pointer to a window-structure.

		RETURNS:		res:
							result of messages:	RESULT_NOTHING -> nothing happens.
														RESULT_CANCEL  -> user wants to quit without a change.
														RESULT_OK      -> accept changes and quit.
*/

LONG HandleWorkgroupReqWindow(struct Window *Win)
{
LONG rc = RESULT_NOTHING;
ULONG result, code;

while((result = DoMethod(workgroup_rwd->RWD_WindowObject, WM_HANDLEINPUT, &code)) != WMHI_LASTMSG) {

#ifndef NDEBUG
	printf("result: %ld\n", result);
#endif /*NDEBUG*/

	switch (result & WMHI_CLASSMASK) {
		case WMHI_CLOSEWINDOW:
			rc = RESULT_CANCEL;
			break;

		case WMHI_GADGETUP:
			switch (result & RL_GADGETMASK) {
				case Work_BUTTON_OK:
					rc = RESULT_OK;
					break;
#ifndef NDEBUG
				default:
					printf("unknown result: %lX\nunknown gadget: %lX\n", result, result & WMHI_GADGETMASK);
					DisplayBeep(NULL);
					break;
#endif /*NDEBUG*/
				}
			break;

		case WMHI_ICONIFY:
			DoMethod(workgroup_rwd->RWD_WindowObject, WM_ICONIFY);
			GetAttr(WINDOW_Window, workgroup_rwd->RWD_WindowObject, (ULONG *) &workgroup_rwd->RWD_IWindow);
			break;

		case WMHI_UNICONIFY:
			DoMethod(workgroup_rwd->RWD_WindowObject, WM_OPEN);
			GetAttr(WINDOW_Window, workgroup_rwd->RWD_WindowObject, (ULONG *) &workgroup_rwd->RWD_IWindow);
			break;
#ifndef NDEBUG
		default:
			printf("unknown result: %lX\nunknown class: %lX\n", result, result & WMHI_CLASSMASK);
			DisplayBeep(NULL);
			break;
#endif /*NDEBUG*/
		}
	}
return(rc);
}
