/*
 *	© 1992 by Michael Watzl
 */

#include	<exec/io.h>
#include	<devices/printer.h>
#include	<intuition/intuitionbase.h>
#include	<intuition/gadgetclass.h>
#include	<intuition/preferences.h>
#include	<workbench/startup.h>
#include	<workbench/icon.h>
#include	<workbench/workbench.h>
#include	<libraries/gadtools.h>
#include	<libraries/asl.h>
#include	<dos/dos.h>
#include	<dos/dosextens.h>
#include	<dos/rdargs.h>
#include	<graphics/gfxbase.h>
#include	<graphics/displayinfo.h>
#include	<exec/memory.h>
#include	<devices/printer.h>
#include	<stdio.h>

#include	<clib/intuition_Protos.h>
#include	<clib/dos_Protos.h>
#include	<clib/graphics_Protos.h>
#include	<clib/exec_Protos.h>
#include	<clib/gadtools_protos.h>
#include	<clib/icon_protos.h>
#include	<clib/utility_protos.h>
#include	<clib/wb_protos.h>
#include	<clib/asl_protos.h>
#include	<clib/alib_protos.h>

union printerIO {
    struct IOStdReq    ios;
    struct IODRPReq    iodrp;
    struct IOPrtCmdReq iopc;
};



WORD	strlen(STRPTR string);
STRPTR	strcpy(STRPTR to , STRPTR from );
STRPTR	strncpy(STRPTR to , STRPTR from , WORD n);
WORD	atoi(STRPTR numberstring);
STRPTR	strcat(STRPTR to, STRPTR from );
STRPTR	strncat(STRPTR to,STRPTR from , WORD n);

VOID	exit(WORD rc);

/****************************************/
/*					*/
/*    ProtoTypes for all my fkts        */
/*					*/
/****************************************/

VOID	PrintList(ULONG Mode);
VOID	PrintOut(WORD start,end, UWORD Mode);
WORD	Print( VOID );

VOID	UpdatePGads(WORD new,x);
WORD	RefreshGads(WORD new);

VOID	GetIDCMP( VOID );
VOID	GetMenu(UWORD n);
WORD	ChangeCurrent(WORD new);
WORD	Load(STRPTR name);			/* if name is specified it'll be loaded at once */
VOID	SetScreenColors( VOID );
BOOL	RequestMyFile(UWORD Mode);
WORD	Save(STRPTR name);	/* same as load */
WORD	Palette(VOID);

VOID	CreateList(ULONG Mode);
VOID	RemakeList( VOID );
VOID	UpdateNodeName(WORD n);
VOID	RemoveCurrentNode( VOID );
WORD	AddNode(STRPTR name);
VOID	UpdateList( VOID );

WORD	Search(STRPTR name, UWORD Mode);
VOID	QuickSort(WORD start,end);

VOID	InitGads( VOID );
VOID	InitList( VOID );
VOID	CompleteGads(struct NewGadget *ng);
VOID	InitTags( VOID );

WORD	quit( STRPTR errtxt );
VOID	usermessage(STRPTR text);

VOID	wbmain( struct WBStartup *msg);
VOID    fromcli(WORD argc, STRPTR *argv);
VOID	main(WORD argc, STRPTR *argv);

VOID	getcolor(WORD index);
VOID	setcolor(WORD index);
VOID	restorecolor( VOID );

BOOL	getmem(WORD number);
STRPTR	fitstring(STRPTR name, WORD length);
STRPTR	cutstring(STRPTR name, WORD length);
STRPTR	itos(STRPTR string, ULONG integer);
WORD	c2hex(WORD c);
WORD	hex2c(WORD c);
ULONG	ahex2ulong( STRPTR ahex );

/* Printer */
BOOL	OpenPrinter( VOID );
BOOL	InitPrinter( VOID );
VOID	ResetPrinter( VOID );
VOID	ClosePrinter( VOID );
VOID	SendBuffer( STRPTR Buffer , UWORD Mode );
VOID	SendCommand( UWORD Command , UBYTE par0,par1,par2,par3 );


/****************************************/
/*					*/
/*         the definitions		*/
/*					*/
/****************************************/

