/*
***************************************************************************
*
* Datei:
*    RSysTextFormatter.c
*
* Inhalt:
*    int RSysFormatOutput(char *format);
*
* Bemerkungen:
*    Formatierung der Ausgabelisten von RSys.
*
* Erstellungsdatum:
*    07-Jul-93    Rolf Böhme
*
* Änderungen:
*    07-Jul-93    Rolf Böhme    Erstellung
*
***************************************************************************
*/

#include "RSysDebug.h"
#include "RSysFunc.h"

enum
{
   GD_PrefixSGad,
   GD_PostFixSGad,
   GD_BlankLeftCGad,
   GD_QuoteCGad,
   GD_NoHeaderCGad,
   GD_TextTGad,
   GD_UseGad,
   GD_NoFormatGad
};

#define Formatter_CNT 8

struct _fmt {
   int   f_blanks,
         f_quote;
   int   f_noheader;
   int   f_noformat;
   char  f_prefix[100],
         f_postfix[100];
   char  f_format[MAXWRITESIZE];
} TFormat, TFormatDef = {
   FALSE, FALSE, FALSE, TRUE,"","","%s"
};

static struct Window *FormatterWnd = NULL;
static struct Gadget *FormatterGList = NULL;
static struct IntuiMessage FormatterMsg;
static struct Gadget *FormatterGadgets[Formatter_CNT];
static UWORD FormatterLeft = 47;
static UWORD FormatterTop = 52;
static UWORD FormatterWidth = 610;
static UWORD FormatterHeight = 74;
static UBYTE *FormatterWdt = (UBYTE *) NAME " " VERSION " - Output Formatter";

static UWORD FormatterGTypes[]=
{
   STRING_KIND,
   STRING_KIND,
   CHECKBOX_KIND,
   CHECKBOX_KIND,
   CHECKBOX_KIND,
   TEXT_KIND,
   BUTTON_KIND,
   BUTTON_KIND
};

int PrefixSGadClicked( void );
int PostFixSGadClicked( void );
int BlankLeftCGadClicked( void );
int QuoteCGadClicked( void );
int NoHeaderCGadClicked( void );
int UseGadClicked( void );
int NoFormatGadClicked( void );

static struct NewGadget FormatterNGad[]=
{
	14, 17, 211, 13, (UBYTE *)"Prefix", NULL, GD_PrefixSGad, PLACETEXT_ABOVE, NULL, (APTR)PrefixSGadClicked,
	384, 17, 211, 13, (UBYTE *)"Postfix", NULL, GD_PostFixSGad, PLACETEXT_ABOVE, NULL, (APTR)PostFixSGadClicked,
	14, 33, 26, 11, (UBYTE *)"Blanks between texts", NULL, GD_BlankLeftCGad, PLACETEXT_RIGHT, NULL, (APTR)BlankLeftCGadClicked,
	234, 33, 26, 11, (UBYTE *)"Quote-in text", NULL, GD_QuoteCGad, PLACETEXT_RIGHT, NULL, (APTR)QuoteCGadClicked,
	419, 33, 26, 11, (UBYTE *)"No header in file", NULL, GD_NoHeaderCGad, PLACETEXT_RIGHT, NULL, (APTR)NoHeaderCGadClicked,
	233, 17, 143, 13, (UBYTE *)"Text to save", NULL, GD_TextTGad, PLACETEXT_ABOVE, NULL, NULL,
	119, 53, 147, 13, (UBYTE *)"Use Format", NULL, GD_UseGad, PLACETEXT_IN, NULL, (APTR)UseGadClicked,
	343, 53, 147, 13, (UBYTE *)"No Format", NULL, GD_NoFormatGad, PLACETEXT_IN, NULL, (APTR)NoFormatGadClicked
};

