/* ListView.c

   Beispiel zur ListView Erzeugung in C
   für SAS/C 6.2
*/
#include <stdio.h>
#include <exec/types.h>
#include <exec/lists.h>
#include <exec/nodes.h>
#include <graphics/gfxbase.h>
#include <graphics/gfxmacros.h>
#include <intuition/intuition.h>
#include <intuition/intuitionbase.h>
#include <intuition/screens.h>
#include <intuition/gadgetclass.h>
#include <workbench/workbench.h>
#include <libraries/gadtools.h>
#include <libraries/asl.h>

#include <clib/exec_protos.h>
#include <clib/alib_protos.h>
#include <clib/dos_protos.h>
#include <clib/intuition_protos.h>
#include <clib/graphics_protos.h>
#include <clib/gadtools_protos.h>
#include <clib/asl_protos.h>
#include <clib/icon_protos.h>

struct TextAttr FontAttr={"topaz.font",11,0,0};

/* Dieser Vektor wird mit den Gadget-Struckturen
   gefüllt, damit man für SetGadgetAttr()-Aufrufen 
   die Pointer hat:
*/
struct Gadget *MeineGadgets[2];

/* Die Listen Elemente müssen natürlich nicht als Vektor
   vorkommen. Aber das ist am schnellsten, wenn sich die
   Sache nicht ändert.
*/
struct Node Knoten[3]={{NULL,NULL,15,0,"Erster Eintrag"},
                       {NULL,NULL,15,0,"Zweiter Eintrag"},
                       {NULL,NULL,15,0,"Dritter Eintrag"},
                      };
void 
main(void)
{  struct Gadget *gad,*GList=NULL;
   struct NewGadget ng;
   struct Screen *WB;
   struct Window *Window;
   void *VisualInfo;
   struct List Liste;
   BOOL Ende=FALSE;
   int i;

   /* !!! Vor Beginn des Programms Bibliotheken öffnen nicht vergessen!!!
    *
    * gadtools.library
    * intuition.libaray
    *
    * (SAS/C 6.2 macht das automatisch.)
    */


   /*  Liste Erzeugen und mit den Einträgen von Knoten[]
       füllen: */
   NewList(&Liste);
   for(i=0;i<3;i++)
      AddTail(&Liste,&Knoten[i]);

   /*  Die Gadtool-Funktionen brauchen VisualInfo des Screens, den man
       benutzt.
       Also besorgen wir uns einen Pointer auf die Workbench und das
       passende VisualInfo.
   */
   if(WB=LockPubScreen(NULL))
   {  VisualInfo=GetVisualInfo(WB,TAG_END);
      
         /* Hier fängt die Arbeit an:  
            Zuerst gadg mit CreateContext() initialisiern, und dann
            für jedes Gadget die NewGadget Struktur füllen
            und CreateGadget(xxx_KIND,gad,&gad,...) aufrufen.
         */
         gad=CreateContext(&GList);

         ng.ng_LeftEdge    =112;
         ng.ng_TopEdge     =170;
         ng.ng_Width       =60;
         ng.ng_Height      =20;
         ng.ng_GadgetText  ="Stopp";
         ng.ng_TextAttr    =&FontAttr;  /* <- MUSS gültig sein. */
         ng.ng_VisualInfo  =VisualInfo; /* <- MUSS gültig sein. */
         ng.ng_GadgetID    =1;
         ng.ng_Flags       =PLACETEXT_IN;
         
         MeineGadgets[0]=gad=CreateGadget(BUTTON_KIND,gad,&ng,TAG_END);

         ng.ng_LeftEdge    =25;
         ng.ng_TopEdge     =20;
         ng.ng_Width       =250;
         ng.ng_Height      =140;
         ng.ng_GadgetText  ="ListView Titel";
         ng.ng_TextAttr    =&FontAttr;  /* <- MUSS gültig sein. */
         ng.ng_VisualInfo  =VisualInfo; /* <- MUSS gültig sein. */
         ng.ng_GadgetID    =2;
         ng.ng_Flags       =PLACETEXT_ABOVE;

         MeineGadgets[1]=gad=CreateGadget(LISTVIEW_KIND,gad,&ng,
                                          GTLV_Labels,&Liste,
                                          TAG_END);


         /* Wenn alle Gadgets erzeugt sind kann man das Fenster öffnen:*/
         if (Window=OpenWindowTags(NULL,
                                   WA_Width,   300,
                                   WA_Height,  200,
                                   WA_Gadgets, GList,
                                   WA_IDCMP,   LISTVIEWIDCMP|BUTTONIDCMP,
                                   TAG_DONE))
         {  /* Nach dem Fenster öffnen muß   GT_RefreshWindow(Window,NULL)
               aufgerufen, um die Gadgets vollständig zeichnen zu lassen.
            */
            GT_RefreshWindow(Window,NULL);



            /* Die Bearbeitung der IntuiMessages erfolgt ähnlich, wie
               ohne Gadtools. Statt GetMsg() und ReplyMsg()
               [1mmüssen[0m jedoch GT_GetIMsg() GT_ReplyIMsg() verwendet 
               werden.
            */
            while(!Ende)
            {  struct IntuiMessage *IMsg;
               ULONG Class;
               UWORD Code;
               struct Gadget *g;

               Wait(1<<Window->UserPort->mp_SigBit);
               while(IMsg=GT_GetIMsg(Window->UserPort))
               {  
                  Class=IMsg->Class;
                  Code =IMsg->Code;
                  g    =(struct Gadget *)IMsg->IAddress;
                  GT_ReplyIMsg(IMsg);
                                   
                  switch(Class)
                  {  case IDCMP_GADGETUP:
                        if(g->GadgetID==1)
                        {  puts("Ende");  
                           Ende=TRUE;
                        }
                        else if(g->GadgetID==2)
                        {  printf("ListView Eintrag %d gewählt\n",Code); 
                        }
                        break;
                     default:
                        /* Das sind größtenteils IDCMP_INTUITICKS */
                        printf("Anderes Ereignis, %x %x\n",IMsg,Class);
                        break;
                  } 
               }
            }
      /* Aufräumen ist oberste Pflicht: */

            CloseWindow(Window);
         }

      FreeGadgets(GList);
      FreeVisualInfo(VisualInfo);
      if(WB) UnlockPubScreen(NULL, WB);
   }
}