#define	MAXNODES	(2*13*MaxCass)				/* MaxNumber of listentries */
#define	MAXCHARS	64					/* Chars per Name */
#define MAXLCHARS	180					/* Max Chars in a Line -> LVG , SuperHires is allowed! */
#define CODE		'#'					/* This is a primitive file format recognition */
#define	CANCEL_ERR	5					/* Load()/save() return codes */
#define	OPEN_ERR	10

#define XOFFSET 	10					/* Offsets Border <-> Gadget */
#define YOFFSET 	9
#define SREQ_WIDTH	400					/* Dimensions of the Search Requester (acutally a window) */
#define SREQ_HEIGHT	130

#define	NTSC		0					/* Displaymodes */
#define PAL     	1
#define VGA		3

#define ASLWIDTH	400					/* ASL Size */
#define ASLHEIGHT	200
#define DEFNAME		"MCDataSet.mc"				/* default filename */


/****************************************/
/*					*/
/*	Userdata for the Menus		*/
/*					*/
/****************************************/

#define MENU_PROJ_BASE		1
#define	MENU_PROJ_LOAD		MENU_PROJ_BASE
#define	MENU_PROJ_SAVE		MENU_PROJ_BASE+1
#define	MENU_PROJ_SAVEAS	MENU_PROJ_BASE+2
#define	MENU_PROJ_INFO		MENU_PROJ_BASE+3
#define	MENU_PROJ_ABOUT		MENU_PROJ_BASE+4
#define	MENU_PROJ_QUIT		MENU_PROJ_BASE+5
#define MENU_PROJ_PRINT		MENU_PROJ_BASE+6
#define	MENU_PROJ_DELETE	MENU_PROJ_BASE+7

#define	MENU_SEARCH_BASE	10
#define MENU_SEARCH_INTER       MENU_SEARCH_BASE+1	/* 001 */
#define MENU_SEARCH_LP          MENU_SEARCH_BASE+2	/* 010 */
#define MENU_SEARCH_SONG        MENU_SEARCH_BASE+4	/* 100 */
#define MENU_SEARCH_ANYTHING    MENU_SEARCH_BASE+7	/* 111 */

#define MENU_LIST_BASE		20
#define MENU_LIST_INTER		MENU_LIST_BASE+0
#define MENU_LIST_LP            MENU_LIST_BASE+1
#define MENU_LIST_SONG          MENU_LIST_BASE+2

#define	MENU_SPECIAL_BASE	30
#define MENU_SPECIAL_NAME       MENU_SPECIAL_BASE
#define MENU_SPECIAL_EDIT       MENU_SPECIAL_BASE+1
#define MENU_SPECIAL_PALETTE    MENU_SPECIAL_BASE+2


/****************************************/
/*					*/
/*   Different Modi for some fkts	*/
/*					*/
/****************************************/

#define FRQ_LOAD 		0			/* Modes for the FileRequester */
#define FRQ_SAVE 		1

#define SEARCH_INTER	0x01				/* Modes for the search routine */
#define SEARCH_LP	0x02				/* lower nibble for search object */
#define SEARCH_SONG	0x04
#define SEARCH_ANYTHING	(SEARCH_INTER|SEARCH_LP|SEARCH_SONG)
#define TOP_SEARCH	0x10				/* upper nibble for search start */
#define NEXT_SEARCH	0x20

#define	DRAFT           0				/* Print Modes */
#define	LQ              1


/****************************************/
/*					*/
/*	"simplifications"		*/
/*					*/
/****************************************/

#define	SHIFTKEYS	(IEQUALIFIER_LSHIFT|IEQUALIFIER_RSHIFT)	/* for easy rawkey handling! */
#define ALTKEYS		(IEQUALIFIER_LALT|IEQUALIFIER_RALT)
#define	RAW_F		0x23
#define	RAW_T		0x14
#define	RAW_D		0x22
#define	RAW_L		0x28
#define	RAW_O		0x18
#define	RAW_C		0x33

/****************************************/
/*					*/
/*	for the printer			*/
/*					*/
/****************************************/

#define	LINE_LENGTH	256
#define	LINE		"________________________________________________________________\n"
#define CPI15		SendCommand( aSHORP4 , 0,0,0,0 )
#define	CPI10		SendCommand( aSHORP0 ,0,0,0,0)
#define	LINE_FEED	SendBuffer("\n", CMD_WRITE )
#define	FORM_FEED	SendBuffer("\f", CMD_WRITE )

