/********************************************************
* Intuition Kurs 7                                      *
* Beispielprogramm                                      *
* Der IDCMPort, Linien, Bilder & Text                   *
* Autor: Andreas Krämer                                 *
* KICKSTART Ausgabe 1.1988                              *
* Erstellt mit dem Lattice C Compiler 3.10              *
* Compilierung ohne besondere Optionen                  *
********************************************************/

/********************************************************
* Zwei Dateien werden eingebunden                       *
********************************************************/

#include <exec/types.h>
#include <intuition/intuition.h>

/* Verschiedene Strukturen werden mit einem Zeiger *
*  versehen                                       */
 
struct IntuitionBase *IntuitionBase;
struct RastPort *Port;
struct IntuiMessage *Nachricht;
struct Window *Window;

/* Variablen Definition */

#define Menu_1           0
#define Item_1           0
#define Item_2           1

/****************************************************
* Alles nötige für die Umrandung des Textes         *
*****************************************************
* zuerst die Koordinaten für den Rand               * 
****************************************************/

SHORT Paare1[] =
{
  -2, -2,
  -2, 14,
 320, 14,
 320, -2,
  -2, -2
};

/* Die Border Struktur  zum Erstellen der Linien */

struct Border Rand1 =
{
 5, 50,
 3, 2, JAM1,
 5,
 (SHORT *) Paare1,
 NULL
};

/* Der Text für das Fenster */

struct IntuiText Text =
{
 2,0,
 JAM1,
 5, 42, 0,
 "Mit der Funktion PrintIText ausgegeben",
 0
};

/***************************************************
* Alles nötige für ein Boolean Gadget              *
****************************************************
* wieder zuerst die Koordinaten für das Boolean    *
* Gadgets.                                         *
***************************************************/

SHORT Paare2[] =
{
 -2,  -2,
 -2,   8,
 80,   8,
 80,  -2,
 -2,  -2
};

/* Die Border Struktur für die Umrandung der Gadgets */

struct Border Rand2 =
{
 0, 0,
 3, 2, JAM1,
 5,
 (SHORT *) Paare2,
 0
};

/* Der Text für das Gadget */

struct IntuiText Gadgettext =
{
 2, 0,
 JAM1,
 0, 0, 0,
 " BOOLEAN ",
 0
};

/* Das Gadget des Typs Boolean */

struct Gadget Boolgadget =
{
 0,
 10, 20, 100, 14,
 GADGHCOMP,
 GADGIMMEDIATE,
 BOOLGADGET,
 (APTR)&Rand2,
 0,
 &Gadgettext,
 0, 0, 0
};

/******************************************************
* Alles nötige für das Menue. Es wird anstelle von    *
* Text ein Bild ausgegeben                            *
* *****************************************************
* Zuerst die Daten für die zwei Bilder                *
******************************************************/

UWORD Bild1[] =
{
  0xFFFF,
  0xC0FF,
  0xCCFF,
  0xC003,
  0xFCF3,
  0xFCF3,
  0xFCF3,
  0xFC03,
  0xFFFF,
};

UWORD Bild2[] =
{
  0x0000,
  0x3FFC,
  0x1000,
  0x0800,
  0x0400,
  0x0800,
  0x1000,
  0x3FFC,
  0x0000
};

/* Die erste Image Struktur */

struct Image Image1 =
{
   2,1,16,9,2,
   &Bild1[0],
   0x1,0x0,
   NULL
};

/* Die zweite Image Struktur */

struct Image Image2 =
{
   2,1,16,9,2,
   &Bild2[0],
   0x1,0x0,
   NULL
};

/* Struktur für den Menuepunkt */

struct MenuItem Item2 =
{
   NULL,
   60,0,20,11,
   ITEMENABLED | HIGHCOMP ,
   0,
   (APTR)&Image1, /* Zeiger auf die Image Struktur */
   NULL,
   0,
   NULL,
   0
};

/* Eine weitere Menuepunkt Struktur */

struct MenuItem Item1 =
{
   &Item2,
   40,0,20,11,
   ITEMENABLED | HIGHCOMP ,
   0,
   (APTR)&Image2, /* Zeiger auf das zweite Bild */
   NULL,
   0,
   NULL,
   0
};

/* Die Menue Struktur */

struct Menu  ErstesMenu =
{
   NULL,
   0,0,150,0,
   MENUENABLED,
   "Grafik-Menue",
   &Item1
};

/*************************************************
* Die NewWindow Struktur für das Fenster         *
* Alle Optionen werden mit diesem Fenster        *
* verkettet                                      *
*************************************************/
/* die NewWindow Struktur */

