		/*************************************
		 *                                   *
		 *             Editor v1.0           *
		 *   by Torsten Jürgeleit in 07/91   *
		 *                                   *
		 *            Requester part         *
		 *                                   *
		 *************************************/

	/* Includes */

#include "includes.h"
#include "defines.h"
#include "imports.h"
#include "protos.h"

	/* Defines for error requester */

#define ERROR_WINDOW_TITLE	" Error "

	/* Statics for error requester */

STATIC BYTE *error_text[] = {
   "Can't open arp.library v39+",
   "Can't open intuisup.library",
   "Can't open diskfont.library",
   "Can't open window",
   "Out of memory",
   "Can't open file",
   "Error while saving",
   "Error while reading",
   "Line in load file too long",
   "Missing argument in load file",
   "Different block types for BEGIN and END in load file"
};
	/* Defines for continue requester */

#define CONTINUE_WINDOW_TITLE		(UBYTE *)" Error "
#define CONTINUE_WINDOW_IDCMP		(CLOSEWINDOW | GADGET_IDCMP_FLAGS_BUTTON)
#define CONTINUE_RENDER_INFO_FLAGS	(RENDER_INFO_FLAG_INNER_WINDOW | RENDER_INFO_FLAG_BACK_FILL)
#define CONTINUE_OPEN_WINDOW_FLAGS	0

#define CONTINUE_GADGET_TYPE		GADGET_DATA_TYPE_BUTTON
#define CONTINUE_GADGET_FLAGS		GADGET_DATA_FLAG_HOT_KEY
#define CONTINUE_GADGET_TEXT		"_Continue"
#define CONTINUE_GADGET_LEFT_EDGE	0
#define CONTINUE_GADGET_TOP_EDGE	0
#define CONTINUE_GADGET_WIDTH		((8 + 2) * 8)
#define CONTINUE_GADGET_HEIGHT		15
#define CONTINUE_GADGET_TEXT_ATTR	&topaz80_attr

	/* Statics for continue requester */

STATIC struct NewWindow  continue_new_window = {
   0, 0, 0, 0, 0, 1, CONTINUE_WINDOW_IDCMP, WINDOWCLOSE | WINDOWDRAG |
   WINDOWDEPTH | SMART_REFRESH | NOCAREREFRESH | ACTIVATE, NULL, NULL, NULL,
   NULL, NULL, 0, 0, 0, 0, WBENCHSCREEN
};

STATIC struct GadgetData  continue_gadget_data[] = {
   {
	CONTINUE_GADGET_TYPE,		/* gd_Type */
	CONTINUE_GADGET_FLAGS,		/* gd_Flags */
	CONTINUE_GADGET_LEFT_EDGE,	/* gd_LeftEdge */
	CONTINUE_GADGET_TOP_EDGE,	/* gd_TopEdge */
	CONTINUE_GADGET_WIDTH,		/* gd_Width */
	CONTINUE_GADGET_HEIGHT,		/* gd_Height */
	CONTINUE_GADGET_TEXT,		/* *gd_Text */
	CONTINUE_GADGET_TEXT_ATTR,	/* *gd_TextAttr */
	{ 0, 0, 0 }
   }, {
	INTUISUP_DATA_END		/* mark end of gadget data */
   }
};
	/* Defines for about requester */

#define ABOUT_WINDOW_WIDTH		300
#define ABOUT_WINDOW_HEIGHT		115
#define ABOUT_WINDOW_TITLE		(UBYTE *)" About "
#define ABOUT_WINDOW_IDCMP		(CLOSEWINDOW | GADGET_IDCMP_FLAGS_BUTTON)
#define ABOUT_RENDER_INFO_FLAGS		(RENDER_INFO_FLAG_INNER_WINDOW | RENDER_INFO_FLAG_BACK_FILL)
#define ABOUT_OPEN_WINDOW_FLAGS		OPEN_WINDOW_FLAG_CENTER_WINDOW

