/* Code generated by Toolmaker V1.19 */

/* Includes */
 
#include <stdlib.h>
#include <exec/types.h>
#include <intuition/intuition.h>
#include <intuition/gadgetclass.h>
#include <libraries/gadtools.h>
#include <exec/memory.h>
#include <graphics/view.h>
#include <graphics/displayinfo.h>

#include "SimpleRexx_tm.h"
#include "FL_Panel.h"

#include <clib/exec_protos.h>
#include <clib/intuition_protos.h>
#include <clib/gadtools_protos.h>

/* Pragma includes for register parameters */
 
#include <pragmas/exec_pragmas.h>
#include <pragmas/intuition_pragmas.h>
#include <pragmas/gadtools_pragmas.h>

/* static function prototypes */
 
static BOOL TM_WindowSignal(struct TMData *);
static BOOL TM_ARexxSignal(struct TMData *TMData);
static VOID TM_RemoveWindow(struct TMWindowInfo *);
static BOOL WindowIDCMP_AMIGAFLP(struct TMData *, struct IntuiMessage *);

/* Mouse pointer data for disabled window */
 
UWORD __chip WaitPointer[36] =
  {
  0x0000, 0x0000,
  0x0400, 0x07C0,
  0x0000, 0x07C0,
  0x0100, 0x0380,
  0x0000, 0x07E0,
  0x07C0, 0x1FF8,
  0x1FF0, 0x3FEC,
  0x3FF8, 0x7FDE,
  0x3FF8, 0x7FBE,
  0x7FFC, 0xFF7F,
  0x7EFC, 0xFFFF,
  0x7FFC, 0xFFFF,
  0x3FF8, 0x7FFE,
  0x3FF8, 0x7FFE,
  0x1FF0, 0x3FFC,
  0x07C0, 0x1FF8,
  0x0000, 0x07E0,
  0x0000, 0x0000,
  };

/* Screen data */
 
/* Window data */
 
struct NewMenu newmenu_AMIGAFLP[] =
  {
  {NM_TITLE, (UBYTE *)MENUTEXT_PROJECT,	NULL,	0,	0,	NULL},	/* Project */
  {NM_ITEM,  (UBYTE *)ITEMTEXT_SAVE,	(UBYTE *)"S",	0,	0,	(APTR) &tmobjectdata_SAVE},	/* Save */
  {NM_ITEM,  (UBYTE *)ITEMTEXT_SAVEASM,	(UBYTE *)"A",	0,	0,	(APTR) &tmobjectdata_SAVEASM},	/* SaveAs... */
  {NM_ITEM,  NM_BARLABEL,	NULL,	0,	0,	NULL},	/* --- */
  {NM_ITEM,  (UBYTE *)ITEMTEXT_ABOUT,	(UBYTE *)"T",	0,	0,	(APTR) &tmobjectdata_ABOUT},	/* About */
  {NM_ITEM,  NM_BARLABEL,	NULL,	0,	0,	NULL},	/* --- */
  {NM_ITEM,  (UBYTE *)ITEMTEXT_QUIT,	(UBYTE *)"Q",	0,	0,	(APTR) &tmobjectdata_QUIT},	/* Quit Program */
  {NM_END,   NULL,	NULL,	0,	0,	NULL}
  };


/* Font data */
 
struct TextAttr topaz8 =
  {
  (STRPTR)"topaz.font",	/* ta_Name */
  8,	/* ta_YSize */
  FS_NORMAL,	/* ta_Style */
  0x0	/* ta_Flags */
  };

