/*
**    GrabKEY
**
**        © 1996 by Timo C. Nentwig
**        All Rights Reserved !
**
**        Tcn@techbase.in-berlin.de
**
**
*/

/// #include

#include "gk_GST.h"
#include "gk_Protos.h"

///
/// #define

#define    LT_VertGroup(Handle)    LT_New (Handle, LA_Type, VERTICAL_KIND,   TAG_END)
#define    LT_HortGroup(Handle)    LT_New (Handle, LA_Type, VERTICAL_KIND,   TAG_END)

#define    CHARS    20

enum
{

	GAD_PAGER,
	GAD_PAGEGROUP,

	GAD_SAVE,
	GAD_CANCEL,
	GAD_HIDE,
	GAD_QUIT,

	GAD_PAGE_HOTKEYS_SCREEN_SAVE,
	GAD_PAGE_HOTKEYS_SCREEN_CLIP,
	GAD_PAGE_HOTKEYS_SCREEN_PRINT,

	GAD_PAGE_HOTKEYS_WINDOW_SAVE,
	GAD_PAGE_HOTKEYS_WINDOW_CLIP,
	GAD_PAGE_HOTKEYS_WINDOW_PRINT,

	GAD_PAGE_NOTIFY_START,
	GAD_PAGE_NOTIFY_DONE,
	GAD_PAGE_NOTIFY_ERROR,

	GAD_PAGE_SAVE_FILE,
	GAD_PAGE_SAVE_COUNT,
	GAD_PAGE_SAVE_ICON,

};

enum
{

	MEN_SAVE,
	MEN_ABOUT,
	MEN_QUIT,

};

///
/// proto

proto BOOL    CreateGUI    (VOID);
proto BOOL    HandleGUI    (VOID);
proto VOID    RemoveGUI    (VOID);

///

struct    LayoutHandle    *Handle;
struct    Window          *Window;
struct    Menu            *Menu;
struct    Settings        *GUI;
ULONG                      GUIMask;

/// CreateGUI ()

	/*
	 *    FUNCTION    Creates the GUI.
	 *
	 *    NOTE
	 *
	 *    EXAMPLE     CreateGUI ();
	 *
	 */


