/*********************************************************************
*                                                                    *
*                           DVIPrintSetUp                            *
*                                                                    *
*                   Version 3.85 vom 24. Mai 1993                    *
*                   geschrieben von Stefan Scherer                   *
*                                                                    *
*                  Hilfefunktion für DVIPrintSetUp                   *
*                                                                    *
**********************************************************************
*                                                                    *
*         Hier sind zuerst alle Hilfetexte definiert und die         *
*        Unterprogramme für die Onlinehilfe.  Der grobe Ablauf       *
*      entspricht der Schleife im Hauptprogramm.  Es werden alle     *
*         Mausklicks und Tastenbetätigungen behandelt und der        *
*                   jeweilige Requester angezeigt.                   *
*                                                                    *
*   Das Hilfesystem wird mit "Cancel" oder der HELP-Taste beendet.   *
*                                                                    *
**********************************************************************
*                                                                    *
*  COPYRIGHT: Dieses Programm und der zugeh"orige Quellcode sind     *
*                                                                    *
*                       >>>  FREEWARE  <<<                           *
*                                                                    *
*  und damit (c) Copyright 1992, 1993, Stefan Scherer.               *
*  S"amtliche Urheberrechte bleiben beim Autor.                      *
*                                                                    *
*  Der Vertrieb des unveränderten Programmes, einschließlich der     *
*  vorhandenen Dokumentation und des unveränderten Quellcodes ist    *
*  zulässig, sofern dieser Urheberrechtsvermerk bei allen Kopien     *
*  erhalten bleibt.                                                  *
*                                                                    *
*  Der Vertrieb von veränderten Versionen dieses Programmes ist      *
*  zulässig, sofern bei allen hiervon abgeleiteten Werken ein mit    *
*  obigem Hinweis vergleichbarer beigefügt wird.                     *
*                                                                    *
*********************************************************************/

/* ------------------------------ Includes --------------------------------- */

#include <exec/types.h>
#include <libraries/gadtools.h>
#include <intuition/intuition.h>
#include <intuition/classes.h>
#include <intuition/imageclass.h>
#include <intuition/gadgetclass.h>
#include <dos/dostags.h>
#include <dos/dos.h>
#include <clib/dos_protos.h>
#include <clib/exec_protos.h>
#include <clib/intuition_protos.h>
#include <clib/gadtools_protos.h>
#include <clib/graphics_protos.h>
#include "DVIPrintSetUp_rev.h"			/* Versionsnummer */
#include "DVIPrintSetUp_gad.h"			/* GadTools Definitionen und Prototypes */

/* ----------------------------- Prototypes -------------------------------- */

void PrintHelp( struct IntuiText * );
void HandleHelpVanillaKey(struct Window *, struct Gadget *, UWORD);

/* ----------------------------- Hilfetexte -------------------------------- */

struct IntuiText IntroIText[] =
{
	1, 0, JAM1, 70,   3, &topaz8, SetupName, &IntroIText[1],
	1, 0, JAM1, 35,  13, &topaz8, "© 1992, 1993, Stefan Scherer", &IntroIText[2],
	1, 0, JAM1,  5,  30, &topaz8, "Dieses Programm soll den Umgang mit", &IntroIText[3],
	1, 0, JAM1,  5,  40, &topaz8, "DVIprint erleichtern. Es ist eine", &IntroIText[4],
	1, 0, JAM1,  5,  50, &topaz8, "Erweiterung des Passauer T X.", &IntroIText[5],
	1, 0, JAM1,  5+208,  53, &topaz8, "E", &IntroIText[6],
	1, 0, JAM1,  5,  70, &topaz8, "Für spezielle Hilfe entsprechendes", &IntroIText[7],
	1, 0, JAM1,  5,  80, &topaz8, "Gadget anklicken. Bei Gadgets mit", &IntroIText[8],
	1, 0, JAM1,  5,  90, &topaz8, "Eingabezeile danach HELP drücken.", &IntroIText[9],
	1, 0, JAM1, 40, 110, &topaz8, "Das Programm ist Freeware.", &IntroIText[10],
	1, 0, JAM1,  5, 129, &topaz8, "Hilfe beenden mit HELP oder", NULL };

