/*
 * Config.ole
 *
 * USAGE: Config.ole
 *
 * Config.ole is the first release of the OLE server configuration module.
 * Let you choose some parameters will be used by all modules.
 *
 * HISTORY:
 * v1.03	bugs fixed, used the ew command INFO
 *
 * $(C): (1994, Rocco Coluccelli, Bologna)
 * $VER: Config.ole 1.03 (25.Oct.1994)
 */

PARSE ARG oleargv
PARSE VALUE GETCLIP(oleargv) WITH module box.left box.top char.w char.h server olectrl remote userscreen userport locale config oleobj .


	olefile.loc = 'OLE:Catalogs/'

IF ~SHOW('C',config) THEN DO
	olefile.ct 	= 'OLE:misc/OLE.rexx.ct'
	olefile.ed 	= 'C:ED'
	END

ELSE PARSE VALUE GETCLIP(config) WITH olefile.ct','olefile.ed','


ADDRESS VALUE olectrl

INFO 0
PARSE VALUE GETCLIP(oleargv) WITH . oleconfig .

IF ~SHOW('C',oleconfig) THEN DO
	win.bl = 5; win.bt = 17; win.br = 6; win.bb = 4
	win.font = 'topaz.font'
	win.fonth = 8; win.fontw = 8
	END

ELSE PARSE VALUE GETCLIP(oleconfig) WITH win.bl','win.bt','win.br','win.bb','win.font','win.fonth','win.fontw','


IF OPENPORT(remote) == NULL() THEN DO
	REQASK 0 'þERR_PORT,'remote
	QUIT
	EXIT 10
	END


elab = 1
st = GUIGads()
DO UNTIL st = 'end'

	CALL WAITPKT(remote)
	pkt = GETPKT(remote)

	IF pkt == NULL() THEN ITERATE

	PARSE VALUE GETARG(pkt) WITH cmd argv .
	PARSE VALUE GETARG(pkt,1) WITH n0 .

	SELECT

		WHEN cmd = 'BORDER' THEN DO
			CALL BorderBox()
			str = GETARG(pkt,2)
			IF DATATYPE(str,'N') & str > 0 THEN win.argv = str
			g_str.n0 = win.argv
			CALL BorderBox()
		END

		WHEN cmd = 'CATALOG' THEN DO

			IF argv = 'EDIT' THEN
				INTERPRET 'ADDRESS COMMAND' '"' || olefile.ed olefile.ct || '"'

			ELSE
				CALL 'OLE:build_cat'(olefile.ct,olefile.loc)
		END

		WHEN cmd = 'SETUP' THEN DO
			CALL Gadgets(7,n1.st,n2.st)
			st = argv
			CALL Gadgets(4,n1.st,n2.st)

			IF st = nborder THEN CALL BorderBox()
		END

		WHEN cmd = 'REQFILE' THEN DO
			PARSE VAR argv t .
			str = GETARG(pkt,2)

			IF str = '' THEN DO
				cmd module olefile.t || ',þ' t
				str = GETCLIP(oleargv)
				END

			olefile.t = str
			g_str.n0 = str
		END

		WHEN cmd = 'OKAY' THEN DO

			IF st = nborder THEN CALL BorderBox()

			IF st = 1 THEN
				st = 'end'

			ELSE DO
				CALL Gadgets(7,n1.st,n2.st)
				st = 1
				CALL Gadgets(4,n1.st,n2.st)
				END
		END


		WHEN cmd = 'HELP' THEN
			REQASK module 'þHELP' || st

		WHEN cmd = 'QUIT' THEN DO
			elab = 0
			st = 'end'
		END

		OTHERWISE NOP

	END

	IF n0 ~= '' THEN DO
		CALL Gadgets(2,n0)
		CALL SETCLIP(config,olefile.ct','olefile.ed',')
		END

	CALL REPLY(pkt,0)

END

CALL CLOSEPORT(remote)

IF elab THEN DO
	CALL SETCLIP(oleconfig,win.bl','win.bt','win.br','win.bb','win.font','win.fonth','win.fontw',')
	'CONFIG 0'
	SETSTATUS 'end'
	END