#define ABOUT_GADGET_TYPE	GADGET_DATA_TYPE_BUTTON
#define ABOUT_GADGET_FLAGS	GADGET_DATA_FLAG_HOT_KEY
#define ABOUT_GADGET_TEXT	"_Continue"
#define ABOUT_GADGET_LEFT_EDGE	((ABOUT_WINDOW_WIDTH - ABOUT_GADGET_WIDTH) / 2)
#define ABOUT_GADGET_TOP_EDGE	(ABOUT_WINDOW_HEIGHT - ABOUT_GADGET_HEIGHT - 10)
#define ABOUT_GADGET_WIDTH	((8 + 2) * 8)
#define ABOUT_GADGET_HEIGHT	15
#define ABOUT_GADGET_TEXT_ATTR	&topaz80_attr

#define ABOUT_TEXT1_TYPE	TEXT_DATA_TYPE_TEXT
#define ABOUT_TEXT1_FLAGS	(TEXT_DATA_FLAG_CENTER | TEXT_DATA_FLAG_BOLD)
#define ABOUT_TEXT1_LEFT_EDGE	0
#define ABOUT_TEXT1_TOP_EDGE	10
#define ABOUT_TEXT1_TEXT	"Template Editor v1.0"
#define ABOUT_TEXT1_TEXT_ATTR	&topaz60_attr

#define ABOUT_TEXT2_TYPE	TEXT_DATA_TYPE_TEXT
#define ABOUT_TEXT2_FLAGS	(TEXT_DATA_FLAG_CENTER | TEXT_DATA_FLAG_COLOR2)
#define ABOUT_TEXT2_LEFT_EDGE	0
#define ABOUT_TEXT2_TOP_EDGE	30
#define ABOUT_TEXT2_TEXT	"© 08/91 by Torsten Jürgeleit"
#define ABOUT_TEXT2_TEXT_ATTR	&topaz80_attr

#define ABOUT_TEXT3_TYPE	TEXT_DATA_TYPE_TEXT
#define ABOUT_TEXT3_FLAGS	(TEXT_DATA_FLAG_CENTER | TEXT_DATA_FLAG_COLOR2)
#define ABOUT_TEXT3_LEFT_EDGE	0
#define ABOUT_TEXT3_TOP_EDGE	40
#define ABOUT_TEXT3_TEXT	"           Am Sandberg 4    "
#define ABOUT_TEXT3_TEXT_ATTR	&topaz80_attr

#define ABOUT_TEXT4_TYPE	TEXT_DATA_TYPE_TEXT
#define ABOUT_TEXT4_FLAGS	(TEXT_DATA_FLAG_CENTER | TEXT_DATA_FLAG_COLOR2)
#define ABOUT_TEXT4_LEFT_EDGE	0
#define ABOUT_TEXT4_TOP_EDGE	50
#define ABOUT_TEXT4_TEXT	"           5270 Gummersbach "
#define ABOUT_TEXT4_TEXT_ATTR	&topaz80_attr

#define ABOUT_TEXT5_TYPE	TEXT_DATA_TYPE_TEXT
#define ABOUT_TEXT5_FLAGS	(TEXT_DATA_FLAG_CENTER | TEXT_DATA_FLAG_COLOR2)
#define ABOUT_TEXT5_LEFT_EDGE	0
#define ABOUT_TEXT5_TOP_EDGE	60
#define ABOUT_TEXT5_TEXT	"           West Germany     "
#define ABOUT_TEXT5_TEXT_ATTR	&topaz80_attr

#define ABOUT_TEXT6_TYPE	TEXT_DATA_TYPE_TEXT
#define ABOUT_TEXT6_FLAGS	(TEXT_DATA_FLAG_CENTER | TEXT_DATA_FLAG_COLOR2)
#define ABOUT_TEXT6_LEFT_EDGE	0
#define ABOUT_TEXT6_TOP_EDGE	70
#define ABOUT_TEXT6_TEXT	"           Phone 02261/27400"
#define ABOUT_TEXT6_TEXT_ATTR	&topaz80_attr

	/* Statics for about requester */

