/* ******************************************************************** */
/* C code generated by:							*/
/* Visual Arts Version 2.1						*/
/* Copyright 1994-95 Danny Y. Wong  All rights reserved			*/
/* Calgary, Alberta (CANADA)                        			*/
/* Partial of the code is copyright by Jaba Development			*/
/* ******************************************************************** */

#include <VisualArts.h>
#include <clib/VisualArts_protos.h>

#define ID_Quit                           			0

#define IconNumGads						1
#define ID_icon1                          			1
#define ID_icon2                          			2
#define ID_icon3                          			3
#define ID_icon4                          			4
#define ID_icon5                          			5

#include "Icon_func.c" 

#include "Icon_images.c" 

int QuitObj(struct VAobject VAObject);
int icon1Obj(struct VAobject VAObject);
int icon2Obj(struct VAobject VAObject);
int icon3Obj(struct VAobject VAObject);
int icon4Obj(struct VAobject VAObject);
int icon5Obj(struct VAobject VAObject);

int GetPubScreen(void);
void ClosePubScreen(void);
int OpenIconWindow(char windtitle[]);
void CloseIconWindow(void);
int IconHandler(void);
int IconMainHandler(void);
void DrawIconObjs(void);
int main(int argc, char *argv[]);

UBYTE				*PubScrName = "Workbench";
struct DrawInfo			*ScrDrawInfo = NULL;
APTR				 VisualInfo = NULL;
struct Screen			*Scr = NULL;
struct Window			*IconWnd = NULL;
struct Gadget			*IconGList = NULL;
struct Gadget			*IconGadgets[IconNumGads];
struct IntuiMessage		 IconMsg;
UWORD				 IconLeft = 118;
UWORD				 IconTop = 63;
UWORD				 IconWidth = 307;
UWORD				 IconHeight = 56;
struct TextAttr topaz8 = { (STRPTR)"topaz.font", 8, 0x00, 0x01 };
struct TextAttr topaz800 = { (STRPTR)"topaz.font", 8, 0x00, 0x00 };

WORD IconGadTypes[] = {
	BUTTON_KIND,
};

struct NewGadget IconNGads[] = {
	124, 30, 62, 12, (UBYTE *)"Quit",&topaz800, ID_Quit, PLACETEXT_IN, NULL, (APTR)QuitObj,
};

ULONG IconNTags[] = {
	TAG_DONE,
};

struct Gadget icon1Gad = {
	NULL, 14, 13, 52, 23, 
	GFLG_GADGHIMAGE | GFLG_GADGIMAGE, GACT_IMMEDIATE | GACT_RELVERIFY,
	GTYP_BOOLGADGET, (APTR)&def_makefileImage, (APTR)&def_makefile1Image, NULL, 0x0, NULL,
	ID_icon1, (APTR)icon1Obj
};

struct Gadget icon2Gad = {
	&icon1Gad, 126, 13, 54, 23, 
	GFLG_GADGHIMAGE | GFLG_GADGIMAGE, GACT_IMMEDIATE | GACT_RELVERIFY,
	GTYP_BOOLGADGET, (APTR)&ShellImage, (APTR)&Shell1Image, NULL, 0x0, NULL,
	ID_icon2, (APTR)icon2Obj
};

struct Gadget icon3Gad = {
	&icon2Gad, 70, 13, 52, 23, 
	GFLG_GADGHIMAGE | GFLG_GADGIMAGE, GACT_IMMEDIATE | GACT_RELVERIFY,
	GTYP_BOOLGADGET, (APTR)&def_mapImage, (APTR)&def_map1Image, NULL, 0x0, NULL,
	ID_icon3, (APTR)icon3Obj
};

struct Gadget icon4Gad = {
	&icon3Gad, 242, 13, 54, 22, 
	GFLG_GADGHIMAGE | GFLG_GADGIMAGE, GACT_IMMEDIATE | GACT_RELVERIFY,
	GTYP_BOOLGADGET, (APTR)&AppLauncherImage, (APTR)&AppLauncher1Image, NULL, 0x0, NULL,
	ID_icon4, (APTR)icon4Obj
};

struct Gadget icon5Gad = {
	&icon4Gad, 184, 13, 54, 23, 
	GFLG_GADGHIMAGE | GFLG_GADGIMAGE, GACT_IMMEDIATE | GACT_RELVERIFY,
	GTYP_BOOLGADGET, (APTR)&DPaintImage, (APTR)&DPaint1Image, NULL, 0x0, NULL,
	ID_icon5, (APTR)icon5Obj
};


int GetPubScreen(void)
{
  if (!(Scr = LockPubScreen(PubScrName)))
	return(1L);

  if (!(VisualInfo = GetVisualInfo(Scr, TAG_DONE)))
	return(2L);

  if (!(ScrDrawInfo = GetScreenDrawInfo(Scr)))
	return(3L);
  return(0L);
}