struct IntuiText PrinterHelp[] =
{
	2, 0, JAM1,  5,   3, &topaz8, "Auswahl des Druckertyps.", &PrinterHelp[1],
	1, 0, JAM1,  5,  20, &topaz8, "Hiermit kann man die Einstellung", &PrinterHelp[2],
	1, 0, JAM1,  5,  30, &topaz8, "für den gewünschten Drucker vor-", &PrinterHelp[3],
	1, 0, JAM1,  5,  40, &topaz8, "nehmen. Es werden die internen", &PrinterHelp[4],
	1, 0, JAM1,  5,  50, &topaz8, "Druckertreiber von DVIprint", &PrinterHelp[5],
	1, 0, JAM1,  5,  60, &topaz8, "benutzt.", &PrinterHelp[6],
	1, 0, JAM1,  5,  75, &topaz8, "Falls kein geeigneter Drucker vor-", &PrinterHelp[7],
	1, 0, JAM1,  5,  85, &topaz8, "handen ist, kann man mit 'generic'", &PrinterHelp[8],
	1, 0, JAM1,  5,  95, &topaz8, "den aktuellen Workbench-Drucker", &PrinterHelp[9],
	1, 0, JAM1,  5, 105, &topaz8, "benutzen.", NULL };

struct IntuiText OffsetHelp[] =
{
	2, 0, JAM1,  5,   3, &topaz8, "Einstellung des Druckoffsets.", &OffsetHelp[1],
	1, 0, JAM1,  5,  20, &topaz8, "Mit den vier Gadgets kann man die", &OffsetHelp[2],
	1, 0, JAM1,  5,  30, &topaz8, "Druckposition für den Ausdruck", &OffsetHelp[3],
	1, 0, JAM1,  5,  40, &topaz8, "festlegen.", &OffsetHelp[4],
	1, 0, JAM1,  5,  55, &topaz8, "Dazu gibt man den horizontalen", &OffsetHelp[5],
	1, 0, JAM1,  5,  65, &topaz8, "und vertikalen Offset ein und", &OffsetHelp[6],
	1, 0, JAM1,  5,  75, &topaz8, "wählt zusätzlich die entsprechende", &OffsetHelp[7],
	1, 0, JAM1,  5,  85, &topaz8, "Maßeinheit aus.", NULL };

struct IntuiText PagesHelp[] =
{
	2, 0, JAM1,  5,   3, &topaz8, "Einstellung des Druckmodus.", &PagesHelp[1],
	1, 0, JAM1,  5,  20, &topaz8, "Mit diesem Cycle-Gadget kann man", &PagesHelp[2],
	1, 0, JAM1,  5,  30, &topaz8, "einstellen, ob man nur die geraden,", &PagesHelp[3],
	1, 0, JAM1,  5,  40, &topaz8, "nur die ungeraden oder alle Seiten", &PagesHelp[4],
	1, 0, JAM1,  5,  50, &topaz8, "drucken möchte.", &PagesHelp[5],
	1, 0, JAM1,  5,  65, &topaz8, "Diese Einstellung wirkt sich nur", &PagesHelp[6],
	1, 0, JAM1,  5,  75, &topaz8, "auf die durch 'From' und 'To'", &PagesHelp[7],
	1, 0, JAM1,  5,  85, &topaz8, "angegebenen Seitengrenzen aus.", NULL };

struct IntuiText FromHelp[] =
{
	2, 0, JAM1,  5,   3, &topaz8, "Drucke ab Seite", &FromHelp[1],
	1, 0, JAM1,  5,  20, &topaz8, "In diesem Gadget kann man angeben,", &FromHelp[2],
	1, 0, JAM1,  5,  30, &topaz8, "ab welcher Seite man den Ausdruck", &FromHelp[3],
	1, 0, JAM1,  5,  40, &topaz8, "beginnen möchte.", &FromHelp[4],
	1, 0, JAM1,  5,  55, &topaz8, "Wird keine Zahl eingegeben, d.h.", &FromHelp[5],
	1, 0, JAM1,  5,  65, &topaz8, "die voreingestellte Zahl gelöscht,", &FromHelp[6],
	1, 0, JAM1,  5,  75, &topaz8, "so wird ab der ersten existierenden", &FromHelp[7],
	1, 0, JAM1,  5,  85, &topaz8, "Seite gedruckt.", NULL };

