/*
							----------------------
									ppmc.c
							 © 1992,1993 REELSOFT
							----------------------
*/

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

#include	<intuition/classes.h>
#include	<intuition/classusr.h>
#include	<intuition/imageclass.h>
#include	<intuition/gadgetclass.h>
#include	<graphics/gfxbase.h>
#include	<graphics/gfxmacros.h>
#include	<utility/hooks.h>

#include	<string.h>

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

#include	"ppmc.h"
#include	"locale.h"

struct	Screen		*Scr		= NULL ;
APTR				VisualInfo	= NULL ;
struct	Window		*Wnd		= NULL ;
struct	Gadget		*GList		= NULL ;
struct	Menu		*Menus		= NULL ;
struct	Gadget		*Gadgets[GAD_CNT] ;

extern	Class		*initGet (VOID) ;
struct	IClass		*getClass	= NULL ;
struct	_Object		*getImage	= NULL ;

struct	TextAttr	Fnt = { (STRPTR)"PPMC.font",8,0x00,0x20 } ;

//""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
UBYTE	SetupScreen (VOID)
{
	if ( NOT (Scr = LockPubScreen (sup.pubscreen))
	  && NOT (Scr = LockPubScreen ("Workbench")) )
		return (1) ;

	VisualInfo = GetVisualInfo (Scr,TAG_DONE) ;
	if (NOT VisualInfo)
		return (2) ;

	getClass = initGet() ;
	if (NOT getClass)
		return (3) ;

	getImage = NewObject (getClass,NULL,GT_VisualInfo,VisualInfo,TAG_DONE) ;
	if (NOT getImage)
		return (4) ;

	return (0) ;
}
//""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
VOID	CloseDownScreen (VOID)
{
	if (getImage)
		DisposeObject (getImage) ;
	if (getClass)
		FreeClass (getClass) ;
	if (VisualInfo)
		FreeVisualInfo (VisualInfo) ;
	if (Scr)
		UnlockPubScreen (NULL,Scr) ;
}