/****** FL_Panel_tm.c/TM_Request *****************************
*
*   NAME
*	TM_Request -- display a message in a system requester.
*
*   SYNOPSIS
*	num = TM_Request(Window, Title, TextFormat, GadgetFormat,
*	                 IDCMP_ptr, Arg1, Arg2, ...)
*
*	LONG TM_Request(struct Window *, UBYTE *, UBYTE *, UBYTE *,
*	                ULONG *, APTR, ...);
*
*   FUNCTION
*	Calls EasyRequestArgs to display a message in a system
*	requester without having to fill in an EasyStruct structure.
*	This function uses a varargs calling convention.
*
*	EasyRequestArgs has the capability to display more than one
*	gadget by separating the GadgetText with the '|' character.
*	Also printf style formatting may be used in the TextFormat
*	and GadgetFormat strings.  The formatting arguments should
*	be added first for the TextFormat, then for the GadgetFormat.
*
*   INPUTS
*	Window = pointer to window (passed to EasyRequestArgs()).
*	Title = title bar string (passed to EasyRequestArgs()).
*	TextFormat = body text (passed to EasyRequestArgs()).
*	GadgetFormat = gadget text (passed to EasyRequestArgs()).
*	IDCMP_ptr = IDCMP value (passed to EasyRequestArgs()).
*	Args = arguments (passed to EasyRequestArgs()).
*
*   RESULT
*	num = gadget number returned by EasyRequestArgs().
*
*   EXAMPLE
*	To display a requester with two choices:
*
*	result = TM_Request(NULL, "Question", "Are you sure?",
*	                    "OK|Cancel", NULL, NULL);
*
*   NOTES
*	The intuition library must be open before calling this
*	function.
*
*   BUGS
*
*   SEE ALSO
*	intuition.library/EasyRequestArgs()
*
**************************************************************
*
*/
LONG TM_Request(struct Window *Window, UBYTE *Title, UBYTE *TextFormat, UBYTE *GadgetFormat, ULONG *IDCMP_ptr, APTR Arg1, ...)
  {
  struct EasyStruct es;

  es.es_StructSize = sizeof(struct EasyStruct);
  es.es_Flags = 0;
  es.es_Title = Title;
  es.es_TextFormat = TextFormat;
  es.es_GadgetFormat = GadgetFormat;

  return(EasyRequestArgs(Window, &es, IDCMP_ptr, &Arg1));
  }

/****** FL_Panel_tm.c/TM_Open *****************************
*
*   NAME
*	TM_Open -- initialize user-interface data.
*
*   SYNOPSIS
*	TMData = TM_Open(ErrorCode)
*
*	struct TMData *TM_Open(ULONG *error);
*
*   FUNCTION
*	Creates an initializes a TMData structure.  This
*	includes allocating memory for a TMData structure,
*	creating a message port for window IDCMP messages,
*	and opening any fonts on disk.
*
*   INPUTS
*	error = pointer to ULONG to store an error number.
*	        Error numbers are defined in the _tm.h file.
*
*   RESULT
*	TMData = pointer to an initialized TMData structure
*	         or NULL if an error occurred.
*
*   EXAMPLE
*	if(!(TMData = TM_Open(&error)))
*	  {
*	  switch(error)
*	    {
*	    case TMERR_MEMORY:
*	      TM_Request(NULL, "Error", "Out of memory", "Abort", NULL, NULL);
*	      break;
*	    case TMERR_MSGPORT:
*	      TM_Request(NULL, "Error", "Error creating\nmessage port", "Abort", NULL, NULL);
*	      break;
*	    }
*	  CleanExit(NULL, RETURN_FAIL);
*	  }
*
*   NOTES
*	The intuition and gadtools libraries must be open before
*	calling this function.  If any fonts other than topaz 8
*	and topaz 9 are used, the diskfont and graphics libraries
*	must also be open.
*
*   BUGS
*
*   SEE ALSO
*	TM_Close()
*
**************************************************************
*
*/
struct TMData *TM_Open(ULONG *error)
  {
  struct TMData *tmdata;

  if(tmdata = AllocMem(sizeof(struct TMData), MEMF_CLEAR))
    {
    tmdata->Size = sizeof(struct TMData);

    tmdata->ARexxContext = InitARexx(AREXXNAME, NULL);	/* FL_Panel */
    tmdata->ARexxSignal = ARexxSignal(tmdata->ARexxContext);
    if(tmdata->WindowMsgPort = CreateMsgPort())
      {
      *error = TMERR_OK;
      return(tmdata);
      }
    else
      {
      *error = TMERR_MSGPORT;
      }
    FreeARexx(tmdata->ARexxContext);
    FreeMem(tmdata, sizeof(struct TMData));
    }
  else
    {
    *error = TMERR_MEMORY;
    }

  return(NULL);
  }

/****** FL_Panel_tm.c/TM_Close *****************************
*
*   NAME
*	TM_Close -- frees user-interface data.
*
*   SYNOPSIS
*	TM_Close(TMData)
*
*	VOID TM_Close(struct TMData *TMData);
*
*   FUNCTION
*	Frees resources allocated by TM_Open().
*
*   INPUTS
*	TMData = pointer to TMData structure returned by TM_Open.
*
*   RESULT
*
*   EXAMPLE
*	if(TMData) TM_Close(TMData);
*
*   NOTES
*
*   BUGS
*
*   SEE ALSO
*	TM_Open()
*
**************************************************************
*
*/
VOID TM_Close(struct TMData *TMData)
  {
  if(TMData)
    {
    if(TMData->WindowMsgPort) DeleteMsgPort(TMData->WindowMsgPort);
    FreeARexx(TMData->ARexxContext);
    FreeMem(TMData, TMData->Size);
    }
  }

