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

#include <exec/types.h>
#include <exec/memory.h>
#include <exec/lists.h>
#include <exec/nodes.h>
#include <intuition/intuition.h>
#include <intuition/gadgetclass.h>
#include <graphics/displayinfo.h>
#include <graphics/gfxbase.h>
#include <graphics/gfxmacros.h>
#include <libraries/gadtools.h>
#include <libraries/dos.h>
#include <libraries/asl.h>

#include <clib/exec_protos.h>
#include <clib/intuition_protos.h>
#include <clib/gadtools_protos.h>
#include <clib/graphics_protos.h>
#include <clib/utility_protos.h>
#include <clib/alib_protos.h>
#include <clib/dos_protos.h>
#include <clib/asl_protos.h>
#include "string.h" 

#define ID_button                         			0
#define ID_button1                        			1
#define ID_string                         			2
#define ID_integer                        			3
#define ID_check                          			4
#define ID_mxmodel                        			5
#define ID_cycle                          			6
#define ID_slider                         			7
#define ID_scroller                       			8
#define ID_scroller1                      			9
#define ID_modellist                      			10
#define ID_color                          			11
#define ID_text                           			12
#define ID_number                         			13

#define BasicNumGads			14
#include "Basic.h" 

int buttonObj(struct VAobject VAObject);
int button1Obj(struct VAobject VAObject);
int stringObj(struct VAobject VAObject);
int integerObj(struct VAobject VAObject);
int checkObj(struct VAobject VAObject);
int mxmodelObj(struct VAobject VAObject);
int cycleObj(struct VAobject VAObject);
int sliderObj(struct VAobject VAObject);
int scrollerObj(struct VAobject VAObject);
int scroller1Obj(struct VAobject VAObject);
int modellistObj(struct VAobject VAObject);
int colorObj(struct VAobject VAObject);

int GetPubScreen(void);
void ClosePubScreen(void);
int OpenBasicWindow(char windtitle[80]);
void CloseBasicWindow(void);
int BasicHandler(void);
int BasicMainHandler(void);
void DrawBasicObjs(void);
int main(int argc, char *argv[]);

UBYTE				*PubScrName = NULL;
APTR				 VisualInfo = NULL;
struct Screen			*Scr = NULL;
struct Window			*BasicWnd = NULL;
struct Gadget			*BasicGList = NULL;
struct Gadget			*BasicGadgets[14];
struct IntuiMessage		 BasicMsg;
UWORD				 BasicLeft = 34;
UWORD				 BasicTop = 22;
UWORD				 BasicWidth = 559;
UWORD				 BasicHeight = 136;
struct TextAttr topaz8 = { (STRPTR)"topaz.font", 8, 0x00, 0x01 };
struct TextAttr topaz800 = { (STRPTR)"topaz.font", 8, 0x00, 0x00 };

UBYTE *modelsLabels[] = {
	(UBYTE *)"Amiga 500", 
	(UBYTE *)"Amiga 600", 
	(UBYTE *)"Amiga 1000", 
	(UBYTE *)"Amiga 1200", 
	(UBYTE *)"Amiga 2000", 
	(UBYTE *)"Amiga 2500", 
	(UBYTE *)"Amiga 2500HD", 
	(UBYTE *)"Amiga 3000", 
	(UBYTE *)"Amiga 4000", 
	(UBYTE *)"Amiga CDTV", 
	(UBYTE *)"Amiga CD32", 
	(UBYTE *)"Amiga 4000T", 
	NULL
};

WORD BasicGadTypes[] = {
	BUTTON_KIND,
	BUTTON_KIND,
	STRING_KIND,
	INTEGER_KIND,
	CHECKBOX_KIND,
	MX_KIND,
	CYCLE_KIND,
	SLIDER_KIND,
	SCROLLER_KIND,
	SCROLLER_KIND,
	LISTVIEW_KIND,
	PALETTE_KIND,
	TEXT_KIND,
	TEXT_KIND,
};