BOOL
CreateGUI (VOID)
{

		// Are we already open ?

	if ( ! (Handle))
	{

			// Temp copy of settings for the GUI

		GUI = Set;

		if (Handle = LT_CreateHandleTags (NULL, LAHN_LocaleHook,   &LocaleHook,
												TAG_END))
												{

													LT_VertGroup (Handle);
													{

														LT_HortGroup (Handle);
														{

																  BYTE    InitPage = 0;
															const LONG    PageTitleID [] =
															{

																MSG_GUI_PAGE_HOTKEYS,
																MSG_GUI_PAGE_NOTIFY,
																MSG_GUI_PAGE_SAVE,

																-1

															};

															LT_VertGroup (Handle);
															{

																LT_New (Handle, LA_Type,            TAB_KIND,
																				LA_ID,              GAD_PAGER,
																				LA_BYTE,           &InitPage,
																				LATB_LabelTable,    PageTitleID,
																				LATB_AutoPageID,    GAD_PAGEGROUP,
																				LATB_TabKey,        TRUE,
																				LATB_FullSize,      TRUE,
																				TAG_END);

																LT_EndGroup (Handle);

															}

															LT_New (Handle, LA_Type,            VERTICAL_KIND,
																			LA_ID,              GAD_PAGEGROUP,
																			LAGR_ActivePage,    InitPage,
																			TAG_END);
																			{

																				/*
																				 *    Page: HotKeys
																				 */

																				LT_VertGroup (Handle);
																				{

																					LT_New (Handle, LA_Type,       VERTICAL_KIND,
																									LA_LabelID,    MSG_GUI_PAGE_HOTKEYS,
																									TAG_END);
																									{

																										LT_New (Handle, LA_Type,         VERTICAL_KIND,
																														LA_LabelID,      MSG_GUI_PAGE_HOTKEYS_WINDOW,
																														TAG_END);
																														{

																															LT_New (Handle, LA_Type,                  STRING_KIND,
																																			LA_Chars,                 CHARS,
																																			LA_ID,                    GAD_PAGE_HOTKEYS_WINDOW_SAVE,
																																			LA_LabelID,               MSG_GUI_PAGE_HOTKEYS_SAVE,
																																			LA_STRPTR,                GUI -> Key . Window . Save,
																																			GTST_MaxChars,    sizeof (GUI -> Key . Window . Save) - 1,
																																			TAG_END);

																															LT_New (Handle, LA_Type,                  STRING_KIND,
																																			LA_Chars,                 CHARS,
																																			LA_ID,                    GAD_PAGE_HOTKEYS_WINDOW_CLIP,
																																			LA_LabelID,               MSG_GUI_PAGE_HOTKEYS_CLIP,
																																			LA_STRPTR,                GUI -> Key . Window . Clip,
																																			GTST_MaxChars,    sizeof (GUI -> Key . Window . Clip) - 1,
																																			TAG_END);

																															LT_New (Handle, LA_Type,                  STRING_KIND,
																																			LA_Chars,                 CHARS,
																																			LA_ID,                    GAD_PAGE_HOTKEYS_WINDOW_PRINT,
																																			LA_LabelID,               MSG_GUI_PAGE_HOTKEYS_PRINT,
																																			LA_STRPTR,                GUI -> Key . Window . Print,
																																			GTST_MaxChars,    sizeof (GUI -> Key . Window . Print) - 1,
																																			TAG_END);

																															LT_EndGroup (Handle);

																														}

																										LT_New (Handle, LA_Type,         VERTICAL_KIND,
																														LA_LabelID,      MSG_GUI_PAGE_HOTKEYS_SCREEN,
																														TAG_END);
																														{

																															LT_New (Handle, LA_Type,                  STRING_KIND,
																																			LA_Chars,                 CHARS,
																																			LA_ID,                    GAD_PAGE_HOTKEYS_SCREEN_SAVE,
																																			LA_LabelID,               MSG_GUI_PAGE_HOTKEYS_SAVE,
																																			LA_STRPTR,                GUI -> Key . Screen . Save,
																																			GTST_MaxChars,    sizeof (GUI -> Key . Screen . Save) - 1,
																																			TAG_END);

																															LT_New (Handle, LA_Type,                  STRING_KIND,
																																			LA_Chars,                 CHARS,
																																			LA_ID,                    GAD_PAGE_HOTKEYS_SCREEN_CLIP,
																																			LA_LabelID,               MSG_GUI_PAGE_HOTKEYS_CLIP,
																																			LA_STRPTR,                GUI -> Key . Screen . Clip,
																																			GTST_MaxChars,    sizeof (GUI -> Key . Screen . Clip) - 1,
																																			TAG_END);

																															LT_New (Handle, LA_Type,                  STRING_KIND,
																																			LA_Chars,                 CHARS,
																																			LA_ID,                    GAD_PAGE_HOTKEYS_SCREEN_PRINT,
																																			LA_LabelID,               MSG_GUI_PAGE_HOTKEYS_PRINT,
																																			LA_STRPTR,                GUI -> Key . Screen . Print,
																																			GTST_MaxChars,    sizeof (GUI -> Key . Screen . Print) - 1,
																																			TAG_END);

																															LT_EndGroup (Handle);

																														}

																										LT_EndGroup (Handle);

																									}

																					LT_EndGroup (Handle);

																				}

																				/*
																				 *    Page: Notify
																				 */

																				LT_VertGroup (Handle);
																				{

																					LT_New (Handle, LA_Type,       VERTICAL_KIND,
																									LA_LabelID,    MSG_GUI_PAGE_NOTIFY,
																									TAG_END);
																									{

																										LT_New (Handle, LA_Type,                  STRING_KIND,
																														LA_Chars,                 CHARS,
																														LA_ID,                    GAD_PAGE_NOTIFY_START,
																														LA_LabelID,               MSG_GUI_PAGE_NOTIFY_START,
																														LA_STRPTR,                GUI -> Sound . Start,
																														GTST_MaxChars,    sizeof (GUI -> Sound . Start) - 1,
																														LAST_Picker,              TRUE,
																														TAG_END);

																										LT_New (Handle, LA_Type,                  STRING_KIND,
																														LA_Chars,                 CHARS,
																														LA_ID,                    GAD_PAGE_NOTIFY_DONE,
																														LA_LabelID,               MSG_GUI_PAGE_NOTIFY_DONE,
																														LA_STRPTR,                GUI -> Sound . Done,
																														GTST_MaxChars,    sizeof (GUI -> Sound . Done) - 1,
																														LAST_Picker,              TRUE,
																														TAG_END);

																										LT_New (Handle, LA_Type,                  XBAR_KIND,
																														TAG_END);

																										LT_New (Handle, LA_Type,                  STRING_KIND,
																														LA_Chars,                 CHARS,
																														LA_ID,                    GAD_PAGE_NOTIFY_ERROR,
																														LA_LabelID,               MSG_GUI_PAGE_NOTIFY_ERROR,
																														LA_STRPTR,                GUI -> Sound . Error,
																														GTST_MaxChars,    sizeof (GUI -> Sound . Error) - 1,
																														LAST_Picker,              TRUE,
																														TAG_END);

																										LT_EndGroup (Handle);

																									}

																					LT_EndGroup (Handle);

																				}

																				/*
																				 *    Page: Save
																				 */

																				LT_VertGroup (Handle);
																				{

																					LT_New (Handle, LA_Type,         VERTICAL_KIND,
																									LA_LabelID,      MSG_GUI_PAGE_SAVE,
																									TAG_END);
																									{

																										LT_New (Handle, LA_Type,                  STRING_KIND,
																														LA_Chars,                 CHARS,
																														LA_ID,                    GAD_PAGE_SAVE_FILE,
																														LA_LabelID,               MSG_GUI_PAGE_SAVE_FILE,
																														LA_STRPTR,                GUI -> File . Path,
																														GTST_MaxChars,    sizeof (GUI -> File . Path) - 1,
																														LAST_Picker,              TRUE,
																														TAG_END);

																										LT_New (Handle, LA_Type,                  CHECKBOX_KIND,
																														LA_ID,                    GAD_PAGE_SAVE_COUNT,
																														LA_LabelID,               MSG_GUI_PAGE_SAVE_COUNT,
																														LA_BOOL,                 &GUI -> File . Count,
																														TAG_END);

																										LT_New (Handle, LA_Type,                  CHECKBOX_KIND,
																														LA_ID,                    GAD_PAGE_SAVE_ICON,
																														LA_LabelID,               MSG_GUI_PAGE_SAVE_ICON,
																														LA_BOOL,                 &GUI -> File . Icon,
																														TAG_END);

																										LT_EndGroup (Handle);

																									}

																					LT_EndGroup (Handle);

																				}

																				LT_EndGroup (Handle);

																			}

															LT_EndGroup (Handle);

														}

														LT_New (Handle, LA_Type,          XBAR_KIND,
																		LAXB_FullSize,    TRUE,
																		TAG_END);

														LT_New (Handle, LA_Type,          HORIZONTAL_KIND,
																		LAGR_Spread,      TRUE,
																		LAGR_SameSize,    TRUE,
																		TAG_END);
																		{

																			LT_New (Handle, LA_Type,           BUTTON_KIND,
																							LA_LabelID,        MSG_GUI_HIDE,
																							LA_ID,             GAD_HIDE,
																							LABT_ReturnKey,    TRUE,
																							LABT_ExtraFat,     TRUE,
																							TAG_END);
																			/*
																			LT_New (Handle, LA_Type,           BUTTON_KIND,
																							LA_LabelID,        MSG_GUI_SAVE,
																							LA_ID,             GAD_SAVE,
																							TAG_END);
																			*/
																			LT_New (Handle, LA_Type,           BUTTON_KIND,
																							LA_LabelID,        MSG_GUI_CANCEL,
																							LA_ID,             GAD_CANCEL,
																							TAG_END);

																			LT_New (Handle, LA_Type,           BUTTON_KIND,
																							LA_LabelID,        MSG_GUI_QUIT,
																							LA_ID,             GAD_QUIT,
																							LABT_EscKey,       TRUE,
																							TAG_END);

																			LT_EndGroup (Handle);

																		}

														LT_EndGroup (Handle);

													}

													{

														LONG    Error;

														if ( ! (Menu = LT_NewMenuTags (LAMN_LayoutHandle,    Handle,
																					   LAMN_TitleText,       PRG_TITLE,
																					   LAMN_Error,          &Error,
																					   /*
																					   LAMN_ItemID,          MSG_GUI_MEN_SAVE,  LAMN_UserData,    MEN_SAVE,
																					   LAMN_ItemText,        NM_BARLABEL,
																					   */
																					   LAMN_ItemID,          MSG_GUI_MEN_ABOUT, LAMN_UserData,    MEN_ABOUT,
																					   LAMN_ItemText,        NM_BARLABEL,
																					   LAMN_ItemID,          MSG_GUI_MEN_QUIT,  LAMN_UserData,    MEN_QUIT,
																					   TAG_END)))
																					   {

																						   switch (Error)
																						   {

																							   case GTMENU_TRIMMED:

																								   if ( ! (ErrorRequest ("OK|Cancel", LocaleString (MSG_ERR_GUI_MEN_TRIMMED))))
																								   {

																									   RemoveGUI();

																								   }
																								   break;

																							   case GTMENU_NOMEM:

																								   if ( ! (ErrorRequest ("OK|Cancel", LocaleString (MSG_ERR_GUI_MEN_NOMEM))))
																								   {

																									   RemoveGUI();

																								   }
																								   break;

																							// case GTMENU_INVALID:
																							   default:

																								   if ( ! (ErrorRequest ("OK|Cancel", LocaleString (MSG_ERR_GUI_MEN_INVALID))))
																								   {

																									   RemoveGUI();

																								   }
																								   break;

																						   }

																					   }

													}

													if (Window = LT_Build (Handle, LAWN_Title,          PRG_TITLE,
																				   LAWN_IDCMP,          IDCMP_CLOSEWINDOW | IDCMP_MENUPICK | IDCMP_IDCMPUPDATE | IDCMP_GADGETUP,
																				   LAWN_AutoRefresh,    TRUE,
																				   LAWN_SmartZoom,      TRUE,
																				   LAWN_BelowMouse,     TRUE,
																				   LAWN_Menu,           Menu,
																				   WA_Activate,         TRUE,
																				   WA_CloseGadget,      TRUE,
																				   WA_DepthGadget,      TRUE,
																				   WA_DragBar,          TRUE,
																				   WA_SmartRefresh,     TRUE,
																				   TAG_END))
																				   {

																					   GUIMask = PortMask (Window -> UserPort);
																					   return (TRUE);

																				   }
																				   else
																				   {

																					   RemoveGUI();
																					   ErrorRequest ("OK", LocaleString (MSG_ERR_OPENWINDOW));

																				   }

												}

		GUIMask = NULL;

		return (FALSE);

	}

	return (TRUE);

}