/****** FL_Panel_tm.c/TM_EventLoop *****************************
*
*   NAME
*	TM_EventLoop -- waits for all events.
*
*   SYNOPSIS
*	TM_EventLoop(TMData)
*
*	VOID TM_EventLoop(struct TMData *);
*
*   FUNCTION
*	Waits for any events to signal program.  All IDCMP, ARexx,
*	and a user signal messages received are sent to the
*	appropriate signal function.  A return value of TRUE from
*	any of the signal functions will terminate the loop.
*
*   INPUTS
*	TMData = pointer to TMData structure returned by TM_Open.
*
*   RESULT
*
*   EXAMPLE
*	TM_EventLoop(TMData);
*
*   NOTES
*	An event signal must be set up before calling TM_EventLoop.
*	Either a window must be open, the SimpleRexx option selected,
*	or a user signal set up.
*
*   BUGS
*
*   SEE ALSO
*	TM_WindowSignal(), TM_ARexxSignal(), exec.library/Wait()
*
**************************************************************
*
*/
VOID TM_EventLoop(struct TMData *TMData)
  {
  BOOL done=FALSE, result;
  ULONG windowsignal, signals;

  windowsignal = 1L << TMData->WindowMsgPort->mp_SigBit;

  while(!done)
    {
    signals = Wait(windowsignal | TMData->ARexxSignal | TMData->UserSignal);

    if(signals & windowsignal)
      {
      if(result = TM_WindowSignal(TMData)) done = result;
      }
    if(signals & TMData->ARexxSignal)
      {
      if(result = TM_ARexxSignal(TMData)) done = result;
      }
    if(signals & TMData->UserSignal)
      {
      if(result = UserSignal(TMData, signals)) done = result;
      }
    }
  }

/****** FL_Panel_tm.c/OpenScreen_Workbench *****************************
*
*   NAME
*	OpenScreen_Workbench -- Use the default public screen.
*
*   SYNOPSIS
*	success = OpenScreen_Workbench(TMData)
*
*	BOOL OpenScreen_Workbench(struct TMData *);
*
*   FUNCTION
*	Locks the default public screen and gets its visual info.  If the
*	screen was already locked, it will be brought to front.
*
*   INPUTS
*	TMData = pointer to the TMData structure returned by TM_Open.
*
*   RESULT
*	success = TRUE if command was successfully completed.
*	          FALSE if not.
*
*   EXAMPLE
*	if(!(OpenScreen_Workbench(TMData)))
*	  {
*	  TM_Request(NULL, "Error", "Error opening screen", "Abort", NULL, NULL);
*	  CleanExit(TMData, RETURN_FAIL);
*	  }
*
*   NOTES
*
*   BUGS
*
*   SEE ALSO
*	CloseScreen_Workbench()
*
**************************************************************
*
*/
BOOL OpenScreen_Workbench(struct TMData *TMData)
  {
  if(ScreenInfo_Workbench.Screen)
    {
    ScreenToFront(ScreenInfo_Workbench.Screen);
    return(TRUE);
    }
  else
    {
    if(ScreenInfo_Workbench.Screen = LockPubScreen(NULL))
      {
      if(ScreenInfo_Workbench.VisualInfo = GetVisualInfo(ScreenInfo_Workbench.Screen, TAG_DONE))
        {
        return(TRUE);
        }
      UnlockPubScreen(NULL, ScreenInfo_Workbench.Screen);
      }
    }

  return(FALSE);
  }

/****** FL_Panel_tm.c/CloseScreen_Workbench *****************************
*
*   NAME
*	CloseScreen_Workbench -- Free the default public screen.
*
*   SYNOPSIS
*	CloseScreen_Workbench(TMData)
*
*	VOID CloseScreen_Workbench(struct TMData *);
*
*   FUNCTION
*	Unlocks the default public screen and frees the visual info.
*	It's ok to re-close a screen that is already closed.
*
*   INPUTS
*	TMData = pointer to the TMData structure returned by TM_Open.
*
*   RESULT
*
*   EXAMPLE
*	CloseScreen_Workbench(TMData);
*
*   NOTES
*
*   BUGS
*
*   SEE ALSO
*	OpenScreen_Workbench()
*
**************************************************************
*
*/
VOID CloseScreen_Workbench(struct TMData *TMData)
  {
  if(ScreenInfo_Workbench.VisualInfo)
    {
    FreeVisualInfo(ScreenInfo_Workbench.VisualInfo);
    ScreenInfo_Workbench.VisualInfo = NULL;
    }
  if(ScreenInfo_Workbench.Screen)
    {
    UnlockPubScreen(NULL, ScreenInfo_Workbench.Screen);
    ScreenInfo_Workbench.Screen = NULL;
    }
  }