/****************************************/
/*					*/
/*	Protostructures			*/
/*					*/
/****************************************/

struct MCData
{							/* Prototype of Cassette-data struct */
	UBYTE  Name[30][MAXCHARS];				/* 15 Names per Side (Titles included) */
	WORD  NR[2];					/* Noise Red. 0->A 1->B */
	WORD  Source[2];				/* Source */
};
struct ListEntry {					/* This contains the relevant data fot */
	struct Node 	Label;				/* the listview nodes */
	UBYTE 		LabelName[MAXLCHARS];
};


/****************************************/
/*					*/
/*  		Global Vars		*/
/*					*/
/****************************************/

static	UBYTE   *VersTag = "\0$VER: MCMaster 1.1 (5.5.1992)";

VOID	*vi;						/* var for VisualInfo */
WORD	MaxCass = 60;					/* By default space for 60 mcs will be allocated */

WORD	r[4],g[4],b[4],col;				/* Colors (for Palette) */
WORD	col0[3][4];					/* saved colors, for canceling the palette */
WORD	activegad=0;					/* I need this for the palette (slidergads) */
WORD	frommc=1,tomc=2;				/* for the printwin */
struct	DiskObject *mydob=NULL;				/* Pointer to my DOB, indicator of WB/CLI start */
UBYTE	myname[34];					/* Name of DiskObject */
UBYTE	toolstr[5][128];
struct	MCData *cass;					/* pointer to datafield, which will be allocated */
UBYTE   uname[30][MAXLCHARS];				/* Undo Buffer for StrGads, also used for a lot of other things*/
UBYTE	ownername[3][MAXCHARS];				/* Strings for the owner's name */
UBYTE	lastfname[64]=DEFNAME, lastdname[128]="";	/* Buffer for file/dir names of ASL-req */
BOOL	fastexit=TRUE;					/* Flag for "really quit" req */
WORD	current=1;					/* currently shown mc */

ULONG   DisplayID	= HIRES_KEY;			/* Defaults for the ToolTypes */
WORD	Oscan		= NULL;
UBYTE	Database[256], Colors[256]="8AC002FFFEB2";

struct  List	LabelList	= {NULL,NULL,NULL,0,0}; /* This is for the ListView */
struct	Node	TailNode	= {NULL,NULL,0,0,NULL}; /* Last Node, "Tail" of NodeList */
WORD	LastNode;					/* Number of TailPred Node */
struct	ListEntry	*LEntry;			/* HEAD- to TailPred-Nodes are allocated in getmem() */

BOOL	PDOPEN	= FALSE;                /* is the printer ready? */
UBYTE	prepbuffer[LINE_LENGTH+5];	/* prepared buffer -> see prepbuffer() */
UBYTE	rawbuffer [LINE_LENGTH+5];	/* for reading a line "raw" */


/****************************************/
/*					*/
/*	Constants			*/
/*					*/
/****************************************/

const STRPTR	NR[]		= {"Dolby C","Dolby B","NO NR.","DBX",NULL};	/* for the noise reduction CycleGadget */
const STRPTR	Source[]	= {"CD","LP","Radio","Mixed","Unknown",NULL};	/* for the source cyclegad */
const STRPTR	what[]		= {"interprets","album names","song names","anything"};	/* search/list mode string */
const STRPTR	OscanName[]	= {"NONE","TEXT","STANDARD","MAX","VIDEO"};
const struct	TextAttr TOPAZ80= {"topaz.font",8,0,0};				/* used font */
const UWORD	PenData[] 	= {3,1,1,2,1,3,1,0,2,-1};					/* for the 3D Look for Screen */


/****************************************/
/*					*/
/*  	Structs/Data			*/
/*					*/
/****************************************/

struct IconBase		*IconBase;					/* All the needed Libs! */
struct IntuitionBase	*IntuitionBase;					/* DICE handles the dos.library */
struct GfxBase		*GfxBase;
struct GadToolsBase	*GadToolsBase;
struct AslBase		*AslBase;
struct UtilityBase	*UtilityBase;

/* IO stuff */
union printerIO 	*printerReq;
struct MsgPort		*printer_mp;		/* Port for printer */

