/*
 * Dialogs -- verschiedene Dialog-"Requester" für Userinput
 *
 * INPUTS
 *  noch in Arbeit, besser wäre was Flexibles
    mehr BOOPSI , weniger Gadtools-Gadgets.
 *
 *
 * RESULT
 *  wird in STRPTRs geschrieben, heikel wg. Speicher usw.
 *
 */

/*
   todo:
   umwandeln der GADTOOLS_ Programmierung in ein BOOPSI GUI
 */


/* GadgetID's: */

#define GAD_TO          44
#define GAD_TOA         45
#define GAD_SUBJ        46

#define GAD_SCHREIBEN   66

#define MAXCHARS        128	/* maximale Zeichen im S-Gadget, todo */

#define NOSELECT ~0
#define BUTTONPRESSED   (NOSELECT - 1)

/*
Dialog
ist der Standarddialog, es geht darum vom User Werte abzufragen,
die nicht mit einfachen Buttonklicks oder Menupunkten eingegeben
werden können:

- Strings     Namen Mailadressen Gruppennamen
- Zahlen
- Listen

Mit dem Parameter type wird die Art des Dialogs gesteuert.
Implementation: in  einem switch/case Konstrukt werden
unterschiedliche Layouts je nach type gezeichnet.

IDCMP-Loop wie gehabt.

Auswertung der Eingaben.
- Auslesen der Stringgadets von Kopieren der Strings
  an einen Platz, der OK ist: ein buffer (kludge).
  Dann Pointer auf buffer setzen.

  Das alles ist sehr wackelig. Hier sind bestimmt noch Fehler.
  Besonders bei den Pointern (mein Spezialgebiet) und bei
  Speicher.

Rücksprung in die aufrufende Routine.
*/