/****** FL_Panel_tm.c/OpenWindow_AMIGAFLP *****************************
*
*   NAME
*	OpenWindow_AMIGAFLP -- Open window "AMIGAFLP".
*
*   SYNOPSIS
*	success = OpenWindow_AMIGAFLP(TMData)
*
*	BOOL OpenWindow_AMIGAFLP(struct TMData *);
*
*   FUNCTION
*	Opens the window with label "AMIGAFLP"
*	along with any gadgets it contains.  If the window was already
*	open, it will be brought to front.
*
*   INPUTS
*	TMData = pointer to the TMData structure returned by TM_Open.
*
*   RESULT
*	success = TRUE if command was successfully completed.
*	          FALSE if not.
*
*   EXAMPLE
*	if(!OpenWindow_AMIGAFLP(TMData))
*	  {
*	  TMRequest(NULL, "Error", "Error opening window", "Abort", NULL, NULL);
*	  CleanExit(TMData, RETURN_FAIL);
*	  }
*   NOTES
*
*   BUGS
*
*   SEE ALSO
*	CloseWindow_AMIGAFLP()
*
**************************************************************
*
*/
BOOL OpenWindow_AMIGAFLP(struct TMData *TMData)
  {
  ULONG lasttag;
  struct NewGadget ng;

  if(WindowInfo_AMIGAFLP.Window)
    {
    WindowToFront(WindowInfo_AMIGAFLP.Window);
    ActivateWindow(WindowInfo_AMIGAFLP.Window);
    return(TRUE);
    }
  else
    {
    WindowInfo_AMIGAFLP.FirstGadget = NULL;
    WindowInfo_AMIGAFLP.ContextGadget = CreateContext(&WindowInfo_AMIGAFLP.FirstGadget);

    ng.ng_VisualInfo = ScreenInfo_Workbench.VisualInfo;

    ng.ng_LeftEdge = 80;
    ng.ng_TopEdge = 123+ScreenInfo_Workbench.Screen->BarHeight;
    ng.ng_Width = 142;
    ng.ng_Height = 12;
    ng.ng_Flags = PLACETEXT_IN;
    ng.ng_TextAttr = &topaz8;
    ng.ng_GadgetText = (UBYTE *)GADGETTEXT_FLPoints; /* Number of Points */
    ng.ng_GadgetID = 0;
    ng.ng_UserData = NULL;
    lasttag = GadgetInfo_FLPoints.MoreTags ? TAG_MORE : TAG_DONE;
    GadgetInfo_FLPoints.Gadget = CreateGadget(TEXT_KIND, WindowInfo_AMIGAFLP.ContextGadget, &ng,
		GTTX_Border, FALSE,
		lasttag, GadgetInfo_FLPoints.MoreTags);

    ng.ng_LeftEdge = 48;
    ng.ng_TopEdge = 17+ScreenInfo_Workbench.Screen->BarHeight;
    ng.ng_Width = 22;
    ng.ng_Height = 160;
    ng.ng_Flags = PLACETEXT_BELOW;
    ng.ng_GadgetText = (UBYTE *)GADGETTEXT_FLPNUMY; /* _Y */
    ng.ng_GadgetID = ID_FLPNUMY;
    ng.ng_UserData = (APTR) &tmobjectdata_FLPNUMY;
    lasttag = GadgetInfo_FLPNUMY.MoreTags ? TAG_MORE : TAG_DONE;
    GadgetInfo_FLPNUMY.Gadget = CreateGadget(SLIDER_KIND, GadgetInfo_FLPoints.Gadget, &ng,
		GT_Underscore, '_',
		GTSL_Level, 30,
		GTSL_LevelFormat, GTSL_LevelFormat_FLPNUMY,
		GTSL_LevelPlace, PLACETEXT_ABOVE,
		GTSL_Max, 100,
		GTSL_MaxLevelLen, 4,
		GTSL_Min, 3,
		GA_Immediate, TRUE,
		GA_RelVerify, TRUE,
		PGA_Freedom, LORIENT_VERT,
		lasttag, GadgetInfo_FLPNUMY.MoreTags);

    ng.ng_LeftEdge = 144;
    ng.ng_TopEdge = 77+ScreenInfo_Workbench.Screen->BarHeight;
    ng.ng_Width = 148;
    ng.ng_Height = 14;
    ng.ng_Flags = PLACETEXT_RIGHT;
    ng.ng_GadgetText = (UBYTE *)GADGETTEXT_FLPSeed;	/* _Random Seed */
    ng.ng_GadgetID = ID_FLPSeed;
    ng.ng_UserData = (APTR) &tmobjectdata_FLPSeed;
    lasttag = GadgetInfo_FLPSeed.MoreTags ? TAG_MORE : TAG_DONE;
    GadgetInfo_FLPSeed.Gadget = CreateGadget(STRING_KIND, GadgetInfo_FLPNUMY.Gadget, &ng,
		GTST_MaxChars, 25,
		GTST_String, GTST_String_FLPSeed,
		GT_Underscore, '_',
		GA_TabCycle, FALSE,
		STRINGA_ExitHelp, TRUE,
		STRINGA_Justification, GACT_STRINGRIGHT,
		lasttag, GadgetInfo_FLPSeed.MoreTags);

    ng.ng_LeftEdge = 104;
    ng.ng_Width = 26;
    ng.ng_Height = 18;
    ng.ng_Flags = PLACETEXT_BELOW | NG_HIGHLABEL;
    ng.ng_GadgetText = (UBYTE *)GADGETTEXT_FLPRaniz;	/* Randomi_ze */
    ng.ng_GadgetID = ID_FLPRaniz;
    ng.ng_UserData = (APTR) &tmobjectdata_FLPRaniz;
    lasttag = GadgetInfo_FLPRaniz.MoreTags ? TAG_MORE : TAG_DONE;
    GadgetInfo_FLPRaniz.Gadget = CreateGadget(BUTTON_KIND, GadgetInfo_FLPSeed.Gadget, &ng,
		GT_Underscore, '_',
		lasttag, GadgetInfo_FLPRaniz.MoreTags);

    ng.ng_LeftEdge = 18;
    ng.ng_TopEdge = 17+ScreenInfo_Workbench.Screen->BarHeight;
    ng.ng_Width = 22;
    ng.ng_Height = 160;
    ng.ng_Flags = PLACETEXT_BELOW;
    ng.ng_GadgetText = (UBYTE *)GADGETTEXT_FLPNUMX; /* _X */
    ng.ng_GadgetID = ID_FLPNUMX;
    ng.ng_UserData = (APTR) &tmobjectdata_FLPNUMX;
    lasttag = GadgetInfo_FLPNUMX.MoreTags ? TAG_MORE : TAG_DONE;
    GadgetInfo_FLPNUMX.Gadget = CreateGadget(SLIDER_KIND, GadgetInfo_FLPRaniz.Gadget, &ng,
		GT_Underscore, '_',
		GTSL_Level, 30,
		GTSL_LevelFormat, GTSL_LevelFormat_FLPNUMX,
		GTSL_LevelPlace, PLACETEXT_ABOVE,
		GTSL_Max, 100,
		GTSL_MaxLevelLen, 4,
		GTSL_Min, 3,
		GA_Immediate, TRUE,
		GA_RelVerify, TRUE,
		PGA_Freedom, LORIENT_VERT,
		lasttag, GadgetInfo_FLPNUMX.MoreTags);

    ng.ng_LeftEdge = 92;
    ng.ng_TopEdge = 159+ScreenInfo_Workbench.Screen->BarHeight;
    ng.ng_Width = 250;
    ng.ng_Height = 18;
    ng.ng_Flags = PLACETEXT_ABOVE;
    ng.ng_GadgetText = (UBYTE *)GADGETTEXT_FILENAME;	/* _File Name */
    ng.ng_GadgetID = ID_FILENAME;
    ng.ng_UserData = (APTR) &tmobjectdata_FILENAME;
    lasttag = GadgetInfo_FILENAME.MoreTags ? TAG_MORE : TAG_DONE;
    GadgetInfo_FILENAME.Gadget = CreateGadget(STRING_KIND, GadgetInfo_FLPNUMX.Gadget, &ng,
		GTST_MaxChars, 149,
		GTST_String, GTST_String_FILENAME,
		GT_Underscore, '_',
		GA_TabCycle, FALSE,
		STRINGA_ExitHelp, TRUE,
		STRINGA_Justification, GACT_STRINGCENTER,
		lasttag, GadgetInfo_FILENAME.MoreTags);

    ng.ng_LeftEdge = 104;
    ng.ng_TopEdge = 17+ScreenInfo_Workbench.Screen->BarHeight;
    ng.ng_Width = 26;
    ng.ng_Flags = PLACETEXT_RIGHT | NG_HIGHLABEL;
    ng.ng_GadgetText = (UBYTE *)GADGETTEXT_MAKEFRAC;	/* _Make Fractal Landscape */
    ng.ng_GadgetID = ID_MAKEFRAC;
    ng.ng_UserData = (APTR) &tmobjectdata_MAKEFRAC;
    lasttag = GadgetInfo_MAKEFRAC.MoreTags ? TAG_MORE : TAG_DONE;
    GadgetInfo_MAKEFRAC.Gadget = CreateGadget(BUTTON_KIND, GadgetInfo_FILENAME.Gadget, &ng,
		GT_Underscore, '_',
		lasttag, GadgetInfo_MAKEFRAC.MoreTags);

    ng.ng_TopEdge = 47+ScreenInfo_Workbench.Screen->BarHeight;
    ng.ng_GadgetText = (UBYTE *)GADGETTEXT_SAVEAS;	/* Save _As */
    ng.ng_GadgetID = ID_SAVEAS;
    ng.ng_UserData = (APTR) &tmobjectdata_SAVEAS;
    lasttag = GadgetInfo_SAVEAS.MoreTags ? TAG_MORE : TAG_DONE;
    GadgetInfo_SAVEAS.Gadget = CreateGadget(BUTTON_KIND, GadgetInfo_MAKEFRAC.Gadget, &ng,
		GT_Underscore, '_',
		lasttag, GadgetInfo_SAVEAS.MoreTags);

    if(GadgetInfo_SAVEAS.Gadget)
      {
      lasttag = WindowInfo_AMIGAFLP.MoreTags ? TAG_MORE : TAG_DONE;

      if((WindowInfo_AMIGAFLP.Window = OpenWindowTags(NULL,
		WA_PubScreen, ScreenInfo_Workbench.Screen,
		WA_Title, WINDOWTEXT_AMIGAFLP,	/* Amiga Fractal Landscape Panel */
		WA_IDCMP, NULL,
		WA_Gadgets, WindowInfo_AMIGAFLP.FirstGadget,
		WA_Left, 154,
		WA_Top, 58,
		WA_InnerWidth, 395,
		WA_InnerHeight, 189,
		WA_MinWidth, 70,
		WA_MinHeight, 30,
		WA_MaxWidth, -1,
		WA_MaxHeight, -1,
		WA_DragBar, TRUE,
		WA_CloseGadget, TRUE,
		WA_DepthGadget, TRUE,
		WA_Activate, TRUE,
		WA_SimpleRefresh, TRUE,
		lasttag, WindowInfo_AMIGAFLP.MoreTags)))
        {
        if((WindowInfo_AMIGAFLP.Menu = CreateMenus(newmenu_AMIGAFLP, TAG_DONE)))
          {
          if((LayoutMenus(WindowInfo_AMIGAFLP.Menu, ScreenInfo_Workbench.VisualInfo, TAG_DONE)))
            {
            if((SetMenuStrip(WindowInfo_AMIGAFLP.Window, WindowInfo_AMIGAFLP.Menu)))
              {
              WindowInfo_AMIGAFLP.Window->UserPort = TMData->WindowMsgPort;
              ModifyIDCMP(WindowInfo_AMIGAFLP.Window,
			IDCMP_REFRESHWINDOW |
			SLIDERIDCMP |
			STRINGIDCMP |
			BUTTONIDCMP |
			IDCMP_GADGETUP |
			IDCMP_MENUPICK |
			IDCMP_CLOSEWINDOW |
			IDCMP_RAWKEY |
			IDCMP_REQVERIFY |
			IDCMP_MENUVERIFY |
			IDCMP_VANILLAKEY |
			IDCMP_MENUHELP);
              GT_RefreshWindow(WindowInfo_AMIGAFLP.Window, NULL);
              WindowInfo_AMIGAFLP.Flags |= TMWF_OPENED;
              return(TRUE);
              }
            }
          FreeMenus(WindowInfo_AMIGAFLP.Menu);
          }
        CloseWindow(WindowInfo_AMIGAFLP.Window);
        }
      FreeGadgets(WindowInfo_AMIGAFLP.FirstGadget);
      }
    }
  return(FALSE);
  }

