// MPMorph - Amiga Morphing program
// Copyright (C) © 1993  Topicsave Limited

// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2 of the License, or
// any later version.

// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.

// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.

// mpaddock@cix.compulink.co.uk

// Include precompiled headers if not already included
#ifndef MPMORPH_AMIGA_H
#include "MPMorph-amiga.h"
#endif
#ifndef MPMORPH_H
#include "MPMorph.h"
#endif

extern struct Image *Check = NULL;
extern struct Image *Amiga = NULL;

/* Gadgets in the control window */
extern struct ExtGadget OneGadget = {
	&TwoGadget,
	0,0,
	IMAGE_WIDTH,IMAGE_HEIGHT,
	GFLG_GADGHIMAGE|GFLG_GADGIMAGE|GFLG_EXTENDED,
	GACT_IMMEDIATE,
	GTYP_BOOLGADGET,
	&One_im,
	&One_imx,
	NULL,
	0,
	NULL,
	ONEGADGET,
	NULL,
	GMORE_GADGETHELP
};
extern struct ExtGadget TwoGadget = {
	&RelGadget,
	0,0,
	IMAGE_WIDTH,IMAGE_HEIGHT,
	GFLG_GADGHIMAGE|GFLG_GADGIMAGE|GFLG_EXTENDED,
	GACT_IMMEDIATE,
	GTYP_BOOLGADGET,
	&Two_im,
	&Two_imx,
	NULL,
	0,
	NULL,
	TWOGADGET,
	NULL,
	GMORE_GADGETHELP
};
extern struct ExtGadget RelGadget = {
	&MyAddGadget,
	0,0,
	IMAGE_WIDTH,IMAGE_HEIGHT,
	GFLG_GADGHIMAGE|GFLG_GADGIMAGE|GFLG_EXTENDED,
	GACT_IMMEDIATE,
	GTYP_BOOLGADGET,
	&Rel_im,
	&Rel_imx,
	NULL,
	0,
	NULL,
	RELGADGET,
	NULL,
	GMORE_GADGETHELP
};
extern struct ExtGadget MyAddGadget = {	// Note not AddGadget as this is a function!
	&DelGadget,
	0,0,
	IMAGE_WIDTH,IMAGE_HEIGHT,
	GFLG_GADGHIMAGE|GFLG_GADGIMAGE|GFLG_EXTENDED,
	GACT_IMMEDIATE,
	GTYP_BOOLGADGET,
	&Add_im,
	&Add_imx,
	NULL,
	0,
	NULL,
	ADDGADGET,
	NULL,
	GMORE_GADGETHELP
};
extern struct ExtGadget DelGadget = {
	&LinkGadget,
	0,0,
	IMAGE_WIDTH,IMAGE_HEIGHT,
	GFLG_GADGHIMAGE|GFLG_GADGIMAGE|GFLG_EXTENDED,
	GACT_IMMEDIATE,
	GTYP_BOOLGADGET,
	&Del_im,
	&Del_imx,
	NULL,
	0,
	NULL,
	DELGADGET,
	NULL,
	GMORE_GADGETHELP
};
extern struct ExtGadget LinkGadget = {
	&UnlinkGadget,
	0,0,
	IMAGE_WIDTH,IMAGE_HEIGHT,
	GFLG_GADGHIMAGE|GFLG_GADGIMAGE|GFLG_EXTENDED,
	GACT_IMMEDIATE,
	GTYP_BOOLGADGET,
	&Link_im,
	&Link_imx,
	NULL,
	0,
	NULL,
	LINKGADGET,
	NULL,
	GMORE_GADGETHELP
};
extern struct ExtGadget UnlinkGadget = {
	&NoneGadget,
	0,0,
	IMAGE_WIDTH,IMAGE_HEIGHT,
	GFLG_GADGHIMAGE|GFLG_GADGIMAGE|GFLG_EXTENDED,
	GACT_IMMEDIATE,
	GTYP_BOOLGADGET,
	&Unlink_im,
	&Unlink_imx,
	NULL,
	0,
	NULL,
	UNLINKGADGET,
	NULL,
	GMORE_GADGETHELP
};
extern struct ExtGadget NoneGadget = {
	&stGadget,
	0,0,
	IMAGE_WIDTH,IMAGE_HEIGHT,
	GFLG_GADGHIMAGE|GFLG_GADGIMAGE|GFLG_SELECTED|GFLG_EXTENDED,
	GACT_IMMEDIATE,
	GTYP_BOOLGADGET,
	&None_im,
	&None_imx,
	NULL,
	0,
	NULL,
	NONEGADGET,
	NULL,
	GMORE_GADGETHELP
};
extern struct ExtGadget stGadget = {
	&prevGadget,
	0,0,
	AIMAGE,AIMAGE,
	GFLG_GADGHIMAGE|GFLG_GADGIMAGE|GFLG_EXTENDED,
	GACT_RELVERIFY,
	GTYP_BOOLGADGET,
	&st_im,
	&st_imx,
	NULL,
	0,
	NULL,
	STGADGET,
	NULL,
	GMORE_GADGETHELP
};
extern struct ExtGadget prevGadget = {
	&gotoGadget,
	0,0,
	AIMAGE,AIMAGE,
	GFLG_GADGHIMAGE|GFLG_GADGIMAGE|GFLG_EXTENDED,
	GACT_RELVERIFY,
	GTYP_BOOLGADGET,
	&prev_im,
	&prev_imx,
	NULL,
	0,
	NULL,
	PREVGADGET,
	NULL,
	GMORE_GADGETHELP
};
extern struct ExtGadget gotoGadget = {
	&nextGadget,
	0,0,
	AIMAGE+1,AIMAGE,
	GFLG_GADGHIMAGE|GFLG_GADGIMAGE|GFLG_EXTENDED,
	GACT_RELVERIFY,
	GTYP_BOOLGADGET,
	&goto_im,
	&goto_imx,
	NULL,
	0,
	NULL,
	GOTOGADGET,
	NULL,
	GMORE_GADGETHELP
};
extern struct ExtGadget nextGadget = {
	&lastGadget,
	0,0,
	AIMAGE,AIMAGE,
	GFLG_GADGHIMAGE|GFLG_GADGIMAGE|GFLG_EXTENDED,
	GACT_RELVERIFY,
	GTYP_BOOLGADGET,
	&next_im,
	&next_imx,
	NULL,
	0,
	NULL,
	NEXTGADGET,
	NULL,
	GMORE_GADGETHELP
};
extern struct ExtGadget lastGadget = {
	NULL,
	0,0,
	AIMAGE,AIMAGE,
	GFLG_GADGHIMAGE|GFLG_GADGIMAGE|GFLG_EXTENDED,
	GACT_RELVERIFY,
	GTYP_BOOLGADGET,
	&last_im,
	&last_imx,
	NULL,
	0,
	NULL,
	LASTGADGET,
	NULL,
	GMORE_GADGETHELP
};