STATIC struct NewWindow  about_new_window = {
   0, 0, ABOUT_WINDOW_WIDTH, ABOUT_WINDOW_HEIGHT, 0, 1, ABOUT_WINDOW_IDCMP,
   WINDOWCLOSE | WINDOWDRAG | WINDOWDEPTH | SMART_REFRESH | NOCAREREFRESH |
   ACTIVATE, NULL, NULL, ABOUT_WINDOW_TITLE, NULL, NULL, 0, 0, 0, 0,
   WBENCHSCREEN
};
STATIC struct GadgetData  about_gadget_data[] = {
   {
	ABOUT_GADGET_TYPE,	/* gd_Type */
	ABOUT_GADGET_FLAGS,	/* gd_Flags */
	ABOUT_GADGET_LEFT_EDGE,	/* gd_LeftEdge */
	ABOUT_GADGET_TOP_EDGE,	/* gd_TopEdge */
	ABOUT_GADGET_WIDTH,	/* gd_Width */
	ABOUT_GADGET_HEIGHT,	/* gd_Height */
	ABOUT_GADGET_TEXT,	/* *gd_Text */
	ABOUT_GADGET_TEXT_ATTR,	/* *gd_TextAttr */
	{ 0, 0, 0 }
   }, {
	INTUISUP_DATA_END	/* mark end of gadget data */
   }
};
STATIC struct TextData  about_text_data[] = {
   {
	ABOUT_TEXT1_TYPE,	/* td_Type */
	ABOUT_TEXT1_FLAGS,	/* td_Flags */
	ABOUT_TEXT1_LEFT_EDGE,	/* td_LeftEdge */
	ABOUT_TEXT1_TOP_EDGE,	/* td_TopEdge */
	ABOUT_TEXT1_TEXT,	/* *td_Text */
	ABOUT_TEXT1_TEXT_ATTR	/* *td_TextAttr */
   }, {
	ABOUT_TEXT2_TYPE,	/* td_Type */
	ABOUT_TEXT2_FLAGS,	/* td_Flags */
	ABOUT_TEXT2_LEFT_EDGE,	/* td_LeftEdge */
	ABOUT_TEXT2_TOP_EDGE,	/* td_TopEdge */
	ABOUT_TEXT2_TEXT,	/* *td_Text */
	ABOUT_TEXT2_TEXT_ATTR	/* *td_TextAttr */
   }, {
	ABOUT_TEXT3_TYPE,	/* td_Type */
	ABOUT_TEXT3_FLAGS,	/* td_Flags */
	ABOUT_TEXT3_LEFT_EDGE,	/* td_LeftEdge */
	ABOUT_TEXT3_TOP_EDGE,	/* td_TopEdge */
	ABOUT_TEXT3_TEXT,	/* *td_Text */
	ABOUT_TEXT3_TEXT_ATTR	/* *td_TextAttr */
   }, {
	ABOUT_TEXT4_TYPE,	/* td_Type */
	ABOUT_TEXT4_FLAGS,	/* td_Flags */
	ABOUT_TEXT4_LEFT_EDGE,	/* td_LeftEdge */
	ABOUT_TEXT4_TOP_EDGE,	/* td_TopEdge */
	ABOUT_TEXT4_TEXT,	/* *td_Text */
	ABOUT_TEXT4_TEXT_ATTR	/* *td_TextAttr */
   }, {
	ABOUT_TEXT5_TYPE,	/* td_Type */
	ABOUT_TEXT5_FLAGS,	/* td_Flags */
	ABOUT_TEXT5_LEFT_EDGE,	/* td_LeftEdge */
	ABOUT_TEXT5_TOP_EDGE,	/* td_TopEdge */
	ABOUT_TEXT5_TEXT,	/* *td_Text */
	ABOUT_TEXT5_TEXT_ATTR	/* *td_TextAttr */
   }, {
	ABOUT_TEXT6_TYPE,	/* td_Type */
	ABOUT_TEXT6_FLAGS,	/* td_Flags */
	ABOUT_TEXT6_LEFT_EDGE,	/* td_LeftEdge */
	ABOUT_TEXT6_TOP_EDGE,	/* td_TopEdge */
	ABOUT_TEXT6_TEXT,	/* *td_Text */
	ABOUT_TEXT6_TEXT_ATTR	/* *td_TextAttr */
   }, {
	INTUISUP_DATA_END	/* mark end of text data array */
   }
};
	/* Defines for ok/cancel requester */