struct ViewPort		*vp;
struct MonitorInfo 	monitorinfo;
struct DimensionInfo 	dimensioninfo;
struct ColorSpec	colorspec[5];
struct RDArgs		*cliargs;
struct Window		*window, *searchwin, *listwin, *namewin, *printwin, *palwin;
struct Window		*olderrwin;
struct Screen		*screen;
struct Menu		*menu;
struct IntuiMessage	*message;
struct Gadget		*congad, *gad;				/* pointer to gadgetcontext, all round gadget pointer */
struct Gadget		*noiseAgad,*noiseBgad,*sourceAgad,*sourceBgad,*listviewgad, *nextgad, *prevgad, *currentgad; /* Gadgets of the main window */
struct Gadget		*printcon, *pos1gad, *pos2gad;  	/* for the print window */
struct Gadget		*rslider, *gslider, *bslider, *palcon;	/* for the palette win */


/****************************************/
/*					*/
/*	EasyReqs and Freqs		*/
/*					*/
/****************************************/

struct EasyStruct easyerror = {sizeof(struct EazyStruct),0,"MC request",NULL,"UNDERSTOOD"};	/* Easy Reqs */
struct EasyStruct easyquit  = {sizeof(struct EazyStruct),0,"MC Request","You did not save the last changes!\nReally Quit?","Bye bye|Stay here!"};	/* Easy Reqs */
struct EasyStruct easyabout = {sizeof(struct EazyStruct),0,"MCMaster V1.1","MCMaster\n  © 1992 by  Michael Watzl\n             Konradstraße 11\n             8850 Donauwörth, GERMANY\n\nYou are free to send bug reports, donations or anything else.\n","Great Stuff!"};	/* Easy Reqs */
struct EasyStruct easyinfo  = {sizeof(struct EazyStruct),0,"MCMaster V1.1","MCMaster                  Information\n\nThere are %ld of maximal %ld mcs in memory.\n------------------------------------------\nFree Mem:\n\n  Chip : %10ld\n  Fast : %10ld\n\nPerferences Printer: %s\n------------------------------------------\n© 1992 by Michael Watzl","OK"};	/* Easy Reqs */
struct EasyStruct easyfound = {sizeof(struct EazyStruct),0,"MCMaster V1.1",NULL,"I see"};	/* Easy Reqs */
struct EasyStruct easydelete= {sizeof(struct EazyStruct),0,"MCMaster V1.1","Really delete MC %ld\nContents:\n Side A: %s, %s   \n Side B: %s, %s   \n","DELETE!|Oh No!"};	/* Easy Reqs */
struct EasyStruct easyprint = {sizeof(struct EazyStruct),0,"MCMaster V1.1","Print\nfrom %ld: Side A: %s, %s   \n         Side B: %s, %s\n\n  to %ld: Side A: %s, %s   \n         Side B: %s, %s\n","PRINT!|Get Back|Abort Print"};	/* Easy Reqs */
struct EasyStruct easyprintl= {sizeof(struct EazyStruct),0,"MCMaster V1.1","Are you sure?\nPrint this list of all %s?\n","PRINT!|Cancel"};	/* Easy Reqs */

struct FileRequester *filerequester;			/* AslStyle! */


/****************************************/
/*					*/
/*		Tag Lists		*/
/*					*/
/****************************************/

struct	TagItem screentag[] = {
	SA_Left,	0,
	SA_Width,	640,
	SA_Height,	200,
	SA_Depth,	2,
	SA_Font,	&TOPAZ80,
	SA_Quiet,	TRUE,
	SA_DisplayID,	HIRES_KEY,
	SA_Pens,	PenData,
	SA_Colors,	NULL,
	SA_Overscan,	NULL,
	TAG_DONE,	0};
struct TagItem AslTag[] = {				/* TagItems for the File Requester */
	ASL_OKText,	"LOAD",		/* Do not change the order of these Tags! */
	ASL_Window,	NULL,
	ASL_Hail,	NULL,
	ASL_FuncFlags,	FILF_PATGAD,
	ASL_File,	DEFNAME,
	ASL_Dir,	NULL,
	ASL_LeftEdge,	(640-ASLWIDTH)/2,
	ASL_TopEdge,	0,
	ASL_Width,	ASLWIDTH,
	ASL_Height,	ASLHEIGHT,
	ASL_Pattern,	"#?.mc",
	TAG_DONE,	0};