/* Screen and VisualInfo for ControlWindow	*/
static struct Screen 		*Screen	= NULL;
static struct VisualInfo	*VisInfo	= NULL;

/* The Window and its menus and (animated) screen title	*/
extern struct Window			*ControlWindow	= NULL;
extern struct Menu 			*MyMenu 			= NULL;
extern UBYTE					*CWTitle			= "                           ";	// note at least 3 spaces at end for frame number!
//														  "MPMorph - Frame            "

/* Open the Control Window
 * Not really sure why it returns a Struct Window *
 * as ControlWindow is set up inside this function anyway
 * should really be a BOOL
 */
struct Window *
OpenControlWindow(void) {
	ULONG HNum=0;			// The current edit mode is displayed as help
	switch (Mode) {
	case EDIT1:
		HNum = H_EOne;
		break;
	case EDIT2:
		HNum = H_ETwo;
		break;
	case EDITREL:
		HNum = H_ERel;
		break;
	case ADD:
		HNum = H_EAdd;
		break;
	case DELETE:
		HNum = H_EDel;
		break;
	case LINK1:
		HNum = H_ELnk;
		break;
	case UNLINK1:
		HNum = H_EUnl;
		break;
	case NONE:
		HNum = H_EMov;
		break;
	}
	if (Screen = LockPubScreen(PubScreenName)) {		/* Supplied in PUBSCREEN=	*/
		// Dynamically position all the gadgets (actually only based on window top border)
		/* Gadgets in the left column */
		OneGadget.LeftEdge =
			RelGadget.LeftEdge =
			DelGadget.LeftEdge =
			UnlinkGadget.LeftEdge =
			stGadget.LeftEdge = Screen->WBorLeft; 
		/* Gadgets in the right column */
		TwoGadget.LeftEdge =
			MyAddGadget.LeftEdge =
			LinkGadget.LeftEdge =
			NoneGadget.LeftEdge = Screen->WBorLeft + IMAGE_WIDTH;
		prevGadget.LeftEdge = Screen->WBorLeft + AIMAGE;
		gotoGadget.LeftEdge = Screen->WBorLeft + (AIMAGE+AIMAGE);
		nextGadget.LeftEdge = Screen->WBorLeft + (AIMAGE+AIMAGE+AIMAGE+1);	// +1 as gotoGadget is 1 wider
		lastGadget.LeftEdge = Screen->WBorLeft + (AIMAGE+AIMAGE+AIMAGE+1+AIMAGE);
		/* Gadgets in top row */
		OneGadget.TopEdge =
			TwoGadget.TopEdge = Screen->WBorTop + Screen->Font->ta_YSize+1;
		/* Gadgets in 2nd row */
		RelGadget.TopEdge =
			MyAddGadget.TopEdge = Screen->WBorTop + Screen->Font->ta_YSize+1+(IMAGE_HEIGHT);
		/* Gadgets in 3rd row */
		DelGadget.TopEdge =
			LinkGadget.TopEdge = Screen->WBorTop + Screen->Font->ta_YSize+1+(IMAGE_HEIGHT+IMAGE_HEIGHT);
		/* Gadgets in bottom (-1) row */
		UnlinkGadget.TopEdge =
			NoneGadget.TopEdge = Screen->WBorTop + Screen->Font->ta_YSize+1+(IMAGE_HEIGHT+IMAGE_HEIGHT+IMAGE_HEIGHT);
		/* Arrow gadgets */
		stGadget.TopEdge =
			prevGadget.TopEdge =
			gotoGadget.TopEdge =
			nextGadget.TopEdge =
			lastGadget.TopEdge = Screen->WBorTop + Screen->Font->ta_YSize+1+(IMAGE_HEIGHT+IMAGE_HEIGHT+IMAGE_HEIGHT+IMAGE_HEIGHT);
		if ((SinglePicture == 2) || (SinglePicture == 3)) {		// Animated so set screen title
			sprintf(CWTitle,MyGetMsg(MSG_MPMFRAME),FrameNumber);
		}
		else {
			strcpy(CWTitle,MyGetMsg(MSG_MPM));										// Otherwise default
		}
		/* Open the window, in a default position */
		if (ControlWindow = OpenWindowTags(NULL,
										WA_Gadgets, 		&OneGadget,
										WA_IDCMP,			IDCMP_MENUPICK | IDCMP_CLOSEWINDOW | IDCMP_MENUHELP |
																IDCMP_GADGETDOWN | IDCMP_RAWKEY | IDCMP_VANILLAKEY | IDCMP_GADGETUP |
																IDCMP_GADGETHELP | IDCMP_MOUSEMOVE,
										WA_SimpleRefresh, TRUE,
										WA_Flags,			WFLG_DRAGBAR | WFLG_DEPTHGADGET | WFLG_CLOSEGADGET |
																WFLG_NOCAREREFRESH,
										WA_PubScreen, 		Screen,
					               WA_Width,			Screen->WBorLeft + Screen->WBorRight + 
					               							(IMAGE_WIDTH+IMAGE_WIDTH),
					               WA_Height,			Screen->WBorTop + Screen->Font->ta_YSize + 1 +
					               							Screen->WBorBottom +
					               							(IMAGE_HEIGHT+IMAGE_HEIGHT+IMAGE_HEIGHT+IMAGE_HEIGHT+AIMAGE),
					               WA_Left,				0,			// left edge of screen
					               WA_Top,				MPMorphWnd->TopEdge + BottomHelp + 2,
										WA_ScreenTitle,	CWTitle,	//	Top edge means help gadget is still visible
										WA_Title,			MyGetMsg(MSG_MOV),	// This is wrong - could be a different mode ?
										WA_MenuHelp,		TRUE,
										WA_NewLookMenus,	TRUE,
										Check ? WA_Checkmark: TAG_IGNORE,	Check,
										Amiga ? WA_AmigaKey : TAG_IGNORE,	Amiga,
										WA_HelpGroup,	HelpGroup,
										TAG_DONE)) {
			HelpControl(ControlWindow,HC_GADGETHELP);
			UpdateMenuDefs();										// Update the menu off/on/checks etc.
         /* Create,layout and add the menu	*/
			if (MyMenu = CreateMenus(MyNewMenu,
										GTMN_FullMenu,TRUE,
										TAG_END)) {
				if (VisInfo = GetVisualInfo(Screen, TAG_END)) {
					if (LayoutMenus(MyMenu,VisInfo,
											GTMN_NewLookMenus,TRUE,
											Amiga ? GTMN_AmigaKey : TAG_IGNORE, Amiga,
											Check ? GTMN_Checkmark : TAG_IGNORE, Check,
											TAG_END)) {
						if (SetMenuStrip(ControlWindow,MyMenu)) {
							// display either full or short help
							if (GHelp) {
								help(HNum);
							}
							else {
								ihelp(HNum);
							}
							MySetMode(Mode);
							
							return ControlWindow;		/* Success !!!						*/
						}
					}
				}
			}
		}
	}
	/* Something failed so clear everything down	*/
	CloseControlWindow();
	return NULL;
}
		

