/*********************************************************************
 *
 *  boopsi_1.c 
 *  Przykīadowy program pokazujācy 
 *  w jaki sposób tworzyź obiekt BOOPSI
 *
 *********************************************************************/

#include <exec/types.h>
#include <utility/tagitem.h>
#include <intuition/intuition.h>
#include <intuition/gadgetclass.h> 
#include <intuition/icclass.h>     
#include <clib/exec_protos.h>
#include <clib/intuition_protos.h>

/********************************************************************/

struct IntuitionBase    *IntuitionBase = NULL;
struct Window           *w = NULL;
struct Gadget           *propgadget = NULL; 
struct Gadget           *strgadget = NULL;

/********************************************************************/

void   cleanup();
void   loop();

/********************************************************************/

#define MINWINDOWWIDTH      100
#define MINWINDOWHEIGHT     50

#define VISIBLE             10
#define TOTAL               100
#define INITIALVAL          25
#define MAXCHAR             3

#define PROPGADGETID        1L
#define PROPGADGETTOP       12
#define PROPGADGETWIDTH     10
#define RELRIGHT           -13
#define RELHEIGHT          -11

#define STRGADGETID         2
#define STRGADGETTOP        30
#define STRGADGETLEFT       20
#define STRGADGETWIDTH      50
#define STRGADGETHEIGHT     12


/*********************************************************************/

struct TagItem	proptags[] = 
{   
    { GA_TOP,           PROPGADGETTOP },
    { GA_RELRIGHT,	RELRIGHT },
    { GA_WIDTH,		PROPGADGETWIDTH },	
    { GA_RELHEIGHT,     2 * RELHEIGHT - 1 },
    { GA_ID,		PROPGADGETID },
    { GA_IMMEDIATE,	TRUE },
    { GA_RELVERIFY,	TRUE },
    { PGA_FREEDOM,	FREEVERT},
    { PGA_VISIBLE,	VISIBLE},		
    { PGA_TOTAL,        TOTAL },
    { PGA_TOP,          INITIALVAL },
    { PGA_NewLook ,     TRUE },
    { TAG_END ,}
};

struct TagItem	stringtags[] = {
    { GA_ID,            STRGADGETID },
    { GA_TOP,		STRGADGETTOP },
    { GA_LEFT,          STRGADGETLEFT },
    { GA_WIDTH,		STRGADGETWIDTH },
    { GA_IMMEDIATE,	TRUE },
    { GA_RELVERIFY,	TRUE },
    { GA_HEIGHT,        STRGADGETHEIGHT },
    { STRINGA_MaxChars,	MAXCHAR },
    { STRINGA_LongVal,	INITIALVAL },	
    { STRINGA_Justification, STRINGRIGHT },
    { TAG_END, }
};

/************************************************************************/

main()
{


    if (!(IntuitionBase = (struct IntuitionBase *)OpenLibrary("intuition.library", 37L)))
    {
        cleanup(" Nie moge otworzyc Biblioteki Intuition wer. 37\n" );
    }                                
    
    if (!(w = OpenWindowTags(NULL,
                             WA_Flags,     WFLG_DEPTHGADGET | 
                                           WFLG_DRAGBAR |
                                           WFLG_CLOSEGADGET | 
                                           WFLG_SIZEGADGET,
                             WA_IDCMP,     IDCMP_CLOSEWINDOW |
                                           IDCMP_GADGETUP |
                                           IDCMP_GADGETDOWN,
                             WA_Title,     " Gadgety BOOPSI ",
                             WA_MinWidth,  MINWINDOWWIDTH,
                             WA_MinHeight, MINWINDOWHEIGHT,
                             TAG_END)))
    {
        cleanup(" Nie moge otworzyc okna\n");
    }
     
    if (propgadget = (struct Gadget *)NewObjectA( NULL, "propgclass",&proptags[0] ))
    {

         if (strgadget = (struct Gadget *)NewObject( NULL , "strgclass" ,
                                                     GA_PREVIOUS , propgadget ,
                                                     TAG_MORE , stringtags ,
                                                     TAG_END ))
         {

              AddGList(w, propgadget, -1, -1, NULL);  
              RefreshGList(propgadget, w, NULL, -1);  
         
              loop( w );
         
              RemoveGList(w, propgadget, -1);

              DisposeObject(strgadget);
              
         }
         
         DisposeObject( propgadget );
     
    }

    cleanup(" OK\n");    
}

/************************************************************************/

void cleanup( char *str )
{
    if (str) printf("%s\n", str);

    if ( w ) CloseWindow( w );
    if (IntuitionBase) CloseLibrary(( struct Library *)IntuitionBase);

    exit (0);
}

/***********************************************************************/

void loop( struct Window *w )
{
   BOOL done = FALSE;
   struct IntuiMessage     *msg = NULL;
   
   while (done == FALSE)     
   {                         
       WaitPort((struct MsgPort *)w->UserPort);
       while (msg = (struct IntuiMessage *)GetMsg((struct MsgPort *)w->UserPort))
       {
           ULONG class = msg->Class;
           UWORD code  = msg->Code;
           struct Gadget *gadget = (struct Gadget *)msg->IAddress;
           LONG val;
           
           ReplyMsg((struct Message *)msg);        
           
           switch( class )
           {
           
           case IDCMP_CLOSEWINDOW:
                 
              done = TRUE;
              break;
                 
           case IDCMP_GADGETUP:
                 
              switch( gadget->GadgetID )
              {
              case PROPGADGETID:
                    
                 GetAttr( PGA_TOP , gadget , &val );
                 SetAttrs( strgadget , STRINGA_LongVal , val , TAG_END );
                 RefreshGList(propgadget, w, NULL, -1);
                 break;
                    
              case STRGADGETID:
                    
                 GetAttr( STRINGA_LongVal , gadget , &val );
                 SetGadgetAttrs( propgadget , w , NULL ,
                                 PGA_TOP , val , TAG_END );
                 break;
                    
              }
       
           break;
              
           }
       }
   }
}