#define OK_CANCEL_WINDOW_IDCMP		(CLOSEWINDOW | GADGET_IDCMP_FLAGS_BUTTON)
#define OK_CANCEL_RENDER_INFO_FLAGS	(RENDER_INFO_FLAG_INNER_WINDOW | RENDER_INFO_FLAG_BACK_FILL)
#define OK_CANCEL_INIT_NEW_WINDOW_FLAGS	0

#define OK_GADGET_TYPE			GADGET_DATA_TYPE_BUTTON
#define OK_GADGET_FLAGS			GADGET_DATA_FLAG_HOT_KEY
#define OK_GADGET_TEXT			"_Ok"
#define OK_GADGET_LEFT_EDGE		0
#define OK_GADGET_TOP_EDGE		0
#define OK_GADGET_WIDTH			((6 + 2) * 8)
#define OK_GADGET_HEIGHT		15
#define OK_GADGET_TEXT_ATTR		&topaz80_attr

#define CANCEL_GADGET_TYPE		GADGET_DATA_TYPE_BUTTON
#define CANCEL_GADGET_FLAGS		GADGET_DATA_FLAG_HOT_KEY
#define CANCEL_GADGET_TEXT		"_Cancel"
#define CANCEL_GADGET_LEFT_EDGE		0
#define CANCEL_GADGET_TOP_EDGE		0
#define CANCEL_GADGET_WIDTH		((6 + 2) * 8)
#define CANCEL_GADGET_HEIGHT		15
#define CANCEL_GADGET_TEXT_ATTR		&topaz80_attr

	/* Statics for ok/cancel requester */

STATIC struct NewWindow  ok_cancel_new_window = {
   0, 0, 0, 0, 0, 1, OK_CANCEL_WINDOW_IDCMP, WINDOWCLOSE | WINDOWDRAG |
   WINDOWDEPTH | SMART_REFRESH | NOCAREREFRESH | ACTIVATE, NULL, NULL, NULL,
   NULL, NULL, 0, 0, 0, 0, WBENCHSCREEN
};

STATIC struct GadgetData  ok_cancel_gadget_data[] = {
   {
	OK_GADGET_TYPE,			/* gd_Type */
	OK_GADGET_FLAGS,		/* gd_Flags */
	OK_GADGET_LEFT_EDGE,		/* gd_LeftEdge */
	OK_GADGET_TOP_EDGE,		/* gd_TopEdge */
	OK_GADGET_WIDTH,		/* gd_Width */
	OK_GADGET_HEIGHT,		/* gd_Height */
	OK_GADGET_TEXT,			/* *gd_Text */
	OK_GADGET_TEXT_ATTR,		/* *gd_TextAttr */
	{ 0, 0, 0 }
   }, {
	CANCEL_GADGET_TYPE,		/* gd_Type */
	CANCEL_GADGET_FLAGS,		/* gd_Flags */
	CANCEL_GADGET_LEFT_EDGE,	/* gd_LeftEdge */
	CANCEL_GADGET_TOP_EDGE,		/* gd_TopEdge */
	CANCEL_GADGET_WIDTH,		/* gd_Width */
	CANCEL_GADGET_HEIGHT,		/* gd_Height */
	CANCEL_GADGET_TEXT,		/* *gd_Text */
	CANCEL_GADGET_TEXT_ATTR,	/* *gd_TextAttr */
	{ 0, 0, 0 }
   }, {
	INTUISUP_DATA_END		/* mark end of gadget data */
   }
};
	/* Show error message as continue requester */

   VOID
show_error(SHORT status)
{
   BYTE *error;

   if (status < EDITOR_STATUS_NORMAL) {
      error = error_text[-(status + 1)];
      if (IntuiSupBase) {
	 continue_requester(ERROR_WINDOW_TITLE, error);
      } else {
	 if (IntuitionBase) {
	    intuition_error_requester(error);
	 }
      }
   }
}
	/* Show IntuiSup continue requester */

   VOID