struct TagItem searchwintag[]= {			/* Window Tags for search win */
	WA_Height	,SREQ_HEIGHT,
	WA_Width	,SREQ_WIDTH,
	WA_Left		,(640-SREQ_WIDTH)/2,
	WA_Top		,(200-SREQ_HEIGHT)/2,
	WA_Title	,"Sneekin' around...",
	WA_Flags	,WFLG_ACTIVATE|WFLG_RMBTRAP|WFLG_CLOSEGADGET|WFLG_DRAGBAR,
	WA_IDCMP	,STRINGIDCMP|BUTTONIDCMP|IDCMP_CLOSEWINDOW|IDCMP_VANILLAKEY,
	WA_Gadgets	,NULL,
	WA_CustomScreen	,NULL,
	TAG_DONE	,0};
struct TagItem printwintag[] = {	/* Window Tag List for the printwindow */
	WA_Height	,140,
	WA_Width	,640,
	WA_Left		,0,
	WA_Top		,(200-140)/2,
	WA_Flags	,WFLG_ACTIVATE|WFLG_RMBTRAP|WFLG_CLOSEGADGET|WFLG_DRAGBAR,
	WA_IDCMP	,STRINGIDCMP|BUTTONIDCMP|IDCMP_CLOSEWINDOW|IDCMP_RAWKEY|MXIDCMP|SCROLLERIDCMP,
	WA_Gadgets	,NULL,
	WA_CustomScreen	,NULL,
	WA_Title	,"Print MCCovers",
	TAG_DONE	,0};
struct TagItem listwintag[]= {		/* Window Tags for the list window */
	WA_Title	,NULL,
	WA_Flags	,WFLG_ACTIVATE|WFLG_RMBTRAP|WFLG_CLOSEGADGET,
	WA_IDCMP	,LISTVIEWIDCMP|BUTTONIDCMP|IDCMP_CLOSEWINDOW|IDCMP_VANILLAKEY,
	WA_Gadgets	,NULL,
	WA_CustomScreen	,NULL,
	TAG_DONE	,0};
struct TagItem namewintag[] = {		/* window tag list for the name window */
	WA_Flags,	WFLG_ACTIVATE|WFLG_CLOSEGADGET|WFLG_DRAGBAR,
	WA_IDCMP,	IDCMP_CLOSEWINDOW|STRINGIDCMP,
	WA_Title,	"Enter new name",
	WA_Left,	120,
	WA_Top,		45,
	WA_Width,	400,
	WA_Height,	100,
	WA_Gadgets,	NULL,
	WA_CustomScreen,NULL,
	TAG_DONE,	0};
struct	TagItem SliderItem[] = {
	GA_FollowMouse,		TRUE,
	GTSL_Min,		0,
	GTSL_Max,		15,
	GTSL_Level,		0,
	GTSL_LevelFormat,	"%2ld",
	GA_RelVerify,		TRUE,
	GA_Immediate,		TRUE,
	GTSL_MaxLevelLen,	2,
	GTSL_LevelPlace,	PLACETEXT_RIGHT,
	TAG_DONE,		0};


/****************************************/
/*					*/
/*  IntuiStringGadgets + SpecialInfos   */
/*					*/
/****************************************/

