/*							----------------------
								   window.c

							 © 1992,1993 REELSOFT
							----------------------
*/

#include	<proto/intuition.h>
#include	<proto/gadtools.h>
#include	<proto/exec.h>
#include	<proto/graphics.h>
#include	<proto/reqtools.h>
#include	<proto/utility.h>

#include	<graphics/gfxmacros.h>
#include	<intuition/classes.h>
#include	<intuition/imageclass.h>
#include	<intuition/gadgetclass.h>

#include	<string.h>

#include	"protos.h"
#include	"macros.h"
#include	"debug.h"

#include	"locale.h"
#include	"window.h"

APTR			VInfo		= NULL ;
struct	Screen	*Scr		= NULL ;
struct	Window	*Wnd		= NULL ;
struct	Menu	*Menus		= NULL ;
struct	_Object	*getImage	= NULL ;
struct	IClass	*getClass	= NULL ;
struct	Gadget	*GList		= NULL ;
struct	Gadget	*Gads[GAD_CNT] ;

BYTE				WBTop ;
struct	RastPort	*RPort ;
struct	TextAttr	Fnt = {(STRPTR)"PPMC.font",8,0x00,0x20} ;
struct	IntuiText	IText[3] ;

UWORD	pattern[] = { 0x5555,0xAAAA } ;

STRPTR	Efficiency[6], SUBuffer[4], DecEffect[6] ;

ULONG	bbxTags[] = {	GTBB_Recessed,	TRUE,
						GTBB_FrameType,	FRAME_RIDGE,
						GT_VisualInfo,	NULL,
						TAG_DONE
} ;

const WORD	NGPosition[2][GAD_CNT] = {
			{ 21, 21, 21, 46,261,286,286,356,356,356, 11, 94,177,260,346},
			{ 27, 48,  9, 27, 27, 45, 72, 16, 43, 70, 94, 94, 94, 94, 94}
} ;

const WORD	NGSize[2][GAD_CNT] = {
			{ 20, 26,301,150, 61, 35, 35,103,103,103, 72, 72, 72, 72,123},
			{ 14, 11, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15}
} ;

const BYTE	NGText[] = {	0,
							MSG_ENCRYPT_GAD,
							0,0,
							MSG_SIZE_GAD,
							MSG_GAIN_GAD,
							0,0,0,0,
							MSG_ABOUT_GAD,
							MSG_SAVE_GAD,
							MSG_PACK_GAD,
							MSG_UNPACK_GAD,
							MSG_ABORT_GAD
} ;

ULONG	GTags[GAD_CNT][5] = {
				{	TAG_DONE	},							//	Load
				{	GT_Underscore,			'_',			//	Encrypt
					GTCB_Checked,			NULL,
					TAG_DONE
				},
				{	GTTX_Text,				NULL,			//	Status
					GTTX_Border,			TRUE,
					TAG_DONE
				},
				{	GTTX_Border,			TRUE,			//	FileName
					TAG_DONE
				},
				{	GTNM_Border,			TRUE,			//	Size
					GTNM_Justification,		GTJ_RIGHT,
					TAG_DONE
				},
				{	GTNM_Border,			TRUE,			//	Gained
					GTNM_Justification,		GTJ_RIGHT,
					TAG_DONE
				},
				{	GTNM_Border,			TRUE,			//	Packed
					GTNM_Justification,		GTJ_RIGHT,
					TAG_DONE
				},
				{	GTCY_Labels,			NULL,			//	CrunEff
					GTCY_Active,			NULL,
					TAG_DONE
				},
				{	GTCY_Labels,			NULL,			//	SUBuffer
					GTCY_Active,			NULL,
					TAG_DONE
				},
				{	GTCY_Labels,			NULL,			//	DecrEff
					GTCY_Active,			NULL,
					TAG_DONE
				},
				{	TAG_DONE	},							//	About
				{	GT_Underscore,			'_',			//	Save
					GA_Disabled,			TRUE,
					TAG_DONE
				},
				{	GT_Underscore,			'_',			//	Pack
					GA_Disabled,			TRUE,
					TAG_DONE
				},
				{	GT_Underscore,			'_',			//	UnPack
					GA_Disabled,			TRUE,
					TAG_DONE
				},
				{	GA_Disabled,			TRUE,			//	Abort
					TAG_DONE
				}
} ;