struct NewGadget BasicNGads[] = {
	6, 2, 105, 13, (UBYTE *)"Button",&topaz800, ID_button, PLACETEXT_IN, NULL, (APTR)buttonObj,
	113, 2, 108, 13, (UBYTE *)"Toggle Button",&topaz800, ID_button1, PLACETEXT_IN, NULL, (APTR)button1Obj,
	289, 13, 125, 12, (UBYTE *)"Name", &topaz800, ID_string, PLACETEXT_LEFT, NULL, (APTR)stringObj,
	289, 26, 124, 12, (UBYTE *)"Version", &topaz800, ID_integer, PLACETEXT_LEFT, NULL, (APTR)integerObj,
	289, 1, 26, 11, (UBYTE *)"Visual Arts", &topaz800, ID_check, PLACETEXT_RIGHT, NULL, (APTR)checkObj,
	426, 2, 17, 118, (UBYTE *)"model", &topaz800, ID_mxmodel, PLACETEXT_RIGHT, NULL, (APTR)mxmodelObj,
	269, 66, 148, 14, (UBYTE *)"Models", &topaz800, ID_cycle, PLACETEXT_LEFT, NULL, (APTR)cycleObj,
	109, 111, 310, 10, (UBYTE *)"Slider   ", &topaz800, ID_slider, PLACETEXT_LEFT, NULL, (APTR)sliderObj,
	175, 65, 20, 42, (UBYTE *)"", &topaz800, ID_scroller, PLACETEXT_RIGHT, NULL, (APTR)scrollerObj,
	7, 97, 164, 10, (UBYTE *)"", &topaz800, ID_scroller1, PLACETEXT_LEFT, NULL, (APTR)scroller1Obj,
	7, 16, 211, 44, (UBYTE *)"", &topaz800, ID_modellist, PLACETEXT_ABOVE, NULL, (APTR)modellistObj,
	291, 40, 124, 24, (UBYTE *)"", &topaz800, ID_color, PLACETEXT_ABOVE, NULL, (APTR)colorObj,
	270, 82, 147, 12, (UBYTE *)"Text", &topaz800, ID_text, PLACETEXT_LEFT, NULL, NULL,
	270, 97, 147, 13, (UBYTE *)"Version", &topaz800, ID_number, PLACETEXT_LEFT, NULL, NULL,
};

ULONG BasicNTags[] = {
	TAG_DONE,
	TAG_DONE,
	(GTST_String), (ULONG)"Visual Arts", GTST_MaxChars, 40, (STRINGA_Justification), GACT_STRINGLEFT, TAG_DONE,
	(GTIN_Number), (ULONG)1, (GTIN_MaxChars), 10, (STRINGA_Justification), GACT_STRINGLEFT, TAG_DONE,
	(GTCB_Checked), TRUE, TAG_DONE,
	(GTMX_Labels), (ULONG)&modelsLabels[0], (GTMX_Active), 4, (GTMX_Spacing), 2, TAG_DONE,
	(GTCY_Labels), (ULONG)&modelsLabels[0], (GTCY_Active), 0, TAG_DONE,
	(GTSL_Min), 20, (GTSL_Max), 100, (GTSL_Level), 20, (GTSL_LevelFormat), (ULONG)"%3ld", (GTSL_MaxLevelLen), 0, (GTSL_LevelPlace), PLACETEXT_LEFT, (GA_Immediate), TRUE, (GA_RelVerify), TRUE, (PGA_Freedom), LORIENT_HORIZ, TAG_DONE,
	(GTSC_Top), -20, (GTSC_Total), 30, (GTSC_Visible), 10, (GTSC_Arrows), 8, (GA_Immediate), TRUE, (GA_RelVerify), TRUE, (PGA_Freedom), LORIENT_VERT, TAG_DONE,
	(GTSC_Top), 0, (GTSC_Total), 40, (GTSC_Visible), 10, (GTSC_Arrows), 16, (GA_Immediate), TRUE, (GA_RelVerify), TRUE, (PGA_Freedom), LORIENT_HORIZ, TAG_DONE,
	(GTLV_Labels), NULL, (GTLV_Top), 0, (GTLV_ScrollWidth), 16, (GTLV_ShowSelected), NULL, (LAYOUTA_Spacing), 0, TAG_DONE,
	(GTPA_Depth), 2, (GTPA_Color), 1, (GTPA_ColorOffset), 0, (GTPA_IndicatorWidth), 20, TAG_DONE,
	(GTTX_Text),(ULONG)"Visual Arts", (GTTX_Border), TRUE, TAG_DONE,
	(GTTX_Text),(ULONG)"1", (GTTX_Border), TRUE, TAG_DONE,
};


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

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

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

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

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

  for (i=0, j=0; i < BasicNumGads; i++)
  {
    CopyMem((char *)&BasicNGads[i], (char *)&NewGad, (long)sizeof(struct NewGadget));

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

    BasicGadgets[i] = Gad = CreateGadgetA((ULONG)BasicGadTypes[i], Gad,&NewGad,
	(struct TagItem *)&BasicNTags[j]);
    while (BasicNTags[j])
        j +=2;
    j++;
    if (!Gad)
       return(2L);
  }
  BasicGadgets[1]->Activation |= GACT_TOGGLESELECT;
  if (!(BasicWnd = OpenWindowTags(NULL,
  	WA_Left,	BasicLeft,
  	WA_Top, 	BasicTop,
  	WA_Width,	BasicWidth,
  	WA_Height,	BasicHeight - Scr->WBorTop,
  	WA_IDCMP,	IDCMP_CLOSEWINDOW |  IDCMP_NEWSIZE | IDCMP_MOUSEBUTTONS | IDCMP_MOUSEMOVE | IDCMP_GADGETUP | IDCMP_GADGETDOWN | IDCMP_REFRESHWINDOW | IDCMP_INTUITICKS ,
  	WA_Flags,	WFLG_CLOSEGADGET | WFLG_DEPTHGADGET  |  WFLG_SMART_REFRESH |  WFLG_RMBTRAP |  WFLG_ACTIVATE |  WFLG_DRAGBAR ,
  	WA_Gadgets,	BasicGList,
  	WA_Title,	windtitle,
  	WA_ScreenTitle,	"Visual Arts V1.0 Copyright 1994 Danny Y. Wong  All Rights Reserved.",
  	WA_PubScreen,	Scr,
  	WA_MinWidth,	20,
  	WA_MinHeight,	10,
  	WA_MaxWidth,	640,
  	WA_MaxHeight,	200,
  	TAG_DONE)))
  	    return(3L);

  DrawBasicObjs();
  GT_RefreshWindow(BasicWnd, NULL);
  CreateBasicLists();
  GT_SetGadgetAttrs(BasicGadgets[10], BasicWnd, NULL,
 	GTLV_Labels, BasicLists[0], TAG_END);
  RefreshGadgets(BasicGadgets[0], BasicWnd, NULL);
  return(0L);
}