struct IntuiText ToHelp[] =
{
	2, 0, JAM1,  5,   3, &topaz8, "Drucke bis Seite", &ToHelp[1],
	1, 0, JAM1,  5,  20, &topaz8, "In diesem Gadget kann man angeben,", &ToHelp[2],
	1, 0, JAM1,  5,  30, &topaz8, "bis zu welcher Seite man drucken", &ToHelp[3],
	1, 0, JAM1,  5,  40, &topaz8, "möchte.", &ToHelp[4],
	1, 0, JAM1,  5,  55, &topaz8, "Wird keine Zahl eingegeben, d.h.", &ToHelp[5],
	1, 0, JAM1,  5,  65, &topaz8, "die voreingestellte Zahl gelöscht,", &ToHelp[6],
	1, 0, JAM1,  5,  75, &topaz8, "so wird bis zur letzten", &ToHelp[7],
	1, 0, JAM1,  5,  85, &topaz8, "existierenden Seite gedruckt.", NULL };

struct IntuiText OutToHelp[] =
{
	2, 0, JAM1,  5,   3, &topaz8, "Druckumlenkung", &OutToHelp[1],
	1, 0, JAM1,  5,  20, &topaz8, "In diesem Gadget kann man die", &OutToHelp[2],
	1, 0, JAM1,  5,  30, &topaz8, "Zieldatei angeben, in die 'gedruckt'", &OutToHelp[3],
	1, 0, JAM1,  5,  40, &topaz8, "werden soll. Der Ausdruck wird", &OutToHelp[4],
	1, 0, JAM1,  5,  50, &topaz8, "anstatt zum Drucker in diese", &OutToHelp[5],
	1, 0, JAM1,  5,  60, &topaz8, "Datei gelenkt.", &OutToHelp[6],
	1, 0, JAM1,  5,  75, &topaz8, "Vorsicht! Bitte keine Leerzeichen", &OutToHelp[7],
	1, 0, JAM1,  5,  85, &topaz8, "in Device-, Pfad- oder Dateinamen", &OutToHelp[8],
	1, 0, JAM1,  5,  95, &topaz8, "verwenden, da DVIprint nicht damit", &OutToHelp[9],
	1, 0, JAM1,  5, 105, &topaz8, "zurechtkommt.", NULL };

struct IntuiText OutFileHelp[] =
{
	2, 0, JAM1,  5,   3, &topaz8, "Dateiauswahl zur Druckumlenkung", &OutFileHelp[1],
	1, 0, JAM1,  5,  20, &topaz8, "Mit diesem Gadget öffnet man einen", &OutFileHelp[2],
	1, 0, JAM1,  5,  30, &topaz8, "Filerequester, mit dem man die", &OutFileHelp[3],
	1, 0, JAM1,  5,  40, &topaz8, "Zieldatei auswählen kann. Nach der", &OutFileHelp[4],
	1, 0, JAM1,  5,  50, &topaz8, "Eingabe erscheint der Dateiname im", &OutFileHelp[5],
	1, 0, JAM1,  5,  60, &topaz8, "Gadget 'OutTo' rechts daneben.", NULL };

struct IntuiText SaveHelp[] =
{
	2, 0, JAM1,  5,   3, &topaz8, "Abspeichern der Einstellungen", &SaveHelp[1],
	1, 0, JAM1,  5,  20, &topaz8, "Mit diesem Gadget speichert man die", &SaveHelp[2],
	1, 0, JAM1,  5,  30, &topaz8, "Einstellungen in der Datei", &SaveHelp[3],
	1, 3, JAM2, 22,  47, &topaz8, "TeX:config/DVIPrintSetUp.config", &SaveHelp[4],
	1, 0, JAM1,  5,  64, &topaz8, "ab. Diese Datei wird bei jedem", &SaveHelp[5],
	1, 0, JAM1,  5,  74, &topaz8, "Aufruf geladen und es stehen so die", &SaveHelp[6],
	1, 0, JAM1,  5,  84, &topaz8, "gespeicherten Grundeinstellungen", &SaveHelp[7],
	1, 0, JAM1,  5,  94, &topaz8, "zur Verfügung.", NULL };