const UWORD	GTypes[] = {	GENERIC_KIND,					//	Load
							CHECKBOX_KIND,					//	Encrypt
							TEXT_KIND,						//	Status
							TEXT_KIND,						//	FileName
							NUMBER_KIND,					//	Size
							NUMBER_KIND,					//	Gained
							NUMBER_KIND,					//	Packed
							CYCLE_KIND,						//	CrunEff
							CYCLE_KIND,						//	SUBuffer
							CYCLE_KIND,						//	DecrEff
							BUTTON_KIND,					//	About
							BUTTON_KIND,					//	Save
							BUTTON_KIND,					//	Pack
							BUTTON_KIND,					//	UnPack
							BUTTON_KIND						//	Abort   
} ;

const BYTE	NMLabel[] = {	MSG_PROJECT_MENU,
							MSG_PROJECT_ABOUT,
							0,
							MSG_PROJECT_LOAD,
							MSG_PROJECT_SAVE,
							MSG_PROJECT_SAVEAS,
							0,
							MSG_PROJECT_QUIT,
							MSG_PARAMETERS_MENU,
							MSG_PARAMETERS_EFFICIENCY,
							MSG_EFFICIENCY0_GAD,
							MSG_EFFICIENCY1_GAD,
							MSG_EFFICIENCY2_GAD,
							MSG_EFFICIENCY3_GAD,
							MSG_EFFICIENCY4_GAD,
							MSG_PARAMETERS_SUBUFFER,
							MSG_SUBUFFER0_GAD,
							MSG_SUBUFFER1_GAD,
							MSG_SUBUFFER2_GAD,
							MSG_PARAMETERS_DECEFFECT,
							MSG_DECEFFECT0_GAD,
							MSG_DECEFFECT1_GAD,
							MSG_DECEFFECT2_GAD,
							MSG_DECEFFECT3_GAD,
							MSG_DECEFFECT4_GAD,
							MSG_PARAMETERS_ENCRYPT,
							MSG_CRUNCHING_MENU,
							MSG_CRUNCHING_PACK,
							MSG_CRUNCHING_UNPACK
} ;

const BYTE	NMCKey[] = {	0,
							MSG_PROJECT_ABOUT_CKEY,
							0,
							MSG_PROJECT_LOAD_CKEY,
							MSG_PROJECT_SAVE_CKEY,
							MSG_PROJECT_SAVEAS_CKEY,
							0,
							MSG_PROJECT_QUIT_CKEY,
							0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
							MSG_PARAMETERS_ENCRYPT_CKEY,
							0,
							MSG_CRUNCHING_PACK_CKEY,
							MSG_CRUNCHING_UNPACK_CKEY
} ;

const BYTE	NMMX[] = { 30,29,27,23,15,0,6,5,3,0,30,29,27,23,15 } ;

ULONG	winTags[] = {	WA_Left,			0L,
						WA_Top,				0L,
						WA_Width,			WND_WIDTH,
						WA_Height,			WND_HEIGHT,
						WA_IDCMP,			IDCMP_REFRESHWINDOW
											|IDCMP_GADGETUP
											|IDCMP_MENUPICK
											|IDCMP_CLOSEWINDOW
											|IDCMP_VANILLAKEY,
						WA_Flags,			WFLG_DRAGBAR
											|WFLG_DEPTHGADGET
											|WFLG_CLOSEGADGET
											|WFLG_SMART_REFRESH
											|WFLG_ACTIVATE
											|WFLG_NEWLOOKMENUS,
						WA_Title,			NULL,
						WA_ScreenTitle,		NULL,
						WA_PubScreen,		NULL,
						WA_Zoom,			NULL
} ;

