/*
 *  FM_SysInfoReq_React.c
 *
 *  Requester for sysinfo-request with reaction-support
 *  V1.1, 14.06.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 <gadgets/string.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_SysInfoReq_React.h"
#include "FM_ReactionBasics.h"
#include "FM_Reaction.h"
#include "FM_ReactionCD.h"

extern ULONG *PALETTE;

extern TEXT CPU68K_STR;
extern TEXT FPU68K_STR;
extern TEXT CPUPPC_STR;
extern TEXT FPUPPC_STR;

struct ReactWinData *sysinfo_rwd = NULL;

/*	Do_SysInfoRequest(): sysinfo-requester (full handling).

		SYNOPSIS: void = Do_SysInfoRequest
						(
						struct Window	  *Win;
						WORD 					Left;
						WORD					Top;
						);

		INPUTS:		Win:
							Pointer to the parent-window.

						Left:
							Left edge of palette-window.

						Top:
							Top edge of palette-window.

		RETURNS:		-
*/

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

if (OpenSysInfoReqWindow() == TRUE) {
	waitsigs = sysinfo_rwd->RWD_WSignals|SIGBREAKF_CTRL_C;

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

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

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

/*	OpenSysInfoReqWindow(): open window of sysinfo-requester.

		SYNOPSIS: BOOL res = OpenSysInfoReqWindow
						(
						void
						);

		INPUTS:		-

		RETURNS:		res:
							TRUE, if successfull.
*/

BOOL OpenSysInfoReqWindow(void)
{
if (sysinfo_rwd = OpenReactionWindow(WIN_SYSI_ID, GROUP_SysI_ID)) {
	ULONG chip = AvailMem(MEMF_CHIP);
	ULONG fast = AvailMem(MEMF_FAST);
	ULONG largestchip = AvailMem(MEMF_CHIP|MEMF_LARGEST);
	ULONG largestfast = AvailMem(MEMF_FAST|MEMF_LARGEST);
   char buffer[20];

	SetGadgetAttrs(sysinfo_rwd->RWD_GadgetArray[SysI_STRING_68kCPU], sysinfo_rwd->RWD_IWindow, NULL,
						STRINGA_TextVal, &CPU68K_STR, TAG_DONE);
	SetGadgetAttrs(sysinfo_rwd->RWD_GadgetArray[SysI_STRING_68kFPU], sysinfo_rwd->RWD_IWindow, NULL,
						STRINGA_TextVal, &FPU68K_STR, TAG_DONE);
	SetGadgetAttrs(sysinfo_rwd->RWD_GadgetArray[SysI_STRING_PPCCPU], sysinfo_rwd->RWD_IWindow, NULL,
						STRINGA_TextVal, &CPUPPC_STR, TAG_DONE);
	SetGadgetAttrs(sysinfo_rwd->RWD_GadgetArray[SysI_STRING_PPCFPU], sysinfo_rwd->RWD_IWindow, NULL,
						STRINGA_TextVal, &FPUPPC_STR, TAG_DONE);
	sprintf((char *) &buffer, "%ld", chip);
	SetGadgetAttrs(sysinfo_rwd->RWD_GadgetArray[SysI_STRING_AvailChip], sysinfo_rwd->RWD_IWindow, NULL,
						STRINGA_TextVal, &buffer, TAG_DONE);
	sprintf((char *) &buffer, "%ld", fast);
	SetGadgetAttrs(sysinfo_rwd->RWD_GadgetArray[SysI_STRING_AvailFast], sysinfo_rwd->RWD_IWindow, NULL,
						STRINGA_TextVal, &buffer, TAG_DONE);
	sprintf((char *) &buffer, "%ld", largestchip);
	SetGadgetAttrs(sysinfo_rwd->RWD_GadgetArray[SysI_STRING_LargestChip], sysinfo_rwd->RWD_IWindow, NULL,
						STRINGA_TextVal, &buffer, TAG_DONE);
	sprintf((char *) &buffer, "%ld", largestfast);
	SetGadgetAttrs(sysinfo_rwd->RWD_GadgetArray[SysI_STRING_LargestFast], sysinfo_rwd->RWD_IWindow, NULL,
						STRINGA_TextVal, &buffer, TAG_DONE);
	return(TRUE);
	}
return(FALSE);
}

/*	CloseSysInfoReqWindow(): close window of sysinfo-requester.

		SYNOPSIS: void = CloseSysInfoReqWindow
						(
						void
						);

		INPUTS:		-

		RETURNS:		-
*/

void CloseSysInfoReqWindow(void)
{
CloseReactionWindow(sysinfo_rwd);
}

/*	HandleSysInfoReqWindow(): Handle the messages of the sysinfo-requester.

		SYNOPSIS: LONG res = HandlePalettePrefWindow
						(
						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 HandleSysInfoReqWindow(struct Window *Win)
{
LONG rc = RESULT_NOTHING;
ULONG result, code;

while((result = DoMethod(sysinfo_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 SysI_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(sysinfo_rwd->RWD_WindowObject, WM_ICONIFY);
			GetAttr(WINDOW_Window, sysinfo_rwd->RWD_WindowObject, (ULONG *) &sysinfo_rwd->RWD_IWindow);
			break;

		case WMHI_UNICONIFY:
			DoMethod(sysinfo_rwd->RWD_WindowObject, WM_OPEN);
			GetAttr(WINDOW_Window, sysinfo_rwd->RWD_WindowObject, (ULONG *) &sysinfo_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);
}
