/*
Auto:		smake ForceIcon
*/



/* $Revision Header built automatically *************** (do not edit) ************
**
** © Copyright by GuntherSoft
**
** File             : SnakeSYS:CPrgs/Utils/ForceIcon/Interface.c
** Created on       : Friday, 22.10.93 16:28:10
** Created by       : Kai Iske
** Current revision : V1.0
**
**
** Purpose
** -------
**   - User-Interface for ForceIcon
**
** Revision V1.0
** --------------
** created on Friday, 22.10.93 16:28:10  by  Kai Iske.   LogMessage :
**     --- Initial release ---
**
*********************************************************************************/


#define	MainWinLeft	80
#define	MainWinTop	25
#define	MainWinWidth	457
#define	MainWinHeight	126
#define	EditWinLeft	102
#define	EditWinTop	52
#define	EditWinWidth	433
#define	EditWinHeight	102
#define	ManWinLeft	112
#define	ManWinTop	60
#define	ManWinWidth	438
#define	ManWinHeight	41




/**********************************************************************/
/*                        External structures                         */
/**********************************************************************/
extern struct List		VolumeList;
extern struct SignalSemaphore	MySemaphore;



/**********************************************************************/
/*                        Module`s structures                         */
/**********************************************************************/
struct	Window		*MainWinHandle	= NULL;		// Window handles
struct	Window		*EditWinHandle	= NULL;
struct	Window		*PosWinHandle	= NULL;
struct	Window		*ManWinHandle	= NULL;


static struct VisualInfo	*MainVisInfo	= NULL;
static struct VisualInfo	*EditVisInfo	= NULL;
static struct VisualInfo	*ManVisInfo	= NULL;
static struct Gadget		*MainWinGList	= NULL;
static struct Gadget		*EditWinGList	= NULL;
static struct Gadget		*ManWinGList	= NULL;
static struct Gadget		*MainWinGadgets[MAINWIN_CNT];
static struct Gadget		*EditWinGadgets[EDITWIN_CNT];
static struct Gadget		*ManWinGadgets[MANWIN_CNT];
static struct _Object		*EditWinGet	= NULL;
static struct TextAttr		MainWinTxtAttr,
				EditWinTxtAttr,
				ManWinTxtAttr;
static char			MainWinFontName[40],
				EditWinFontName[40],
				ManWinFontName[40];

static char			MainTypeStr[40];

static struct List		VolList;
static struct VolEntry		OrigEntry;
static WORD			SelVolume, SelEdVolume, PosMode, ManualType;
static LONG			SecsLeft, MinsLeft, SecsRight, MinsRight;
static WORD			LastLeft, LastRight;
static struct Requester		MainReq;





/**********************************************************************/
/*                         Window definitions                         */
/**********************************************************************/
static UBYTE *EditPos1Labels[] = {
	(UBYTE *)"Open position window",
	(UBYTE *)"Close position window",
	NULL };

static UBYTE *ManType2Labels[] = {
	(UBYTE *)"Device",
	(UBYTE *)"Volume",
	NULL };

static UWORD MainWinGTypes[] = {
	LISTVIEW_KIND,
	LISTVIEW_KIND,
	BUTTON_KIND,
	BUTTON_KIND,
	BUTTON_KIND,
	BUTTON_KIND,
	BUTTON_KIND,
	BUTTON_KIND,
	BUTTON_KIND,
	BUTTON_KIND,
	BUTTON_KIND,
	BUTTON_KIND,
	TEXT_KIND
};

static UWORD EditWinGTypes[] = {
	CYCLE_KIND,
	BUTTON_KIND,
	BUTTON_KIND,
	STRING_KIND,
	STRING_KIND,
	GENERIC_KIND,
	CHECKBOX_KIND,
	CYCLE_KIND,
	CHECKBOX_KIND,
	INTEGER_KIND,
	INTEGER_KIND
};

static UWORD ManWinGTypes[] = {
	STRING_KIND,
	BUTTON_KIND,
	BUTTON_KIND,
	CYCLE_KIND
};

static struct NewGadget MainWinNGad[] = {
	244, 17, 200, 56, (UBYTE *)"Ava_ilable Volumes/Devices", NULL, GD_MainVols, PLACETEXT_ABOVE|NG_HIGHLABEL, NULL, NULL,
	13, 17, 200, 56, (UBYTE *)"Used _Volumes/Devices", NULL, GD_MainUseVols, PLACETEXT_ABOVE|NG_HIGHLABEL, NULL, NULL,
	244, 69, 200, 12, (UBYTE *)"Add to _list", NULL, GD_MainAdd, PLACETEXT_IN, NULL, NULL,
	13, 81, 200, 12, (UBYTE *)"_Edit entry...", NULL, GD_MainEdit, PLACETEXT_IN, NULL, NULL,
	13, 93, 200, 12, (UBYTE *)"_Remove from list", NULL, GD_MainRemove, PLACETEXT_IN, NULL, NULL,
	5, 112, 85, 12, (UBYTE *)"_Save", NULL, GD_MainSave, PLACETEXT_IN, NULL, NULL,
	95, 112, 85, 12, (UBYTE *)"_Use", NULL, GD_MainUse, PLACETEXT_IN, NULL, NULL,
	367, 112, 85, 12, (UBYTE *)"_Quit", NULL, GD_MainQuit, PLACETEXT_IN, NULL, NULL,
	275, 112, 85, 12, (UBYTE *)"_Hide", NULL, GD_MainHide, PLACETEXT_IN, NULL, NULL,
	244, 81, 200, 12, (UBYTE *)"Add _manually...", NULL, GD_MainManual, PLACETEXT_IN, NULL, NULL,
	244, 93, 200, 12, (UBYTE *)"Resca_n list", NULL, GD_MainRescan, PLACETEXT_IN, NULL, NULL,
	185, 112, 85, 12, (UBYTE *)"_About...", NULL, GD_MainAbout, PLACETEXT_IN, NULL, NULL,
	13, 69, 200, 12, NULL, NULL, GD_MainType, 0, NULL, NULL
};

