/*********************************************************************
	>>>>>  Zeig.c   Anzeige-Routinen von `TaskDrive`.

	Autor: Rudolf Gierlinger   A - 4692 Niederthalheim 50

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

						Dezember 1988
 *********************************************************************/
#include "Zeig.H"

extern struct Gadget 	PfeilAuf, 	/* in "Main.c" */
			PfeilAb, PriGad;

struct IntuiText Tx[21]; 	/* Texte für: Typus, Namen, Priorität */

UWORD PfeilDaten[210] =
{
   0x0004,0x0000,0x000e,0x0000,0x001b,0x0000,0x0031,0x8000,
   0x0064,0xc000,0x00ce,0x6000,0x019b,0x3000,0x0331,0x9800,
   0x0664,0xcc00,0x0cce,0x6600,0x199b,0x3300,0x3331,0x9980,
   0x6660,0xccc0,0xccc0,0x6660,0x0000,0x0000,0x0000,0x0000,
   0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
   0x0000,0x0000,0xccc0,0x6660,0x6660,0xccc0,0x3331,0x9980,
   0x199b,0x3300,0x0cce,0x6600,0x0664,0xcc00,0x0331,0x9800,
   0x019b,0x3000,0x00ce,0x6000,0x0064,0xc000,0x0031,0x8000,
   0x001b,0x0000,0x000e,0x0000,0x0004,0x0000,

   0x0000,0x0000,0x0000,0x0000,0x0004,0x0000,0x000e,0x0000,
   0x001f,0x0000,0x003f,0x8000,0x007b,0xc000,0x00f1,0xe000,
   0x01e0,0xf000,0x03c0,0x7800,0x0780,0x3c00,0x0f00,0x1e00,
   0x1e00,0x0f00,0x3c00,0x0780,0x0000,0x0000,0x0000,0x0000,
   0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
   0x0000,0x0000,0x3c00,0x0780,0x1e00,0x0f00,0x0f00,0x1e00,
   0x0780,0x3c00,0x03c0,0x7800,0x01e0,0xf000,0x00f1,0xe000,
   0x007b,0xc000,0x003f,0x8000,0x001f,0x0000,0x000e,0x0000,
   0x0004,0x0000,0x0000,0x0000,0x0000,0x0000,

   0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
   0x0000,0x0000,0x0000,0x0000,0x0004,0x0000,0x000e,0x0000,
   0x001f,0x0000,0x003f,0x8000,0x007b,0xc000,0x00f1,0xe000,
   0x01e0,0xf000,0x03c0,0x7800,0x0000,0x0000,0x0000,0x0000,
   0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
   0x0000,0x0000,0x03c0,0x7800,0x01e0,0xf000,0x00f1,0xe000,
   0x007b,0xc000,0x003f,0x8000,0x001f,0x0000,0x000e,0x0000,
   0x0004,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
   0x0000,0x0000,0x0000,0x0000,0x0000,0x0000
};
struct Image Pfeile =
{	352,37,
	27,35,7,	/* Width, Height, Depth */
	PfeilDaten,
	3,0,NULL
};

#define NO_TASK_TYP "   ALLE"
#define NO_TASK_TXT "Tasks ausgeblendet !"
#define LEERNAME    "                    " /* 20 Spaces */


/*=== FUNCTION  Zuweisung ===*/
/* Zuweisung der Informationen aus der Task-Info-Struktur zum IntuiText.
   Eine Bedingung ist moeglich, bei der IntuiText mit Leerstrings belegt wird. 

   ARGS: SollLeerSein ... Bedingung. Ist diese erfuellt, wird der IntuiText
                          mit Leerstrings belegt.
         Ab  ... Index auf IntuiText. "Zeigt auf sichtbare Eintrags-Zeile".
         Was ... Index auf Task-Info-Struktur.
*/
VOID Zuweisung(SollLeerSein, Ab, Was)
	BOOL SollLeerSein;
	int  Ab, Was;
{
   if  (SollLeerSein)
   { 	Tx[Ab  ].IText = "       "; 	/* Typus */
	Tx[Ab+1].IText = LEERNAME; 	/* Name   */
	Tx[Ab+2].IText = "    "; 	/* Prior. */
   }
   else
   { 	Tx[Ab  ].IText = EintrPtr[Was]->Typus;
	Tx[Ab+1].IText = EintrPtr[Was]->Name;
	Tx[Ab+2].IText =
		Zahl2Digits (	EintrPtr[Was]->PriPuff,
				EintrPtr[Was]->Prior);
   }
}