static ULONG *FormatterGTags[]=
{
   (ULONG *) (GTST_MaxChars), (ULONG *) 100, (ULONG *) (TAG_DONE),
   (ULONG *) (GTST_MaxChars), (ULONG *) 100, (ULONG *) (TAG_DONE),
   (ULONG *) (TAG_DONE),
   (ULONG *) (TAG_DONE),
   (ULONG *) (TAG_DONE),
   (ULONG *) (GTTX_Text), (ULONG *) "This is text", (ULONG *) (GTTX_Border), (ULONG *) TRUE, (ULONG *) (TAG_DONE),
   (ULONG *) (TAG_DONE),
   (ULONG *) (TAG_DONE)
};

static int
UseGadClicked(void)
{
   TFormat.f_noformat = FALSE;

   strncpy(TFormat.f_prefix,gadgetbuff(FormatterGadgets[GD_PrefixSGad]),100);
   strncpy(TFormat.f_postfix,gadgetbuff(FormatterGadgets[GD_PostFixSGad]),100);

   sprintf(TFormat.f_format,"%s%s%s%s%s%s%s",
           TFormat.f_prefix,
           TFormat.f_blanks ? " " : "",
           TFormat.f_quote  ? "\"" : "",
           "\%s",
           TFormat.f_quote  ? "\"" : "",
           TFormat.f_blanks ? " " : "",
           TFormat.f_postfix
           );

   return(FALSE);
}

static void
preview(void)
{
   char text[MAXWRITESIZE];

   DPOS;

   sprintf(text,"%s%s%s%s%s",
           TFormat.f_blanks ? " " : "",
           TFormat.f_quote  ? "\"" : "",
           "This is text",
           TFormat.f_quote  ? "\"" : "",
           TFormat.f_blanks ? " " : ""
           );

   GT_SetGadgetAttrs(FormatterGadgets[GD_TextTGad], FormatterWnd,
                     NULL,
                     GTTX_Text, text,
                     TAG_DONE);

   (void)UseGadClicked();

   return;
}

static int
PrefixSGadClicked(void)
{
   DPOS;

   strncpy(TFormat.f_prefix,gadgetbuff(FormatterGadgets[GD_PrefixSGad]),100);

   preview();

   return TRUE;
}

static int
PostFixSGadClicked(void)
{
   DPOS;

   strncpy(TFormat.f_postfix,gadgetbuff(FormatterGadgets[GD_PostFixSGad]),100);

   preview();

   return TRUE;
}

static int
BlankLeftCGadClicked(void)
{
   DPOS;

   TFormat.f_blanks = (TFormat.f_blanks ? FALSE : TRUE);

   preview();

   return TRUE;
}

static int
QuoteCGadClicked(void)
{
   DPOS;

   TFormat.f_quote = (TFormat.f_quote ? FALSE : TRUE);

   preview();

   return TRUE;
}

static int
NoHeaderCGadClicked(void)
{
   DPOS;

   TFormat.f_noheader = (TFormat.f_noheader ? FALSE : TRUE);

   return TRUE;
}

static int
NoFormatGadClicked(void)
{
   DPOS;

   TFormat.f_noformat = TRUE;
   TFormat.f_noheader = FALSE;

   return FALSE;
}