static struct NewGadget EditWinNGad[] = {
	108, 51, 202, 12, (UBYTE *)"_Position", NULL, GD_EditPos, PLACETEXT_LEFT, NULL, NULL,
	5, 88, 85, 12, (UBYTE *)"_Ok", NULL, GD_EditOk, PLACETEXT_IN, NULL, NULL,
	343, 88, 85, 12, (UBYTE *)"_Cancel", NULL, GD_EditCancel, PLACETEXT_IN, NULL, NULL,
	108, 6, 297, 14, (UBYTE *)"_Volume", NULL, GD_EditVol, PLACETEXT_LEFT, NULL, NULL,
	108, 69, 181, 14, (UBYTE *)"Ico_n", NULL, GD_EditIcon, PLACETEXT_LEFT, NULL, NULL,
	290, 69, 20, 14, NULL, NULL, GD_EditGet, 0, NULL, NULL,
	318, 69, 26, 11, (UBYTE *)"_Use Icon", NULL, GD_EditUseIcon, PLACETEXT_RIGHT, NULL, NULL,
	108, 21, 297, 12, (UBYTE *)"_Type", NULL, GD_EditType, PLACETEXT_LEFT, NULL, NULL,
	318, 51, 26, 11, (UBYTE *)"_IconPos", NULL, GD_EditIconPos, PLACETEXT_RIGHT, NULL, NULL,
	108, 36, 67, 14, (UBYTE *)"Current _X", NULL, GD_EditX, PLACETEXT_LEFT, NULL, NULL,
	338, 36, 67, 14, (UBYTE *)"Current _Y", NULL, GD_EditY, PLACETEXT_LEFT, NULL, NULL
};

static struct NewGadget ManWinNGad[] = {
	82, 7, 346, 14, (UBYTE *)"_Entry", NULL, GD_ManVol, PLACETEXT_LEFT, NULL, NULL,
	5, 27, 85, 12, (UBYTE *)"_Ok", NULL, GD_ManOk, PLACETEXT_IN, NULL, NULL,
	349, 27, 85, 12, (UBYTE *)"_Cancel", NULL, GD_ManCancel, PLACETEXT_IN, NULL, NULL,
	175, 27, 121, 12, (UBYTE *)"_Type", NULL, GD_ManType, PLACETEXT_LEFT, NULL, NULL
};

static ULONG MainWinGTags[] = {
	(GTLV_ShowSelected), NULL, (GT_Underscore), '_', (TAG_DONE),
	(GTLV_ShowSelected), NULL, (GT_Underscore), '_', (TAG_DONE),
	(GT_Underscore), '_', (GA_Disabled), TRUE, (TAG_DONE),
	(GT_Underscore), '_', (GA_Disabled), TRUE, (TAG_DONE),
	(GT_Underscore), '_', (GA_Disabled), TRUE, (TAG_DONE),
	(GT_Underscore), '_', (TAG_DONE),
	(GT_Underscore), '_', (TAG_DONE),
	(GT_Underscore), '_', (TAG_DONE),
	(GT_Underscore), '_', (TAG_DONE),
	(GT_Underscore), '_', (TAG_DONE),
	(GT_Underscore), '_', (TAG_DONE),
	(GT_Underscore), '_', (TAG_DONE),
	(GTTX_Border), TRUE, (TAG_DONE)
};

static ULONG EditWinGTags[] = {
	(GTCY_Labels), (ULONG)&EditPos1Labels[ 0 ], (GT_Underscore), '_', (TAG_DONE),
	(GT_Underscore), '_', (TAG_DONE),
	(GT_Underscore), '_', (TAG_DONE),
	(STRINGA_ExitHelp), TRUE, (GTST_MaxChars), 128, (GT_Underscore), '_', (TAG_DONE),
	(STRINGA_ExitHelp), TRUE, (GTST_MaxChars), 256, (GT_Underscore), '_', (TAG_DONE),
	(TAG_DONE),
	(GT_Underscore), '_', (GTCB_Scaled), TRUE, (TAG_DONE),
	(GTCY_Labels), (ULONG)&ManType2Labels[ 0 ], (GT_Underscore), '_', (TAG_DONE),
	(GT_Underscore), '_', (GTCB_Scaled), TRUE, (TAG_DONE),
	(STRINGA_ExitHelp), TRUE, (GTIN_Number), 0, (GTIN_MaxChars), 4, (GT_Underscore), '_', (TAG_DONE),
	(STRINGA_ExitHelp), TRUE, (GTIN_Number), 0, (GTIN_MaxChars), 4, (GT_Underscore), '_', (TAG_DONE)
};

static ULONG ManWinGTags[] = {
	(STRINGA_ExitHelp), TRUE, (GTST_MaxChars), 128, (GT_Underscore), '_', (TAG_DONE),
	(GT_Underscore), '_', (TAG_DONE),
	(GT_Underscore), '_', (TAG_DONE),
	(GTCY_Labels), (ULONG)&ManType2Labels[ 0 ], (GT_Underscore), '_', (TAG_DONE)
};












/**********************************************************************/
/*                       Handle the main window                       */
/**********************************************************************/
BOOL OpenMainWin(void)
{
		// Initialize volume list

	NewList(&VolList);

		// Get list of available volumes

	if(GetDevVolList(&VolList))
	{
			// Try to open main window

		if(OpenWin(MainWinLeft,
			MainWinTop,
			MainWinWidth,
			MainWinHeight,
			&MainWinGList,
			MAINWIN_CNT,
			NULL,
			MainWinNGad,
			MainWinGTypes,
			MainWinGTags,
			MainWinGadgets,
			&MainWinHandle,
			"ForceIcon v"REVISION" ("REVDATE") - GiftWare, Kai Iske",
			LISTVIEWIDCMP|BUTTONIDCMP|IDCMP_CLOSEWINDOW|IDCMP_VANILLAKEY|IDCMP_REFRESHWINDOW,
			WFLG_DRAGBAR|WFLG_DEPTHGADGET|WFLG_CLOSEGADGET|WFLG_SMART_REFRESH|WFLG_ACTIVATE|WFLG_RMBTRAP,
			5,
			3,
			447,
			106,
			&MainWinTxtAttr,
			MainWinFontName,
		&MainVisInfo))
		{
				// Set right listview

			GT_SetGadgetAttrs(MainWinGadgets[GD_MainVols], MainWinHandle, NULL,
				GTLV_Labels,	&VolList,
			TAG_DONE);

				// Set left listview

			GT_SetGadgetAttrs(MainWinGadgets[GD_MainUseVols], MainWinHandle, NULL,
				GTLV_Labels,	&VolumeList,
			TAG_DONE);

				// Set variables for Window handling

			SelVolume	= SelEdVolume = -1;
			LastLeft	= LastRight = -1;
			SecsLeft	= MinsLeft = SecsRight = MinsRight = -1;
		}
		else
			CloseMainWin();
	}
	else
		FreeDevVolList(&VolList);

	if(!MainWinHandle)
		DisplayError(ERR_NOMEM, NULL);

	return((BOOL)(MainWinHandle != NULL));
}