/* I used non GT-gadgets, because I don't want no borders around */
struct Gadget StrGad[]={
	{NULL,0,0,0,0,NULL,GACT_RELVERIFY|GACT_STRINGEXTEND,GTYP_STRGADGET,NULL,NULL,NULL,NULL,NULL,0,NULL},{NULL,0,0,0,0,NULL,GACT_RELVERIFY|GACT_STRINGEXTEND,GTYP_STRGADGET,NULL,NULL,NULL,NULL,NULL,0,NULL},
	{NULL,0,0,0,0,NULL,GACT_RELVERIFY|GACT_STRINGEXTEND,GTYP_STRGADGET,NULL,NULL,NULL,NULL,NULL,0,NULL},{NULL,0,0,0,0,NULL,GACT_RELVERIFY|GACT_STRINGEXTEND,GTYP_STRGADGET,NULL,NULL,NULL,NULL,NULL,0,NULL},
	{NULL,0,0,0,0,NULL,GACT_RELVERIFY|GACT_STRINGEXTEND,GTYP_STRGADGET,NULL,NULL,NULL,NULL,NULL,0,NULL},{NULL,0,0,0,0,NULL,GACT_RELVERIFY|GACT_STRINGEXTEND,GTYP_STRGADGET,NULL,NULL,NULL,NULL,NULL,0,NULL},
	{NULL,0,0,0,0,NULL,GACT_RELVERIFY|GACT_STRINGEXTEND,GTYP_STRGADGET,NULL,NULL,NULL,NULL,NULL,0,NULL},{NULL,0,0,0,0,NULL,GACT_RELVERIFY|GACT_STRINGEXTEND,GTYP_STRGADGET,NULL,NULL,NULL,NULL,NULL,0,NULL},
	{NULL,0,0,0,0,NULL,GACT_RELVERIFY|GACT_STRINGEXTEND,GTYP_STRGADGET,NULL,NULL,NULL,NULL,NULL,0,NULL},{NULL,0,0,0,0,NULL,GACT_RELVERIFY|GACT_STRINGEXTEND,GTYP_STRGADGET,NULL,NULL,NULL,NULL,NULL,0,NULL},
	{NULL,0,0,0,0,NULL,GACT_RELVERIFY|GACT_STRINGEXTEND,GTYP_STRGADGET,NULL,NULL,NULL,NULL,NULL,0,NULL},{NULL,0,0,0,0,NULL,GACT_RELVERIFY|GACT_STRINGEXTEND,GTYP_STRGADGET,NULL,NULL,NULL,NULL,NULL,0,NULL},
	{NULL,0,0,0,0,NULL,GACT_RELVERIFY|GACT_STRINGEXTEND,GTYP_STRGADGET,NULL,NULL,NULL,NULL,NULL,0,NULL},{NULL,0,0,0,0,NULL,GACT_RELVERIFY|GACT_STRINGEXTEND,GTYP_STRGADGET,NULL,NULL,NULL,NULL,NULL,0,NULL},
	{NULL,0,0,0,0,NULL,GACT_RELVERIFY|GACT_STRINGEXTEND,GTYP_STRGADGET,NULL,NULL,NULL,NULL,NULL,0,NULL},{NULL,0,0,0,0,NULL,GACT_RELVERIFY|GACT_STRINGEXTEND,GTYP_STRGADGET,NULL,NULL,NULL,NULL,NULL,0,NULL},
	{NULL,0,0,0,0,NULL,GACT_RELVERIFY|GACT_STRINGEXTEND,GTYP_STRGADGET,NULL,NULL,NULL,NULL,NULL,0,NULL},{NULL,0,0,0,0,NULL,GACT_RELVERIFY|GACT_STRINGEXTEND,GTYP_STRGADGET,NULL,NULL,NULL,NULL,NULL,0,NULL},
	{NULL,0,0,0,0,NULL,GACT_RELVERIFY|GACT_STRINGEXTEND,GTYP_STRGADGET,NULL,NULL,NULL,NULL,NULL,0,NULL},{NULL,0,0,0,0,NULL,GACT_RELVERIFY|GACT_STRINGEXTEND,GTYP_STRGADGET,NULL,NULL,NULL,NULL,NULL,0,NULL},
	{NULL,0,0,0,0,NULL,GACT_RELVERIFY|GACT_STRINGEXTEND,GTYP_STRGADGET,NULL,NULL,NULL,NULL,NULL,0,NULL},{NULL,0,0,0,0,NULL,GACT_RELVERIFY|GACT_STRINGEXTEND,GTYP_STRGADGET,NULL,NULL,NULL,NULL,NULL,0,NULL},
	{NULL,0,0,0,0,NULL,GACT_RELVERIFY|GACT_STRINGEXTEND,GTYP_STRGADGET,NULL,NULL,NULL,NULL,NULL,0,NULL},{NULL,0,0,0,0,NULL,GACT_RELVERIFY|GACT_STRINGEXTEND,GTYP_STRGADGET,NULL,NULL,NULL,NULL,NULL,0,NULL},
	{NULL,0,0,0,0,NULL,GACT_RELVERIFY|GACT_STRINGEXTEND,GTYP_STRGADGET,NULL,NULL,NULL,NULL,NULL,0,NULL},{NULL,0,0,0,0,NULL,GACT_RELVERIFY|GACT_STRINGEXTEND,GTYP_STRGADGET,NULL,NULL,NULL,NULL,NULL,0,NULL},
	{NULL,0,0,0,0,NULL,GACT_RELVERIFY|GACT_STRINGEXTEND,GTYP_STRGADGET,NULL,NULL,NULL,NULL,NULL,0,NULL},{NULL,0,0,0,0,NULL,GACT_RELVERIFY|GACT_STRINGEXTEND,GTYP_STRGADGET,NULL,NULL,NULL,NULL,NULL,0,NULL},
	{NULL,0,0,0,0,NULL,GACT_RELVERIFY|GACT_STRINGEXTEND,GTYP_STRGADGET,NULL,NULL,NULL,NULL,NULL,0,NULL},{NULL,0,0,0,0,NULL,GACT_RELVERIFY|GACT_STRINGEXTEND,GTYP_STRGADGET,NULL,NULL,NULL,NULL,NULL,0,NULL}};