//""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
BOOL	SetupWindow (VOID)
{
	struct	NewMenu		nm[30] ;
	struct	NewGadget	ng ;
	struct	Gadget		*g ;
	struct	DrawInfo	*drawinfo ;
	ULONG				nmtags[] = {GTMN_NewLookMenus,TRUE,TAG_DONE} ;
	LONG				x, y ;
	WORD				zoom[4], offx = Scr->WBorLeft ;
	BYTE				n ;

	//	the cycle gadgets labels are made upper case:
	for (n = 0 ; n < 5 ; n++) {
		strupr (Efficiency[n] = strdup (LOC(MSG_EFFICIENCY0_GAD+n))) ;
		strupr (DecEffect[n]  = strdup (LOC(MSG_DECEFFECT0_GAD+n))) ;
		if (n<3) strupr (SUBuffer[n] = strdup (LOC(MSG_SUBUFFER0_GAD+n))) ;
	}
	Efficiency[5] = SUBuffer[3] = DecEffect[5] = NULL ;

	GTags[GD_Status  ][1] = (ULONG)LOC(MSG_STATUS_BEGIN) ;
	GTags[GD_CrunEff ][1] = (ULONG)&Efficiency[0] ;
	GTags[GD_SUBuffer][1] = (ULONG)&SUBuffer[0] ;
	GTags[GD_DecrEff ][1] = (ULONG)&DecEffect[0] ;
	GTags[GD_CrunEff ][3] = mcPara[EFF] ;
	GTags[GD_SUBuffer][3] = mcPara[BUF] ;
	GTags[GD_DecrEff ][3] = mcPara[DEC] ;
	GTags[GD_Encrypt ][3] = mcPass ;

	//	alternate zoom position and dimensions:
	zoom[0] = zoom[1] = ~0 ;	// size-only zooming (V39+)
	zoom[2] = TextLength (&Scr->RastPort,_PPMC_,5)+80 ;
	zoom[3] = Scr->WBorTop+Scr->RastPort.TxHeight+1 ;

	//	get screen rendering pens:
	drawinfo = GetScreenDrawInfo (Scr) ;
	mcHpen	 = drawinfo->dri_Pens[HIGHLIGHTTEXTPEN] ;
	FreeScreenDrawInfo (Scr,drawinfo) ;

	// IntuiTexts definitions:
	for (n = 0 ; n < 3 ; n++) {
		IText[n].FrontPen	= mcHpen ;
		IText[n].BackPen	= 0 ;
		IText[n].DrawMode	= JAM1 ;
		IText[n].TopEdge	= 27*n+8 ;
		IText[n].ITextFont	= &Fnt ;
		IText[n].IText		= LOC(MSG_EFFICIENCY_ITEXT+n) ;
		IText[n].NextText	= n<2 ? &IText[n+1] : NULL ;
		IText[n].LeftEdge	= (119-IntuiTextLength(&IText[n]))/2+353 ;
	}

	if (NOT(g = CreateContext (&GList))) return FALSE ;

	for (n = 0 ; n < GAD_CNT ; n++) {
		ng.ng_LeftEdge	 = NGPosition[0][n]+offx ;
		ng.ng_TopEdge	 = NGPosition[1][n]+zoom[3] ;
		ng.ng_Width		 = NGSize[0][n] ;
		ng.ng_Height	 = NGSize[1][n] ;
		ng.ng_GadgetText = NGText[n]?(BYTE *)LOC(NGText[n]):(n==6?"%":NULL) ;
		ng.ng_TextAttr	 = &Fnt ;
		ng.ng_GadgetID	 = n ;
		ng.ng_Flags		 = n>2 && n<10	? PLACETEXT_LEFT
						 : n>9			? PLACETEXT_IN
						 : n==1			? PLACETEXT_RIGHT | NG_HIGHLABEL
						 : NULL ;
		ng.ng_VisualInfo = VInfo ;
		ng.ng_UserData	 = NULL ;

		Gads[n] = g = CreateGadgetA ((ULONG)GTypes[n],g,&ng,(struct TagItem *)&GTags[n]) ;
		if (NOT g) return FALSE ;

		if (NOT n) {
			g->Flags		|= GFLG_GADGIMAGE | GFLG_GADGHIMAGE ;
			g->Activation	|= GACT_RELVERIFY ;
			g->GadgetRender	 = (APTR)getImage ;
			g->SelectRender	 = (APTR)getImage ;
		}
	}

	//	menus definitions:
	for (n = 0 ; n < 29 ; n++) {
		nm[n].nm_Type			= n==0 || n==8 || n==26			 ? NM_TITLE
								 : n>9 && n<25 && n!=15 && n!=19 ? NM_SUB
																 : NM_ITEM ;
		nm[n].nm_Flags			= n==4 || n==5 || n==27 || n==28 ? NM_ITEMDISABLED
								 : n>9 && n<25 && n!=15 && n!=19 ? CHECKIT : 0 ;
		nm[n].nm_Label			= NMLabel[n] ? LOC(NMLabel[n]) : NM_BARLABEL ;
		nm[n].nm_CommKey		= NMCKey[n]  ? LOC(NMCKey[n])  : '\0' ;
		nm[n].nm_MutualExclude	= n>9 && n<25 ? (LONG)NMMX[n-10] : 0L ;
		nm[n].nm_UserData		= 0 ;
	}
	nm[10+mcPara[EFF]].nm_Flags	|= CHECKED ;
	nm[16+mcPara[BUF]].nm_Flags	|= CHECKED ;
	nm[20+mcPara[DEC]].nm_Flags	|= CHECKED ;
	nm[25].nm_Flags				 = CHECKIT | MENUTOGGLE | (mcPass?CHECKED:0) ;
	nm[29].nm_Type				 = NM_END ;
	nm[29].nm_Label				 = nm[29].nm_CommKey = '\0' ;
	nm[29].nm_Flags				 = 0 ;
	nm[29].nm_MutualExclude		 = 0L ;
	nm[29].nm_UserData			 = 0 ;

	if (NOT(Menus = CreateMenusA (nm,TAG_DONE))
	 || NOT LayoutMenusA (Menus,VInfo,(struct TagItem *)nmtags)) return FALSE ;

	//	get the size of the visible size of the screen:
	rtGetVScreenSize (Scr,&x,&y) ;
	winTags[1]	= (x-WND_WIDTH)/2-Scr->LeftEdge ;
	winTags[3]	= (y-WND_HEIGHT)/2-Scr->TopEdge ;
	winTags[7] += (ULONG)zoom[3] ;
	winTags[13]	= (ULONG)_PPMC_ ;
	winTags[15]	= (ULONG)_TITLE_ ;
	winTags[17]	= (ULONG)Scr ;
	winTags[19]	= (ULONG)zoom ;

	Wnd = OpenWindowTagList (NULL,(struct TagItem *)winTags) ;
	if (NOT Wnd) return FALSE ;

	SetMenuStrip (Wnd,Menus) ;

	RPort = Wnd->RPort ;
	WBTop = Wnd->BorderTop ;

	bbxTags[5] = (ULONG)VInfo ;
	Render() ;

	AddGList (Wnd,GList,-1,-1,NULL) ;
	RefreshGList (GList,Wnd,NULL,-1) ;

	GT_RefreshWindow (Wnd,NULL) ;

	return TRUE ;
}
//""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
VOID	Render (VOID)
{
	if (mcPrfs & PATTERN) {
		SetAPen  (RPort,mcApen) ;
		SetAfPt  (RPort,pattern,1) ;
		RectFill (RPort,4,WBTop,481,WBTop+112) ;

		SetAfPt  (RPort,NULL,0) ;
		RectFill (RPort, 17,WBTop+ 5,333,WBTop+62) ;
		RectFill (RPort, 17,WBTop+69,333,WBTop+88) ;
		RectFill (RPort,352,WBTop+ 5,470,WBTop+88) ;

		SetAPen  (RPort,0) ;	//	cleaning-up the overlapped gadgets..
		RectFill (RPort, 27,WBTop+10,323,WBTop+21) ;	//	status gadget
		RectFill (RPort, 52,WBTop+28,197,WBTop+39) ;	//	file name gadget
		RectFill (RPort,267,WBTop+28,323,WBTop+39) ;	//	size gadget
		RectFill (RPort,292,WBTop+46,323,WBTop+57) ;	//	% gain gadget
		RectFill (RPort, 27,WBTop+72,244,WBTop+85) ;	//	gauge
		RectFill (RPort,292,WBTop+73,323,WBTop+84) ;	//	% packed gadget
	}
	SetAPen (RPort,mcHpen) ;

	DrawBevelBoxA (RPort, 15,WBTop +4,321,60,(struct TagItem *)bbxTags) ;
	DrawBevelBoxA (RPort, 15,WBTop+68,321,22,(struct TagItem *)bbxTags) ;
	DrawBevelBoxA (RPort,350,WBTop +4,123,86,(struct TagItem *)bbxTags) ;
	DrawBevelBoxA (RPort, 25,WBTop+71,221,16,(struct TagItem *)bbxTags) ;

	PrintIText (RPort,IText,0,WBTop) ;
}
//""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
UBYTE	ShCutKey (UBYTE appstrid)
{
	UBYTE	p[2] ;

	strncpy (p,strchr(LOC(appstrid),'_'),2) ;
	return (p[1]) ;
}

//	Tab size 4