/**********************************************************************/
/*                      Close main window again                       */
/**********************************************************************/
void CloseMainWin(void)
{
		// Unbusy window first

	UnBusyWindow(MainWinHandle, &MainReq);

		// Close window

	CloseWin(&MainWinHandle, &MainWinGList, &MainVisInfo, NULL);

		// Free volume list

	FreeDevVolList(&VolList);
}






/**********************************************************************/
/*                          Open Edit window                          */
/**********************************************************************/
BOOL OpenEditWin(void)
{
		// Try to open editor window

	if(OpenWin(EditWinLeft,
		EditWinTop,
		EditWinWidth,
		EditWinHeight,
		&EditWinGList,
		EDITWIN_CNT,
		&EditWinGet,
		EditWinNGad,
		EditWinGTypes,
		EditWinGTags,
		EditWinGadgets,
		&EditWinHandle,
		"ForceIcon v"REVISION" ("REVDATE") - GiftWare, Kai Iske",
		LISTVIEWIDCMP|BUTTONIDCMP|IDCMP_CLOSEWINDOW|IDCMP_VANILLAKEY|IDCMP_REFRESHWINDOW,
		WFLG_DRAGBAR|WFLG_DEPTHGADGET|WFLG_CLOSEGADGET|WFLG_SMART_REFRESH|WFLG_ACTIVATE|WFLG_RMBTRAP,
		5,
		3,
		423,
		83,
		&EditWinTxtAttr,
		EditWinFontName,
	&EditVisInfo))
	{
			// Set gadgets

		GT_SetGadgetAttrs(EditWinGadgets[GD_EditVol], EditWinHandle, NULL,
			GTST_String,	OrigEntry.VolName,
		TAG_DONE);

		GT_SetGadgetAttrs(EditWinGadgets[GD_EditType], EditWinHandle, NULL,
			GTCY_Active,	(ManualType = !(OrigEntry.Link.ln_Type == LDF_DEVICES)),
		TAG_DONE);

		GT_SetGadgetAttrs(EditWinGadgets[GD_EditX], EditWinHandle, NULL,
			GTIN_Number,	OrigEntry.Left,
		TAG_DONE);

		GT_SetGadgetAttrs(EditWinGadgets[GD_EditY], EditWinHandle, NULL,
			GTIN_Number,	OrigEntry.Top,
		TAG_DONE);

		GT_SetGadgetAttrs(EditWinGadgets[GD_EditIcon], EditWinHandle, NULL,
			GTST_String,	OrigEntry.IconName,
		TAG_DONE);

		GT_SetGadgetAttrs(EditWinGadgets[GD_EditUseIcon], EditWinHandle, NULL,
			GTCB_Checked,	OrigEntry.UseAlt,
		TAG_DONE);

		GT_SetGadgetAttrs(EditWinGadgets[GD_EditIcon], EditWinHandle, NULL,
			GA_Disabled,	!OrigEntry.UseAlt,
		TAG_DONE);

		GT_SetGadgetAttrs(EditWinGadgets[GD_EditX], EditWinHandle, NULL,
			GA_Disabled,	!OrigEntry.IconPos,
		TAG_DONE);

		GT_SetGadgetAttrs(EditWinGadgets[GD_EditY], EditWinHandle, NULL,
			GA_Disabled,	!OrigEntry.IconPos,
		TAG_DONE);

		GT_SetGadgetAttrs(EditWinGadgets[GD_EditPos], EditWinHandle, NULL,
			GA_Disabled,	!OrigEntry.IconPos,
		TAG_DONE);

		GT_SetGadgetAttrs(EditWinGadgets[GD_EditIconPos], EditWinHandle, NULL,
			GTCB_Checked,	OrigEntry.IconPos,
		TAG_DONE);

		SetGetFileState(EditWinGadgets[GD_EditGet], EditWinHandle, !OrigEntry.UseAlt);

			// Set work mode variable

		PosMode = 0;
	}
	else
		CloseEditWin();

	if(!EditWinHandle)
		DisplayError(ERR_NOMEM, NULL);

	return((BOOL)(EditWinHandle != NULL));
}






/**********************************************************************/
/*                        Close Editor window                         */
/**********************************************************************/
void CloseEditWin(void)
{
		// UnLock main window again

	UnBusyWindow(MainWinHandle, &MainReq);

		// Close position window

	ClosePosWin();

		// Close Editor window

	CloseWin(&EditWinHandle, &EditWinGList, &EditVisInfo, &EditWinGet);
}








/**********************************************************************/
/*                         Open manual window                         */
/**********************************************************************/
BOOL OpenManWin(void)
{
		// Try to open manual input window

	if(OpenWin(ManWinLeft,
		ManWinTop,
		ManWinWidth,
		ManWinHeight,
		&ManWinGList,
		MANWIN_CNT,
		NULL,
		ManWinNGad,
		ManWinGTypes,
		ManWinGTags,
		ManWinGadgets,
		&ManWinHandle,
		"ForceIcon v"REVISION" ("REVDATE") - GiftWare, Kai Iske",
		LISTVIEWIDCMP|BUTTONIDCMP|IDCMP_CLOSEWINDOW|IDCMP_VANILLAKEY|IDCMP_REFRESHWINDOW,
		WFLG_DRAGBAR|WFLG_DEPTHGADGET|WFLG_CLOSEGADGET|WFLG_SMART_REFRESH|WFLG_ACTIVATE|WFLG_RMBTRAP,
		5,
		3,
		429,
		22,
		&ManWinTxtAttr,
		ManWinFontName,
	&ManVisInfo))
	{
		ManualType = 0;
		ActivateGadget(ManWinGadgets[GD_ManVol], ManWinHandle, NULL);
	}
	else
		CloseManWin();

	if(!ManWinHandle)
		DisplayError(ERR_NOMEM, NULL);

	return((BOOL)(ManWinHandle != NULL));
}