struct StringInfo si[] = {
	{NULL,NULL,0,MAXCHARS,0,0,0,0,0,NULL,NULL,NULL},{NULL,NULL,0,MAXCHARS,0,0,0,0,0,NULL,NULL,NULL},
	{NULL,NULL,0,MAXCHARS,0,0,0,0,0,NULL,NULL,NULL},{NULL,NULL,0,MAXCHARS,0,0,0,0,0,NULL,NULL,NULL},
	{NULL,NULL,0,MAXCHARS,0,0,0,0,0,NULL,NULL,NULL},{NULL,NULL,0,MAXCHARS,0,0,0,0,0,NULL,NULL,NULL},
	{NULL,NULL,0,MAXCHARS,0,0,0,0,0,NULL,NULL,NULL},{NULL,NULL,0,MAXCHARS,0,0,0,0,0,NULL,NULL,NULL},
	{NULL,NULL,0,MAXCHARS,0,0,0,0,0,NULL,NULL,NULL},{NULL,NULL,0,MAXCHARS,0,0,0,0,0,NULL,NULL,NULL},
	{NULL,NULL,0,MAXCHARS,0,0,0,0,0,NULL,NULL,NULL},{NULL,NULL,0,MAXCHARS,0,0,0,0,0,NULL,NULL,NULL},
	{NULL,NULL,0,MAXCHARS,0,0,0,0,0,NULL,NULL,NULL},{NULL,NULL,0,MAXCHARS,0,0,0,0,0,NULL,NULL,NULL},
	{NULL,NULL,0,MAXCHARS,0,0,0,0,0,NULL,NULL,NULL},{NULL,NULL,0,MAXCHARS,0,0,0,0,0,NULL,NULL,NULL},
	{NULL,NULL,0,MAXCHARS,0,0,0,0,0,NULL,NULL,NULL},{NULL,NULL,0,MAXCHARS,0,0,0,0,0,NULL,NULL,NULL},
	{NULL,NULL,0,MAXCHARS,0,0,0,0,0,NULL,NULL,NULL},{NULL,NULL,0,MAXCHARS,0,0,0,0,0,NULL,NULL,NULL},
	{NULL,NULL,0,MAXCHARS,0,0,0,0,0,NULL,NULL,NULL},{NULL,NULL,0,MAXCHARS,0,0,0,0,0,NULL,NULL,NULL},
	{NULL,NULL,0,MAXCHARS,0,0,0,0,0,NULL,NULL,NULL},{NULL,NULL,0,MAXCHARS,0,0,0,0,0,NULL,NULL,NULL},
	{NULL,NULL,0,MAXCHARS,0,0,0,0,0,NULL,NULL,NULL},{NULL,NULL,0,MAXCHARS,0,0,0,0,0,NULL,NULL,NULL},
	{NULL,NULL,0,MAXCHARS,0,0,0,0,0,NULL,NULL,NULL},{NULL,NULL,0,MAXCHARS,0,0,0,0,0,NULL,NULL,NULL},
	{NULL,NULL,0,MAXCHARS,0,0,0,0,0,NULL,NULL,NULL},{NULL,NULL,0,MAXCHARS,0,0,0,0,0,NULL,NULL,NULL}};