///
/// HandleGUI ()

	/*
	 *    FUNCTION    Handle window IDCMP etc.
	 *
	 *    NOTE
	 *
	 *    EXAMPLE     HandleGUI ();
	 *
	 */


BOOL
HandleGUI (VOID)
{

	if (Window)
	{

		struct    MenuItem       *MenuItem;
		struct    IntuiMessage   *Message;
		ULONG                     MsgClass,
								  MsgQualifier;
		UWORD                     MsgCode;
		struct    Gadget         *MsgGadget;
		BOOL                      NewKeys = FALSE;

		while (Message = LT_GetIMsg (Handle))
		{

			MsgClass     = Message -> Class;
			MsgCode      = Message -> Code;
			MsgQualifier = Message -> Qualifier;
			MsgGadget    = Message -> IAddress;

			LT_ReplyIMsg   (Message);
			LT_HandleInput (Handle, MsgQualifier, &MsgClass, &MsgCode, &MsgGadget);

			switch (MsgClass)
			{

				case IDCMP_CLOSEWINDOW:

					RemoveGUI();
					return (FALSE);
					break;

				case IDCMP_IDCMPUPDATE:

					switch (MsgGadget -> GadgetID)
					{

						case GAD_PAGE_SAVE_FILE:
						case GAD_PAGE_NOTIFY_DONE:
						case GAD_PAGE_NOTIFY_START:
						case GAD_PAGE_NOTIFY_ERROR:

							{

								UBYTE    File [TT_LEN];

								LT_LockWindow (Window);

								strcpy (File, GetFile());

								if (File)
								{

									LT_SetAttributes (Handle, (LONG) MsgGadget -> GadgetID, GTST_String,    File,
																							TAG_END);

								}

								LT_UnlockWindow (Window);

							}
							break;

					}

				case IDCMP_GADGETUP:

					switch (MsgGadget -> GadgetID)
					{

						case GAD_HIDE:

							Set = GUI;
							NewKeys  = TRUE;
							break;

						case GAD_QUIT:

							RemoveGUI();
							return (TRUE);
							break;

						case GAD_SAVE:

							Set = GUI;
							SaveTTypes();
							NewKeys  = TRUE;
							break;

						case GAD_CANCEL:

							RemoveGUI();
							return (FALSE);
							break;

						/*
						 *    Page: Notify
						 */

						case GAD_PAGE_NOTIFY_START:

							LT_LockWindow (Window);

							PlaySound (GUI -> Sound . Start);

							LT_UnlockWindow (Window);
							break;

						case GAD_PAGE_NOTIFY_DONE:


							LT_LockWindow (Window);

							PlaySound (GUI -> Sound . Done);

							LT_UnlockWindow (Window);
							break;

						case GAD_PAGE_NOTIFY_ERROR:


							LT_LockWindow (Window);

							PlaySound (GUI -> Sound . Error);

							LT_UnlockWindow (Window);
							break;

					}
					break;

				case IDCMP_MENUPICK:

					while (MsgCode != MENUNULL)
					{

						if (MenuItem = ItemAddress (Menu, (ULONG) MsgCode))
						{

							switch ((ULONG) GTMENUITEM_USERDATA (MenuItem))
							{

								case MEN_SAVE:

									Set = GUI;
									SaveTTypes();
									NewKeys  = TRUE;
									break;

								case MEN_ABOUT:

									ShowRequest ("OK", PRG_TITLE " " PRG_VERSION "\n\n"     \
													   "© " PRG_YEAR " by " PRG_AUTHOR "\n" \
													   "All Rights Reserved !\n\n"          \
													   PRG_EMAIL);
									break;

								case MEN_QUIT:

									RemoveGUI();
									return (TRUE);
									break;

							}
							break;

						}
						else
						{

							break;

						}

					}
					break;

			}

			if (NewKeys)
			{

				LT_LockWindow (Window);

				SetupCx();
				LT_UnlockWindow (Window);

				RemoveGUI();
				return (FALSE);

			}

		}

	}

	return (FALSE);

}

///
/// RemoveGUI ()

	/*
	 *    FUNCTION    Close the GUI.
	 *
	 *    NOTE
	 *
	 *    EXAMPLE     RemoveGUI ();
	 *
	 */


VOID
RemoveGUI (VOID)
{

	if (Handle)
	{

		LT_DeleteHandle (Handle);
		Handle = NULL;

	}

	Window  = NULL;
	GUIMask = NULL;

}

///

