/*
 * help.c
 * 
 * Opens help/settings window and handles events.
 * For yak.
 * 
 * Martin W. Scott, 12-Sep-92.
 */
#include <exec/types.h>
#include <dos/dosextens.h>
#include <libraries/commodities.h>
#include <intuition/intuition.h>
#include <libraries/gadtools.h>
#include <proto/exec.h>
#include <proto/dos.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"
#include "version.h"

static UWORD	n;		/* currently shown hotkey */

/* our little menu */
static struct NewMenu gt_items[] = {
	{ NM_TITLE, "Project",	NULL, 0, 0, NULL },
	{ NM_ITEM,  "Load",	"L", 0, 0, NULL },
	{ NM_ITEM,  "Save",	"S", 0, 0, NULL },
	{ NM_ITEM,  "Hide",	"H", 0, 0, NULL },
	{ NM_ITEM,  "Quit",	"Q", 0, 0, NULL },

	{ NM_END }
};
#define LOAD 0
#define SAVE 1
#define HIDE 2
#define QUIT 3
static struct Menu *menu;


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

/* initialise all gadgets */
static void
InitGadgets()
{
	UWORD	i;

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

	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);
}


/* 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, VERSION_NAME ": HotKey=");
	strcat(title, hk[HK_POPKEY].key);
	HelpWdt = title;

	if (!OpenHelpWindow())	/* like the name says... */
	{
		/* attach menu-strip */
		if (menu = CreateMenusA(gt_items, NULL))
		{
			LayoutMenusA(menu, VisualInfo, NULL);
			SetMenuStrip(HelpWnd, menu);
		}
		InitGadgets();
		wndsigflag = 1 << HelpWnd->UserPort->mp_SigBit;
		return TRUE;
	}
	CloseDownScreen();
	return FALSE;
}

/* hide our help window */
void
HideWindow()
{
	if (HelpWnd)
	{
		CloseHelpWindow();
		CloseDownScreen();
		if (menu) FreeMenus(menu);
		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);

		switch (class)
		{
		case CLOSEWINDOW:
			HideWindow();
			return HELP_OKAY;

		case GADGETUP:
		case 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_PopCLIStr:
				strcpy(PopCommand,
					((struct StringInfo *)gadget->SpecialInfo)->Buffer
				);
				break;

			case GD_Hide:
				HideWindow();
				return HELP_OKAY;

			case GD_Quit:
				HideWindow();
				return HELP_QUIT;

			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_WildStarCheck:	/* toggle */
				wildstar ^= TRUE;
				if (wildstar) WILDSTARON; else WILDSTAROFF;
				break;

			case GD_ScrActCheck:	/* toggle */
				scractivate ^= TRUE;
				break;

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

			} /* switch (gadget->GadgetID) */
			break;

		case REFRESHWINDOW:
			GT_BeginRefresh(HelpWnd);
			HelpRender();
			GT_EndRefresh(HelpWnd, TRUE);
			break;

		case IDCMP_CHANGEWINDOW:
			HelpLeft = HelpWnd->LeftEdge;
			HelpTop = HelpWnd->TopEdge;
			break;

		case IDCMP_MENUPICK:
			while (code != MENUNULL) 
			{
				struct MenuItem *item = ItemAddress(menu, code);

				switch (ITEMNUM(code))
				{
				case LOAD:
					LoadSettings(CONFIG_FILE);
					InitGadgets();
					break;
				case SAVE:
					SaveSettings(CONFIG_FILE);
					break;
				case HIDE:
					HideWindow();
					return HELP_OKAY;
				case QUIT:
					HideWindow();
					return HELP_QUIT;
				}
				code = item->NextSelect;

			} /* while more menuchoices */
			break;

		} /* switch (class) */

	} /* while more messages */

	return HELP_OKAY;
}