struct IntuiText LoadHelp[] =
{
	2, 0, JAM1,  5,   3, &topaz8, "Einlesen der Einstellungen", &LoadHelp[1],
	1, 0, JAM1,  5,  20, &topaz8, "Mit diesem Gadget lädt man die", &LoadHelp[2],
	1, 0, JAM1,  5,  30, &topaz8, "Einstellungen aus der Datei", &LoadHelp[3],
	1, 3, JAM2, 22,  47, &topaz8, "TeX:config/DVIPrintSetUp.config", &LoadHelp[4],
	1, 0, JAM1,  5,  64, &topaz8, "ein. Somit gelangt man zur zuletzt", &LoadHelp[5],
	1, 0, JAM1,  5,  74, &topaz8, "gespeicherten Grundeinstellung.", NULL };

struct IntuiText UseHelp[] =
{
	2, 0, JAM1,  5,   3, &topaz8, "Druckvorgang starten", &UseHelp[1],
	1, 0, JAM1,  5,  20, &topaz8, "Mit diesem Gadget beginnt man den", &UseHelp[2],
	1, 0, JAM1,  5,  30, &topaz8, "Ausdruck der geladenen Datei mit", &UseHelp[3],
	1, 0, JAM1,  5,  40, &topaz8, "den aktuellen Einstellungen.", &UseHelp[4],
	1, 0, JAM1,  5,  60, &topaz8, "Die Einstellungen werden dabei", &UseHelp[5],
	1, 0, JAM1,  5,  70, &topaz8, "nicht gespeichert, so daß beim", &UseHelp[6],
	1, 0, JAM1,  5,  80, &topaz8, "nächsten Aufruf wieder die", &UseHelp[7],
	1, 0, JAM1,  5,  90, &topaz8, "gespeicherten Grundeinstellungen", &UseHelp[8],
	1, 0, JAM1,  5, 100, &topaz8, "benutzt werden.", NULL };

struct IntuiText CancelHelp[] =
{
	2, 0, JAM1,  5,   3, &topaz8, "Abbruch des Programms", &CancelHelp[1],
	1, 0, JAM1,  5,  20, &topaz8, "Mit diesem Gadget bricht man das", &CancelHelp[2],
	1, 0, JAM1,  5,  30, &topaz8, "Programm ab.", &CancelHelp[3],
	1, 0, JAM1,  5,  45, &topaz8, "Die aktuellen Einstellungen werden", &CancelHelp[4],
	1, 0, JAM1,  5,  55, &topaz8, "nicht gespeichert und DVIprint", &CancelHelp[5],
	1, 0, JAM1,  5,  65, &topaz8, "wird nicht gestartet.", NULL };

struct IntuiText ButtonHelp[] =
{
	2, 0, JAM1,  5,   3, &topaz8, "Verschiedene Einstellungen", &ButtonHelp[1],
	1, 0, JAM1,  5,  20, &topaz8, "Mit den insgesamt 10 Gadgets können", &ButtonHelp[2],
	1, 0, JAM1,  5,  30, &topaz8, "verschiedene Optionen ausgewählt", &ButtonHelp[3],
	1, 0, JAM1,  5,  40, &topaz8, "werden.", &ButtonHelp[4],
	1, 0, JAM1,  5,  55, &topaz8, "Manche Optionen werden nicht von", &ButtonHelp[5],
	1, 0, JAM1,  5,  65, &topaz8, "jedem Drucker unterstützt. Eine", &ButtonHelp[6],
	1, 0, JAM1,  5,  75, &topaz8, "genauere Beschreibung der Optionen", &ButtonHelp[7],
	1, 0, JAM1,  5,  85, &topaz8, "ist in der Anleitung zu DVIprint", &ButtonHelp[8],
	1, 0, JAM1,  5,  95, &topaz8, "zu finden.", NULL };