/*=== FUNCTION  RollRauf ===*/
/* Rollt alle sichtbaren Eintraege nach oben:
   Aendert die Verkettung der Zeiger zwischen des IntuiText-Strukturen,
   belegt den UNTERSTEN Eintrag neu und zeigt alles an.
*/
VOID RollRauf()
{
	REGISTER int i;

   DrawImage(rp,&Pfeile,0,0);
   OnGadget(&PfeilAb,FenstPtr,NULL);
   if (Wahl+3 > Anzahl)
	OffGadget(&PfeilAuf,FenstPtr,NULL);
   if (Wahl+1 < Anzahl)
   { 	Wahl++;
	for (i=0; i<18; i++)
	   Tx[i].IText = Tx[i+3].IText;
	Zuweisung( (Wahl+4 > Anzahl), 18, Wahl+3 );
   }
}

/*=== FUNCTION  RollRunter ===*/
/* Rollt alle sichtbaren Eintraege nach unten:
   detto. Belegt den OBERSTEN Eintrag neu und zeigt alles an.
*/
VOID RollRunter()
{
	REGISTER int i;

   DrawImage(rp,&Pfeile,0,0);
   OnGadget(&PfeilAuf,FenstPtr,NULL);
   if (Wahl < 2)
	OffGadget(&PfeilAb,FenstPtr,NULL);
   if (Wahl > 0)
   {	Wahl--;
	for (i=17; i>=0; i--)
	   Tx[i+3].IText = Tx[i].IText;
	Zuweisung( (Wahl < 3), 0, Wahl-3 );
   }
}

