/* ******************************************************************** */
/* 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_new                            			0
#define ID_quit                           			1
#define ID_selectmodel                    			2
#define ID_Import                         			3
#define ID_comp1                          			4
#define ID_comp                           			5
#define ID_employees                      			6
#define ID_level                          			7
#define ID_cars                           			8
#define ID_computer                       			9
#define ID_color                          			10

#define GadToolsNumGads						11

#include "GadTools_func.c" 

int newObj(struct VAobject VAObject);
int quitObj(struct VAobject VAObject);
int selectmodelObj(struct VAobject VAObject);
int ImportObj(struct VAobject VAObject);
int comp1Obj(struct VAobject VAObject);
int compObj(struct VAobject VAObject);
int employeesObj(struct VAobject VAObject);
int levelObj(struct VAobject VAObject);
int carsObj(struct VAobject VAObject);
int computerObj(struct VAobject VAObject);
int colorObj(struct VAobject VAObject);

int GadToolsIDCMP_MOUSEBUTTONS (struct VAobject VAObject);
int GadToolsIDCMP_MOUSEMOVE (struct VAobject VAObject);
int GadToolsIDCMP_INTUITICKS (struct VAobject VAObject);
int GetPubScreen(void);
void ClosePubScreen(void);
int OpenGadToolsWindow(char windtitle[]);
void CloseGadToolsWindow(void);
int GadToolsHandler(void);
int GadToolsMainHandler(void);
void DrawGadToolsObjs(void);
int main(int argc, char *argv[]);

UBYTE				*PubScrName = "Workbench";
struct DrawInfo			*ScrDrawInfo = NULL;
APTR				 VisualInfo = NULL;
struct Screen			*Scr = NULL;
struct Window			*GadToolsWnd = NULL;
struct Menu			*GadToolsMenus = NULL;
struct Gadget			*GadToolsGList = NULL;
struct Gadget			*GadToolsGadgets[GadToolsNumGads];
struct IntuiMessage		 GadToolsMsg;
UWORD				 GadToolsLeft = 88;
UWORD				 GadToolsTop = 34;
UWORD				 GadToolsWidth = 421;
UWORD				 GadToolsHeight = 136;
struct NewMenu GadToolsNewMenu1[] = {

  { NM_TITLE, "Project", 0 , 0 , 0 , 0,},
  {  NM_ITEM, "About", 0 ,  0L , 0 , (APTR)AboutMenuObj,},
  {  NM_ITEM, NM_BARLABEL, 0 , 0 , 0 , 0,},
  {  NM_ITEM, "Open", 0 ,  0L , 0 , (APTR)OpenMenuObj,},
  {  NM_ITEM, "Save", 0 ,  0L , 0 , (APTR)SaveMenuObj,},
  {  NM_ITEM, NM_BARLABEL, 0 , 0 , 0 , 0,},
  {  NM_ITEM, "Quit", 0 ,  0L , 0 , (APTR)QuitMenuObj,},

  { NM_TITLE, "Edit", 0 , 0 , 0 , 0,},
  {  NM_ITEM, "Undo", "Z",  0L  , 0, (APTR)UndoMenuObj,},
  {  NM_ITEM, NM_BARLABEL, 0 , 0 , 0 , 0,},
  {  NM_ITEM, "Copy", "C",  0L  , 0, (APTR)CopyMenuObj,},
  {  NM_ITEM, "Cut", "X",  0L  , 0, (APTR)CutMenuObj,},
  {  NM_ITEM, "Paste", "V",  0L  , 0, (APTR)PasteMenuObj,},

  {   NM_END, NULL, 0 , 0 , 0 , 0,},
};


/* stringinfo for WB 1.x style string/integer gadgets */

struct StringExtend			GadToolsStrExt;	/* Extend String Gadget */
struct TextAttr topaz8 = { (STRPTR)"topaz.font", 8, 0x00, 0x01 };
struct TextAttr topaz800 = { (STRPTR)"topaz.font", 8, 0x00, 0x00 };

UBYTE *carsLabels[] = {
	(UBYTE *)"GMC", 
	(UBYTE *)"Ford", 
	(UBYTE *)"Chrysler", 
	(UBYTE *)"Toyota", 
	(UBYTE *)"Honda", 
	(UBYTE *)"Nissa", 
	NULL
};

UBYTE *computerLabels[] = {
	(UBYTE *)"Amiga", 
	(UBYTE *)"Apple", 
	(UBYTE *)"IBM", 
	(UBYTE *)"SUN", 
	(UBYTE *)"HP", 
	NULL
};

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