//""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
//	Menus & Gadgets initialization :
UBYTE	*Efficiency[6], *SUBuffer[4], *DecEffect[6] ;
ULONG	GTags[] = {	(GTTX_Text),	NULL,				//	Status
					(GTTX_Border),	TRUE,	(TAG_DONE),
											(TAG_DONE),	//	Load
					(GTTX_Border),	TRUE,	(TAG_DONE),	//	FileName
					(GTNM_Border),	TRUE,	(TAG_DONE),	//	Size
					(GT_Underscore), '_',				//	Encrypt
					(GTCB_Checked),	NULL,	(TAG_DONE),
					(GTNM_Border),	TRUE,	(TAG_DONE),	//	Gained
					(GTNM_Border),	TRUE,	(TAG_DONE),	//	Packed
					(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), '_',
					(GA_Disabled),	TRUE,	(TAG_DONE),	//	Save
					(GT_Underscore), '_',
					(GA_Disabled),	TRUE,	(TAG_DONE),	//	Pack
					(GT_Underscore), '_',
					(GA_Disabled),	TRUE,	(TAG_DONE),	//	UnPack
					(GA_Disabled),	TRUE,	(TAG_DONE)	//	Abort
} ;
UWORD	GTypes[] = {	TEXT_KIND,		//	Status
						GENERIC_KIND,	//	Load
						TEXT_KIND,		//	FileName
						NUMBER_KIND,	//	Size
						CHECKBOX_KIND,	//	Encrypt
						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
} ;
struct	NewGadget	NGad[] = {
	 21, 9,301,14,NULL,NULL,GD_Status,	0,				NULL,NULL,
	 21,27, 20,14,NULL,NULL,GD_Load,	0,				NULL,NULL,
	 46,27,150,14,NULL,NULL,GD_FileName,PLACETEXT_LEFT,	NULL,NULL,
	261,27, 61,14,NULL,NULL,GD_Size,	PLACETEXT_LEFT,	NULL,NULL,
	21, 48, 26,11,NULL,NULL,GD_Encrypt,	PLACETEXT_RIGHT
										|NG_HIGHLABEL,	NULL,NULL,
	261,45, 41,14,NULL,NULL,GD_Gained,	PLACETEXT_LEFT,	NULL,NULL,
	261,72, 41,14,"%", NULL,GD_Packed,	PLACETEXT_RIGHT,NULL,NULL,
	356,16,101,15,NULL,NULL,GD_CrunEff,	PLACETEXT_LEFT,	NULL,NULL,
	356,43,101,15,NULL,NULL,GD_SUBuffer,PLACETEXT_LEFT,	NULL,NULL,
	356,70,101,15,NULL,NULL,GD_DecrEff,	PLACETEXT_LEFT,	NULL,NULL,
	 11,94, 66,15,NULL,NULL,GD_About,	PLACETEXT_IN,	NULL,NULL,
	 96,94, 66,15,NULL,NULL,GD_Save,	PLACETEXT_IN,	NULL,NULL,
	181,94, 66,15,NULL,NULL,GD_Pack,	PLACETEXT_IN,	NULL,NULL,
	266,94, 66,15,NULL,NULL,GD_UnPack,	PLACETEXT_IN,	NULL,NULL,
	346,94,121,15,NULL,NULL,GD_Abort,	PLACETEXT_IN,	NULL,NULL
} ;
struct	NewMenu	NewMenu[] = {
	NM_TITLE, 0, 0, 0, 0L, 0,
		NM_ITEM, 0, 0, 0, 0L, 0,
		NM_ITEM, (STRPTR)NM_BARLABEL, 0, 0, 0L, 0,
		NM_ITEM, 0, 0, 0, 0L, 0,
		NM_ITEM, 0, 0, NM_ITEMDISABLED, 0L, 0,
		NM_ITEM, 0, 0, NM_ITEMDISABLED, 0L, 0,
		NM_ITEM, (STRPTR)NM_BARLABEL, 0, 0, 0L, 0,
		NM_ITEM, 0, 0, 0, 0L, 0,
	NM_TITLE, 0, 0, 0, 0L, 0,
		NM_ITEM, 0, 0, 0, 0L, 0,
			NM_SUB, 0, 0, 0, 0L, 0,
			NM_SUB, 0, 0, 0, 0L, 0,
			NM_SUB, 0, 0, 0, 0L, 0,
			NM_SUB, 0, 0, 0, 0L, 0,
			NM_SUB, 0, 0, 0, 0L, 0,
		NM_ITEM, 0, 0, 0, 0L, 0,
			NM_SUB, 0, 0, 0, 0L, 0,
			NM_SUB, 0, 0, 0, 0L, 0,
			NM_SUB, 0, 0, 0, 0L, 0,
		NM_ITEM, 0, 0, 0, 0L, 0,
			NM_SUB, 0, 0, 0, 0L, 0,
			NM_SUB, 0, 0, 0, 0L, 0,
			NM_SUB, 0, 0, 0, 0L, 0,
			NM_SUB, 0, 0, 0, 0L, 0,
			NM_SUB, 0, 0, 0, 0L, 0,
		NM_ITEM, 0, 0, 0, 0L, 0,
	NM_TITLE, 0, 0, 0, 0L, 0,
		NM_ITEM, 0, 0, NM_ITEMDISABLED, 0L, 0,
		NM_ITEM, 0, 0, NM_ITEMDISABLED, 0L, 0,
	NM_END, 0, 0, 0, 0L, 0
} ;
//""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
VOID	InitGadNames (VOID)
{
	REGISTER	UBYTE	n ;

	//	Gadget names definition (Cycle gadget names are made upper case) :
	for (n=0 ; n<5 ; n++) {
		Efficiency[n] = strdup (LOC(MSG_EFFICIENCY0_GAD+n)) ;
		strupr (Efficiency[n]) ;
		if (n<3) {
			SUBuffer[n] = strdup (LOC(MSG_SUBUFFER0_GAD+n)) ;
			strupr (SUBuffer[n]) ;
		}
		DecEffect[n] = strdup (LOC(MSG_DECEFFECT0_GAD+n)) ;
		strupr (DecEffect[n]) ;
	}
	Efficiency[5] = SUBuffer[3] = DecEffect[5] = NULL ;

	//	Note: I should find another way to change theese tags...
	GTags[1]	= (ULONG)LOC (MSG_STATUS_BEGIN) ;
	GTags[24]	= (ULONG)&Efficiency[0] ;
	GTags[29]	= (ULONG)&SUBuffer[0] ;
	GTags[34]	= (ULONG)&DecEffect[0] ;
	GTags[15]	= pac.pass ;
	GTags[26]	= pac.eff ;
	GTags[31]	= pac.buf ;
	GTags[36]	= pac.dec ;

	NGLAB (GD_Size)		= LOC (MSG_SIZE_GAD) ;
	NGLAB (GD_Encrypt)	= LOC (MSG_ENCRYPT_GAD) ;
	NGLAB (GD_Gained)	= LOC (MSG_GAIN_GAD) ;
	NGLAB (GD_About)	= LOC (MSG_ABOUT_GAD) ;
	NGLAB (GD_Save)		= LOC (MSG_SAVE_GAD) ;
	NGLAB (GD_Pack)		= LOC (MSG_PACK_GAD) ;
	NGLAB (GD_UnPack)	= LOC (MSG_UNPACK_GAD) ;
	NGLAB (GD_Abort)	= LOC (MSG_ABORT_GAD) ;

	//	Menu names definition :
	NMLAB  (NM_Project_Menu)			= LOC (MSG_PROJECT_MENU) ;
	NMLAB  (NM_Project_About)			= LOC (MSG_PROJECT_ABOUT) ;
	NMLAB  (NM_Project_Load)			= LOC (MSG_PROJECT_LOAD) ;
	NMLAB  (NM_Project_Save)			= LOC (MSG_PROJECT_SAVE) ;
	NMLAB  (NM_Project_SaveAs)			= LOC (MSG_PROJECT_SAVEAS) ;
	NMLAB  (NM_Project_Quit)			= LOC (MSG_PROJECT_QUIT) ;
	NMLAB  (NM_Parameters_Menu)			= LOC (MSG_PARAMETERS_MENU) ;
	NMLAB  (NM_Parameters_Efficiency)	= LOC (MSG_PARAMETERS_EFFICIENCY) ;
	NMLAB  (NM_Efficiency0)				= LOC (MSG_EFFICIENCY0_GAD) ;
	NMLAB  (NM_Efficiency1)				= LOC (MSG_EFFICIENCY1_GAD) ;
	NMLAB  (NM_Efficiency2)				= LOC (MSG_EFFICIENCY2_GAD) ;
	NMLAB  (NM_Efficiency3)				= LOC (MSG_EFFICIENCY3_GAD) ;
	NMLAB  (NM_Efficiency4)				= LOC (MSG_EFFICIENCY4_GAD) ;
	NMLAB  (NM_Parameters_SUBuffer)		= LOC (MSG_PARAMETERS_SUBUFFER) ;
	NMLAB  (NM_SUBuffer0)				= LOC (MSG_SUBUFFER0_GAD) ;
	NMLAB  (NM_SUBuffer1)				= LOC (MSG_SUBUFFER1_GAD) ;
	NMLAB  (NM_SUBuffer2)				= LOC (MSG_SUBUFFER2_GAD) ;
	NMLAB  (NM_Parameters_DecEffect)	= LOC (MSG_PARAMETERS_DECEFFECT) ;
	NMLAB  (NM_DecEffect0)				= LOC (MSG_DECEFFECT0_GAD) ;
	NMLAB  (NM_DecEffect1)				= LOC (MSG_DECEFFECT1_GAD) ;
	NMLAB  (NM_DecEffect2)				= LOC (MSG_DECEFFECT2_GAD) ;
	NMLAB  (NM_DecEffect3)				= LOC (MSG_DECEFFECT3_GAD) ;
	NMLAB  (NM_DecEffect4)				= LOC (MSG_DECEFFECT4_GAD) ;
	NMLAB  (NM_Parameters_Encrypt)		= LOC (MSG_PARAMETERS_ENCRYPT) ;
	NMLAB  (NM_Crunching_Menu)			= LOC (MSG_CRUNCHING_MENU) ;
	NMLAB  (NM_Crunching_Pack)			= LOC (MSG_CRUNCHING_PACK) ;
	NMLAB  (NM_Crunching_UnPack)		= LOC (MSG_CRUNCHING_UNPACK) ;

	NMCKEY (NM_Project_About)			= LOC (MSG_PROJECT_ABOUT_CKEY) ;
	NMCKEY (NM_Project_Load)			= LOC (MSG_PROJECT_LOAD_CKEY) ;
	NMCKEY (NM_Project_Save)			= LOC (MSG_PROJECT_SAVE_CKEY) ;
	NMCKEY (NM_Project_SaveAs)			= LOC (MSG_PROJECT_SAVEAS_CKEY) ;
	NMCKEY (NM_Project_Quit)			= LOC (MSG_PROJECT_QUIT_CKEY) ;
	NMCKEY (NM_Parameters_Encrypt)		= LOC (MSG_PARAMETERS_ENCRYPT_CKEY) ;
	NMCKEY (NM_Crunching_Pack)			= LOC (MSG_CRUNCHING_PACK_CKEY) ;
	NMCKEY (NM_Crunching_UnPack)		= LOC (MSG_CRUNCHING_UNPACK_CKEY) ;

	NMFLAG (NM_Parameters_Encrypt) = CHECKIT|MENUTOGGLE|(pac.pass?CHECKED:0) ;
}
//""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
struct	IntuiText	IText[] = {	2,0,JAM1,0, 8,&Fnt,0,&IText[1],
								2,0,JAM1,0,35,&Fnt,0,&IText[2],
								2,0,JAM1,0,62,&Fnt,0,NULL		} ;
