/* demotextb.c -- demonstration of 		:ts=8
 * Basic Object Oriented Programming System for Intuition
 *
 * Demonstrates use of a text button object (from class "textbclass").
 */

/*
Copyright (c) 1989 Commodore-Amiga, Inc.

Executables based on this information may be used in software
for Commodore Amiga computers. All other rights reserved.
This information is provided "as is"; no warranties are made.
All use is at your own risk, and no liability or responsibility
is assumed.
*/

#include "sysall.h"

#define D(x)	;

void cleanup(char	*str);
void goHandleWindow(struct Window	*w);

struct  Library   *IntuitionBase;
struct  Library   *GfxBase;
struct  Library   *UtilityBase;

ULONG	myiflags = GADGETDOWN | GADGETUP | CLOSEWINDOW;

/* objects to be created	*/
void		*initTextBClass();
void		*TextBClass = NULL;
struct Gadget	*textbutton = NULL;

void		*initFrame1Class();
void		*Frame1Class = NULL;
struct Image	*frameimage = NULL;

void main(void)
{
    struct DrawInfo	*GetScreenDrawInfo();
    struct DrawInfo	*drinfo;

    struct Window 	*OpenWindowTags();
    struct Window	*w;

    if (!(UtilityBase=OpenLibrary("utility.library",36L)))
    { cleanup("no V36 utility library\n"); }

    if (!(IntuitionBase = OpenLibrary("intuition.library", 36L)))
    { cleanup("no V36 intuition library\n"); }

    if (!(GfxBase =  OpenLibrary("graphics.library", 36L)))
    { cleanup("no V36 graphics library\n"); }

    D( printf("about to openwindow\n") );
    w = OpenWindowTags( NULL,
		WA_Title,	"boopsi Test Window",
		WA_SimpleRefresh, TRUE,
		WA_NoCareRefresh, TRUE,
		WA_DepthGadget,	TRUE,
		WA_DragBar,	TRUE,
		WA_Left,	300,
		WA_Top,		50,
		WA_Width,	280,
		WA_Height,	120,
		WA_IDCMP,	myiflags,
		WA_CloseGadget,	TRUE,
    		TAG_END );
    D( printf("window at %lx\n ", w ) );

    if ( w == NULL) cleanup( "couldn't open my window.\n");
    drinfo = GetScreenDrawInfo( w->WScreen );

    /* create a frame image which can be shared by contents
     * of different sizes
     */
    Frame1Class = initFrame1Class();
    frameimage =  (struct Image *) NewObject( Frame1Class, NULL, TAG_END );

    /* create a text button gadget using
     * a "simple ascii string" as a label
     */
    TextBClass = initTextBClass();
    textbutton =  (struct Gadget *) NewObject( TextBClass, NULL,
		GA_LEFT,	30,
		GA_TOP,		20,
		GA_TEXT,	"My Gadget",
		GA_IMAGE,	frameimage,
		GA_ID,		0xf00d,
		GA_DRAWINFO,	drinfo,		/* textbuttons need this now */
    		TAG_END );

    D(printf("objects initialized\n"));

    /* make it a little bigger, but want to see centered text */
    SetGadgetAttrs( textbutton, NULL, NULL,
		    	GA_WIDTH, textbutton->Width + 20,
			GA_DRAWINFO,	drinfo,		/* since no window */
			TAG_END );

    AddGList( w, textbutton, -1, -1, NULL );
    RefreshGList( textbutton, w, NULL, -1 );

    D( printf("gadgets added and refreshed \n") );

    goHandleWindow( w );

    RemoveGList( w, textbutton, -1 );
    FreeScreenDrawInfo( w->WScreen, drinfo );
    CloseWindow( w );

    D( printf("dispose\n") );
    DisposeObject( textbutton );
    DisposeObject( frameimage);
    freeTextBClass( TextBClass );
    freeFrame1Class( Frame1Class );

    cleanup( "all done" );
}

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

    if (IntuitionBase) CloseLibrary(IntuitionBase);
    if (GfxBase) CloseLibrary(GfxBase);
    if (UtilityBase) CloseLibrary(UtilityBase);

    exit (0);
}

/* this variable holds the integer "current value" of the
 * whole little system of gadgets
 */
LONG		currval = 0;

void goHandleWindow(struct Window	*w)
{
    struct IntuiMessage *imsg;
    struct Gadget	*g;

    for(;;)
    {
	WaitPort( w->UserPort );
	while ( imsg = (struct IntuiMessage *) GetMsg( w->UserPort ) )
	{
	    switch ( imsg->Class )
	    {
	    case CLOSEWINDOW:
	    	ReplyMsg( (struct Message *) imsg );
		return;

	    case GADGETDOWN:
		D( printf("gadget down, %lx\n", imsg->IAddress ) );
		break;

	    case GADGETUP:
		g = (struct Gadget *) imsg->IAddress;
		D( printf("gadget up, %lx, id %lx\n",
			imsg->IAddress, g->GadgetID ) );
		break;
	    }
	    ReplyMsg( (struct Message *) imsg );
	}
    }
}