int
Dialog (STRPTR to, STRPTR toa, STRPTR subj, int type)
{
  int result = NOSELECT;
  struct IntuiMessage *imsg;

  struct TextAttr *texatt;
  struct Screen *mysc;
  struct NewGadget ng;
  struct Gadget *glist, *gad, *toGad;
  struct Window *win;
  void *vi;

  ULONG imsgClass;
  UWORD imsgCode;
  UWORD topborder, leftborder, rightborder, bottomborder;
  UWORD left, top, height, width;

  BOOL going = TRUE;
  BOOL terminated = FALSE;



  mysc = LockPubScreen (NULL);
  if (mysc)
    {
      texatt = mysc->Font;
      vi = GetVisualInfo (mysc, TAG_DONE);
      if (vi)
	{
	  /* Default-Windowposition */

	  width = (mysc->Width) - 200;
	  height = (mysc->Height) / 3;
	  left = width / 2;
	  top = height / 2;

	  win = OpenWindowTags (NULL,
				WA_Width, width,
				WA_InnerHeight, height,
				WA_Left, left,
				WA_Top, top,

				WA_Flags, WFLG_DEPTHGADGET |
				WFLG_DRAGBAR |
				WFLG_CLOSEGADGET |
				WFLG_SIZEGADGET |
				WFLG_SIZEBBOTTOM |
				WFLG_SIZEBRIGHT,
				WA_Activate, TRUE,
				WA_SmartRefresh, TRUE,
				WA_IDCMP, CLOSEWINDOW |
				REFRESHWINDOW |
				LISTVIEWIDCMP |
				BUTTONIDCMP |
				IDCMP_NEWSIZE,
				WA_MinWidth, 200,
				WA_MinHeight, 80,
				WA_Title, msgtypeaction[type],
				TAG_DONE);

	  if (win)
	    {
	      /* weil Window offen ist & Screen sperrt, Sperre (lock) weg: */
	      UnlockPubScreen (NULL, mysc);

	      do
		{
		  /* todo: Refresh! */
		  terminated = FALSE;	/* initialisieren */
		  glist = NULL;
		  toGad = NULL;
		  gad = NULL;

		  /* Größe des Fensters ermitteln, todo: Prefs */
		  left = win->LeftEdge;
		  top = win->TopEdge;
		  width = win->Width;
		  height = win->Height;

		  /* Rahmen berechnen */
		  topborder = mysc->WBorTop + (mysc->Font->ta_YSize + 1);
		  leftborder = mysc->WBorLeft + 2;
		  rightborder = mysc->WBorRight + 2;
		  bottomborder = mysc->WBorBottom + 2;

		  /* Gadget-Größen bestimmen */
		  gad = CreateContext (&glist);

		  /* Meine Stringgadgets erzeugen */
		  ng.ng_GadgetText = "An:";
		  ng.ng_LeftEdge = leftborder + 60;
		  ng.ng_TopEdge = topborder;
		  ng.ng_Width = width - rightborder - leftborder - 16 - ng.ng_LeftEdge;		/* todo */
		  ng.ng_Height = win->RPort->TxHeight + 6;
		  ng.ng_TextAttr = texatt;
		  ng.ng_VisualInfo = vi;
		  ng.ng_GadgetID = GAD_TO;
		  ng.ng_Flags = 0;

		  toGad = gad = CreateGadget (STRING_KIND, gad, &ng,
					      GTST_String, to,
					      GTST_MaxChars, MAXCHARS,
					      TAG_DONE);

		  if ((type == POSTING) || (type == FOLLOWUP))
		    {
		      ng.ng_GadgetText = "Gruppe:";
		    }
		  else
		    {
		      ng.ng_GadgetText = "Adresse:";
		    }

		  ng.ng_TopEdge = ng.ng_TopEdge + ng.ng_Height + 5;
		  ng.ng_GadgetID = GAD_TOA;
		  ng.ng_Flags = 0;

		  gad = CreateGadget (STRING_KIND, gad, &ng,
				      GTST_String, toa,
				      GTST_MaxChars, MAXCHARS,
				      TAG_DONE);

		  ng.ng_TopEdge = ng.ng_TopEdge + ng.ng_Height + 5;
		  ng.ng_GadgetText = "Thema: ";
		  ng.ng_GadgetID = GAD_SUBJ;
		  ng.ng_Flags = 0;

		  gad = CreateGadget (STRING_KIND, gad, &ng,
				      GTST_String, subj,
				      GTST_MaxChars, MAXCHARS,
				      TAG_DONE);

		  ng.ng_LeftEdge = leftborder;
		  ng.ng_TopEdge = ng.ng_TopEdge + ng.ng_Height + 5;
		  ng.ng_GadgetText = " Schreiben ";
		  ng.ng_Width = TextLength (win->RPort, ng.ng_GadgetText, strlen (ng.ng_GadgetText));
		  ng.ng_GadgetID = GAD_SCHREIBEN;
		  ng.ng_Flags = 0;

		  gad = CreateGadget (BUTTON_KIND, gad, &ng, TAG_DONE);

		  if (gad)
		    {

		      /* Gadgets dem Fenster hinzufügen ... */
		      AddGList (win, glist, -1, -1, NULL);
		      RefreshGList (glist, win, NULL, -1);
		      GT_RefreshWindow (win, NULL);	/* ... und darstellen */

		      /* Window-Schleife */
		      while (!terminated)
			{
			  /* auf IDCMP-Message warten */
			  Wait (1 << win->UserPort->mp_SigBit);
			  while (!terminated)
			    {
			      if (imsg = GT_GetIMsg (win->UserPort))
				{
				  imsgClass = imsg->Class;
				  imsgCode = imsg->Code;

				  gad = (struct Gadget *) imsg->IAddress;
				  GT_ReplyIMsg (imsg);	/* und Message wieder freigeben */

				  switch (imsgClass)
				    {
				    case GADGETUP:
				      {
					/* welches GADTOOLS-Gadget? */
					switch (gad->GadgetID)
					  {
					  case GAD_SCHREIBEN:
					    terminated = TRUE;
					    result = BUTTONPRESSED;
					    break;

					  case GAD_TO:
					    sprintf (to, "%s", ((struct StringInfo *) gad->SpecialInfo)->Buffer);
					    break;

					  case GAD_TOA:
					    sprintf (toa, "%s", ((struct StringInfo *) gad->SpecialInfo)->Buffer);
					    break;

					  case GAD_SUBJ:
					    sprintf (subj, "%s", ((struct StringInfo *) gad->SpecialInfo)->Buffer);
					    break;
					  }

					if (terminated)
					  {
					    going = FALSE;	/* kein Refresh zeichnen */
					  }
					break;
				      }		/* case GADGETUP */

				    case CLOSEWINDOW:
				      /* CANCEL -- Verlasse das Fenster ohne Berücksichtigung der Stringgadget-Inhalte */
				      result = NOSELECT;
				      terminated = TRUE;
				      going = FALSE;	/* keine neuen Gadgets */
				      strcpy (to, "");
				      strcpy (toa, "");
				      strcpy (subj, "");
				      RemoveGList (win, glist, -1);
				      break;

				    case REFRESHWINDOW:
				      GT_BeginRefresh (win);
				      GT_EndRefresh (win, TRUE);
				      break;

				    case IDCMP_NEWSIZE:	/* todo: Refresh! */
				      terminated = TRUE;
				      going = TRUE;
				      RemoveGList (win, glist, -1);
				      SetAPen (win->RPort, 0L);
				      RectFill (win->RPort, win->BorderLeft, win->BorderTop, win->Width - win->BorderRight - 1, win->Height - win->BorderBottom - 1);
				      RefreshWindowFrame (win);
				      FreeGadgets (glist);
				      glist = NULL;
				      break;
				    }	/* switch */
				}
			    }
			}	/* while */


		    }
		  else
		    {
		      printf ("Fehler bei Gadget-Creation. \n");
		    }
		}		/* do */
	      while (going);	/* neuzeichnen, wenn Going = True */

	      CloseWindow (win);
	      win = NULL;
	      if (glist)
		FreeGadgets (glist);
	    }			/* if */
	  FreeVisualInfo (vi);
	}			/* getVisualInfo */
    }				/* LockPubScreen */

  if (result == NOSELECT)	/* todo, kludge */
    {
      printf ("User Cancel\n");
      result = NOSELECT;
    }				/* todo, kludge */

  printf ("Ergebnis Dialog: TO %s  TOA %s  SUBJ %s\n", to, toa, subj);
  return (result);
}

/*---------------------------------------------------*/

/* ShowReq -- Zeigt kurzen Infotext in einem Requester

Ist soweit gebrauchbar.
Die Routine ShowError, siehe unten, ruft ShowReq auf.
 */

/* return NULL = Abbruch, Cancel */

int
ShowReq (STRPTR title, STRPTR text, STRPTR gads)
{
  struct EasyStruct myES =
  {
    sizeof (struct EasyStruct),
    0,
    title ? title : NB_NAME " Meldung",		/* Default-Texte festlegen *//*todo: lokalisieren */
    text ? text : "Unterbrechung!",	/*todo: lokalisieren */
    gads ? gads : "Weiter",	/*todo: lokalisieren */
  };

  return (EasyRequest (0, &myES, NULL));

/* zu EasyRequest: */
/* 1. Paramaeter: Window -- hier NULL, da Requester auf Defaultscreen erscheinen soll */
/* 2. Parameter: &myES -- Zeiger auf oben definierte EasyStruct */
/* 3. Parameter: IDCMP-Flags (z.B. DISKINSERTED) -- hier NULL, da unnötig */
}

int
ShowError (STRPTR error)
{
  return (ShowReq (NB_NAME " Hinweis", error, NULL));
}