/****** FL_Panel_tm.c/CloseWindow_AMIGAFLP *****************************
*
*   NAME
*	CloseWindow_AMIGAFLP -- Close window "AMIGAFLP".
*
*   SYNOPSIS
*	CloseWindow_AMIGAFLP(TMData)
*
*	VOID CloseWindow_AMIGAFLP(struct TMData *);
*
*   FUNCTION
*	Closes the window with label "AMIGAFLP"
*	and frees its resources.  It's ok to re-close a window
*	that is already closed.
*
*   INPUTS
*	TMData = pointer to the TMData structure returned by TM_Open.
*
*   RESULT
*
*   EXAMPLE
*
*   NOTES
*
*   BUGS
*
*   SEE ALSO
*	OpenWindow_AMIGAFLP()
*
**************************************************************
*
*/
VOID CloseWindow_AMIGAFLP(struct TMData *TMData)
  {
  TM_RemoveWindow(&WindowInfo_AMIGAFLP);
  }

/****** FL_Panel_tm.c/DisableWindow_AMIGAFLP *****************************
*
*   NAME
*	DisableWindow_AMIGAFLP -- disable input to window "AMIGAFLP".
*
*   SYNOPSIS
*	DisableWindow_AMIGAFLP(TMData)
*
*	VOID DisableWindow_AMIGAFLP(struct TMData *);
*
*   FUNCTION
*	Disables all input to window with label "AMIGAFLP"
*	and changes its mouse pointer.
*
*   INPUTS
*	TMData = pointer to the TMData structure returned by TM_Open.
*
*   RESULT
*
*   EXAMPLE
*
*   NOTES
*
*   BUGS
*
*   SEE ALSO
*	EnableWindow_AMIGAFLP()
*
**************************************************************
*
*/
VOID DisableWindow_AMIGAFLP(struct TMData *TMData)
  {
  if((WindowInfo_AMIGAFLP.DisableCount == 0) && (WindowInfo_AMIGAFLP.Flags & TMWF_OPENED))
    {
    InitRequester(&WindowInfo_AMIGAFLP.Requester);
    if(Request(&WindowInfo_AMIGAFLP.Requester, WindowInfo_AMIGAFLP.Window))
      {
      WindowInfo_AMIGAFLP.Flags |= TMWF_DISABLED;
      SetPointer(WindowInfo_AMIGAFLP.Window, WaitPointer, 16, 16, -6, 0);
      }
    }
  WindowInfo_AMIGAFLP.DisableCount++;
  }