continue_requester(BYTE *title, BYTE *text)
{
   struct NewWindow     *nwin = &continue_new_window;
   struct Window        *win;
   struct TextAttr      *ta = &topaz80_attr;
   struct MsgPort       *up;
   struct IntuiMessage  *msg;
   APTR   ri, gl;
   USHORT width, height;
   BOOL   keepon = TRUE;

   nwin->Title  = (UBYTE *)title;
   if (ri = IGetRenderInfo((struct Screen *)NULL, CONTINUE_RENDER_INFO_FLAGS)) {
      width = IPrintText(ri, (struct Window *)NULL, text, 0, 0,
			  TEXT_DATA_TYPE_TEXT, TEXT_DATA_FLAG_NO_PRINT, ta);
      if (width < CONTINUE_GADGET_WIDTH) {
	 width = CONTINUE_GADGET_WIDTH;
      }
      width += 40;
      height = ta->ta_YSize + CONTINUE_GADGET_HEIGHT + 30;

      /* Prepare error window */
      nwin->Width  = width;
      nwin->Height = height;
      if (win = IOpenWindow(ri, nwin, CONTINUE_OPEN_WINDOW_FLAGS)) {
	 IPrintText(ri, win, text, 0, 10, TEXT_DATA_TYPE_TEXT,
			 TEXT_DATA_FLAG_CENTER | TEXT_DATA_FLAG_COLOR2, ta);
	 continue_gadget_data[0].gd_LeftEdge = (width -
						 CONTINUE_GADGET_WIDTH) / 2;
	 continue_gadget_data[0].gd_TopEdge  = height -
					      (CONTINUE_GADGET_HEIGHT + 10);
	 if (gl = ICreateGadgets(ri, &continue_gadget_data[0], 0, 0)) {
	    IDisplayGadgets(win, gl);

	    /* Wait for close gadget or button pressed */
	    up = win->UserPort;
	    do {
	       WaitPort(up);
	       while (msg = IGetMsg(up)) {
		  switch (msg->Class) {
		     case CLOSEWINDOW :
		     case ISUP_ID :
			keepon = FALSE;
			break;
		  }
	       }
	    } while (keepon == TRUE);
	    IRemoveGadgets(gl);
	    IFreeGadgets(gl);
	 }
	 CloseWindow(win);
      }
      IFreeRenderInfo(ri);
   }
}
	/* Show Intuition error requester */

   STATIC VOID
intuition_error_requester(BYTE *text)
{
   struct Screen     screen;
   struct IntuiText  itext_error, itext_ok;
   USHORT border_left, border_top, width, height, max_width;

   /* Get screen dimension */
   GetScreenData((BYTE *)&screen, (LONG)sizeof(struct Screen), (LONG)
						  WBENCHSCREEN,	(LONG)NULL);
   border_left = screen.BarHeight - screen.BarVBorder + screen.WBorTop;
   border_top  = screen.WBorTop;

   /* Init message text */
   itext_error.LeftEdge  = border_left;
   itext_error.TopEdge   = border_top + 4;
   itext_error.DrawMode  = JAM1;
   itext_error.FrontPen  = 2;
   itext_error.IText     = (UBYTE *)text;
   itext_error.ITextFont = &topaz80_attr;
   max_width             = IntuiTextLength(&itext_error);

   /* Init ok text */
   itext_ok.LeftEdge  = 6;
   itext_ok.TopEdge   = 4;
   itext_ok.DrawMode  = JAM1;
   itext_ok.FrontPen  = 3;
   itext_ok.ITextFont = &topaz60_attr;
   itext_ok.IText     = (UBYTE *)"Ok";
   if ((width = IntuiTextLength(&itext_ok) + 2 * 16) * 2 > max_width) {
      max_width = width;
   }

   /* Calc requester dimension and scale it if neccessary */
   width = max_width + border_left + screen.WBorRight + 2 * 16;
   if (width > screen.Width) {
      width = screen.Width;
   }
   height = border_top + screen.WBorBottom + 8 + 10 + 9 + 2 * 8 + 2 * 4;
   if (height > screen.Height) {
      height = screen.Height;
   }
   AutoRequest((LONG)NULL, &itext_error, &itext_ok, &itext_ok, 0L, 0L,
						 (LONG)width, (LONG)height);
}
	/* Show about requester */

   VOID