EXIT 0


GetLocale: PROCEDURE EXPOSE locale
ARG strID

	strID = 'þ'strID'þ'; PARSE VALUE GETCLIP(locale) WITH (strID)text'Þ'

RETURN text


BorderBox:

	x = win.w - win.br; y = win.h - win.bb
	CALL SetDrMd(server,COMPLEMENT)
	CALL Move(server,win.bl,win.bt)
	CALL Draw(server,x,win.bt); CALL Draw(server,x,y); CALL Draw(server,win.bl,y); CALL Draw(server,win.bl,win.bt)
	CALL SetDrMd(server,JAM1)

RETURN


GUIGads:

	g_offx. = 2;	g_offx.1 = 0;			g_offx.3 = 2
	g_offy. = 2;	g_offy.1 = char.h + 1;	g_offy.3 = 3
	g_wid. = 8;				g_wid.1 = 0;			g_wid.3 = 12
	g_hei. = char.h + 4;	g_hei.1 = char.h + 1;	g_hei.3 = char.h + 6
	g_sx = char.w % 2;	g_sy = char.h % 4

	box.left = box.left + g_sx; box.top = box.top + 2 * g_sy
	box.w = 36 * char.w

	n = 1

	nmain = 1; nborder = 2; nlocale = 3; npaths = 4; nbases = 5

	n1.nmain = n
	x = box.left; y = box.top
	CALL IniGad(2,2,0,'SETUP' nborder,CENTER(GetLocale('B1'),30))
	y = y + g_hei.3 + 2 * g_sy
	CALL IniGad(2,2,0,'SETUP' nlocale,CENTER(GetLocale('B2'),30))
	y = y + g_hei.3 + 2 * g_sy
	CALL IniGad(2,2,0,'SETUP' npaths,CENTER(GetLocale('B3'),30))
	y = y + g_hei.3 + 2 * g_sy
	CALL IniGad(2,2,0,'SETUP' nbases,CENTER(GetLocale('B4'),30))
	box.h = y
	n2.nmain = n - 1

	n1.nborder = n
	y = box.top
	CALL IniGad(3,2,0,'BORDER' bt '%1' n '%2%g',win.bt,3)
	CALL IniGad(1,0,1,,GetLocale('S1'))
	y = y + g_hei.3 + 4 * g_sy
	CALL IniGad(1,2,0,,GetLocale('S2'))
	y = y + g_hei.3 + 4 * g_sy
	CALL IniGad(1,1,0,,GetLocale('S3'))
	CALL IniGad(3,0,1,'BORDER' bl '%1' n '%2%g',win.bl,3)
	n1 = IniGad(3,0,0,'BORDER' br '%1' n '%2%g',win.br,3)
	n2 = IniGad(1,0,1,,GetLocale('S4'))
	x = box.left + box.w - x; g_xpos.n1 = g_xpos.n1 + x; g_xpos.n2 = g_xpos.n2 + x
	y = y + g_hei.3 + 4 * g_sy
	CALL IniGad(3,2,0,'BORDER' bb '%1' n '%2%g',win.bb,3)
	CALL IniGad(1,0,1,,GetLocale('S5'))
	box.h = MAX(box.h,y)
	n2.nborder = n - 1

	n1.nlocale = n
	y = box.top
	CALL IniFileGad('REQFILE ED',olefile.ed,GetLocale('S6'))
	y = y + g_hei.3 + 2 * g_sy
	CALL IniFileGad('REQFILE CT',olefile.ct,GetLocale('S7'))
	y = y + g_hei.3 + 2 * g_sy
	CALL IniGad(2,1,0,'CATALOG EDIT',GetLocale('S8'))
	CALL IniGad(2,0,1,'CATALOG MAKE',GetLocale('S9'))
	box.h = MAX(box.h,y)
	n2.nlocale = n - 1

	n1.npaths = n
	y = box.top
	CALL IniGad(1,2,0,,GetLocale('S10'))
	box.h = MAX(box.h,y)
	n2.npaths = n - 1

	n1.nbases = n
	y = box.top
	CALL IniGad(1,2,0,,GetLocale('S10'))
	box.h = MAX(box.h,y)
	n2.nbases = n - 1

	y = box.h + g_hei.3 + 2 * g_sy
	CALL IniGad(2,1,0,'OKAY',GetLocale('S11'))
	n = IniGad(2,3,0,'HELP',GetLocale('S12'))

	box.h = y + g_hei.2 + 2 * g_sy - box.top

	win.w = box.w + 2 * g_sx + win.bl + win.br
	win.h = box.h + 2 * g_sy + win.bt + win.bb
	WINDOW module (box.w + 2 * g_sx) (box.h + 2 * g_sy) 0 0
	CALL Gadgets(4,n - 1,n)
	CALL Gadgets(4,n1.nmain,n2.nmain)