/****** FL_Panel_tm.c/EnableWindow_AMIGAFLP *****************************
*
*   NAME
*	EnableWindow_AMIGAFLP -- enable input to window "AMIGAFLP".
*
*   SYNOPSIS
*	EnableWindow_AMIGAFLP(TMData)
*
*	VOID EnableWindow_AMIGAFLP(struct TMData *);
*
*   FUNCTION
*	Enables input to window with label "AMIGAFLP"
*	and clears its mouse pointer.
*
*   INPUTS
*	TMData = pointer to the TMData structure returned by TM_Open.
*
*   RESULT
*
*   EXAMPLE
*
*   NOTES
*
*   BUGS
*
*   SEE ALSO
*	DisableWindow_AMIGAFLP()
*
**************************************************************
*
*/
VOID EnableWindow_AMIGAFLP(struct TMData *TMData)
  {
  WindowInfo_AMIGAFLP.DisableCount--;
  if((WindowInfo_AMIGAFLP.DisableCount == 0) && (WindowInfo_AMIGAFLP.Flags & (TMWF_DISABLED | TMWF_OPENED)))
    {
    EndRequest(&WindowInfo_AMIGAFLP.Requester, WindowInfo_AMIGAFLP.Window);
    WindowInfo_AMIGAFLP.Flags &= ~TMWF_DISABLED;
    ClearPointer(WindowInfo_AMIGAFLP.Window);
    }
  }