/*=== FUNCTION  SchnappSchuss ===*/
/* Erstellt das gesamte Angezeigte neu (aktualisiere!). Dazu geschieht:
     Alle alten Info-Strukturen freigeben (FreeMem),
     Tasklisten durchsuchen (neue Info-Structs werden erzeugt),
     Nicht-anzuzeigende Eintraege ausblenden,
     Variablen fuer den Statusbericht aktualisieren,
     Info-Structs => IntuiText kopieren,
     Statuswerte ausgeben,
     Pfeile-Image&Gadget entsprechend aktivieren/desaktivieren.
*/
VOID SchnappSchuss()
{
 	REGISTER int i,j;	

 /*>>>>>>>>> Tasks suchen <<<<<<<<<*/
   Anzahl = 0;
   for (i=0; i<MAXEINTR; i++) 	/* alte Eintraege wieder freigeben ...   */
 	if (EintrPtr[i])
 	{	FreeMem((APTR)EintrPtr[i],sizeof(struct TaskEintr));
 		EintrPtr[i] = NULL;
 	}
   Forbid(); 			/* ... da sie hier neu alloziert werden! */
     SuchNamen_inRRList(&ExecBase->TaskWait);
     SuchNamen_inRRList(&ExecBase->TaskReady);
   Permit();
   
  /* Tasks eventuell aussortieren */
   Wahl = CliTskAnz = SysTskAnz = KorrekturAnz = 0;
   for (i=j=0; i<Anzahl; i++)
   {
	if (WirklichZeigen(i))
	{ 	*EintrPtr[j] = *EintrPtr[i]; /* struct copy ! */
		j++;  Wahl++;
	}
   }

   UsrTskAnz = Anzahl-CliTskAnz-SysTskAnz-KorrekturAnz;;
   Anzahl    = Wahl;

   SortEintr(); /* Wahnsinnig wichtiger Kommentar: Hier wird sortiert. */

  /*>>>>>>>>>>> IntuiText-Strukturen belegen <<<<<<<<<<*/
   Wahl = 0; 	/* ab 1. Eintrag anzeigen */
   for (i=0;  (i < 7);  i++)
	Zuweisung( (i > (Anzahl+2)) || (i < 3), i*3, i-3 );

 /* Anzahl-Anzeige */
   SetAPen(rp,SCHWARZ);
   sprintf(StrPuff,"%2.2u", 	UsrTskAnz );
   Move(rp,470,63); Text(rp,StrPuff,2);
   sprintf(StrPuff,"%2.2u", 	CliTskAnz );
   Move(rp,470,80); Text(rp,StrPuff,2);
   sprintf(StrPuff,"%2.2u", 	SysTskAnz );
   Move(rp,470,90); Text(rp,StrPuff,2);
   sprintf(StrPuff,"%2.2u", 	UsrTskAnz+CliTskAnz+SysTskAnz );
   Move(rp,470,53); Text(rp,StrPuff,2);
   sprintf(StrPuff,"%2.2u", 	Anzahl );
   Move(rp,228,12); Text(rp,StrPuff,2);

   DrawImage(rp,&Pfeile,0,0); /* Restaurieren, falls vorher Off */
   if (Anzahl > 0)
   { 	OnGadget(&PfeilAuf,FenstPtr,NULL);
	OnGadget(&PriGad  ,FenstPtr,NULL);
   }
   else
   { 	OffGadget(&PfeilAuf,FenstPtr,NULL);
	OffGadget(&PriGad  ,FenstPtr,NULL);
   }
   OffGadget(&PfeilAb ,FenstPtr,NULL);
   /* jetzt noch noetig: Zeig() */
}

/*=== FUNCTION  Zeig ===*/
/* "Zeigt alles an"
   Task-Struct-Adresse wird errechnet und in IntuiText eingetragen,
   Alles anzeigen,
   Int-Gadget-Inhalt muß aktualisiert werden (per Zahl2Digits!),
   dieser Inhalt darf keine Spaces enthalten - als Zahl nicht erlaubt !
   Int-Gadget aktivieren & Gadgets-Refreshen.
*/
VOID Zeig()
{
   if (Anzahl > 0)
   {                /* V..auf Pos 0 steht '$' als Hex-Kennung */
	sprintf (&AdrPuff[1],"%6.6lx",EintrPtr[Wahl]->MyID);
	Tx[9].IText = AdrPuff; 		/* Adresse des Gewaehlten eintragen */
   }
   else
   {	Tx[ 9].FrontPen = ROT; 		/* VV voruebergehend, als Signalfarbe */
	Tx[ 9].IText = NO_TASK_TYP;
	Tx[10].IText = NO_TASK_TXT;
   }

   PrintIText (rp,&Tx[0],0,0); 		/* Alles (!!) wird damit angezeigt. */
   Tx[9].IText = EintrPtr[Wahl]->Typus;
   Tx[9].FrontPen = GRAU; 		/* ^^ restaurieren */

   if (Anzahl > 0)
   {
	REGISTER int i,j;
	
   	strcpy (StrPuff,
		Zahl2Digits(EintrPtr[Wahl]->PriPuff,EintrPtr[Wahl]->Prior) );

   	/* Integer-Gadget liefert falsches Ergebnis, wenn im Initialstring
      	   Spaces sind, daher Spaces wegbringen: */
   	for (i=0, j=0; StrPuff[i]; i++)
   	     if  (StrPuff[i]==' ') ;
	else StrPuff[j++] = StrPuff[i];
   	StrPuff[j] = '\0';

 	RefreshGadgets (&PriGad,FenstPtr,NULL);
 	ActivateGadget (&PriGad,FenstPtr,NULL);
   }
}