/* Close the Control Window
 * or at least as much as it is open
 * Clearing down all variables
 */
void
CloseControlWindow(void) {
	if (ControlWindow) {
		ClearMenuStrip(ControlWindow);
	}
	if (VisInfo) {
		FreeVisualInfo(VisInfo);
		VisInfo = NULL;
	}
	if (MyMenu) {
		FreeMenus(MyMenu);
		MyMenu = NULL;
	}
	if (ControlWindow) {
		CloseWindow(ControlWindow);
		ControlWindow = NULL;
	}
	if (Screen) {
		UnlockPubScreen(NULL,Screen);
		Screen = NULL;
	}
}

/* Update the new menu array based on the current settings
 * updates enabled/disabled status
 * and checkmarks
 */
void
UpdateMenuDefs(void) {
	if ((SinglePicture == 2) || (SinglePicture == 3)) {	// No frame controls if not anim
      MyNewMenu[NM_FRAME].nm_Flags &= ~NM_ITEMDISABLED;
	}
	else {
      MyNewMenu[NM_FRAME].nm_Flags |= NM_ITEMDISABLED;
	}
   if (CreateIcons) {							/* Supplied in CREATEICONS=	*/
      MyNewMenu[NM_CREATEICONS].nm_Flags |= CHECKED;
      MPMorphNewMenu[M_NM_CREATEICONS].nm_Flags |= CHECKED;
   }
   else {
      MyNewMenu[NM_CREATEICONS].nm_Flags &= ~CHECKED;
      MPMorphNewMenu[M_NM_CREATEICONS].nm_Flags &= ~CHECKED;
   }
   if (CreateIconsP) {							/* Supplied in CREATEICONSP=	*/
      MyNewMenu[NM_ICONSP].nm_Flags |= CHECKED;
      MPMorphNewMenu[M_NM_ICONSP].nm_Flags |= CHECKED;
   }
   else {
      MyNewMenu[NM_ICONSP].nm_Flags &= ~CHECKED;
      MPMorphNewMenu[M_NM_ICONSP].nm_Flags &= ~CHECKED;
   }
   if (KeepSettings) {							/* Supplied in KEEPSETTINGS=	*/
      MyNewMenu[NM_KEEPS].nm_Flags |= CHECKED;
      MPMorphNewMenu[M_NM_KEEPS].nm_Flags |= CHECKED;
   }
   else {
      MyNewMenu[NM_KEEPS].nm_Flags &= ~CHECKED;
      MPMorphNewMenu[M_NM_KEEPS].nm_Flags &= ~CHECKED;
   }
	if (ZoomAllowed) {							/* Supplied in ZOOM=				*/
      MyNewMenu[NM_ZOOM].nm_Flags &= ~NM_ITEMDISABLED;
      MPMorphNewMenu[M_NM_ZOOM].nm_Flags &= ~NM_ITEMDISABLED;
	}
	else {
      MyNewMenu[NM_ZOOM].nm_Flags |= NM_ITEMDISABLED;
      MPMorphNewMenu[M_NM_ZOOM].nm_Flags |= NM_ITEMDISABLED;
	}
   if (Zoom) {										/* Supplied in ZOOM=				*/
      MyNewMenu[NM_ZOOM].nm_Flags |= CHECKED;
      MPMorphNewMenu[M_NM_ZOOM].nm_Flags |= CHECKED;
   }
   else {
      MyNewMenu[NM_ZOOM].nm_Flags &= ~CHECKED;
      MPMorphNewMenu[M_NM_ZOOM].nm_Flags &= ~CHECKED;
   }
   if (GHelp) {									/* Supplied in HELP=				*/
      MyNewMenu[NM_HELP].nm_Flags |= CHECKED;
      MPMorphNewMenu[M_NM_HELP].nm_Flags |= CHECKED;
   }
   else {
      MyNewMenu[NM_HELP].nm_Flags &= ~CHECKED;
      MPMorphNewMenu[M_NM_HELP].nm_Flags &= ~CHECKED;
   }
   if (!handle) {									// Have not managed to open amigaguide help file
   	MyNewMenu[NM_HELP].nm_Flags |= NM_ITEMDISABLED;
   	MPMorphNewMenu[M_NM_HELP].nm_Flags |= NM_ITEMDISABLED;
   }
}