/**********************************************************************/
/*                        Close manual window                         */
/**********************************************************************/
void CloseManWin(void)
{
		// Unbusy main window first

	UnBusyWindow(MainWinHandle, &MainReq);

		// Close manual input window

	CloseWin(&ManWinHandle, &ManWinGList, &ManVisInfo, NULL);
}






/**********************************************************************/
/*                        Open position window                        */
/**********************************************************************/
BOOL OpenPosWin(void)
{
	struct	Screen		*WBScreen;

		// Get info about WBScreen

	if((WBScreen = LockPubScreen("Workbench")))
	{
		PosWinHandle = OpenWindowTags(NULL,
			WA_Left,	OrigEntry.Left,
			WA_Top,		OrigEntry.Top,
			WA_Width,	(EditWinHandle->IFont->tf_XSize * 8) + 30 + WBScreen->WBorLeft + WBScreen->WBorRight,
			WA_Height,	WBScreen->WBorTop + WBScreen->Font->ta_YSize + 1,
			WA_IDCMP,	IDCMP_CHANGEWINDOW,
			WA_Flags,	WFLG_DEPTHGADGET|WFLG_DRAGBAR|WFLG_RMBTRAP,
			WA_Title,	"IconPos",
			WA_PubScreen,	WBScreen,
		TAG_DONE);
			// Unlock screen

		UnlockPubScreen(NULL, WBScreen);
	}


	if(!PosWinHandle)
		DisplayError(ERR_NOMEM, NULL);

	return((BOOL)(PosWinHandle != NULL));
}




/**********************************************************************/
/*                       Close Position window                        */
/**********************************************************************/
void ClosePosWin(void)
{
	if(PosWinHandle)
		CloseWindow(PosWinHandle);
	PosWinHandle = NULL;
}



