#include <exec/types.h>
#include <exec/memory.h>
#include <exec/libraries.h>
#include <dos/dos.h>
#include <intuition/gadgetclass.h>
#include <intuition/intuitionbase.h>
#include <libraries/iffparse.h>
#include <prefs/prefhdr.h>
#include <prefs/font.h>
#include <string.h>

#include <proto/exec.h>
#include <proto/intuition.h>
#include <proto/gadtools.h>
#include <proto/dos.h>
#include <proto/iffparse.h>
#include <proto/diskfont.h>
#include <proto/graphics.h>

#include "split.h"

/* for debug purposes */
#include <stdio.h>

extern UWORD wwidth, wheight, wleft, wtop;
extern VolumeList *vlist;
extern STRPTR msg_warnfilenotproc, msg_warngadgets,
	msg_write, msg_chunkoffs, msg_chunksize, msg_chunknum, msg_chunkname,
	msg_file, msg_size, status_title, statname[];
extern UBYTE chunk_number, status;
extern ULONG chunkoffset, chunksize;
extern STRPTR chunkname, filename;
extern ULONG filesize;

struct Gadget *glist, *gad, *vlist_gad, *chunk_gad, *chunknum_gad,
	*chunksize_gad, *chunkoffs_gad, *write_gad, *chunknam1_gad, *chunknam2_gad,
	*filenam1_gad, *filenam2_gad, *filesize_gad, *status_gad, *hide_gad, *quit_gad;

STRPTR msg_hide, msg_quit;

struct VisualInfo *vi;
struct NewGadget newgdg = { 0, 0, 0, 0, NULL, NULL, 0, 0, 0, 0 };
struct Screen *WBS;
struct Library *GadToolsBase, *IFFParseBase, *DiskFontBase;
struct DrawInfo *dri;

struct IntuiText it = { 0, 0, 0, 0, 0, NULL, NULL, NULL };
UWORD maxstrlen;

UWORD CheckMax( STRPTR text, UWORD add_gdw, UWORD prev )
{
register UWORD ilength;

it.IText = text;
if ( ( ilength = IntuiTextLength( &it ) + add_gdw ) > prev )
	return( ilength );
else
	return( prev );
}


char fontname[FONTNAMESIZE];
struct TextAttr topazattr = { "topaz.font", 8, FS_NORMAL, FPF_ROMFONT };
struct FontPrefs fp;
struct TextFont *font;