void ClosePubScreen(void)
{
  if (VisualInfo)
    FreeVisualInfo(VisualInfo);
  if (Scr)
    UnlockPubScreen(NULL,  Scr);
  if (ScrDrawInfo)
    FreeScreenDrawInfo(Scr,  ScrDrawInfo);
}

int OpenIconWindow(char windtitle[80])
{
  struct NewGadget	NewGad;
  struct Gadget   	*Gad;
  register UWORD i, j;
  UWORD offsetx = Scr->WBorLeft;
  UWORD offsety = Scr->WBorTop + Scr->Font->ta_YSize + 1;

  if (!(Gad = CreateContext(&IconGList)))
  	return(1L);

  icon1Gad.TopEdge += kWindowOffSetY;
  icon2Gad.TopEdge += kWindowOffSetY;
  icon3Gad.TopEdge += kWindowOffSetY;
  icon4Gad.TopEdge += kWindowOffSetY;
  icon5Gad.TopEdge += kWindowOffSetY;
  for (i=0, j=0; i < IconNumGads; i++)
  {
    CopyMem((char *)&IconNGads[i], (char *)&NewGad, (long)sizeof(struct NewGadget));

    NewGad.ng_VisualInfo = VisualInfo;
    NewGad.ng_LeftEdge += offsetx;
    NewGad.ng_TopEdge  += offsety;

    IconGadgets[i] = Gad = CreateGadgetA((ULONG)IconGadTypes[i], Gad, &NewGad,
	(struct TagItem *)&IconNTags[j]);
    while (IconNTags[j])
        j +=2;
    j++;
    if (!Gad)
       return(2L);
  }
  IconGadgets[i-1]->NextGadget = &icon5Gad;
  if (!(IconWnd = OpenWindowTags(NULL,
  	WA_Left,	IconLeft,
  	WA_Top, 	IconTop,
  	WA_Width,	IconWidth,
  	WA_Height,	IconHeight + kWindowOffSetY,
  	WA_NewLookMenus, TRUE,
  	WA_IDCMP,	IDCMP_CLOSEWINDOW | IDCMP_GADGETUP | IDCMP_GADGETDOWN ,
  	WA_Flags,	WFLG_CLOSEGADGET  |  WFLG_SMART_REFRESH | 
			 WFLG_RMBTRAP |  WFLG_ACTIVATE | 
			 WFLG_DRAGBAR ,
  	WA_Gadgets,	IconGList,
  	WA_Title,	windtitle,
  	WA_ScreenTitle,	"Visual Arts V2.2 Copyright 1994-95 Danny Y. Wong  All Rights Reserved.",
  	WA_PubScreen,	Scr,
  	WA_MinWidth,	160,
  	WA_MinHeight,	50,
  	WA_MaxWidth,	640,
  	WA_MaxHeight,	200,
  	TAG_DONE)))
  	    return(3L);

  DrawIconObjs();
  GT_RefreshWindow(IconWnd, NULL);
  RefreshGadgets(IconGadgets[0], IconWnd, NULL);
  return(0L);
}

void CloseIconWindow(void)
{
  if (IconWnd)
	CloseWindow(IconWnd);
  if (IconGList)
	FreeGadgets(IconGList);
}

int IconHandler(void)
{
  struct IntuiMessage	*msg;
  struct VAobject	VAObject;
  int running	= 1;
  int (*func)(struct VAobject VAObject);
  ULONG class;
  UWORD code;

  while (msg=GT_GetIMsg(IconWnd->UserPort))
  {
    CopyMem((char *)msg, (char *)&IconMsg, (long)sizeof(struct IntuiMessage));
    class = msg->Class;
    code  = msg->Code;

    VAObject.va_Window = (struct Window *)IconWnd;
    VAObject.va_Gadget = (struct Gadget *)msg->IAddress;
    VAObject.va_IntuiMsg = (struct IntuiMessage *)msg;
    VAObject.va_Flags = 0;
    VAObject.va_UserData = 0;

    GT_ReplyIMsg(msg);
    switch(class)
    {

	  case IDCMP_CLOSEWINDOW:
	     return(0);
	     break;

	  case IDCMP_GADGETUP:
	    func = (void *)((struct Gadget *)IconMsg.IAddress)->UserData;
	    if (func != NULL)
	      running =  func(VAObject);
	    break;

    }
  }
  return(running);
}

void DrawIconObjs(void)
{
  IconDrawRects(IconWnd);

}

int IconMainHandler(void)
{
  int running = 1;
  ULONG windsig, signals;

  windsig = 1L << IconWnd->UserPort->mp_SigBit;

  while (running == 1)
  {
    signals = Wait( windsig );
    if (signals & windsig)
    {
	  running = IconHandler();
    }
  }
  return(running);
}

int main(int argc, char *argv[])
{
  int rc;

  if (!(GetPubScreen()))
  {
	if (!(OpenIconWindow("Icon Demo")))
	{
	  rc = IconMainHandler();
	  CloseIconWindow();
	}
	ClosePubScreen();
  }
  return(0L);
}