/**********************************************************************/
/*                 Check for inputs from main window                  */
/**********************************************************************/
BOOL HandleMainWin(BOOL *QuitIT)
{
	struct	IntuiMessage	*MyMsg;
	struct	Gadget		*MsgGad;
	ULONG	MsgClass, CurrentSecs, CurrentMins;
	UWORD	GadID, MsgQual, MsgCode;
	BOOL	CloseIT = FALSE, KeyUse;

		// Loop for all messages

	while((MyMsg = (struct IntuiMessage *)GT_GetIMsg(MainWinHandle->UserPort)))
	{
		MsgClass	= MyMsg->Class;
		MsgQual		= MyMsg->Qualifier;
		MsgCode		= MyMsg->Code;
		CurrentSecs	= MyMsg->Seconds;
		CurrentMins	= MyMsg->Micros;

		if((MsgClass & (IDCMP_GADGETUP|IDCMP_GADGETDOWN)))
		{
			MsgGad	= (struct Gadget *)MyMsg->IAddress;
			GadID	= MsgGad->GadgetID;
		}

		CheckKeys(&MsgClass, &MsgCode, &GadID, &KeyUse, &MsgGad, &MainWinGadgets[0], MAINWIN_CNT);

		GT_ReplyIMsg(MyMsg);

		switch(MsgClass)
		{
			case IDCMP_CLOSEWINDOW :
			{
				CloseIT	= TRUE;
				break;
			}
			case IDCMP_GADGETUP :
			{
				switch(GadID)
				{
						// Save prefs to env:

					case GD_MainUse :
					{
						SavePrefs(TRUE);
						CloseIT = TRUE;
						break;
					}
						// Save prefs to env: and envarc:

					case GD_MainSave :
					{
						SavePrefs(FALSE);
						CloseIT = TRUE;
						break;
					}
						// Display about

					case GD_MainAbout :
					{
						DisplayError(ERR_ABOUT, VERNUM, REVNUM, (ULONG)REVDATE, NULL);
						break;
					}

						// Quit it

					case GD_MainQuit :
					{
						*QuitIT	= TRUE;
						CloseIT	= TRUE;
						break;
					}
						// Hide all windows

					case GD_MainHide :
					{
						CloseIT	= TRUE;
						break;
					}
						// Selected a new volume from the available ones ???

					case GD_MainVols :
					{
						if((SelVolume = HandleListViewGad(MsgGad, MainWinHandle, KeyUse, MsgCode, MsgQual, SelVolume, 0, VolList.lh_Type - 1)) != -1)
						{
							GT_SetGadgetAttrs(MainWinGadgets[GD_MainAdd], MainWinHandle, NULL,
								GA_Disabled,	FALSE,
							TAG_DONE);

								// Check for double-click

							if(!KeyUse)
							{
								if(LastRight == SelVolume)
								{
									if(DoubleClick(SecsRight, MinsRight, CurrentSecs, CurrentMins))
									{
										struct	VolEntry	*ThisEntry	= (struct VolEntry *)GetListEntry(&VolList, SelVolume);

										AddNewVolume(ThisEntry->VolName, ThisEntry->Link.ln_Type);
									}
								}
								SecsRight	= CurrentSecs;
								MinsRight	= CurrentMins;
								LastRight	= SelVolume;
							}
						}
						break;
					}
					case GD_MainUseVols :
					{
							// Selected a new volume to edit ???

						if((SelEdVolume = HandleListViewGad(MsgGad, MainWinHandle, KeyUse, MsgCode, MsgQual, SelEdVolume, 0, VolumeList.lh_Type - 1)) != -1)
						{
							strcpy(MainTypeStr, "Type: ");
							strcat(MainTypeStr, ManType2Labels[!(((struct VolEntry *)GetListEntry(&VolumeList, SelEdVolume))->Link.ln_Type == LDF_DEVICES)]);

							GT_SetGadgetAttrs(MainWinGadgets[GD_MainType], MainWinHandle, NULL,
								GTTX_Text,	MainTypeStr,
							TAG_DONE);

							GT_SetGadgetAttrs(MainWinGadgets[GD_MainEdit], MainWinHandle, NULL,
								GA_Disabled,	FALSE,
							TAG_DONE);

							GT_SetGadgetAttrs(MainWinGadgets[GD_MainRemove], MainWinHandle, NULL,
								GA_Disabled,	FALSE,
							TAG_DONE);

								// Check for double-click

							if(!KeyUse)
							{
								if(LastLeft == SelEdVolume)
								{
									if(DoubleClick(SecsLeft, MinsLeft, CurrentSecs, CurrentMins))
									{
										struct	VolEntry	*EditEntry;

										if((EditEntry = (struct VolEntry *)GetListEntry(&VolumeList, SelEdVolume)))
										{
											strcpy(OrigEntry.VolName, EditEntry->VolName);
											strcpy(OrigEntry.IconName, EditEntry->IconName);
											OrigEntry.Link.ln_Type	= EditEntry->Link.ln_Type;
											OrigEntry.Left		= EditEntry->Left;
											OrigEntry.Top		= EditEntry->Top;
											OrigEntry.UseAlt	= EditEntry->UseAlt;
											OrigEntry.IconPos	= EditEntry->IconPos;

											if(OpenEditWin())
												BusyWindow(MainWinHandle, &MainReq);
										}
									}
								}
								SecsLeft	= CurrentSecs;
								MinsLeft	= CurrentMins;
								LastLeft	= SelEdVolume;
							}
						}
						break;
					}
						// Add new entry to list

					case GD_MainAdd :
					{
						struct	VolEntry	*VolEntry = (struct VolEntry *)GetListEntry(&VolList, SelVolume);

						if(SelVolume != -1)
							AddNewVolume(VolEntry->VolName, VolEntry->Link.ln_Type);
						break;
					}
						// Remove active entry from list

					case GD_MainRemove :
					{
						struct	VolEntry	*ThisEntry = (struct VolEntry *)GetListEntry(&VolumeList, SelEdVolume);

						if(ThisEntry)
						{
								// Get semaphore

							ObtainSemaphore(&MySemaphore);

								// Remove list from ListView

							GT_SetGadgetAttrs(MainWinGadgets[GD_MainUseVols], MainWinHandle, NULL,
								GTLV_Labels,	~0,
							TAG_DONE);

								// Remove entry and free memory

							Remove((struct Node *)ThisEntry);
							FreeVec(ThisEntry);

								// One entry less

							VolumeList.lh_Type--;

								// Set pointer to current entry

							if(SelEdVolume >= VolumeList.lh_Type)
								SelEdVolume--;

								// Still entries available ???

							if(SelEdVolume > -1)
							{
									// Reinstall list

								GT_SetGadgetAttrs(MainWinGadgets[GD_MainUseVols], MainWinHandle, NULL,
									GTLV_Labels,	&VolumeList,
									GTLV_Selected,	SelEdVolume,
									GTLV_Top,	SelEdVolume,
								TAG_DONE);

								strcpy(MainTypeStr, "Type: ");
								strcat(MainTypeStr, ManType2Labels[!(((struct VolEntry *)GetListEntry(&VolumeList, SelEdVolume))->Link.ln_Type == LDF_DEVICES)]);
								GT_SetGadgetAttrs(MainWinGadgets[GD_MainType], MainWinHandle, NULL,
									GTTX_Text,	MainTypeStr,
								TAG_DONE);
							}
							else
							{
									// Disable gadgets

								GT_SetGadgetAttrs(MainWinGadgets[GD_MainUseVols], MainWinHandle, NULL,
									GTLV_Labels,	NULL,
								TAG_DONE);

								GT_SetGadgetAttrs(MainWinGadgets[GD_MainEdit], MainWinHandle, NULL,
									GA_Disabled,	TRUE,
								TAG_DONE);

								GT_SetGadgetAttrs(MainWinGadgets[GD_MainRemove], MainWinHandle, NULL,
									GA_Disabled,	TRUE,
								TAG_DONE);

								strcpy(MainTypeStr, "");
								GT_SetGadgetAttrs(MainWinGadgets[GD_MainType], MainWinHandle, NULL,
									GTTX_Text,	MainTypeStr,
								TAG_DONE);
							}

							ReleaseSemaphore(&MySemaphore);
						}
						break;
					}
						// Edit current entry using the Editor window

					case GD_MainEdit :
					{
						struct	VolEntry	*EditEntry;

						if((EditEntry = (struct VolEntry *)GetListEntry(&VolumeList, SelEdVolume)))
						{
								// Copy data from current entry to spare

							strcpy(OrigEntry.VolName, EditEntry->VolName);
							strcpy(OrigEntry.IconName, EditEntry->IconName);
							OrigEntry.Link.ln_Type	= EditEntry->Link.ln_Type;
							OrigEntry.Left		= EditEntry->Left;
							OrigEntry.Top		= EditEntry->Top;
							OrigEntry.UseAlt	= EditEntry->UseAlt;
							OrigEntry.IconPos	= EditEntry->IconPos;

							if(OpenEditWin())
								BusyWindow(MainWinHandle, &MainReq);
						}
						break;
					}
						// Enter manually

					case GD_MainManual :
					{
						if(OpenManWin())
							BusyWindow(MainWinHandle, &MainReq);
						break;
					}
						// Recan volume list

					case GD_MainRescan :
					{
							// Remove list

						GT_SetGadgetAttrs(MainWinGadgets[GD_MainVols], MainWinHandle, NULL,
							GTLV_Labels,	~0,
						TAG_DONE);

							// Free old list and get new

						FreeDevVolList(&VolList);
						GetDevVolList(&VolList);

							// Set pointer to current entry

						if(SelVolume >= VolList.lh_Type)
							SelVolume = VolList.lh_Type - 1;

							// Reinstall gadget

						GT_SetGadgetAttrs(MainWinGadgets[GD_MainVols], MainWinHandle, NULL,
							GTLV_Labels,	&VolList,
						TAG_DONE);

							// Set gadget state

						if(!VolList.lh_Type)
						{
							GT_SetGadgetAttrs(MainWinGadgets[GD_MainAdd], MainWinHandle, NULL,
								GA_Disabled,	TRUE,
							TAG_DONE);
						}
						else
						{
							if(SelVolume != -1)
							{
								GT_SetGadgetAttrs(MainWinGadgets[GD_MainAdd], MainWinHandle, NULL,
									GA_Disabled,	FALSE,
								TAG_DONE);
							}
						}
						break;
					}
				}
				break;
			}
		}
	}

	return(CloseIT);
}