/* *********************************************************** */
/* Static functions (available only to functions in this file) */
/* *********************************************************** */
 
static BOOL TM_WindowSignal(struct TMData *TMData)
  {
  BOOL done=FALSE;
  BOOL result;
  struct IntuiMessage *imessage;

  while(imessage = GT_GetIMsg(TMData->WindowMsgPort))
    {
    if(imessage->IDCMPWindow == WindowInfo_AMIGAFLP.Window)
      {
      WindowInfo_AMIGAFLP.GT_IMsg = imessage;
      if(result = WindowIDCMP_AMIGAFLP(TMData, imessage)) done = result;
      if(WindowInfo_AMIGAFLP.GT_IMsg)
        {
        GT_ReplyIMsg(WindowInfo_AMIGAFLP.GT_IMsg);
        WindowInfo_AMIGAFLP.GT_IMsg = NULL;
        }
      }
    }

  return(done);
  }

static BOOL WindowIDCMP_AMIGAFLP(struct TMData *TMData, struct IntuiMessage *imessage)
  {
  BOOL done=FALSE;
  BOOL result;

  switch(imessage->Class)
    {
    case IDCMP_REFRESHWINDOW:	/* Always refresh */
      GT_BeginRefresh(WindowInfo_AMIGAFLP.Window);
      GT_EndRefresh(WindowInfo_AMIGAFLP.Window, TRUE);
      break;

    case IDCMP_MENUPICK:
      if(result = Window_AMIGAFLP_MENUPICK(TMData, imessage)) done = result;
      break;

    case IDCMP_GADGETUP:
      if(result = Window_AMIGAFLP_GADGETUP(TMData, imessage)) done = result;
      break;

    case IDCMP_CLOSEWINDOW:
      if(result = Window_AMIGAFLP_CLOSEWINDOW(TMData, imessage)) done = result;
      break;

    case IDCMP_RAWKEY:
      if(result = Window_AMIGAFLP_RAWKEY(TMData, imessage)) done = result;
      break;

    case IDCMP_REQVERIFY:
      if(result = Window_AMIGAFLP_REQVERIFY(TMData, imessage)) done = result;
      break;

    case IDCMP_MENUVERIFY:
      if(result = Window_AMIGAFLP_MENUVERIFY(TMData, imessage)) done = result;
      break;

    case IDCMP_VANILLAKEY:
      if(result = Window_AMIGAFLP_VANILLAKEY(TMData, imessage)) done = result;
      break;

    case IDCMP_MENUHELP:
      if(result = Window_AMIGAFLP_MENUHELP(TMData, imessage)) done = result;
      break;

    }

  return(done);
  }

