#include <exec/types.h>
#include <exec/memory.h>
#include <dos/dos.h>
#include <intuition/intuition.h>
#include <intuition/gadgetclass.h>
#include <intuition/imageclass.h>
#include <intuition/icclass.h>
#include <gadgets/listbrowser.h>
#include <images/label.h>
#include <libraries/asl.h>
#include <libraries/gadtools.h>
#include <utility/tagitem.h>
#include <proto/asl.h>
#include <proto/dos.h>
#include <proto/diskfont.h>
#include <proto/exec.h>
#include <proto/gadtools.h>
#include <proto/graphics.h>
#include <proto/icon.h>
#include <proto/intuition.h>
#include <proto/utility.h>
#include <proto/wb.h>
#include <classact.h>
#include <stdio.h>
#include <string.h>


/* Here's where it all starts.
 */
main()
{
	struct Screen *screen = NULL;

	if (!ButtonBase) return(20);

	/* We'll just open up on the default public screen, and use its screen font.
	 */
	if (screen = LockPubScreen(NULL))
	{
		struct DrawInfo *drinfo = GetScreenDrawInfo(screen);
		Object *layout;

		if (layout = LayoutObject,
						GA_DrawInfo, drinfo,
						LAYOUT_DeferLayout, TRUE,	/* Layout refreshes done on
													 * task's context (by the
													 * window class) */
						LAYOUT_SpaceOuter, TRUE,
						LAYOUT_AddChild, LayoutObject,
							LAYOUT_VertAlignment, LAYOUT_ALIGN_TOP,
							LAYOUT_Orientation, LAYOUT_ORIENT_HORIZ,
							LAYOUT_BevelStyle, BVS_GROUP,
							LAYOUT_Label, "Available Glyphs",

							LAYOUT_AddChild, LayoutObject,
								LAYOUT_Orientation, LAYOUT_ORIENT_VERT,
								LAYOUT_HorizAlignment, LAYOUT_ALIGN_RIGHT,
								LAYOUT_SpaceOuter, TRUE,
	
								LAYOUT_AddImage, GlyphObject,
									GLYPH_Glyph, GLYPH_DOWNARROW,
									GlyphEnd,
									CHILD_MinWidth, 12,
									CHILD_MinHeight, 12,
									CHILD_Label, LabelObject,
										LABEL_Text, "Down Arrow:",
										LabelEnd,
	
								LAYOUT_AddImage, GlyphObject,
									GLYPH_Glyph, GLYPH_UPARROW,
									GlyphEnd,
									CHILD_MinWidth, 12,
									CHILD_MinHeight, 12,
									CHILD_Label, LabelObject,
										LABEL_Text, "Up Arrow:",
										LabelEnd,
	
								LAYOUT_AddImage, GlyphObject,
									GLYPH_Glyph, GLYPH_LEFTARROW,
									GlyphEnd,
									CHILD_MinWidth, 12,
									CHILD_MinHeight, 12,
									CHILD_Label, LabelObject,
										LABEL_Text, "Left Arrow:",
										LabelEnd,
	
								LAYOUT_AddImage, GlyphObject,
									GLYPH_Glyph, GLYPH_RIGHTARROW,
									GlyphEnd,
									CHILD_MinWidth, 12,
									CHILD_MinHeight, 12,
									CHILD_Label, LabelObject,
										LABEL_Text, "Right Arrow:",
										LabelEnd,
	
								LAYOUT_AddImage, GlyphObject,
									GLYPH_Glyph, GLYPH_DROPDOWN,
									GlyphEnd,
									CHILD_MinWidth, 12,
									CHILD_MinHeight, 12,
									CHILD_Label, LabelObject,
										LABEL_Text, "Drop Down:",
										LabelEnd,
	
								LAYOUT_AddImage, GlyphObject,
									GLYPH_Glyph, GLYPH_CHECKMARK,
									GlyphEnd,
									CHILD_MinWidth, 12,
									CHILD_MinHeight, 12,
									CHILD_Label, LabelObject,
										LABEL_Text, "Check Mark:",
										LabelEnd,
	
								LAYOUT_AddImage, GlyphObject,
									GLYPH_Glyph, GLYPH_RADIOBUTTON,
									GlyphEnd,
									CHILD_MinWidth, 12,
									CHILD_MinHeight, 12,
									CHILD_Label, LabelObject,
										LABEL_Text, "Radio Button:",
										LabelEnd,
								LayoutEnd,
	
							LAYOUT_AddChild, LayoutObject,
								LAYOUT_SpaceOuter, TRUE,
								LAYOUT_AddImage, BevelObject,
									GA_DrawInfo, drinfo,
									BEVEL_Style, BVS_SBAR_HORIZ,
									BevelEnd,
								LayoutEnd,
								CHILD_MinWidth, 4,
								CHILD_WeightedWidth, 0,

							LAYOUT_AddChild, LayoutObject,
								LAYOUT_Orientation, LAYOUT_ORIENT_VERT,
								LAYOUT_VertAlignment, LAYOUT_ALIGN_CENTER,
								LAYOUT_SpaceOuter, TRUE,
	
								LAYOUT_AddImage, GlyphObject,
									GLYPH_Glyph, GLYPH_POPUP,
									GlyphEnd,
									CHILD_MinWidth, 12,
									CHILD_MinHeight, 12,
									CHILD_Label, LabelObject,
										LABEL_Text, "Pop Up:",
										LabelEnd,
	
								LAYOUT_AddImage, GlyphObject,
									GLYPH_Glyph, GLYPH_POPFONT,
									GlyphEnd,
									CHILD_MinWidth, 12,
									CHILD_MinHeight, 12,
									CHILD_Label, LabelObject,
										LABEL_Text, "Pop Font:",
										LabelEnd,
	
								LAYOUT_AddImage, GlyphObject,
									GLYPH_Glyph, GLYPH_POPFILE,
									GlyphEnd,
									CHILD_MinWidth, 12,
									CHILD_MinHeight, 12,
									CHILD_Label, LabelObject,
										LABEL_Text, "Pop File:",
										LabelEnd,
	
								LAYOUT_AddImage, GlyphObject,
									GLYPH_Glyph, GLYPH_POPDRAWER,
									GlyphEnd,
									CHILD_MinWidth, 12,
									CHILD_MinHeight, 12,
									CHILD_Label, LabelObject,
										LABEL_Text, "Pop Drawer:",
										LabelEnd,
	
								LAYOUT_AddImage, GlyphObject,
									GLYPH_Glyph, GLYPH_POPSCREENMODE,
									GlyphEnd,
									CHILD_MinWidth, 12,
									CHILD_MinHeight, 12,
									CHILD_Label, LabelObject,
										LABEL_Text, "Pop Screen Mode:",
										LabelEnd,
	
								LAYOUT_AddImage, GlyphObject,
									GLYPH_Glyph, GLYPH_POPTIME,
									GlyphEnd,
									CHILD_MinWidth, 12,
									CHILD_MinHeight, 12,
									CHILD_Label, LabelObject,
										LABEL_Text, "Pop Time:",
										LabelEnd,
	
								LAYOUT_AddImage, GlyphObject,
									GLYPH_Glyph, GLYPH_RETURNARROW,
									GlyphEnd,
									CHILD_MinWidth, 12,
									CHILD_MinHeight, 12,
									CHILD_Label, LabelObject,
										LABEL_Text, "Return Arrow:",
										LabelEnd,
								LayoutEnd,
							LayoutEnd,
						LayoutEnd)
		{
			struct MsgPort *app_port;
			Object *window_obj;

			/* Create a message port for App* messages.  This is needed for
			 * iconification.  We're being a touch naughty by not checking
			 * the return code, but that just means that iconification won't
			 * work, nothing really bad will happen.
			 */
			app_port = CreateMsgPort();

			/* Create the window object.
			 */
			if (window_obj = WindowObject,
								WA_Left, 0,
								WA_Top, screen->Font->ta_YSize + 3,
								WA_CustomScreen, screen,
								WA_IDCMP, IDCMP_CLOSEWINDOW | IDCMP_REFRESHWINDOW,
								WA_Flags, WFLG_DRAGBAR | WFLG_DEPTHGADGET | WFLG_CLOSEGADGET |
											WFLG_SIZEGADGET | WFLG_ACTIVATE | WFLG_SMART_REFRESH,
								WA_Title, "Glyph class example",
								WA_NewLookMenus, TRUE,
								WINDOW_ParentGroup, layout,
								WINDOW_IconifyGadget, TRUE,
								WINDOW_Icon, GetDiskObject("PROGDIR:GlyphExample"),
								WINDOW_IconTitle, "GlyphExample",
								WINDOW_AppPort, app_port,
								TAG_DONE))
			{
				struct Window *win;

				/*  Open the window.
				 */
				if (win = (struct Window *)CA_OpenWindow(window_obj))
				{
					ULONG signal;
					BOOL ok = TRUE;

					/* Obtain the window wait signal mask.
					 */
					GetAttr(WINDOW_SigMask, window_obj, &signal);

					/* Input Event Loop
					 */
					while (ok)
					{
						ULONG result;

						Wait(signal | (1L << app_port->mp_SigBit));

						/* CA_HandleInput() returns the gadget ID of a clicked
						 * gadget, or one of several pre-defined values.  For
						 * this demo, we're only actually interested in a
						 * close window and a couple of gadget clicks.
						 */
						while ((result = CA_HandleInput(window_obj, NULL)) != WMHI_LASTMSG)
						{
							switch(result & WMHI_CLASSMASK)
							{
								case WMHI_CLOSEWINDOW:
									ok = FALSE;
									break;

								case WMHI_GADGETUP:
									switch (result & WMHI_GADGETMASK)
									{
										default:
											break;
									}
									break;

								case WMHI_ICONIFY:
									if (CA_Iconify(window_obj))
										win = NULL;
									break;
							 
								case WMHI_UNICONIFY:
									win = CA_OpenWindow(window_obj);
									break;

								default:
									break;
							}
						}
					}
 				}
				else
					PutStr("ERROR: failed to start.  Couldn't open window\n");

				/* Disposing of the window object will also close the
				 * window if it is already opened and it will dispose of
				 * all objects attached to it.
				 */
				DisposeObject(window_obj);
			}
			else
				PutStr("ERROR: failed to start.  Couldn't create window\n");

			/* Lose the App* message port.
			 */
			if (app_port)
				DeleteMsgPort(app_port);
		}
		else
			PutStr("ERROR: failed to start.  Couldn't create layout\n");

		if (drinfo)
			FreeScreenDrawInfo(screen, drinfo);

	    UnlockPubScreen(0, screen);
	}
	else
		PutStr("ERROR: failed to start.  Couldn't lock destination screen\n");

	exit(0);
}