/**********************************************************************/
/*                 Add a new entry to the volume list                 */
/**********************************************************************/
BOOL AddNewVolume(char *Name, ULONG Type)
{
	struct	VolEntry	*NewEntry;
	BOOL	RetVal = TRUE;

		// Check for exitance

	if(CheckExists(Name))
	{
		DisplayError(ERR_EXISTS, (ULONG)Name, NULL);
		return(FALSE);
	}

		// Try to get our semaphore

	ObtainSemaphore(&MySemaphore);

		// Get memory for new entry

	if((NewEntry = AllocVec(sizeof(struct VolEntry), MEMF_CLEAR)))
	{
		GT_SetGadgetAttrs(MainWinGadgets[GD_MainUseVols], MainWinHandle, NULL,
			GTLV_Labels,	~0,
		TAG_DONE);

		VolumeList.lh_Type++;
		SelEdVolume = -1;

			// Add entry and fill out structure

		if(Type == LDF_VOLUMES)
			AddHead(&VolumeList, (struct Node *)NewEntry);
		else
			AddTail(&VolumeList, (struct Node *)NewEntry);

		NewEntry->Link.ln_Name	= NewEntry->VolName;
		NewEntry->Link.ln_Type	= Type;
		strcpy(NewEntry->VolName, Name);

			// Sort the list again

		SortList(&VolumeList, TRUE);

			// reset listview

		GT_SetGadgetAttrs(MainWinGadgets[GD_MainUseVols], MainWinHandle, NULL,
			GTLV_Labels,	&VolumeList,
			GTLV_Selected,	~0,
			GTLV_Top,	0,
		TAG_DONE);

			// Disable edit and remove gadgets

		GT_SetGadgetAttrs(MainWinGadgets[GD_MainEdit], MainWinHandle, NULL,
			GA_Disabled,	TRUE,
		TAG_DONE);

		GT_SetGadgetAttrs(MainWinGadgets[GD_MainRemove], MainWinHandle, NULL,
			GA_Disabled,	TRUE,
		TAG_DONE);

		strcpy(MainTypeStr, "");
		GT_SetGadgetAttrs(MainWinGadgets[GD_MainType], MainWinHandle, NULL,
			GTTX_Text,	MainTypeStr,
		TAG_DONE);
	}
	else
	{
		DisplayError(ERR_NOMEM, NULL);
		RetVal = FALSE;
	}

		// Free our semaphore

	ReleaseSemaphore(&MySemaphore);

	return(RetVal);
}




