/*********************************************************************
	>>>>>  Zeichnen.c   Farbverlauf-Balken - Routinen

	Autor: Rudolf Gierlinger   A - 4692 Niederthalheim 50

	Verwendung und Verbreitung fuer NICHTKOMMERZIELLEN Gebrauch
	erlaubt, solange der Autorenvermerk nicht geloescht wird !

						Dezember 1988
 *********************************************************************/
#ifdef EXTERN
 #undef EXTERN
#endif
#define EXTERN extern

#include "Common.H"

/* aus <intuition/intuition.h> */
struct Border
{
    SHORT LeftEdge, TopEdge;
    UBYTE FrontPen, BackPen;
    UBYTE DrawMode;
    BYTE Count;
    SHORT *XY;
    struct Border *NextBorder;
};

SHORT PriBoData[] =
{	0,0,
	48,0,
	48,13,
	0,13,
	0,0
};
struct Border PriBord =
{	281,48,
	ROT,0,JAM1,
	5, 		/*Anz*/
	PriBoData,
	NULL 		/*noNext*/
};


/*=== FUNCTION  FarbBalken ===*/
/* Ermöglicht ein bequemes Zeichnen von Balken, die aus mehreren parallelen
   Strichen bestehen, die ihre Farbe wechseln (Farbverlauf) und wobei der
   Balken an beiden Enden schräge Kanten besitzt. Alle relevanten Parameter
   können beeinflußt werden.

   ARGS:    rastP   ... RastPort.
            FRichtg ... Richtung des Farbverlaufs.
            wo      ... Ort des Balkens (x-Koord. bei vertikalem Balken,
                                         y-Koord. bei horizont.  Balken)
            BArt siehe unten.
            von,bis ... Anfang,Ende des Balkens
                        (2 y-Koord. bei vertikalem Balken,
                         2 x-Koord. bei horizont.  Balken)

            BArt    ...
	Diese Zeichenkette legt das Aussehen des Balkens fest,
	sie MUSS 3 ZEICHEN enthalten, derart:

	Pos 0: normalerweise 1 Leerzeichen.
	Pos 1: eines der Zeichen V ^ > <  die angeben, ob der Balken
		horizontal (V ^) oder vertikal (> <) sein, und in welche
		Richtung die Balkenenden abgeschnitten werden sollen.
	SOLLEN die Balkenenden nicht konkav, sondern PARALLEL abgeschnitten
	werden, so ist neben der Kante des Symbols (V ^ < >), die die 
	Richtung vorgeben soll, das Zeichen "`" bzw. "," anzugeben - also
	immer als 1. oder 3. Zeichen (bzw. 0. oder 2. Position).
	BEISPIELE:
	"+ > "	normaler Farbverlauf; Balken vertikal, konkav nach rechts.
	"- < "	inverser Farbverlauf; Balken vertikal, konkav nach links.
	"+ V "  		horizontal, konkav nach unten.
	"+ ^ "  		horizontal, konkav nach unten.
	"+`> "			vertikal, untere Kante PARALLEL zur OBEREN.
	"+,> " oder "+ >," 	vertikal, obere  Kante PARALLEL zur UNTEREN.
	"+,V " oder "+`V " 	horizont, rechte Kante PARALLEL zur LINKEN.
	"+ V," oder "+ V`"	horizont, linke  Kante PARALLEL zur RECHTEN.
*/

VOID FarbBalken(rastP,FRichtg,wo,BArt,von,bis)
	int 		wo,von,bis,FRichtg;
	struct RastPort *rastP;
	char 		*BArt;
{
	int		Anf,End,Farb;
	REGISTER int 	i;
	enum KantRichtg { slash, backslash }
			AnfRichtg, EndRichtg;

#define FA_MAX 5 /* Max.Farben & Strichstärke(in y) des Balkens */

   if (BArt[1]=='>' || BArt[1]=='<')	/*  | vertikaler Balken */
   {
	AnfRichtg =
	    ( (BArt[1]=='<' &&  BArt[0]!=',' && BArt[2]!=',' ) 
	   || (BArt[1]=='>' && (BArt[0]==',' || BArt[2]==','))
	    )  ? slash : backslash;
	EndRichtg =
	    ( (BArt[1]=='>' &&  BArt[0]!='`' && BArt[2]!='`' )
	   || (BArt[1]=='<' && (BArt[0]=='`' || BArt[2]=='`'))
	    )  ? slash : backslash;

	for (i=0; i <= FA_MAX; i++)
	{	Farb = (FRichtg) ? FA_MAX-i : i; /* inverser Farbverlauf ? */
		Anf  = (AnfRichtg==slash)     ? von+(FA_MAX-i) : von+i; /* / */
		End  = (EndRichtg==backslash) ? bis-(FA_MAX-i) : bis-i; /* \ */
  		SetAPen(rastP,Farb);
		Move(rastP,wo+i*2,Anf); 	Draw(rastP,wo+i*2,End);
		Move(rastP,wo+i*2+1,Anf+1); 	Draw(rastP,wo+i*2+1,End-1);
	}
   }
   else					/* --- horizontaler Balken */
   {
	AnfRichtg =
	    ( (BArt[1]=='^' && BArt[2]==' ') || (BArt[1]=='V' && BArt[2]!=' ')
	    )  ? slash : backslash;
	EndRichtg =
	    ( (BArt[1]=='V' && BArt[0]==' ') || (BArt[1]=='^' && BArt[0]!=' ')
	    )  ? slash : backslash;
	for (i=0; i <= FA_MAX; i++)
	{	Farb = (FRichtg) ? FA_MAX-i : i; /* inverser Farbverlauf ? */
		Anf  = (AnfRichtg==slash)     ? von+(FA_MAX-i)*2 : von+i*2; /* / */
		End  = (EndRichtg==backslash) ? bis-(FA_MAX-i)*2 : bis-i*2; /* \ */
  		SetAPen(rastP,Farb);
		Move(rastP,Anf,wo+i); Draw(rastP,End,wo+i);
	}
   }
}