struct NewGadget GadToolsNGads[] = {
	186, 1, 97, 12, (UBYTE *)"New _Model",&topaz800, ID_new, PLACETEXT_IN, NULL, (APTR)newObj,
	323, 66, 72, 11, (UBYTE *)"Ne_xt",&topaz800, ID_quit, PLACETEXT_IN, NULL, (APTR)quitObj,
	4, 45, 174, 12, (UBYTE *)"", &topaz800, ID_selectmodel, PLACETEXT_LEFT, NULL, (APTR)selectmodelObj,
	257, 15, 26, 11, (UBYTE *)"Import", &topaz800, ID_Import, PLACETEXT_LEFT, NULL, (APTR)ImportObj,
	324, 2, 17, 9, (UBYTE *)"", &topaz800, ID_comp1, PLACETEXT_RIGHT, NULL, (APTR)comp1Obj,
	194, 63, 89, 14, (UBYTE *)"Company", &topaz800, ID_comp, PLACETEXT_LEFT, NULL, (APTR)compObj,
	130, 105, 153, 12, (UBYTE *)"# Employees   ", &topaz800, ID_employees, PLACETEXT_LEFT, NULL, (APTR)employeesObj,
	289, 1, 23, 117, (UBYTE *)"", &topaz800, ID_level, PLACETEXT_LEFT, NULL, (APTR)levelObj,
	4, 1, 174, 44, (UBYTE *)"", &topaz800, ID_cars, PLACETEXT_ABOVE, NULL, (APTR)carsObj,
	6, 63, 109, 36, (UBYTE *)"", &topaz800, ID_computer, PLACETEXT_ABOVE, NULL, (APTR)computerObj,
	130, 78, 152, 25, (UBYTE *)"", &topaz800, ID_color, PLACETEXT_ABOVE, NULL, (APTR)colorObj,
};