/**********************************************************************/
/*                  Handle inputs from Editor window                  */
/**********************************************************************/
BOOL HandleEditWin(void)
{
	struct	IntuiMessage	*MyMsg;
	struct	Gadget		*MsgGad;
	ULONG	MsgClass;
	UWORD	GadID, MsgQual, MsgCode;
	BOOL	CloseIT = FALSE, KeyUse;

		// Loop for all messages

	while((MyMsg = (struct IntuiMessage *)GT_GetIMsg(EditWinHandle->UserPort)))
	{
		MsgClass	= MyMsg->Class;
		MsgQual		= MyMsg->Qualifier;
		MsgCode		= MyMsg->Code;

		if((MsgClass & (IDCMP_GADGETUP|IDCMP_GADGETDOWN)))
		{
			MsgGad	= (struct Gadget *)MyMsg->IAddress;
			GadID	= MsgGad->GadgetID;
		}

		CheckKeys(&MsgClass, &MsgCode, &GadID, &KeyUse, &MsgGad, &EditWinGadgets[0], EDITWIN_CNT);

		GT_ReplyIMsg(MyMsg);

		switch(MsgClass)
		{
			case IDCMP_CLOSEWINDOW :
			{
				CloseIT	= TRUE;
				break;
			}
			case IDCMP_GADGETUP :
			{
				switch(GadID)
				{
						// Settings ok, copy to current entry

					case GD_EditOk :
					{
						struct	VolEntry	*ToEntry = (struct VolEntry *)GetListEntry(&VolumeList, SelEdVolume);

						if(ToEntry)
						{
							LONG	NewSel = SelEdVolume;

								// Get semaphore

							ObtainSemaphore(&MySemaphore);

							GT_SetGadgetAttrs(MainWinGadgets[GD_MainUseVols], MainWinHandle, NULL,
								GTLV_Labels,	~0,
							TAG_DONE);

								// Fill out structure

							strcpy(ToEntry->VolName, ((struct StringInfo *)EditWinGadgets[GD_EditVol]->SpecialInfo)->Buffer);
							strcpy(ToEntry->IconName, ((struct StringInfo *)EditWinGadgets[GD_EditIcon]->SpecialInfo)->Buffer);
							if(!strstr(ToEntry->IconName, ".info") && strlen(ToEntry->IconName))
								strcat(ToEntry->IconName, ".info");

								// Rearrange Node`s position

							if(ToEntry->Link.ln_Type != OrigEntry.Link.ln_Type)
							{
								Remove((struct Node *)ToEntry);

								if(OrigEntry.Link.ln_Type == LDF_DEVICES)
									AddTail(&VolumeList, (struct Node *)ToEntry);
								else
									AddHead(&VolumeList, (struct Node *)ToEntry);
								SelEdVolume	= -1;
								NewSel		= ~0;
							}

							ToEntry->Link.ln_Type	= OrigEntry.Link.ln_Type;
							ToEntry->Left		= OrigEntry.Left;
							ToEntry->Top		= OrigEntry.Top;
							ToEntry->UseAlt		= OrigEntry.UseAlt;
							ToEntry->IconPos	= OrigEntry.IconPos;

								// Sort List again

							if(NewSel == ~0)
								SortList(&VolumeList, TRUE);

								// Reset listview

							GT_SetGadgetAttrs(MainWinGadgets[GD_MainUseVols], MainWinHandle, NULL,
								GTLV_Labels,	&VolumeList,
								GTLV_Selected,	NewSel,
								GTLV_Top,	0,
							TAG_DONE);

							if(NewSel == ~0)
							{
									// Disable edit and remove gadgets

								GT_SetGadgetAttrs(MainWinGadgets[GD_MainEdit], MainWinHandle, NULL,
									GA_Disabled,	TRUE,
								TAG_DONE);

								GT_SetGadgetAttrs(MainWinGadgets[GD_MainRemove], MainWinHandle, NULL,
									GA_Disabled,	TRUE,
								TAG_DONE);

								strcpy(MainTypeStr, "");
								GT_SetGadgetAttrs(MainWinGadgets[GD_MainType], MainWinHandle, NULL,
									GTTX_Text,	MainTypeStr,
								TAG_DONE);
							}
							else
							{
								strcpy(MainTypeStr, "Type: ");
								strcat(MainTypeStr, ManType2Labels[!(((struct VolEntry *)GetListEntry(&VolumeList, SelEdVolume))->Link.ln_Type == LDF_DEVICES)]);
								GT_SetGadgetAttrs(MainWinGadgets[GD_MainType], MainWinHandle, NULL,
									GTTX_Text,	MainTypeStr,
								TAG_DONE);
							}

								// Release our semaphore

							ReleaseSemaphore(&MySemaphore);
						}

						CloseIT = TRUE;
						break;
					}
						// Cancel Editor window

					case GD_EditCancel :
					{
						CloseIT = TRUE;
						break;
					}
						// Change Type of entry

					case GD_EditType :
					{
						ManualType = HandleCycleGad(MsgGad, EditWinHandle, KeyUse, MsgCode, MsgQual, ManualType, 0, 1);

						OrigEntry.Link.ln_Type = (!ManualType) ? LDF_DEVICES : LDF_VOLUMES;
						break;
					}
						// Set X position manually

					case GD_EditX :
					{
						if(OrigEntry.IconPos)
						{
							LONG	Val	= ((struct StringInfo *)MsgGad->SpecialInfo)->LongInt;

							if(Val >= 0)
							{
								OrigEntry.Left	= Val;
								if(PosWinHandle)
									MoveWindow(PosWinHandle, OrigEntry.Left - PosWinHandle->LeftEdge, 0);
							}
							else
							{
								DisplayError(ERR_NONEG, NULL);
								GT_SetGadgetAttrs(MsgGad, EditWinHandle, NULL,
									GTIN_Number,	OrigEntry.Left,
								TAG_DONE);
							}
						}
						break;
					}
						// Set Y position manually

					case GD_EditY :
					{
						if(OrigEntry.IconPos)
						{
							LONG	Val	= ((struct StringInfo *)MsgGad->SpecialInfo)->LongInt;

							if(Val >= 0)
							{
								OrigEntry.Top	= Val;
								if(PosWinHandle)
									MoveWindow(PosWinHandle, 0, OrigEntry.Top - PosWinHandle->TopEdge);
							}
							else
							{
								DisplayError(ERR_NONEG, NULL);
								GT_SetGadgetAttrs(MsgGad, EditWinHandle, NULL,
									GTIN_Number,	OrigEntry.Top,
								TAG_DONE);
							}
						}
						break;
					}

						// Open/Close position window

					case GD_EditPos :
					{
						if(OrigEntry.IconPos)
						{
							PosMode = HandleCycleGad(MsgGad, EditWinHandle, KeyUse, MsgCode, MsgQual, PosMode, 0, 1);

							if(PosMode)
							{
								if(!OpenPosWin())
								{
									PosMode = 0;
									GT_SetGadgetAttrs(EditWinGadgets[GD_EditPos], EditWinHandle, NULL,
										GTCY_Active, PosMode,
									TAG_DONE);
								}
							}
							else
								ClosePosWin();
						}
						break;
					}
						// Set mode for Icon position

					case GD_EditIconPos :
					{
						if(KeyUse)
							OrigEntry.IconPos	= !OrigEntry.IconPos;
						else
							OrigEntry.IconPos	= MsgCode;

						GT_SetGadgetAttrs(EditWinGadgets[GD_EditIconPos], EditWinHandle, NULL,
							GTCB_Checked,	OrigEntry.IconPos,
						TAG_DONE);

						GT_SetGadgetAttrs(EditWinGadgets[GD_EditX], EditWinHandle, NULL,
							GA_Disabled,	!OrigEntry.IconPos,
						TAG_DONE);

						GT_SetGadgetAttrs(EditWinGadgets[GD_EditY], EditWinHandle, NULL,
							GA_Disabled,	!OrigEntry.IconPos,
						TAG_DONE);

						GT_SetGadgetAttrs(EditWinGadgets[GD_EditPos], EditWinHandle, NULL,
							GA_Disabled,	!OrigEntry.IconPos,
						TAG_DONE);
						break;
					}
					case GD_EditGet :
					{
						char	BackName[256];

							// Allowed to use alternative icon ???

						if(OrigEntry.UseAlt)
						{
								// Get it using ListView

							strcpy(BackName, OrigEntry.IconName);
							if(!GetFileName(EditWinHandle, "Select an icon", OrigEntry.IconName))
								strcpy(OrigEntry.IconName, BackName);
							else
							{
								if(!strstr(OrigEntry.IconName, ".info"))
									strcat(OrigEntry.IconName, ".info");
							}

							GT_SetGadgetAttrs(EditWinGadgets[GD_EditIcon], EditWinHandle, NULL,
								GTST_String,	OrigEntry.IconName,
							TAG_DONE);
						}
						break;
					}
					case GD_EditUseIcon :
					{
						if(KeyUse)
							OrigEntry.UseAlt = !OrigEntry.UseAlt;
						else
							OrigEntry.UseAlt = MsgCode;

						GT_SetGadgetAttrs(MsgGad, EditWinHandle, NULL,
							GTCB_Checked,	OrigEntry.UseAlt,
						TAG_DONE);

						GT_SetGadgetAttrs(EditWinGadgets[GD_EditIcon], EditWinHandle, NULL,
							GA_Disabled,	!OrigEntry.UseAlt,
						TAG_DONE);

						SetGetFileState(EditWinGadgets[GD_EditGet], EditWinHandle, !OrigEntry.UseAlt);
						break;
					}
				}
				break;
			}
			case IDCMP_GADGETDOWN :
			{
				switch(GadID)
				{
					case GD_EditVol :
					{
						ActivateGadget(MsgGad, EditWinHandle, NULL);
						break;
					}
					case GD_EditIcon :
					{
						if(OrigEntry.UseAlt)
						{
							if(KeyUse && (MsgQual & (IEQUALIFIER_LSHIFT|IEQUALIFIER_RSHIFT)))
							{
								char	BackName[256];

								strcpy(BackName, OrigEntry.IconName);
								if(!GetFileName(EditWinHandle, "Select an icon", OrigEntry.IconName))
									strcpy(OrigEntry.IconName, BackName);
								else
								{
									if(!strstr(OrigEntry.IconName, ".info"))
										strcat(OrigEntry.IconName, ".info");
								}

								GT_SetGadgetAttrs(EditWinGadgets[GD_EditIcon], EditWinHandle, NULL,
									GTST_String,	OrigEntry.IconName,
								TAG_DONE);
							}
							else
								ActivateGadget(MsgGad, EditWinHandle, NULL);
						}
						break;
					}
					case GD_EditX :
					case GD_EditY :
					{
						if(OrigEntry.IconPos)
							ActivateGadget(MsgGad, EditWinHandle, NULL);
						break;
					}
				}
				break;
			}
			case IDCMP_ACTSTRGAD :
			{
				ActivateGadget(MsgGad, EditWinHandle, NULL);
				break;
			}
		}
	}

	return(CloseIT);
}