UWORD	pattern[] = { 0x5555,0xAAAA } ;
VOID	Render (VOID)
{
	if (sup.fill) {
		SetAPen  (WRP,sup.apen) ;
		SetBPen  (WRP,0) ;
		SetAfPt  (WRP,pattern,1) ;
		RectFill (WRP,  4,WBT,481,WBT+112) ;

		SetAfPt  (WRP,NULL,0) ;
		RectFill (WRP, 17,WBT+ 5,333,WBT+62) ;
		RectFill (WRP, 17,WBT+69,333,WBT+88) ;
		RectFill (WRP,352,WBT+ 5,468,WBT+88) ;

		SetAPen  (WRP,0) ;	//	Cleaning-up the overlapped gadgets..
		RectFill (WRP, 27,WBT+10,323,WBT+21) ;	//	status gadget
		RectFill (WRP, 52,WBT+28,197,WBT+39) ;	//	file name gadget
		RectFill (WRP,267,WBT+28,323,WBT+39) ;	//	size gadget
		RectFill (WRP,267,WBT+46,303,WBT+57) ;	//	% gain gadget
		RectFill (WRP, 27,WBT+72,243,WBT+85) ;	//	gauge
		RectFill (WRP,267,WBT+73,303,WBT+84) ;	//	% packed gadget

		RefreshGList (GList,Wnd,NULL,-1) ;
		SetAfPt  (WRP,pattern,1) ;
	}

	DrawBevelBox (WRP, 15,WBT +4,321,60,GT_VisualInfo,VI,GTBB_Recessed,TRUE,TAG_DONE) ;
	DrawBevelBox (WRP, 15,WBT+68,321,22,GT_VisualInfo,VI,GTBB_Recessed,TRUE,TAG_DONE) ;
	DrawBevelBox (WRP,350,WBT +4,121,86,GT_VisualInfo,VI,GTBB_Recessed,TRUE,TAG_DONE) ;
	DrawBevelBox (WRP, 25,WBT+71,221,16,GT_VisualInfo,VI,GTBB_Recessed,TRUE,TAG_DONE) ;

	PrintIText (WRP,IText,0,WBT) ;
}
//""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
#define	WND_WIDTH	486
#define	WND_HEIGHT	115
UBYTE	SetupWindow (VOID)
{
	struct	IntuiText	tmpIText ;
	struct	NewGadget	ng ;
	struct	Gadget		*g ;
	REGISTER UWORD		lc, tc, zoom[4] ;

	InitGadNames() ;

	IText[0].IText = LOC(MSG_EFFICIENCY_ITEXT) ;
	IText[1].IText = LOC(MSG_SUBUFFER_ITEXT) ;
	IText[2].IText = LOC(MSG_DECEFFECT_ITEXT) ;

	//	calculating the position of the cycle gadgets title..
	tmpIText.ITextFont = &Fnt ;
	for (tc=0 ; tc<3 ; tc++) {
		tmpIText.IText = IText[tc].IText ;
		IText[tc].LeftEdge = (117-IntuiTextLength(&tmpIText))/2+352 ;
	}

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

	for (lc=0,tc=0 ; lc<GAD_CNT ; lc++) {
		CopyMem ((char *)&NGad[lc],(char *)&ng,(LONG)sizeof(struct NewGadget)) ;

		ng.ng_VisualInfo	 = VisualInfo ;
		ng.ng_TextAttr		 = &Fnt ;
		ng.ng_LeftEdge		+= OFFX ;
		ng.ng_TopEdge		+= OFFY ;

		Gadgets[lc] = g = CreateGadgetA ((ULONG)GTypes[lc],g,&ng,(struct TagItem *)&GTags[tc]) ;

		if (GTypes[lc]	== GENERIC_KIND) {
			g->Flags		|= GFLG_GADGIMAGE | GFLG_GADGHIMAGE ;
			g->Activation	|= GACT_RELVERIFY ;
			g->GadgetRender	 = (APTR)getImage ;
			g->SelectRender	 = (APTR)getImage ;
		}

		while (GTags[tc])
			tc += 2 ;
		tc++ ;

		if (NOT g)
			return (2) ;
	}

	Menus = CreateMenus (NewMenu,GTMN_FrontPen,0L,TAG_DONE) ;
	if (Menus == NULL)
		return (3) ;

	LayoutMenus (Menus,VisualInfo,TAG_END) ;

	zoom[0] = 0 ;
	zoom[1] = zoom[3] = OFFY ;
	zoom[2] = TextLength (&Scr->RastPort,(UBYTE *)"PPMC",5)+80 ;

	Wnd = OpenWindowTags (	NULL,
							WA_Left,			(Scr->Width-WND_WIDTH)/2,
							WA_Top,				(Scr->Height-WND_HEIGHT)/2,
							WA_Width,			WND_WIDTH,
							WA_Height,			WND_HEIGHT+OFFY,
							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,
							WA_Gadgets,			GList,
							WA_Title,			(UBYTE *)"PPMC",
							WA_ScreenTitle,		(UBYTE *)SCREEN,
							WA_PubScreen,		Scr,
							WA_Zoom,			zoom,
							TAG_DONE	) ;
	if (NOT Wnd)
		return (4) ;

	SetMenuStrip (Wnd,Menus) ;
	Render() ;

	GT_RefreshWindow (Wnd,NULL) ;

	return (0) ;
}
//""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
VOID	CloseDownWindow (VOID)
{
	ClearMenus() ;
	if (Wnd)
		CloseWindow (Wnd) ;
	if (GList)
		FreeGadgets (GList) ;
}
//""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
VOID	SetupMenus (VOID)
{
	Menus = CreateMenus (NewMenu,GTMN_FrontPen,0L,TAG_DONE) ;
	if (Menus) {
		LayoutMenus (Menus,VisualInfo,TAG_END) ;
		SetMenuStrip (Wnd,Menus) ;
	}
}
//""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
VOID	ClearMenus (VOID)
{
	if (Menus) {
		ClearMenuStrip (Wnd) ;
		FreeMenus (Menus) ;
	}
}
//""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
UBYTE	ShCutKey (UBYTE appstrid,UBYTE defkey)
{
	UBYTE	p[2] ;

	strncpy (p,strchr(LOC(appstrid),0x5F),2) ;
	return ((UBYTE)(p[1]?p[1]:defkey)) ;
}

//	...