ULONG GadToolsNTags[] = {
	(GT_Underscore), '_', TAG_DONE,
	(GT_Underscore), '_', TAG_DONE,
	GTST_MaxChars, 255, (STRINGA_Justification), GACT_STRINGLEFT, TAG_DONE,
	TAG_DONE,
	(GTMX_Labels), (ULONG)&carsLabels[0], (GTMX_Active), 0, (GTMX_Spacing), 2, TAG_DONE,
	(GTCY_Labels), (ULONG)&computerLabels[0], (GTCY_Active), 3, TAG_DONE,
	(GTSL_Min), 0, (GTSL_Max), 100, (GTSL_Level), 10, (GTSL_LevelFormat), (ULONG)"%l3d", (GTSL_MaxLevelLen), 0, (GTSL_LevelPlace), PLACETEXT_LEFT, (GA_Immediate), TRUE, (GA_RelVerify), TRUE, (PGA_Freedom), LORIENT_HORIZ, TAG_DONE,
	(GTSC_Top), 0, (GTSC_Total), 1210, (GTSC_Visible), 330, (GTSC_Arrows), 10, (GA_Immediate), TRUE, (GA_RelVerify), TRUE, (PGA_Freedom), LORIENT_VERT, TAG_DONE,
	(GTLV_ShowSelected), 99, (GTLV_Labels), NULL, (GTLV_Top), 0, (GTLV_ScrollWidth), 16, (LAYOUTA_Spacing), 2, TAG_DONE,
	(GTLV_Labels), NULL, (GTLV_Top), 0, (GTLV_ReadOnly), TRUE, (GTLV_ScrollWidth), 16, (LAYOUTA_Spacing), 0, TAG_DONE,
	(GTPA_Depth), 2, (GTPA_Color), 1, (GTPA_ColorOffset), 0, TAG_DONE,
};


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 OpenGadToolsWindow(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;
  int k=0;
  int LVStrGads[] = {ID_selectmodel, -1 };


  GadToolsStrExt.Font = NULL;
  GadToolsStrExt.Pens[0] = 2;
  GadToolsStrExt.Pens[1] = 0;
  GadToolsStrExt.ActivePens[0] = 3;
  GadToolsStrExt.ActivePens[1] = 2;
  GadToolsStrExt.InitialModes  = 0;
  GadToolsStrExt.EditHook = NULL;
  GadToolsStrExt.WorkBuffer = NULL;

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

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

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

    if (GadToolsNTags[j] == GTLV_ShowSelected && GadToolsNTags[j+1] == 99)
	  GadToolsNTags[j+1] = (ULONG)GadToolsGadgets[LVStrGads[k++]];
    GadToolsGadgets[i] = Gad = CreateGadgetA((ULONG)GadToolsGadTypes[i], Gad, &NewGad,
	(struct TagItem *)&GadToolsNTags[j]);
    if (GadToolsGadTypes[i] == STRING_KIND || GadToolsGadTypes[i] == INTEGER_KIND)
    {
	GadToolsGadgets[i]->Flags |= GFLG_STRINGEXTEND;
	((struct StringInfo *)GadToolsGadgets[i]->SpecialInfo)->Extension = &GadToolsStrExt;
    }
    while (GadToolsNTags[j])
        j +=2;
    j++;
    if (!Gad)
       return(2L);
  }
  GadToolsGadgets[0]->Activation |= GACT_TOGGLESELECT;

  if (!(GadToolsMenus = CreateMenus(GadToolsNewMenu1,
	 GTMN_FrontPen, 0L, TAG_DONE)))
    return(3L);
  LayoutMenus(GadToolsMenus, VisualInfo, GTMN_TextAttr,
 	&topaz800, GTMN_NewLookMenus, TRUE, TAG_DONE);

  if (!(GadToolsWnd = OpenWindowTags(NULL,
  	WA_Left,	GadToolsLeft,
  	WA_Top, 	GadToolsTop,
  	WA_Width,	GadToolsWidth,
  	WA_Height,	GadToolsHeight + kWindowOffSetY,
  	WA_NewLookMenus, TRUE,
  	WA_IDCMP,	IDCMP_CLOSEWINDOW |  IDCMP_NEWSIZE | IDCMP_MOUSEBUTTONS | IDCMP_MOUSEMOVE | IDCMP_GADGETUP | IDCMP_GADGETDOWN | IDCMP_VANILLAKEY | IDCMP_INTUITICKS |  IDCMP_MENUPICK ,
  	WA_Flags,	WFLG_CLOSEGADGET | WFLG_DEPTHGADGET  |  WFLG_SMART_REFRESH | 
			 WFLG_ACTIVATE |  WFLG_DRAGBAR ,
  	WA_Gadgets,	GadToolsGList,
  	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);

  CreateGadToolsLists();
  SetMenuStrip(GadToolsWnd, GadToolsMenus);
  DrawGadToolsObjs();
  GT_RefreshWindow(GadToolsWnd, NULL);
  RefreshGadgets(GadToolsGadgets[0], GadToolsWnd, NULL);
  GT_SetGadgetAttrs(GadToolsGadgets[8], GadToolsWnd, NULL,
 	GTLV_Labels, GadToolsLists[0], TAG_END);
  GT_SetGadgetAttrs(GadToolsGadgets[9], GadToolsWnd, NULL,
 	GTLV_Labels, GadToolsLists[1], TAG_END);
  return(0L);
}

void CloseGadToolsWindow(void)
{
  if (GadToolsWnd)
	CloseWindow(GadToolsWnd);
  if (GadToolsGList)
	FreeGadgets(GadToolsGList);
  if (GadToolsMenus)
  {
    ClearMenuStrip(GadToolsWnd);
    FreeMenus(GadToolsMenus);
  }
}

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

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

    VAObject.va_Window = (struct Window *)GadToolsWnd;
    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_MOUSEBUTTONS :
	    running = GadToolsIDCMP_MOUSEBUTTONS (VAObject);
	    break;

	  case IDCMP_MOUSEMOVE :
	    running = GadToolsIDCMP_MOUSEMOVE (VAObject);
	    break;

	  case IDCMP_INTUITICKS :
	    running = GadToolsIDCMP_INTUITICKS (VAObject);
	    break;

	  case IDCMP_NEWSIZE:
	   break;

	  case IDCMP_CLOSEWINDOW:
	     return(0);
	     break;

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


	  case   IDCMP_VANILLAKEY:
	    switch(code)
	    {
	      case 'M':
	        GadToolsGadgets[0]->Flags ^= GFLG_SELECTED;
	        RefreshGList(GadToolsGadgets[0], GadToolsWnd, NULL, 1);
	        break;
	      case 'x':
	        ButtonSelected(GadToolsWnd, GadToolsGadgets[1]);
	        break;
	    }
	    break;

	  case IDCMP_MENUPICK:
	    while ( code != MENUNULL)
	    {
	      VAObject.va_Window = (struct Window *)GadToolsWnd;
	      VAObject.va_Gadget = NULL;
	      VAObject.va_IntuiMsg = (struct IntuiMessage *)msg;
	      VAObject.va_Flags = NULL;
	      VAObject.va_UserData = 0;
	      menu = ItemAddress(GadToolsMenus, code);
	      func = (void *)(GTMENUITEM_USERDATA(menu));
	      running =  func(VAObject);
	      code =  menu->NextSelect;
	    }
	    break;
    }
  }
  return(running);
}

void DrawGadToolsObjs(void)
{
  GadToolsDrawRects(GadToolsWnd);

}

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

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

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

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

  if (!(GetPubScreen()))
  {
	for (rc=0; rc < 2; rc++)
	  GadToolsLists[rc]=GetNewList();
	if (!(OpenGadToolsWindow("GadTools & Menu Demo")))
	{
	  rc = GadToolsMainHandler();
	  CloseGadToolsWindow();
	}
	for (rc=0; rc < 2; rc++)
	  FreeList(GadToolsLists[rc]);
	ClosePubScreen();
  }
  return(0L);
}