struct NewWindow NeuesFenster =
{
 20,             /* X Bestimmung */
 20,             /* Y Bestimmung */
 400,            /* Breite */
 100,            /* Hoehe */
 1,            /* DetailPen Bestimmung */
 2,           /* BlockPen Bestimmung */
 CLOSEWINDOW | MENUPICK | GADGETDOWN |
 NEWSIZE | MOUSEMOVE,      /* IDCMPFlags */
 WINDOWDRAG | WINDOWSIZING | ACTIVATE       /* Flags */
 | SIZEBBOTTOM | SIZEBRIGHT | WINDOWCLOSE | 
   REPORTMOUSE | FOLLOWMOUSE,
 &Boolgadget,    /* Zeiger auf das Gadget */
 NULL,           /* Kein direktes Image */
 "KICKSTART 1.88", /* Fenster Titel */
 NULL,           /* Kein Custom Screen */
 NULL,           /* Kein BitMap */
 400,             /* Minimale Breite */
 100,             /* Minimale Hoehe */
 640,            /* Maximale Breite */
 200,            /* Maximale Hoehe */
 WBENCHSCREEN    /* Bildschirm Typ */
};

/******************************************************* 
*                                                      *
* Hauptprogramm                                        *
*                                                      *
*******************************************************/

main()
{
/* Definition von Variablen                            *
*  Die Variablen werden später in der Ereignisabfrage  *
*  benötigt                                           */
 
ULONG   NachrichtenArt;
USHORT  code;
int x,y;

/* Die Message Struktur */

struct Message *GetMsg();

/* Öffnen der intuition.library */

IntuitionBase = (struct IntuitionBase *)
     OpenLibrary("intuition.library",0);
if(IntuitionBase==NULL)exit(FALSE);

/* Öffnen des Fensters */

if((Window = (struct Window *)
     OpenWindow(&NeuesFenster))==NULL)
exit(FALSE);

/* Aufrufen und verketten der Menueliste     *
*  mit dem Fenster                          */

SetMenuStrip(Window,&ErstesMenu);

/* Zuweisung fes RastPorts */

Port = Window->RPort;

/* Im Artikel sind die Funktionen erleutert */

PrintIText(Port,&Text,10,10);
DrawBorder(Port,&Rand1,0,0);

/**************************************************
* Die Endlosschleife fragt ständig die Ereignisse *
* ab und veranlaßt daraufhin einen Ausdruck       *
**************************************************/

for(;;)
  {
      if(Nachricht=(struct IntuiMessage *)
                 GetMsg(Window->UserPort))
    {
       NachrichtenArt=Nachricht->Class;
       code=Nachricht->Code;
       x = Nachricht->MouseX; /* Für die Ausgabe der */
       y = Nachricht->MouseY; /* Mausposition        */
       ReplyMsg(Nachricht);
       switch(NachrichtenArt)
         {
           case CLOSEWINDOW : ende(); /* Verzweigung in ein */   
                              break;  /* Unterprogramm      */

           case GADGETDOWN  : printf("Das Boolean Gadget\n");
                              break;
           /* Abfrage des Boolean Gadgets */
                  
           case NEWSIZE     : printf("Veränderung der Größe\n");
                              break;
           /* Abfrage der Größenveränderung */

           case MOUSEMOVE   : printf("X = %d\nY = %d\n",x,y);
                              break;
           /* Abfrage der Mausbewegung */ 
           
           case MENUPICK    : if (MENUNUM(code) != MENUNULL)
                                 Bearbeite_Menu( MENUNUM(code),
                                                 ITEMNUM(code),
                                                 SUBNUM(code));
                              break;
         } /* Abfrage des Menues */
    }
  } /* for Ende */
return(0);
} /* Hauptprogramm Ende */

/**************************************************
* Unterprogramm zum Selektieren des Menues        *
**************************************************/

Bearbeite_Menu(menu,item,subitem)
int menu,item,subitem;
{
  switch(menu)
    {
      case Menu_1 : switch(item)
                 {
                   case Item_1 : printf("menu1 item1\n");
                                 break;
                   case Item_2 : printf("menu1 item2\n");
                                 break;
                 }
               break;
    }
 return(0);
} /* Ende erstes Unterprogramm */

/*********************************************************
* Unterprogramm zum Schließen aller Einrichtungen        *
*********************************************************/
     
ende()
{
 ClearMenuStrip(Window);
 CloseWindow(Window);
 CloseLibrary(IntuitionBase);
 exit(0);
 return(0);
} /* Programmende */