BOOL setUpGadgets( void )
{
UWORD fontw = 8, fonth = 8;
UWORD dummy;

if ( GadToolsBase = OpenLibrary( "gadtools.library", 0L ) )
	{
	if ( IFFParseBase = OpenLibrary( "iffparse.library", 37L ) )
		{
		struct IFFHandle *iffhandle;

		if ( iffhandle = AllocIFF() )
			{
			ULONG intuiVersion = IntuitionBase->LibNode.lib_Version;
			if ( iffhandle->iff_Stream = Open( intuiVersion >= 39L ? "ENV:Sys/font.prefs" : "ENV:Sys/sysfont.prefs", MODE_OLDFILE ) )
				{
				InitIFFasDOS( iffhandle );
				if ( !OpenIFF( iffhandle, IFFF_READ ) )
					{
					if ( !StopChunk( iffhandle, ID_PREF, ID_FONT ) )
						{
						ParseIFF( iffhandle, IFFPARSE_SCAN );
						if ( intuiVersion >= 39L )
							ParseIFF( iffhandle, IFFPARSE_SCAN );

						ReadChunkBytes( iffhandle, &fp, sizeof(struct FontPrefs) );
						strcpy( fontname, fp.fp_Name );

						if ( DiskFontBase = OpenLibrary( "diskfont.library", 37L ) )
							{
							topazattr.ta_Name = fontname;
							topazattr.ta_YSize = fp.fp_TextAttr.ta_YSize;
							topazattr.ta_Style = fp.fp_TextAttr.ta_Style;
							topazattr.ta_Flags = fp.fp_TextAttr.ta_Flags;

							if ( font = OpenDiskFont( &topazattr ) )
								fontw = font->tf_XSize;

							CloseLibrary( DiskFontBase );
							}

						if ( !font )
							{
							topazattr.ta_Name = "topaz.font";
							topazattr.ta_YSize = 8;
							topazattr.ta_Style = FS_NORMAL;
							topazattr.ta_Flags = FPF_ROMFONT;
							font = OpenFont( &topazattr );
							}

						fonth = topazattr.ta_YSize;
						CloseIFF( iffhandle );
						}
					Close( iffhandle->iff_Stream );
					}
				FreeIFF( iffhandle );
				}
			CloseLibrary( IFFParseBase );
			}
		CloseLibrary( DiskFontBase );
		}

	if ( WBS = LockPubScreen( NULL ) )
		{
		it.ITextFont = &topazattr;

		if ( vi = GetVisualInfoA( WBS, TAG_END ) )
			{
			newgdg.ng_Flags = NULL;
			newgdg.ng_VisualInfo = vi;
			newgdg.ng_TopEdge = WBS->BarHeight + 3;
			newgdg.ng_TextAttr = &topazattr;
			gad = CreateContext (&glist);

			/* Prima riga */

			newgdg.ng_LeftEdge = WBS->WBorLeft + 4;
			newgdg.ng_Width = ( 4 + VOLUMENODENAMELEN ) * fontw + 4;
			newgdg.ng_Height = fonth * 5 + 4;
			newgdg.ng_GadgetText = NULL;
			newgdg.ng_GadgetID = DOSLIST_GDG;
			vlist_gad = gad = CreateGadget( LISTVIEW_KIND, gad, &newgdg,
				GTLV_Labels, vlist,
				GTLV_ShowSelected, NULL,
				TAG_END );

			/* Seconda riga */

			newgdg.ng_Flags = PLACETEXT_IN;
			newgdg.ng_Height = fonth + 6;
			newgdg.ng_LeftEdge = WBS->WBorLeft + 4;
			newgdg.ng_TopEdge += fonth * 5 + 6;
			newgdg.ng_Width = fontw * 7 + 4;;
			newgdg.ng_GadgetText = msg_chunknum;
			newgdg.ng_GadgetID = CHUNK_GDG;
			chunk_gad = gad = CreateGadget( BUTTON_KIND, gad, &newgdg,
				TAG_END );

			newgdg.ng_Flags = PLACETEXT_LEFT;
			newgdg.ng_LeftEdge += gad->Width + 2;
			newgdg.ng_Width = fontw * 3 + 2;
			newgdg.ng_GadgetText = NULL;
			newgdg.ng_GadgetID = CHUNKNMB_GDG;
			chunknum_gad = gad = CreateGadget( NUMBER_KIND, gad, &newgdg,
				GTNM_Number, chunk_number,
				GTNM_Border, TRUE,
				TAG_END );

			newgdg.ng_LeftEdge += gad->Width + fontw * 6 + 6;
			newgdg.ng_Width = fontw * 9 + 4;
			newgdg.ng_GadgetText = msg_chunksize;
			newgdg.ng_GadgetID = CHUNKSIZE_GDG;
			chunksize_gad = gad = CreateGadget( INTEGER_KIND, gad, &newgdg,
				GTIN_Number, chunksize,
				STRINGA_Justification, STRINGRIGHT,
				TAG_END );

			newgdg.ng_LeftEdge += gad->Width + fontw * 8 + 2;
			newgdg.ng_Width = fontw * 9 + 4;
			newgdg.ng_GadgetText = msg_chunkoffs;
			newgdg.ng_GadgetID = CHUNKOFFS_GDG;
			chunkoffs_gad = gad = CreateGadget( INTEGER_KIND, gad, &newgdg,
				GTIN_Number, chunkoffset,
				STRINGA_Justification, STRINGRIGHT,
				TAG_END );

			/* Terza riga */

			newgdg.ng_Flags = PLACETEXT_IN;
			newgdg.ng_LeftEdge = WBS->WBorLeft + 4;
			newgdg.ng_TopEdge += fonth + 7;
			newgdg.ng_Width = fontw * 7 + 4;
			newgdg.ng_GadgetText = msg_write;
			newgdg.ng_GadgetID = WRITE_GDG;
			write_gad = gad = CreateGadget( BUTTON_KIND, gad, &newgdg,
				TAG_END );

			newgdg.ng_LeftEdge += gad->Width + 2;
			newgdg.ng_Width = fontw * 7 + 8;
			newgdg.ng_GadgetText = msg_chunkname;
			newgdg.ng_GadgetID = CHUNKNAM1_GDG;
			chunknam1_gad = gad = CreateGadget( BUTTON_KIND, gad, &newgdg,
				TAG_END );

			dummy = chunkoffs_gad->LeftEdge + chunkoffs_gad->Width;

			newgdg.ng_LeftEdge += fontw * 7 + 8;
			newgdg.ng_Width = 6 + dummy - newgdg.ng_LeftEdge;
			newgdg.ng_GadgetText = NULL;
			newgdg.ng_GadgetID = CHUNKNAM2_GDG;
			chunknam2_gad = gad = CreateGadget( STRING_KIND, gad, &newgdg,
				GTST_String, chunkname,
				TAG_END );

			/* Quarta riga */

			newgdg.ng_Flags = PLACETEXT_IN;
			newgdg.ng_LeftEdge = WBS->WBorLeft + 4;
			newgdg.ng_TopEdge += fonth + 7;
			newgdg.ng_Width = fontw * 7 + 4;
			newgdg.ng_GadgetText = msg_file;
			newgdg.ng_GadgetID = FILENAM1_GDG;
			filenam1_gad = gad = CreateGadget( BUTTON_KIND, gad, &newgdg,
				TAG_END );

			newgdg.ng_LeftEdge += gad->Width + 2;
			newgdg.ng_Width = dummy - newgdg.ng_LeftEdge - fontw * 9;
			newgdg.ng_GadgetText = NULL;
			newgdg.ng_GadgetID = FILENAM2_GDG;
			filenam2_gad = gad = CreateGadget( TEXT_KIND, gad, &newgdg,
				GTTX_Text, filename,
				GTTX_Border, TRUE,
				TAG_END );

			newgdg.ng_LeftEdge = dummy - fontw * 9 + 4;
			newgdg.ng_Width = fontw * 9 + 2;
			newgdg.ng_GadgetText = NULL;
			newgdg.ng_GadgetID = FILESIZE_GDG;
			filesize_gad = gad = CreateGadget( NUMBER_KIND, gad, &newgdg,
				GTNM_Number, filesize,
				GTNM_Border, TRUE,
				GTNM_Justification, GTJ_RIGHT,
				TAG_END );

			/* Quinta riga */

			newgdg.ng_Flags = PLACETEXT_LEFT;
			newgdg.ng_LeftEdge = WBS->WBorLeft + fontw * 8 + 2;
			newgdg.ng_TopEdge += fonth + 7;
			newgdg.ng_Width = 6 + dummy - newgdg.ng_LeftEdge;
			newgdg.ng_GadgetText = status_title;
			newgdg.ng_GadgetID = STATUS_GDG;
			status_gad = gad = CreateGadget( TEXT_KIND, gad, &newgdg,
				GTTX_Text, statname[status],
				GTTX_Border, TRUE,
				TAG_END );

			/* Sesta riga */

			newgdg.ng_Flags = PLACETEXT_IN;
			newgdg.ng_LeftEdge = WBS->WBorLeft + 2 + vlist_gad->Width / 3 - 50;
			newgdg.ng_TopEdge += fonth + 10;
			newgdg.ng_Width = fontw * 10 + 20;
			newgdg.ng_GadgetText = msg_hide;
			newgdg.ng_GadgetID = HIDE_GDG;
			hide_gad = gad = CreateGadget( BUTTON_KIND, gad, &newgdg,
				TAG_END );

			newgdg.ng_LeftEdge += vlist_gad->Width / 3;
			newgdg.ng_GadgetText = msg_quit;
			newgdg.ng_GadgetID = QUIT_GDG;
			quit_gad = gad = CreateGadget( BUTTON_KIND, gad, &newgdg,
				TAG_END );

			/* Set up gadgets */
			if ( gad )
				{
				wwidth = (UWORD)(vlist_gad->LeftEdge + vlist_gad->Width + 4 + WBS->WBorRight);
				if ( GadToolsBase->lib_Version < 38 )
					wheight = (UWORD)(gad->TopEdge + gad->Height + 3 + WBS->WBorBottom);
				else
					wheight = (UWORD)(gad->TopEdge + gad->Height + 2 + WBS->WBorBottom);
				if ( wleft == ~0 && wtop == ~0 )
					{
					wleft = (WBS->Width - wwidth)>>1;
					wtop = (WBS->Height - wheight)>>1;
					}
				return( TRUE );
				}

			FreeVisualInfo( vi );
			vi = NULL;
			}
		UnlockPubScreen( NULL, WBS );
		}
	CloseLibrary( GadToolsBase );
	}
return( FALSE );
}


void removeGadgets( void )
{
FreeGadgets( glist );
FreeVisualInfo( vi );
UnlockPubScreen( NULL, WBS );
CloseLibrary( GadToolsBase );
if ( font )
	CloseFont( font );
}
