/*
 * Help.c -- Online Hilfen
 */

/*
 * OpenAmigaGuide -- öffnet Fenster mit Guide-Hilfe
 * OpenDatatypeWindow -- öffnet Fenster mit Datatype
 * void OpenAbout -- öffnet Aboutfenster
 */

#define UMS_ROOT_PATH       "UMS:"
#define NB_APP_TYPE        "Reader"
#define NB_LANGUAGE        "deutsch"

#define NB_GUIDE_PATH      UMS_ROOT_PATH "Doc/" NB_LANGUAGE "/"
#define NB_GUIDE_SUFFIX    ".guide"	/* Standardtyp der Dokumentation */

#define NB_GUIDEFILE              NB_GUIDE_PATH NB_NAME NB_GUIDE_SUFFIX
#define NB_GUIDEFILE_FALLBACK     "PROGDIR:" NB_NAME NB_GUIDE_SUFFIX
#define NB_GUIDEFILE_FALLBACK2    "PROGDIR:/Doc/" NB_LANGUAGE "/" NB_NAME NB_GUIDE_SUFFIX


/*
 * OpenAmigaGuide (struct Window *hostwin) -- öffnet Fenster mit Guide-Datatype
 *
 * INPUTS
 *   hostwin -- ein Fenster des Hauptprogramms
 *
 * RESULT
 *   void (todo -- success melden)
 *
 * Quelle: Die Routine kommt vom GUICreator-Programm
 */

/*
   OpenAmigaGuide() gibt dem Anwender eine AmigaGUIDE-Onlinehilfe

   Beschreibung:
   - öffne Fenster mit Scrollbars,
   - erzeuge AmigaGuide-Datatype
   - lade das .guide File in den Datatype und
   - binde diese BOOPSI Gadgets (Datatype ist BOOPSI Gadget) untereinander , todo
   - binde Gadgets an das Fenster, OK

 */


void
OpenAmigaGuide (struct Window *hostwin)
{
  /* Feld möglicher Pade+Filenamen */
  static STRPTR names[] =
  {
    NB_GUIDEFILE,
    NB_GUIDEFILE_FALLBACK,
    NB_GUIDEFILE_FALLBACK2,
    NULL};

  OpenDatatypeWindow (hostwin, names);
}

/*
 * OpenAbout -- Aboutfenster
 */

void
OpenAbout (struct Window *hostwin)
{
  static STRPTR names[] =
  {
    "dh0:nb/Reader/NewsBreaker/experimental/Pic/nb.ilbm",
    NULL};

  OpenDatatypeWindow (hostwin, names);
}


