/*

Directory Opus 4
Original GPL release version 4.12
Copyright 1993-2000 Jonathan Potter

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 (at your option) 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., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.

All users of Directory Opus 4 (including versions distributed
under the GPL) are entitled to upgrade to the latest version of
Directory Opus version 5 at a reduced price. Please see
http://www.gpsoft.com.au for more information.

The release of Directory Opus 4 under the GPL in NO WAY affects
the existing commercial status of Directory Opus 5.

*/

#include "DOpus.h"

enum {
	SELECT_CANCEL,
	SELECT_OKAY,
	SELECT_SELECTBASE,
	SELECT_SELECTTYPE};

static char sel_patternbuf[80];

struct RequesterBase select_req={
	36,3,50,27,
	8,6,
	0,0,0,0,NULL,NULL,NULL,NULL,
	NULL,NULL,NULL,
	0,0,NULL,0,NULL};

struct TagItem
	select_base_gadget[]={
		{RO_Type,OBJECT_GADGET},
		{RO_GadgetType,GADGET_CYCLE},
		{RO_GadgetID,SELECT_SELECTBASE},
		{RO_Top,1},
		{RO_TopFine,2},
		{RO_Width,6},
		{RO_WidthFine,24},
		{RO_Height,1},
		{RO_HeightFine,6},
		{RO_HighRecess,TRUE},
		{TAG_END,0}},
	select_pattern_gadget[]={
		{RO_Type,OBJECT_GADGET},
		{RO_GadgetType,GADGET_STRING},
		{RO_GadgetID,SELECT_OKAY},
		{RO_Top,1},
		{RO_TopFine,4},
		{RO_Height,1},
		{RO_HeightFine,2},
		{RO_Left,6},
		{RO_LeftFine,30},
		{RO_Width,30},
		{RO_StringBuf,(ULONG)sel_patternbuf},
		{RO_StringLen,79},
		{RO_StringUndo,(ULONG)str_undobuffer},
		{TAG_END,0}},

	select_okay_gadget[]={
		{RO_Type,OBJECT_GADGET},
		{RO_GadgetType,GADGET_BOOLEAN},
		{RO_GadgetID,SELECT_OKAY},
		{RO_Top,2},
		{RO_TopFine,11},
		{RO_Height,1},
		{RO_HeightFine,6},
		{RO_Width,10},
		{RO_TextNum,STR_OKAY},
		{RO_TextPos,TEXTPOS_CENTER},
		{RO_HighRecess,TRUE},
		{TAG_END,0}},

	select_type_gadget[]={
		{RO_Type,OBJECT_GADGET},
		{RO_GadgetType,GADGET_CYCLE},
		{RO_GadgetID,SELECT_SELECTTYPE},
		{RO_Top,2},
		{RO_TopFine,11},
		{RO_Height,1},
		{RO_HeightFine,6},
		{RO_Width,14},
		{RO_WidthFine,20},
		{RO_Left,11},
		{RO_LeftFine,6},
		{RO_HighRecess,TRUE},
		{TAG_END,0}},

	select_cancel_gadget[]={
		{RO_Type,OBJECT_GADGET},
		{RO_GadgetType,GADGET_BOOLEAN},
		{RO_GadgetID,SELECT_CANCEL},
		{RO_Top,2},
		{RO_TopFine,11},
		{RO_Height,1},
		{RO_HeightFine,6},
		{RO_Width,10},
		{RO_Left,26},
		{RO_LeftFine,34},
		{RO_TextNum,STR_CANCEL},
		{RO_TextPos,TEXTPOS_CENTER},
		{RO_HighRecess,TRUE},
		{TAG_END,0}},

	select_title_text[]={
		{RO_Type,OBJECT_BORDER},
		{RO_BorderType,BORDER_NONE},
		{RO_Width,36},
		{RO_WidthFine,34},
		{RO_TopFine,-1},
		{RO_Height,1},
		{RO_TextNum,STR_ENTER_SELECT_PATTERN},
		{RO_TextPos,TEXTPOS_CENTER},
		{TAG_END,0}},

	*select_gadgets[]={
		select_base_gadget,
		select_pattern_gadget,
		select_type_gadget,
		select_okay_gadget,
		select_cancel_gadget,
		NULL};

int select_base=0,select_type=0;

getselectdata(buffer,selbase)
char **buffer;
int *selbase;
{
	ULONG class;
	USHORT gadgetid;
	struct Window *swindow;
	struct Gadget *gadlist,*sel_type_gad;
	char *select_base_array[3],*select_type_array[3];
	int a,ret=0;

	fix_requester(&select_req,globstring[STR_ENTER_SELECT_PATTERN]);

	for (a=0;a<3;a++) {
		select_type_array[a]=globstring[STR_SELECT_ALL_ENTRIES+a];
		select_base_array[a]=globstring[STR_SELECT_NAME+a]; 
	}
	strcpy(sel_patternbuf,buffer[select_base]);

	if (!(swindow=OpenRequester(&select_req)) ||
		!(gadlist=addreqgadgets(&select_req,select_gadgets,0,NULL)) ||
		!(AddRequesterObject(&select_req,select_title_text))) {
		CloseRequester(&select_req);
		return(0);
	}
	RefreshRequesterObject(&select_req,NULL);

	sel_type_gad=gadlist->NextGadget->NextGadget;
	DoCycleGadget(gadlist,swindow,select_base_array,select_base);
	DoCycleGadget(sel_type_gad,swindow,select_type_array,select_type);

	ActivateStrGad(gadlist->NextGadget,swindow);

	FOREVER {
		while (IMsg=(struct IntuiMessage *)GetMsg(swindow->UserPort)) {
			class=IMsg->Class;
			if (class==IDCMP_GADGETUP)
				gadgetid=((struct Gadget *) IMsg->IAddress)->GadgetID;
			ReplyMsg((struct Message *) IMsg);

			switch (class) {
				case IDCMP_MOUSEBUTTONS:
					ActivateStrGad(gadlist->NextGadget,swindow);
					break;

				case IDCMP_GADGETUP:
					switch (gadgetid) {
						case SELECT_SELECTBASE:
							strcpy(buffer[select_base],sel_patternbuf);
							if (++select_base>2) select_base=0;
							DoCycleGadget(gadlist,swindow,select_base_array,select_base);
							strcpy(sel_patternbuf,buffer[select_base]);
							RefreshStrGad(gadlist->NextGadget,swindow);
							ActivateStrGad(gadlist->NextGadget,swindow);
							break;
						case SELECT_SELECTTYPE:
							if (++select_type>2) select_type=0;
							DoCycleGadget(sel_type_gad,swindow,select_type_array,select_type);
							ActivateStrGad(gadlist->NextGadget,swindow);
							break;
						case SELECT_OKAY:
							ret=select_type+1;
						case SELECT_CANCEL:
							CloseRequester(&select_req);
							strcpy(buffer[select_base],sel_patternbuf);
							*selbase=select_base;
							return(ret);
					}
					break;
			}
		}
		Wait(1<<swindow->UserPort->mp_SigBit);
	}
}
