
/*       Menu-Routinen fÜr Amiga                   */
/*       (C) 1987                                  */
/*       Thomi Mauch                               */
/*       Augustin Keller-Str. 9                    */
/*       CH-5000 Aarau                             */

/*  Werden die folgenden Routinen im LoRes-Modus   */
/*  (320*200 / 320*400) verwendet, so sollten      */
/*     CHECKWIDTH und    COMMWIDTH durch           */
/*  LOWCHECKWIDTH und LOWCOMMWIDTH ersetzt werden  */

cr_MenuTitle (p,text,new)                    /* Teilweises Initiali- */
struct MenuItem *p;                          /* sieren des Menu-     */
BYTE *text;                                  /* Headers              */
struct Menu *new;
{
   new->TopEdge   = 0;
   new->Width     = lenght (text) * 8 + 8;
   new->Height    = 0;
   new->Flags     = MENUENABLED | MIDRAWN;   /* Flags fÜr Auswählen  */
   new->MenuName  = text;                    /* möglich und zum      */
   new->FirstItem = p;                       /* Zeichnen auf den     */
}                                            /* Bildschirm           */

cr_MenuText (p,text,command,new1,new2)       /* Teilweises Initiali- */
struct MenuItem *p;                          /* sieren eines Menu-   */
BYTE *text;                                  /* Items und des dazu-  */
BYTE command;                                /* gehörenden Intui-    */
struct MenuItem  *new1;                      /* Textes               */
struct IntuiText *new2;
{
   new2->FrontPen  = 0;                      /* Init IntuiText       */
   new2->BackPen   = 0;
   new2->DrawMode  = JAM1;
   new2->LeftEdge  = 0;
   new2->TopEdge   = 1;
   new2->ITextFont = NULL;
   new2->IText     = text;
   new2->NextText  = NULL;

   new1->NextItem      = p;                  /* Init MenuItem        */
   new1->Width         = lenght (text) * 8;
   new1->Height        = 10;
   new1->Flags         = ITEMTEXT    |       /* Flags fuer Text,     */
                         ITEMENABLED |       /* Auswählen möglich,   */
                         HIGHCOMP    |       /* Revers-Darstellung   */
              (COMMSEQ * (command>1));       /* und Shortcut         */
   new1->MutualExclude = 0;
   new1->ItemFill      = (APTR) new2;        /* Pointer auf Text     */
   new1->SelectFill    = (APTR) new2;
   new1->Command       = command;            /* Shortcut             */
   new1->SubItem       = NULL;
   new1->NextSelect    = 0;
}

set_Attribute (item,exclude,state)           /* Kennzeichnet Menu-   */
struct MenuItem *item;                       /* Item als Attribut    */
LONG exclude;                                /* und setzt CHECKED    */
int state;                                   /* und MutualExclude    */
{
   item->Flags         = item->Flags | CHECKIT | (state > 0) * CHECKED;
   item->MutualExclude = exclude;
}

cr_Menu (window,old,new,x,xItem,mode,attr)   /* Initialisiert Menu-  */
struct Window *window;                       /* Header und alle      */
struct Menu *old,*new;                       /* MenuItems fertig,    */
int x,xItem,mode,attr;                       /* sorgt fÜr die gra-   */
{                                            /* fische Gestaltung    */
   int down = 10;                            /* und initialisiert es */
   int highest;                              /* auf dem Bildschirm   */
   struct MenuItem *item1,*item2;

   new->NextMenu = old;                      /* MenuHeader fertig    */
   new->LeftEdge = x;                        /* initialisieren       */

   item1 = new->FirstItem;                   /* Erstes MenuItem      */
   item1->LeftEdge = xItem;                  /* behandeln            */
   item1->TopEdge  = 0;
   if (attr)
      attribute (item1);
   highest = item1->Width;

   while ((item2 = item1->NextItem) != NULL) /* Schleife fÜr alle    */
      {                                      /* anderen              */
      item2->LeftEdge = xItem;
      item2->TopEdge  = down;
      if (attr)
         attribute (item2);
      if (item2->Width > highest)
         highest = item2->Width;
      item1 = item2;
      down += 10;
      }

   if (mode)                                 /* Grafische Gestaltung */
      equal (new->FirstItem,highest);        /* Boxen gleich lang    */
   shortcut (new->FirstItem,highest);        /* Platz fuer Shortcuts */

   ClearMenuStrip (window);                  /* Neue Menu-Liste      */
   SetMenuStrip   (window,new);              /* zeigen               */
}