about_requester(VOID)
{
   struct NewWindow     *nwin = &about_new_window;
   struct Window        *win;
   struct MsgPort       *up;
   struct IntuiMessage  *msg;
   APTR ri, gl;
   BOOL keepon = TRUE;

   if (ri = IGetRenderInfo((struct Screen *)NULL, ABOUT_RENDER_INFO_FLAGS)) {
      nwin->Width  = ABOUT_WINDOW_WIDTH;
      nwin->Height = ABOUT_WINDOW_HEIGHT;
      if (win = IOpenWindow(ri, nwin, ABOUT_OPEN_WINDOW_FLAGS)) {
	 IDisplayTexts(ri, win, &about_text_data[0], 0, 0);
	 if (gl = ICreateGadgets(ri, &about_gadget_data[0], 0, 0)) {
	    IDisplayGadgets(win, gl);

	    /* Wait for close gadget or button pressed */
	    up = win->UserPort;
	    do {
	       WaitPort(up);
	       while (msg = IGetMsg(up)) {
		  switch (msg->Class) {
		     case CLOSEWINDOW :
		     case ISUP_ID :
			keepon = FALSE;
			break;
		  }
	       }
	    } while (keepon == TRUE);
	    IRemoveGadgets(gl);
	    IFreeGadgets(gl);
	 }
	 CloseWindow(win);
      }
      IFreeRenderInfo(ri);
   }
}
	/* Show IntuiSup ok/cancel requester */

   BOOL
ok_cancel_requester(BYTE *title, BYTE *text)
{
   struct NewWindow     *nwin = &ok_cancel_new_window;
   struct Window        *win;
   struct TextAttr      *ta = &topaz80_attr;
   struct MsgPort       *up;
   struct IntuiMessage  *msg;
   APTR   ri, gl;
   USHORT width, height;
   BOOL   result = FALSE, keepon = TRUE;

   nwin->Title  = (UBYTE *)title;
   if (ri = IGetRenderInfo((struct Screen *)NULL,
					     OK_CANCEL_RENDER_INFO_FLAGS)) {
      width = IPrintText(ri, (struct Window *)NULL, text, 0, 0,
			  TEXT_DATA_TYPE_TEXT, TEXT_DATA_FLAG_NO_PRINT, ta);
      if (width < (OK_GADGET_WIDTH + 20 + CANCEL_GADGET_WIDTH)) {
	 width = OK_GADGET_WIDTH + 20 + CANCEL_GADGET_WIDTH;
      }
      width += 40;
      height = ta->ta_YSize + OK_GADGET_HEIGHT + 30;

      /* Prepare error window */
      nwin->Width  = width;
      nwin->Height = height;
      if (win = IOpenWindow(ri, nwin, CONTINUE_OPEN_WINDOW_FLAGS)) {
	 IPrintText(ri, win, text, 0, 10, TEXT_DATA_TYPE_TEXT,
			 TEXT_DATA_FLAG_CENTER | TEXT_DATA_FLAG_COLOR2, ta);
	 ok_cancel_gadget_data[0].gd_LeftEdge = 20;
	 ok_cancel_gadget_data[0].gd_TopEdge  = height - (OK_GADGET_HEIGHT +
									10);
	 ok_cancel_gadget_data[1].gd_LeftEdge = width -
						 (CANCEL_GADGET_WIDTH +	20);
	 ok_cancel_gadget_data[1].gd_TopEdge  = height -
						(CANCEL_GADGET_HEIGHT + 10);
	 if (gl = ICreateGadgets(ri, &ok_cancel_gadget_data[0], 0, 0)) {
	    IDisplayGadgets(win, gl);

	    /* Wait for close gadget or button pressed */
	    up = win->UserPort;
	    do {
	       WaitPort(up);
	       while (msg = IGetMsg(up)) {
		  switch (msg->Class) {
		     case CLOSEWINDOW :
		     case ISUP_ID :
			if (!msg->Code) {
			   result = TRUE;   /* Ok */
			}
			keepon = FALSE;
			break;
		  }
	       }
	    } while (keepon == TRUE);
	    IRemoveGadgets(gl);
	    IFreeGadgets(gl);
	 }
	 CloseWindow(win);
      }
      IFreeRenderInfo(ri);
   }
   return(result);
}