/* -------------- Array aller Texte entsprechend dem GadgetID -------------- */

struct IntuiText *HelpMessages[] = {
	&PrinterHelp[0],
	&OffsetHelp[0],
	&OffsetHelp[0],
	&FromHelp[0],
	&ToHelp[0],
	&PagesHelp[0],
	&SaveHelp[0],
	&LoadHelp[0],
	&UseHelp[0],
	&CancelHelp[0],
	&OutFileHelp[0],
	&OutToHelp[0],
	&ButtonHelp[0],
	&ButtonHelp[0],
	&ButtonHelp[0],
	&ButtonHelp[0],
	&ButtonHelp[0],
	&ButtonHelp[0],
	&ButtonHelp[0],
	&ButtonHelp[0],
	&ButtonHelp[0],
	&ButtonHelp[0]
};


/*  OnlineHelp()
 *
 *  Das Hauptprogramm für die Hilfefunktion.
 */

void OnlineHelp(void)
{
	struct IntuiMessage *imsg;
	struct Gadget *gad;
	ULONG imsgClass;
	UWORD imsgCode;
	BOOL terminated = FALSE;

	if ( ! OpenHelpWindow() ) {

		/* Allgemeine Information ausgeben */
		PrintHelp( IntroIText );

		while (!terminated) {
			/*
			 *  Wir warten auf Events von zwei Fenstern
			 *  gleichzeitig. Deshalb muß man beide "mp_SigBit"
			 *  miteinander ODER-verknüpfen. Tritt ein Event
			 *  auf, so wird zuerst abgefragt, ob dieser im
			 *  Hilfefenster oder im Hauptfenster auftrat.
			 */

			Wait ( (1 << HelpWnd->UserPort->mp_SigBit) |
			       (1 << DVIPrintSetUpWnd->UserPort->mp_SigBit) );

			/*
			 *  Zuerst werden alle Events des
			 *  Hilfefensters behandelt. Es kann wenig
			 *  passieren, da nur eine Taste und
			 *  ein Gadget vorhanden sind.
			 */

			while ((!terminated) && (imsg = GT_GetIMsg(HelpWnd->UserPort))) {
				imsgClass = imsg->Class;
				imsgCode = imsg->Code;
				gad = (struct Gadget *)imsg->IAddress;
				GT_ReplyIMsg(imsg);

				switch (imsgClass) {
					case IDCMP_GADGETDOWN:
					case IDCMP_GADGETUP:
						/* Gadget angeklickt */
						terminated = (gad->GadgetID == GD_HelpCancel);
						break;

					case IDCMP_VANILLAKEY:
						/* Taste gedrückt */
						terminated = (imsgCode == 'c' || imsgCode == 'C');
						break;

					case IDCMP_CLOSEWINDOW:
						/* Hilfefenster schließen */
						terminated = TRUE;
						break;

					case IDCMP_RAWKEY:
						/* HELP-Taste abfragen */
						terminated = (imsgCode == 0x5F);
						break;

					case IDCMP_REFRESHWINDOW:
						/* Fenster refreshen */
						GT_BeginRefresh(HelpWnd);
						GT_EndRefresh(HelpWnd, TRUE);
						break;
					}
				}

			/*
			 *  Nun folgt die zusätzliche Abfrage aller
			 *  Events des Hauptfensters. Drückt
			 *  hier der Benutzer eine Taste oder
			 *  ein Gadget, so soll der entsprechende
			 *  Text im Hilfefenster angezeigt werden.
			 */

			while ((!terminated) && (imsg = GT_GetIMsg(DVIPrintSetUpWnd->UserPort))) {
				imsgClass = imsg->Class;
				imsgCode = imsg->Code;
				gad = (struct Gadget *)imsg->IAddress;
				GT_ReplyIMsg(imsg);

				switch (imsgClass) {
					case IDCMP_GADGETDOWN:
					case IDCMP_MOUSEMOVE:
					case IDCMP_GADGETUP:
						/* Gadget angeklickt, entsprechenden Text anzeigen */
						PrintHelp( HelpMessages[ (gad->GadgetID) ] );
						break;

					case IDCMP_VANILLAKEY:
						/* Taste gedrückt, entsprechenden Text anzeigen */
						HandleHelpVanillaKey(DVIPrintSetUpWnd, gad, imsgCode);
						break;

					case IDCMP_CLOSEWINDOW:
						/* Close-Gadget im Hauptfenster, entsprechenden Text */
						PrintHelp( CancelHelp );
						break;

					case IDCMP_RAWKEY:
						/* HELP-Taste abfragen für Ende der Hilfefunktion */
						terminated = (imsgCode == 0x5F);
						break;

					case IDCMP_REFRESHWINDOW:
						/* Hauptfenster refreshen */
						GT_BeginRefresh(DVIPrintSetUpWnd);
						GT_EndRefresh(DVIPrintSetUpWnd, TRUE);
						break;
					}
				}
			}
		CloseHelpWindow();
	}
}

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