RETURN nmain


Gadgets:

	IF ARG(1) < 4 THEN
		DO i = 2 TO ARG(); n = ARG(i)
			IF ARG(1) ~= 1 THEN CALL DelGad(n,g_type.n)
			IF ARG(1) ~= 3 THEN CALL NewGad(n,g_type.n)
		END

	ELSE IF ARG(1) < 7 THEN
		DO n = ARG(2) TO ARG(3)
			IF ARG(1) ~= 4 THEN CALL DelGad(n,g_type.n)
			IF ARG(1) ~= 6 THEN CALL NewGad(n,g_type.n)
		END

	ELSE DO
		DO n = ARG(2) TO ARG(3)
			IF g_type.n ~= 1 THEN CALL RemoveGadget(server,GAD.n)
		END
		CALL SetAPen(server,0)
		CALL RectFill(server,box.left,box.top,box.left + box.w,box.top + box.h)
		CALL RefreshGadgets(server)
		END
RETURN


DelGad:
PARSE ARG n,t

	IF t ~= 1 THEN CALL RemoveGadget(server,GAD.n)

	x = g_xpos.n - g_offx.t; y = g_ypos.n - g_offy.t
	CALL SetAPen(server,0)
	CALL RectFill(server,x,y,x + g_len.n,y + g_hei.t)

RETURN


NewGad:
PARSE ARG n,t

	IF t = 2 THEN
		CALL AddGadGet(server,g_xpos.n,g_ypos.n,GAD.n,g_str.n,g_msg.n)

	ELSE IF t = 3 THEN
		CALL AddGadGet(server,g_xpos.n,g_ypos.n,GAD.n,g_str.n,g_msg.n,g_len.n - 4,"RIDGEBORDER")

	ELSE IF t = 4 THEN
		CALL AddGadGet(server,g_xpos.n,g_ypos.n,GAD.n,D2C(32 + g_str.n * 183),g_msg.n)

	ELSE DO
		CALL SetAPen(server,1)
		CALL Move(server,g_xpos.n,g_ypos.n)
		CALL Text(server,g_str.n)
		END
RETURN


IniGad:
PARSE ARG t,na,nx,g_msg.n,g_str.n,var

	x = x + nx * g_sx

	IF t = 3 & var > 0 THEN
		g_len.n = var * char.w + g_wid.t
	ELSE IF t = 3 THEN
		g_len.n = box.left + box.w - x
	ELSE
		g_len.n = LENGTH(g_str.n) * char.w + g_wid.t

	IF na > 0 THEN x = box.left + (na - 1) * (box.w - g_len.n) % 2 + nx * g_sx

	g_xpos.n = x + g_offx.t; g_ypos.n = y + g_offy.t; g_type.n = t
	x = x + g_len.n
	n = n + 1

	IF t = 4 THEN CALL IniGad(1,0,1,,var)

RETURN n - 1


IniFileGad:
PARSE ARG msg,str,txt

	CALL IniGad(1,1,0,,txt)
	y = y + g_hei.1 + 2 * g_sy
	CALL IniGad(2,1,0,msg '%1' (n + 1),'F')
	CALL IniGad(3,0,1,msg '%1' n '%2%g',str)

RETURN n - 1