/****************************************/
/*					*/
/*          GadToolsGadgets             */
/*					*/
/****************************************/

struct NewGadget ListVG		= {10,10,10,10,NULL,&TOPAZ80,50,NULL,NULL,NULL};
struct NewGadget DolbyA		= {10,10,10,10,NULL,&TOPAZ80,40,NULL,NULL,NULL};
struct NewGadget DolbyB		= {10,10,10,10,NULL,&TOPAZ80,41,NULL,NULL,NULL};
struct NewGadget SourceA	= {10,10,10,10,NULL,&TOPAZ80,42,NULL,NULL,NULL};
struct NewGadget SourceB	= {10,10,10,10,NULL,&TOPAZ80,43,NULL,NULL,NULL};
struct NewGadget Next		= {10,10,10,10,">" ,&TOPAZ80,44,PLACETEXT_IN,NULL,NULL};
struct NewGadget Prev		= {10,10,10,10,"<" ,&TOPAZ80,45,PLACETEXT_IN,NULL,NULL};
struct NewGadget Current	= {10,10,10,10,NULL,&TOPAZ80,31,NULL,NULL,NULL};

/****************************************/
/*					*/
/*           GadToolsMenus              */
/*					*/
/****************************************/

const struct NewMenu MainMenu[] = {
	{NM_TITLE,"Project"		,NULL,0,0,NULL			},/* PROJECT */
	{NM_ITEM ,"Load..."		,"L" ,0,0,MENU_PROJ_LOAD	},
	{NM_ITEM ,NM_BARLABEL        	,NULL,0,0,NULL			},
	{NM_ITEM ,"Save"		,"S" ,0,0,MENU_PROJ_SAVE	},
	{NM_ITEM ,"Save as..."		,NULL,0,0,MENU_PROJ_SAVEAS	},
	{NM_ITEM ,"Info"		,NULL,0,0,MENU_PROJ_INFO	},
	{NM_ITEM ,"About"		,NULL,0,0,MENU_PROJ_ABOUT	},
	{NM_ITEM ,"Delete this MC..."	,"D" ,0,0,MENU_PROJ_DELETE	},
	{NM_ITEM ,"Print..."		,"P" ,0,0,MENU_PROJ_PRINT	},
	{NM_ITEM ,NM_BARLABEL           ,NULL,0,0,NULL			},
	{NM_ITEM ,"Quit"		,"Q" ,0,0,MENU_PROJ_QUIT	},

	{NM_TITLE,"Examine Data"	,NULL,0,0,NULL			},/* SEARCH, LIST */
	{NM_ITEM ,"Search"		,NULL,0,0,NULL			},
	{NM_SUB  ,"Interprets..."	,NULL,0,0,MENU_SEARCH_INTER	},
	{NM_SUB  ,"LP titles..."	,NULL,0,0,MENU_SEARCH_LP	},
	{NM_SUB  ,"Songnames..."	,NULL,0,0,MENU_SEARCH_SONG	},
	{NM_SUB  ,"Search anything..."  ,"F" ,0,0,MENU_SEARCH_ANYTHING	},

	{NM_ITEM ,NM_BARLABEL        	,NULL,0,0,NULL			},
	{NM_ITEM ,"List"		,NULL,0,0,NULL			},/* SEARCH */
	{NM_SUB  ,"Interprets"		,NULL,0,0,MENU_LIST_INTER	},
	{NM_SUB  ,"Albums"		,NULL,0,0,MENU_LIST_LP		},
	{NM_SUB  ,"Songnames"		,"N" ,0,0,MENU_LIST_SONG	},

	{NM_TITLE,"Special"		,NULL,0,0,NULL			},/* SPECIAL */
	{NM_ITEM ,"Edit Owner's Name...",NULL,0,0,MENU_SPECIAL_NAME	},
	{NM_ITEM ,"Edit MC"		,"E" ,0,0,MENU_SPECIAL_EDIT	},
	{NM_ITEM ,"Color palette..."	,"C" ,0,0,MENU_SPECIAL_PALETTE	},

	{NM_END}
};