void
OpenDatatypeWindow (struct Window *hostwin, STRPTR filenames[])
{
  struct IntuiMessage *imessage = NULL;
  struct Gadget *idcmpgad = NULL;
  struct TagItem *tag = NULL;
  struct TagItem *tstate = NULL;
  ULONG idcmpclass = 0;
  UWORD messagecode = 0;
  BOOL running = TRUE;

  struct Screen *customscreen = hostwin->WScreen;

  struct Gadget *prop_abObject, *up_abObject, *down_abObject;
  struct Image *up_abImage, *down_abImage;
  ULONG *connect_abObject;

  struct Window *win = NULL;

/* Prop-Gadget */

  static struct TagItem prop2aguide[] =
  {
    {PGA_Top, DTA_TopVert},
    {TAG_DONE}
  };

/* Amigaguide-Gadget: funkt nicht :-( */

  static struct TagItem aguide2prop[] =
  {
    {DTA_TopVert, PGA_Top},
    {DTA_VisibleVert, PGA_Visible},
    {DTA_TotalVert, PGA_Total},
    {TAG_DONE}
  };

  APTR visualinfo = GetVisualInfo (hostwin->WScreen, TAG_DONE);
  if (visualinfo)
    {
      ULONG i = 0;
      Object *o = NULL;

      while ((o == NULL) && (filenames[i] != NULL))
	{
	  o = NewDTObject (filenames[i++],
			   DTA_SourceType, DTST_FILE,
			   DTA_ControlPanel, TRUE,
			   TAG_DONE);
	}

      if (o)
	{
	  win = OpenWindowTags (NULL, WA_Activate, TRUE,
				WA_Flags, WFLG_DEPTHGADGET |
				WFLG_DRAGBAR |
				WFLG_CLOSEGADGET |
				WFLG_SIZEGADGET |
				WFLG_SIZEBBOTTOM |
				WFLG_SIZEBRIGHT,
	  //WA_InnerHeight, height,
	  //WA_InnerWidth, width,
				WA_MinHeight, 50,
				WA_MinWidth, 50,
				WA_MaxHeight, customscreen->Height,
				WA_MaxWidth, customscreen->Width,
				WA_IDCMP, IDCMP_CLOSEWINDOW |
				IDCMPUPDATE |
				IDCMP_VANILLAKEY |
				IDCMP_GADGETDOWN,
	  //WA_Left, left,
	  //WA_Top, top,
				WA_SmartRefresh, TRUE,
				WA_CustomScreen, customscreen,
				TAG_DONE);

	  if (win)
	    {

/* todo: BOOPSI Gadgets für Scrollbar. */
/* todo: Zur Zeit keine Bindung des Scrollbars an den Datatype */
/* todo: Notifiction. Also: Klick auf Scrollbar --> Datatype scrollt */
/* todo: Klick auf Guide-Link, neuer Text: --> Scrollbar(-Top) ändert sich usw. */

	      prop_abObject = NewObject (NULL, "propgclass",
					 GA_ID, 2,
					 GA_Top, win->BorderTop + 2,
				       GA_RelRight, -(win->BorderRight - 5),
					 GA_Width, win->BorderRight - 8,
	      GA_RelHeight, -(win->BorderTop + (3 * win->BorderBottom)) - 6,
					 GA_RightBorder, TRUE,
					 ICA_MAP, prop2aguide,
					 ICA_TARGET, NULL,
					 PGA_NewLook, TRUE,
					 PGA_Borderless, TRUE,
					 PGA_Visible, 50,
					 PGA_Total, 50,
					 TAG_DONE);

	      up_abImage = NewObject (NULL, "sysiclass",
				      SYSIA_DrawInfo, dri,
				      SYSIA_Which, UPIMAGE,
				      IA_Width, win->BorderRight,
				      IA_Height, win->BorderBottom,
				      TAG_DONE);

	      down_abImage = NewObject (NULL, "sysiclass",
					SYSIA_DrawInfo, dri,
					SYSIA_Which, DOWNIMAGE,
					IA_Width, win->BorderRight,
					IA_Height, win->BorderBottom,
					TAG_DONE);

	      up_abObject = NewObject (NULL, "buttongclass",
				 GA_RelBottom, -(3 * win->BorderBottom) - 1,
				       GA_RelRight, -(win->BorderRight - 1),
				       GA_Height, win->BorderBottom,
				       GA_Width, win->BorderRight,
				       GA_Image, up_abImage,
				       GA_RightBorder, TRUE,
				       GA_Previous, prop_abObject,
				       TAG_DONE);

	      down_abObject = NewObject (NULL, "buttongclass",
				     GA_RelBottom, -(2 * win->BorderBottom),
				       GA_RelRight, -(win->BorderRight - 1),
					 GA_Height, win->BorderBottom,
					 GA_Width, win->BorderRight,
					 GA_Image, down_abImage,
					 GA_RightBorder, TRUE,
					 GA_Previous, up_abObject,
					 TAG_DONE);

	      connect_abObject = NewObject (NULL, ICCLASS,
					    ICA_MAP, aguide2prop,
					    ICA_TARGET, prop_abObject,
					    TAG_DONE);

	      if (prop_abObject && up_abImage &&
		  down_abImage && up_abObject && down_abObject)
		{
		  SetDTAttrs (o, NULL, NULL,
			      GA_Left, win->BorderLeft + 2,
			      GA_Top, win->BorderTop + 2,
			      GA_RelWidth, - (win->BorderLeft+win->BorderRight),
			      GA_RelHeight,- (win->BorderTop+win->BorderBottom),
			      ICA_TARGET, ICTARGET_IDCMP,
			      TAG_DONE);
		  AddDTObject (win, NULL, o, -1L);

		  /* BOOPSI -- Datatype Bindung läuft nicht */
		  SetGadgetAttrsX (prop_abObject, win, NULL, ICA_TARGET, o, TAG_DONE);
		  //SetGadgetAttrsX (up_abObject, win, NULL, ICA_TARGET, o, TAG_DONE);
		  //SetGadgetAttrsX (down_abObject, win, NULL, ICA_TARGET, o, TAG_DONE);

		  AddGList (win, prop_abObject, -1, -1, NULL);
		  RefreshGList (prop_abObject, win, NULL, -1);
		}

	      while (running)
		{
		  Wait (1L << win->UserPort->mp_SigBit);

		  while (imessage = (struct IntuiMessage *) GetMsg ((struct MsgPort *) win->UserPort))
		    {
		      idcmpgad = (struct Gadget *) imessage->IAddress;
		      idcmpclass = imessage->Class;
		      messagecode = imessage->Code;

		      ReplyMsg ((struct Message *) imessage);

		      switch (idcmpclass)
			{
			  /* Ereignistabelle wäre besser als switch/case, todo */
			case IDCMP_VANILLAKEY:
			  if (messagecode == 27 || messagecode == 'o' || messagecode == 'O')
			    running = FALSE;
			  break;
			case IDCMP_REFRESHWINDOW:
			  BeginRefresh (win);
			  EndRefresh (win, TRUE);
			  break;
			case IDCMP_CLOSEWINDOW:
			  running = FALSE;
			  break;
			case IDCMP_IDCMPUPDATE:
			  tstate = (struct TagItem *) imessage->IAddress;
			  while (tag = NextTagItem (&tstate))
			    {
			      if (tag->ti_Tag == DTA_Sync)
				{
				  RefreshDTObjectA (o, win, NULL, NULL);
				}
			    }
			  break;
			}	/* switch */

		    }		/* while */
		}		/* while */

	      DisposeObject (down_abObject);
	      DisposeObject (up_abObject);
	      DisposeObject (down_abImage);
	      DisposeObject (up_abImage);
	      DisposeObject (prop_abObject);

	      CloseWindow (win);
	    }
	  else
	    {
	      ShowError ("AmigaGUIDE Fenster\n"
			 "konnte nicht geöffnet werden.");
	    }
	  DisposeDTObject (o);
	}
      else
	{
	  ShowError ("Datatype-Fenster\nnicht geöffnet. Ursachen:"
		     " ·  Dokument nicht gefunden  oder\n"
		     " ·  Zu wenig Speicher  oder\n"
		     " ·  Benötigter Datatype nicht vorhanden.");
	}
      FreeVisualInfo (visualinfo);
    }
}