/**********************************************************************/
/*                  Handle input from manual window                   */
/**********************************************************************/
BOOL HandleManWin(void)
{
	struct	IntuiMessage	*MyMsg;
	struct	Gadget		*MsgGad;
	ULONG	MsgClass;
	UWORD	GadID, MsgCode, MsgQual;
	BOOL	CloseIT = FALSE, KeyUse;

		// Loop for all messages

	while((MyMsg = (struct IntuiMessage *)GT_GetIMsg(ManWinHandle->UserPort)))
	{
		MsgClass	= MyMsg->Class;
		MsgCode		= MyMsg->Code;
		MsgQual		= MyMsg->Qualifier;

		if((MsgClass & (IDCMP_GADGETUP|IDCMP_GADGETDOWN)))
		{
			MsgGad	= (struct Gadget *)MyMsg->IAddress;
			GadID	= MsgGad->GadgetID;
		}

		CheckKeys(&MsgClass, &MsgCode, &GadID, &KeyUse, &MsgGad, &ManWinGadgets[0], EDITWIN_CNT);

		GT_ReplyIMsg(MyMsg);

		switch(MsgClass)
		{
			case IDCMP_CLOSEWINDOW :
			{
				CloseIT	= TRUE;
				break;
			}
			case IDCMP_GADGETUP :
			{
				switch(GadID)
				{
						// On Ok, add a new volume to the list

					case GD_ManOk :
					{
						if(!CheckExists(((struct StringInfo *)ManWinGadgets[GD_ManVol]->SpecialInfo)->Buffer))
						{
							AddNewVolume(((struct StringInfo *)ManWinGadgets[GD_ManVol]->SpecialInfo)->Buffer, (!ManualType) ? LDF_DEVICES : LDF_VOLUMES);
							CloseIT = TRUE;
						}
						else
							DisplayError(ERR_EXISTS, (ULONG)((struct StringInfo *)ManWinGadgets[GD_ManVol]->SpecialInfo)->Buffer, NULL);
						break;
					}
					case GD_ManCancel :
					{
						CloseIT = TRUE;
						break;
					}
					case GD_ManType :
					{
						 ManualType = HandleCycleGad(MsgGad, ManWinHandle, KeyUse, MsgCode, MsgQual, ManualType, 0, 1);
						 break;
					}
				}
				break;
			}
			case IDCMP_GADGETDOWN :
			{
				switch(GadID)
				{
					case GD_ManVol :
					{
						ActivateGadget(MsgGad, ManWinHandle, NULL);
						break;
					}
				}
				break;
			}
			case IDCMP_ACTSTRGAD :
			{
				ActivateGadget(MsgGad, ManWinHandle, NULL);
				break;
			}
		}
	}
	return(CloseIT);
}







/**********************************************************************/
/*                 Handle input from Position window                  */
/**********************************************************************/
void HandlePosWin(void)
{
	struct	IntuiMessage	*MyMsg;
	ULONG	MsgClass;

	while((MyMsg = (struct IntuiMessage *)GT_GetIMsg(PosWinHandle->UserPort)))
	{
		MsgClass	= MyMsg->Class;

		GT_ReplyIMsg(MyMsg);

			// Window was moved, so set the new values to the number gadgets

		if(MsgClass == IDCMP_CHANGEWINDOW)
		{
			OrigEntry.Left	= PosWinHandle->LeftEdge;
			OrigEntry.Top	= PosWinHandle->TopEdge;

			GT_SetGadgetAttrs(EditWinGadgets[GD_EditX], EditWinHandle, NULL,
				GTIN_Number,	OrigEntry.Left,
			TAG_DONE);

			GT_SetGadgetAttrs(EditWinGadgets[GD_EditY], EditWinHandle, NULL,
				GTIN_Number,	OrigEntry.Top,
			TAG_DONE);
		}
	}
}




/**********************************************************************/
/*              Sets the state of a generic_kind gadget               */
/**********************************************************************/
void SetGetFileState(struct Gadget *Gad, struct Window *Win, BOOL State)
{
	RemoveGList(Win, Gad, 1);

	if(!State)
		Gad->Flags &= ~GFLG_DISABLED;
	else
		Gad->Flags |= GFLG_DISABLED;

	AddGList(Win, Gad, -1, 1, NULL);
	RefreshGList(Gad, Win, NULL, 1);
}