cr_SubMenu (pItem,pSub,x,yMode,mode,attr)    /* Initialisiert alle   */
struct MenuItem *pItem,*pSub;                /* MenuItems fertig und */
int x,yMode,mode,attr;                       /* sorgt fÜr die gra-   */
{                                            /* fische Gestaltung    */
   struct MenuItem *item1,*item2;
   int number = 1;
   int highest;
   int down;

   pItem->SubItem = pSub;                    /* Erstes MenuItem      */
   item1 = pSub;                             /* behandeln            */
   if (attr)
      attribute (item1);
   highest = item1->Width;
   item1->LeftEdge = x;
   ((struct IntuiText *)item1->ItemFill)->TopEdge  = 0;
   item1->Height   = 8;

   while ((item2 = item1->NextItem) != NULL) /* Schleife fÜr alle    */
      {                                      /* anderen              */
      number++;
      if (attr)
         attribute (item2);
      if (item2->Width > highest)
         highest = item2->Width;
      item2->LeftEdge = x;
      ((struct IntuiText *)item2->ItemFill)->TopEdge  = 0;
      item2->Height   = 8;
      item1 = item2;
      }

   if (mode)                                 /* Grafische Gestaltung */
      equal (pSub,highest);                  /* Boxen gleich lang    */
   shortcut (pSub,highest);                  /* Platz fuer Shortcuts */

   if (yMode == 0)                           /* SubItems nur ab-     */
      down = 0;                              /* wärts oder zen-      */
   else                                      /* triert               */
      down = 0 - (number-1>>1) * 8;

   item1 = pSub;
   item1->TopEdge = down;
   while ((item2 = item1->NextItem) != NULL)
      {
      down += 8;
      item2->TopEdge = down;
      item1 = item2;
      }
}

shortcut (item1,highest)                     /* Wenn Shortcuts, dann */
struct MenuItem *item1;                      /* Shortcuts an rechten */
int highest;                                 /* Rand.                */
{
   struct MenuItem *item2;

   if (item1->Flags & COMMSEQ)
      item1->Width = highest + COMMWIDTH + 16;
   while ((item2 = item1->NextItem) != NULL)
      {
      if (item2->Flags & COMMSEQ)
         item2->Width = highest + COMMWIDTH + 16;
      item1 = item2;
      }
}

equal (item1,highest)                        /* Alle Selectboxes     */
struct MenuItem *item1;                      /* gleich lang machen.  */
int highest;
{
   struct MenuItem *item2;

   item1->Width = highest;
   while ((item2 = item1->NextItem) != NULL)
      {
      item2->Width = highest;
      item1 = item2;
      }
}

attribute (item)                             /* Wenn Attribute, dann */
struct MenuItem *item;                       /* Attribute an linken  */
{                                            /* Rand                 */
   item->Width += CHECKWIDTH;
   ((struct IntuiText *)item->ItemFill)->LeftEdge = CHECKWIDTH;
}

ins_Line (item,text,string,mode)             /* Abstand zwischen     */
struct MenuItem  *item;                      /* zwei MenuItems er-   */
struct IntuiText *text;                      /* zeugen und dort ei-  */
UBYTE            *string;                    /* nen String ausgeben  */
USHORT           mode;
{
   struct MenuItem *item1,*item2;

   if (mode == 1)                            /* Unterschiedliche     */
      mode = 8;                              /* Grösse Item / Sub-   */
   else                                      /* Item berÜcksichtigen */
      mode = 6;
   item1 = item;
   while ((item2 = item1->NextItem) != NULL) /* Schleife: Items nach */
      {                                      /* unten schieben       */
      item2->TopEdge += mode;
      item1 = item2;
      }

   ((struct IntuiText *)item->ItemFill)->NextText  = text;
   text->FrontPen  = 0;
   text->BackPen   = 0;                      /* IntuiText-Struktur   */
   text->DrawMode  = JAM1;                   /* initialisieren und   */
   text->LeftEdge  = 0;                      /* anhängen             */
   text->TopEdge   = mode + (mode==8) + 1;
   text->ITextFont = NULL;
   text->IText     = string;
   text->NextText  = NULL;
}



lenght (string)
char string [];
{
	int i=0;
	
	while (string[i++] != '\0')
		;

	return (--i);
}
