/*
 * help.c
 * 
 * Opens help/settings window and handles events.
 * For yak.
 * 
 * Martin W. Scott, 12-Sep-92.
 */
#include <exec/types.h>
#include <libraries/commodities.h>
#include <intuition/intuition.h>
#include <libraries/gadtools.h>
#include <proto/exec.h>
#include <proto/intuition.h>
#include <proto/gadtools.h>
#include <proto/graphics.h>
#include <proto/commodities.h>
#include <string.h>

#include "yak.h"
#include "popup.h"

LONG wndsigflag;
static UWORD	n;		/* currently shown hotkey */

/* initialise created gadgets */
static void
InitGadget(UWORD num, LONG tagtype, LONG tagvalue)
{
	GT_SetGadgetAttrs(HelpGadgets[num], HelpWnd, NULL, tagtype, tagvalue, TAG_DONE);
}

/* show our help window */
BOOL
ShowWindow()
{
	static char	title[80];

	WBenchToFront();
	if (HelpWnd)		/* already open... */
	{
		WindowToFront(HelpWnd);
		return TRUE;
	}

	if (SetupScreen())	/* try to get lock on WB */
		return FALSE;

	strcpy(title, "Yak 1.0: HotKey=");
	strcat(title, hk[HK_POPKEY].key);
	HelpWdt = title;

	if (!OpenHelpWindow())	/* like the name says... */
	{
		UWORD	i;

		for (i = 0; i < NUM_TOGGLES; i++)
			InitGadget(toggledata[i].gadid,
				   GTCB_Checked,
				   toggles[i]); 

		InitGadget(GDX_hkListView, GTLV_Selected, n);
		InitGadget(GDX_KeyStr, GTST_String, (LONG)hk[n].key);
		InitGadget(GDX_Volume, GTSL_Level, click_volume);
		InitGadget(GDX_DateFmt, GTMX_Active, datefmt);
		InitGadget(GDX_PopCLIStr, GTST_String, (LONG)PopCommand);
		InitGadget(GDX_ScrTONum, GTIN_Number, blanksecs);

		n = 0;
		wndsigflag = 1 << HelpWnd->UserPort->mp_SigBit;
		return TRUE;
	}
	CloseDownScreen();
	return FALSE;
}

/* hide our help window */
void
HideWindow()
{
	if (HelpWnd)
	{
		CloseHelpWindow();
		CloseDownScreen();
		wndsigflag = NULL;
		HelpWnd = NULL;
	}
}

/* handle window events */
LONG
HandleIDCMP()
{
	struct IntuiMessage *msg;
	struct Gadget   *gadget;
	ULONG           class;
	UWORD		code;

	while (msg = GT_GetIMsg(HelpWnd->UserPort))
	{
		class = msg->Class;
		code = msg->Code;
		gadget = (struct Gadget *)msg->IAddress;
		GT_ReplyIMsg(msg);


		if (class == CLOSEWINDOW)
		{
			HideWindow();
			return HELP_OKAY;
		}

		if (class == GADGETUP || class == GADGETDOWN)
		{
			switch (gadget->GadgetID)
			{
			case GD_KeyStr:
			{	/* set new hotkey-string */
				char *newstr;

				newstr = ((struct StringInfo *)gadget->SpecialInfo)->Buffer;
				if (!AddHotKey(newstr, n))
				{
					DisplayBeep(Scr);
					InitGadget(GDX_KeyStr, GTST_String, (LONG)hk[n].key);
				}
			}
			break;

			case GD_hkListView:
				n = code;
				InitGadget(GDX_KeyStr, GTST_String, (LONG)hk[n].key);
				break;

			case GD_Volume:
				click_volume = code;
				break;

			case GD_DateFmt:
				datefmt = code;
				break;

			case GD_TimeCheck:	/* toggle */
				instime ^= TRUE;
				break;

			case GD_DateCheck:	/* toggle */
				insdate ^= TRUE;
				break;

			case GD_DayCheck:	/* toggle */
				insday ^= TRUE;
				break;

			case GD_Hide:
				HideWindow();
				return HELP_OKAY;
				break;

			case GD_PopCLIStr:
				strcpy(PopCommand,
					((struct StringInfo *)gadget->SpecialInfo)->Buffer
				);
				break;

			case GD_Quit:
				HideWindow();
				return HELP_QUIT;
				break;

			case GD_AutoCheck:	/* toggle */
				autopoint ^= TRUE;
				break;

			case GD_KeyActCheck:	/* toggle */
				keyactivate ^= TRUE;
				break;

			case GD_CTFCheck:	/* toggle */
				clicktofront ^= TRUE;
				break;

			case GD_CTBCheck:	/* toggle */
				clicktoback ^= TRUE;
				break;

			case GD_ScrCycleCheck:	/* toggle */
				screencycle ^= TRUE;
				break;

			case GD_MBlankCheck:	/* toggle */
				mouseblank ^= TRUE;
				mblankcount = mblanktimeout;
				break;

			case GD_ScrTONum:
				blanksecs = ((struct StringInfo *)gadget->SpecialInfo)->LongInt;
				blankcount = blanktimeout = blanksecs*10;
				break;

			} /* switch */
		}
		else if (class == REFRESHWINDOW)
		{
			GT_BeginRefresh(HelpWnd);
			HelpRender();
			GT_EndRefresh(HelpWnd, TRUE);
		}
		else if (class == IDCMP_CHANGEWINDOW)
		{
			HelpLeft = HelpWnd->LeftEdge;
			HelpTop = HelpWnd->TopEdge;
		}

	} /* while */

	return HELP_OKAY;
}