static int
OpenFormatterWindow(void)
{
   struct NewGadget ng;
   struct Gadget *g;
   UWORD lc,
         tc;
   UWORD wleft = FormatterLeft,
         wtop = FormatterTop,
         ww,
         wh;
   int gl[] = { GD_PrefixSGad, GD_PostFixSGad, GD_TextTGad };

   DPOS;
   ComputeFont(Scr, FormatterWidth, FormatterHeight);

   ww = ComputeX(FormatterWidth);
   wh = ComputeY(FormatterHeight);

   if ((wleft + ww + OffX + Scr->WBorRight) > Scr->Width)
      wleft = Scr->Width - ww;
   if ((wtop + wh + OffY + Scr->WBorBottom) > Scr->Height)
      wtop = Scr->Height - wh;

   ww = compute((UWORD) (OffX + Scr->WBorRight), FontX, (int)FormatterWidth);
   wh = compute((UWORD) (OffY + Scr->WBorBottom), FontY, (int)FormatterHeight);

   CenterWindow(Scr, &wtop, &wleft, ww, wh);

   if (!(g = CreateContext(&FormatterGList)))
      return (1L);

   for (lc = 0, tc = 0; lc < Formatter_CNT; lc++)
   {
      CopyMem((char *)&FormatterNGad[lc], (char *)&ng, (long)sizeof(struct NewGadget));

      ng.ng_VisualInfo = VisualInfo;
      ng.ng_TextAttr = Font;
      ng.ng_LeftEdge = OffX + ComputeX(ng.ng_LeftEdge);
      ng.ng_TopEdge = OffY + ComputeY(ng.ng_TopEdge);
      ng.ng_Width = ComputeX(ng.ng_Width);
      ng.ng_Height = ComputeY(ng.ng_Height);

      FormatterGadgets[lc] = g = CreateGadgetA((ULONG) FormatterGTypes[lc], g, &ng, (struct TagItem *) & FormatterGTags[tc]);

      makelabelvisible(FormatterGadgets[lc]);

      while (FormatterGTags[tc])
         tc += 2;
      tc++;

      if (NOT g)
         return (2L);
   }

   if (!(FormatterWnd = OpenWindowTags(NULL,
                                       WA_Left, wleft,
                                       WA_Top, wtop,
                                       WA_Width, ww,
                                       WA_Height, wh,
                                       WA_IDCMP, STRINGIDCMP | CHECKBOXIDCMP |
                                       TEXTIDCMP | BUTTONIDCMP | IDCMP_CLOSEWINDOW |
                                       IDCMP_REFRESHWINDOW | IDCMP_VANILLAKEY,
                                       WA_Flags, WFLG_DRAGBAR | WFLG_DEPTHGADGET |
                                       WFLG_CLOSEGADGET | WFLG_SMART_REFRESH |
                                       WFLG_ACTIVATE | WFLG_RMBTRAP,
                                       WA_Gadgets, FormatterGList,
                                       WA_Title, FormatterWdt,
                                       WA_PubScreenFallBack,TRUE,
                                       WA_PubScreen, Scr,
                                       TAG_DONE)))
      return (4L);

   RefreshRastPort(FormatterWnd,FormatterGadgets,gl, 3);

   if(Flags.autofront)
   {
      WindowToFront(FormatterWnd);
      ActivateWindow(FormatterWnd);
   }

   return (0L);
}

static int
HandleFormatterIDCMP(void)
{
   struct IntuiMessage *m;
   int   (*func) (void);
   BOOL  running = TRUE;

   DPOS;
   while (m = GT_GetIMsg(FormatterWnd->UserPort))
   {
      CopyMem((char *)m, (char *)&FormatterMsg, (long)sizeof(struct IntuiMessage));

      GT_ReplyIMsg(m);

      switch (FormatterMsg.Class)
      {
         case IDCMP_REFRESHWINDOW:
            GT_BeginRefresh(FormatterWnd);
            GT_EndRefresh(FormatterWnd, TRUE);
            break;

         case IDCMP_VANILLAKEY:
            if ((char)FormatterMsg.Code == ESC)
               running = FALSE;
            break;

         case IDCMP_CLOSEWINDOW:
            running = NoFormatGadClicked();
            break;

         case IDCMP_GADGETUP:
            func = (void *)((struct Gadget *) FormatterMsg.IAddress)->UserData;
            running = func();
            break;
      }
   }
   DPOS;
   return (running);
}

int
RSysFormatOutput(char *format)
{
   APTR req;

   DPOS;
   CopyMem(&TFormatDef, &TFormat, sizeof(struct _fmt));

   if (OpenASysWindow(OpenFormatterWindow, NO_KILL))
   {
      PrintInfo("Format output strings", SPEAK, 0);

      if (SysWnd)
         req = LockWindow(SysWnd);

      while(HandleFormatterIDCMP()) ;

      CloseASysWindow(&FormatterWnd, &FormatterGList, NULL);

      if(TFormat.f_noformat == FALSE)
         strcpy(format,TFormat.f_format);
      else
         strcpy(format,"%s");

      if (SysWnd)
      {
         UnlockWindow(req);
         RefreshMainWindowPattern();
         RefreshList(LastID);
      }
   }

   return TFormat.f_noheader;
}