void CloseBasicWindow(void)
{
  if (BasicWnd)
	CloseWindow(BasicWnd);
  if (BasicGList)
	FreeGadgets(BasicGList);
}

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

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

    GT_ReplyIMsg(msg);
    switch(class)
    {

	  case IDCMP_MOUSEBUTTONS :
	    break;

	  case IDCMP_MOUSEMOVE :
	    break;

	  case IDCMP_GADGETDOWN :
	    break;

	  case IDCMP_INTUITICKS :
	    break;

	  case IDCMP_REFRESHWINDOW:
		GT_BeginRefresh(BasicWnd);
		DrawBasicObjs();
		GT_EndRefresh(BasicWnd, NULL);
		break;

	  case IDCMP_CLOSEWINDOW:
	     return(0);
	     break;

	  case IDCMP_GADGETUP:
	    VAObject.va_Window = (struct Window *)BasicWnd;
	    VAObject.va_Gadget = (struct Gadget *)msg->IAddress;
	    VAObject.va_IntuiMsg = (struct IntuiMessage *)msg;
	    VAObject.va_Flags = 0;
	    VAObject.va_UserData = 0;
	    func = (void *)((struct Gadget *)BasicMsg.IAddress)->UserData;
	    running =  func(VAObject);
	    break;

    }
  }
  return(running);
}

void DrawBasicObjs(void)
{
  BasicDrawRects(BasicWnd);

}

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

  while (running == 1)
  {
    windsig = 1L << BasicWnd->UserPort->mp_SigBit;
    signals = Wait( windsig );
    if (signals & windsig)
    {
	  running = BasicHandler();
    }
  }
  return(running);
}

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

  if (!(GetPubScreen()))
  {
	for (rc=0; rc < 1; rc++)
	  BasicLists[rc]=GetNewList();
	if (!(OpenBasicWindow("Basic Demo")))
	{
	  rc = BasicMainHandler();
	  CloseBasicWindow();
	}
	for (rc=0; rc < 1; rc++)
	  FreeList(BasicLists[rc]);
	ClosePubScreen();
  }
}