/*=== FUNCTION  FarbRahmen ===*/
/* Zeichnet Rechteck mit Farbbalken; Kanten koennen wegfallen.

   ARGS: rastP   ... RastPort.
         FRichtg ... Farbrichtung des Farbverlaufs der Balken.
         weg     ... Kontrollstring, der symbolisch ( <>^V ) die Balken
                     des Rechtecks enthält, die NICHT gezeichnet werden sollen.
         x,y     ... Pos. der linken oberen Ecke des Rechtecks.
         Br,Hoe  ... Breite, Hoehe.
*/
VOID FarbRahmen (rastP,FRichtg,weg,x,y,Br,Hoe)
	int 		x,y,Br,Hoe,FRichtg;
	struct RastPort *rastP;
	char 		*weg;
{
   if (Zeichnen(weg,'^'))  FarbBalken (rastP,!FRichtg,y+Hoe-5," ^ ",x,x+Br);
   if (Zeichnen(weg,'V'))  FarbBalken (rastP, FRichtg,y      ," V ",x,x+Br);
   if (Zeichnen(weg,'>'))  FarbBalken (rastP, FRichtg,x      ," > ",y,y+Hoe);
   if (Zeichnen(weg,'<'))  FarbBalken (rastP,!FRichtg,x+Br-11," < ",y,y+Hoe);
}

/*=== FUNCTION   ===*/
VOID Umgebung_Zeichnen()
{ 
  FarbRahmen (rp,1,"<",0,0,359,99);	/* grosser Rahmen */
  FarbBalken (rp,0,348,"`< ",  0, 35);
  FarbBalken (rp,1, 29,",^ ",348,400);
  FarbBalken (rp,0,389," < ", 29, 79);
  FarbBalken (rp,0, 74,",V ",348,400);
  FarbBalken (rp,0,348,",< ", 74, 99);

  FarbBalken (rp,0,70,"`< ", 0,15); 	/* Doppelbalken zw. Typus & Task */
  FarbBalken (rp,1,80,"`> ", 0,15);
  FarbBalken (rp,1,10," ^ ",71,91);
  
  FarbBalken (rp,0,254,"`< ",  0, 15); 	/* Doppelbalken zw. Task & Prior. */
  FarbBalken (rp,1,264,"`> ",  0, 15);
  FarbBalken (rp,1, 10," ^ ",255,275);

  SetAPen(rp,ROT);
  Move(rp, 21,12); Text(rp," Typ ",5);
  Move(rp, 92,12); Text(rp,"   T  A  S  K  (#  )",20);
  Move(rp,276,12); Text(rp,"Priorität",9);

  FarbRahmen (rp,0,"",272,44, 67,21); 	/* Rahmen um dessen Prioritaet	*/
  FarbRahmen (rp,0,"", 0,44,275,21); 	/* Rahmen um ausgewaehlten Task */
  SetAPen(rp,SCHWARZ);
  RectFill(rp,0+9, 44+6, 0+275-12, 44+21-6); /* Rahmen ausfuellen */

  FarbRahmen (rp,1,"",380,4,28+8*8,20);
  Move (rp,380+15,4+13); Text(rp,"Aktuell!",8);

  FarbRahmen (rp,1,"",359,79,40,20); /* Exit-Knopf */
  FarbRahmen (rp,0,"",369,84,20,10);

  FarbRahmen (rp,1,"",400,29,100,70); /* "Anzahl"-Rahmen */
  FarbBalken (rp,0,66," ^ ",400,500); 
  SetAPen(rp,ROT);     Move(rp,427,42); Text(rp,"Anzahl",6);
  SetAPen(rp,SCHWARZ); Move(rp,415,53); Text(rp,"GESAMT",6);
		       Move(rp,415,63); Text(rp,"User  ",6);
  SetAPen(rp,GRAU);    Move(rp,415,80); Text(rp,"CLI's ",6);
		       Move(rp,415,90); Text(rp,"System",6);

  DrawBorder(rp,&PriBord,0,0);
}

/*=== FUNCTION  Zeichnen ===*/
/* "FarbRahmen" erhält Kontrollstring, welche Seiten des Rechtecks
   NICHT gezeichnet werden sollen. Dieser wird hier ausgewertet.

   FUNCTION: "IF was IN wo THEN NOT Zeichnen"
   ARGS:   wo  ... Kontrollstring, der die NICHT zu zeichnenden B. enthält;
           was ... Zeichen, das aktuellen Balken darstellt ( ^>V< ).
   RESULT: BOOL Balken zeichnen ja/nein.
*/
Zeichnen(wo,was)
	char wo[], was;
{
	REGISTER int i;

   for (i=0; i<5; i++)
   {	if (wo[i]=='\0') return (TRUE );
	if (wo[i]==was)  return (FALSE); 	/* nicht Zeichnen */
   }
   /*DEBUG*/ return(0);
}