/*  HandleHelpVanillaKey()
 *
 *  Falls im Hilfesystem eine Taste im Hauptfenster gedrückt
 *  wird, so wird der entsprechende Hilfetext im Hilfefenster
 *  ausgegeben.
 */

void HandleHelpVanillaKey( struct Window *win, struct Gadget *gad, UWORD code )
{
	struct IntuiText *HelpText = NULL;
	switch (code) {

		case 'h':
		case 'v':
		case 'H':
		case 'V':
			/* Offset auswählen */
			HelpText = OffsetHelp;
			break;

		case 'i':
			/* Seitenmodus [ All | Even | Odd ] auswählen */
			HelpText = PagesHelp;
			break;

		case 'f':
		case 'F':
			/* Integer-Gadget für Startseite aktivieren */
			HelpText = FromHelp;
			break;

		case 't':
		case 'T':
			/* Integer-Gadget für Zielseite aktivieren */
			HelpText = ToHelp;
			break;

		case 's':
		case 'S':
			/* Einstellung speichern (wie in HandleGadgetEvent) */
			HelpText = SaveHelp;
			break;

		case 'l':
		case 'L':
			/* Grundeinstellung laden (wie in HandleGadgetEvent) */
			HelpText = LoadHelp;
			break;

		case 'p':
		case 'P':
			/* Print: aktuelle Einstellung benutzen */
			HelpText = UseHelp;
			break;

		case 'c':
		case 'C':
			/* Cancel: Programmabbruch mit Returncode 5 */
			HelpText = CancelHelp;
			break;

		case 'o':
		case 'O':
			/* String-Gadget für Druckumlenkung aktivieren */
			HelpText = OutToHelp;
			break;

		case 'I':
		case 'e':
		case 'E':
		case 'a':
		case 'A':
		case 'm':
		case 'M':
		case 'n':
		case 'N':
		case 'k':
		case 'K':
		case 'd':
		case 'D':
		case 'r':
		case 'R':
		case 'g':
		case 'G':
			HelpText = ButtonHelp;
			break;
	}
	if ( HelpText ) PrintHelp( HelpText );
}

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

/*  PrintHelp()
 *
 *  Druck einen IntuiText in das Hilfefenster.
 *  Dabei wird ab der linken oberen Ecke IM Fenster
 *  geschrieben, es wird also die Größe des Rahmens
 *  berücksichtigt. Vor der Ausgabe wird der Fensterinhalt
 *  gelöscht. Dabei wird das Gadget berücksichtigt.
 */

void PrintHelp( struct IntuiText *Text )
{
	UWORD offx = HelpWnd->BorderLeft;
	UWORD offy = HelpWnd->BorderTop;
	UWORD sizex = HelpWnd->Width - HelpWnd->BorderRight - 1;

	SetAPen( HelpWnd->RPort, 0 );
	RectFill( HelpWnd->RPort, offx, offy, sizex, 124+offy );  /* 124 wegen Gadget */
	PrintIText( HelpWnd->RPort, Text, offx, offy );
}