static BOOL TM_ARexxSignal(struct TMData *TMData)
  {
  BOOL done=FALSE;
  BOOL result;
  struct RexxMsg *rexxmsg;

  while(rexxmsg = GetARexxMsg(TMData->ARexxContext))
    {
    TMData->ARexxErrorLevel = 0;
    TMData->ARexxError = NULL;
    TMData->ARexxResult = NULL;

    if(result = ARexxMessage(TMData, rexxmsg)) done = result;

    if(TMData->ARexxError)
      {
      SetARexxLastError(TMData->ARexxContext, rexxmsg, TMData->ARexxError);
      }
    ReplyARexxMsg(TMData->ARexxContext, rexxmsg, TMData->ARexxResult, TMData->ARexxErrorLevel);
    }

  return(done);
  }

static VOID TM_RemoveWindow(struct TMWindowInfo *TMWindowInfo)
  {
  struct IntuiMessage *imessage;
  struct Node *succ;

  if(TMWindowInfo->Window)
    {
    if(TMWindowInfo->Menu)
      {
      ClearMenuStrip(TMWindowInfo->Window);
      FreeMenus(TMWindowInfo->Menu);
      TMWindowInfo->Menu = NULL;
      }

    if(TMWindowInfo->GT_IMsg)
      {
      GT_ReplyIMsg(TMWindowInfo->GT_IMsg);
      TMWindowInfo->GT_IMsg = NULL;
      }

    if(TMWindowInfo->Window->UserPort)
      {
      Forbid();
      imessage = (struct IntuiMessage *) TMWindowInfo->Window->UserPort->mp_MsgList.lh_Head;
      while(succ = imessage->ExecMessage.mn_Node.ln_Succ)
        {
        if(imessage->IDCMPWindow == TMWindowInfo->Window)
          {
          Remove((struct Node *) imessage);
          ReplyMsg((struct Message *) imessage);
          }
        imessage = (struct IntuiMessage *) succ;
        }
      TMWindowInfo->Window->UserPort = NULL;
      ModifyIDCMP(TMWindowInfo->Window, 0L);
      Permit();
      }

    CloseWindow(TMWindowInfo->Window);
    TMWindowInfo->Window = NULL;
    TMWindowInfo->Flags = 0;
    }

  if(TMWindowInfo->FirstGadget)
    {
    FreeGadgets(TMWindowInfo->FirstGadget);
    TMWindowInfo->FirstGadget = NULL;
    }
  }

