/*
 * 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 new command INFO
 *
 * v1.04	added the possibility to change the progress indicator
 *
 * v1.05	bug fixed in the "INFO" request
 *
 * v1.06	added ActivateGadget()
 *
 * v1.07	aligned with the new server design v1.10
 *
 * v1.08	bug fixed in ReqFile()
 *
 * v1.09	the catalog compiler is an OLE module
 *
 * $(C): (1994, Rocco Coluccelli, Bologna)
 * $VER: Config.ole 1.09 (04.Dec.1994)
 */

PARSE ARG oleclip
PARSE VALUE GETCLIP(oleclip) WITH jobID modID box.left box.top char.w char.h olewin oleport olehost userscreen userport . locale config .

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 oleport

/*
 *	Get the server configuration clip
 */
INFO jobID modID 'config.0.1'
oleconfig = GETCLIP(oleclip)

IF ~SHOW('C',oleconfig) THEN DO
	win.bl = 3; win.bt = 15; win.br = 4; win.bb = 2
	win.font = 'topaz.font'; win.fonth = 8; win.fontw = 8
	oleind.outer = 0; oleind.inner = 0; oleind.color = 4
	END

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

/*
 *	Get the progress indicator height
 */
INFO jobID modID 'oleind.hei'
oleind.hei = GETCLIP(oleclip)

/*
 *	Get the compiler message port
 */
INFO jobID modID 'oleport.' || jobID || '.' || modID + 1
compilerport = GETCLIP(oleclip)


IF OPENPORT(olehost) == NULL() THEN DO
	ERROR jobID modID 1 olehost
	SETJOB jobID 'end'
	EXIT 10
	END

rt_TAG = 'rt_pubscrname=' || userscreen 'rtez_flags=ezreqf_centertext'
st = GUIGads()
DO UNTIL st = 'end'

	CALL WAITPKT(olehost)
	pkt = GETPKT(olehost)

	IF pkt == NULL() THEN ITERATE

	PARSE VALUE GETARG(pkt) WITH cmd argv .
	/*
	 *	n0 = gadget to update	nn = gadget to activate
	 */
	PARSE VALUE GETARG(pkt,1) WITH n0 nn .

	SELECT

		WHEN cmd = 'CATALOG' THEN DO

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

			ELSE IF olefile.ct ~= '' & RIGHT(olefile.ct,3) = '.ct' THEN DO

				IF ~SHOW('P',compilerport) THEN DO
					SETJOB jobID modID + 1
					CALL Wait_For_Port(compilerport)
					END

				IF SHOW('P',compilerport) THEN INTERPRET 'ADDRESS' compilerport '"COMPILE' olefile.ct || '"'
				END
		END

		WHEN cmd = 'PROGIND' THEN
			IF argv = '' THEN
				DO i = 0 TO 100 BY 2
					CALL FillProgInd(n0,i,oleind.color)
				END

			ELSE DO
				oleind.argv = oleind.argv + 1
				IF oleind.argv = 3 & argv ~= 'COLOR' THEN oleind.argv = 0
				IF oleind.argv = 16 THEN oleind.argv = 0
			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 = '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 = 'REQFILE' THEN DO
			PARSE VAR argv t .
			str = STRIP(GETARG(pkt,2),'B')

			IF str = '' THEN str = ReqFile(100,100,olefile.t,GetLocale(t),userscreen)

			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 = 'UNICONIFY' THEN CALL Gadgets(8,1,g_gads)

		WHEN cmd = 'HELP' THEN ABOUT jobID modID 'HELP' || st

		WHEN cmd = 'QUIT' THEN st = 'end'

		OTHERWISE NOP

	END

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

	CALL REPLY(pkt,0)

END

CALL CLOSEPORT(olehost)

IF cmd ~= 'QUIT' THEN DO
	CALL SETCLIP(oleconfig,win.bl','win.bt','win.br','win.bb','win.font','win.fonth','win.fontw','oleind.outer','oleind.inner','oleind.color',')
	'CONFIG 0 1'
	SETJOB jobID 'end'
	NEWPREFS
	END

EXIT 0


/*
 *	procedure that split a path and request a file
 *
 *	pathname = ReqFile(x,y,path,title,userscreen)
 */
ReqFile: PROCEDURE

	dir = ''; file = ''
	IF ARG(3) ~= '' THEN DO
		pos = LASTPOS('/',ARG(3))

		IF pos = 0 THEN DO
			pos = POS(':',ARG(3))
			dir = LEFT(ARG(3),pos)
			END

		ELSE dir = LEFT(ARG(3),pos - 1)

		file = SUBSTR(ARG(3),pos + 1)
		END

RETURN GetFile(ARG(1),ARG(2),dir,file,ARG(4),ARG(5))


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(olewin,COMPLEMENT)
	CALL Move(olewin,win.bl,win.bt)
	CALL Draw(olewin,x,win.bt); CALL Draw(olewin,x,y); CALL Draw(olewin,win.bl,y); CALL Draw(olewin,win.bl,win.bt)
	CALL SetDrMd(olewin,JAM1)

RETURN


DrawProgInd:

	IF ARG(5) = 0 THEN RETURN
	CALL Move(olewin,ARG(1),ARG(4))
	CALL SetAPen(olewin,3 - ARG(5))
	CALL Draw(olewin,ARG(1),ARG(2)); CALL Draw(olewin,ARG(3),ARG(2))
	CALL SetAPen(olewin,ARG(5))
	CALL Draw(olewin,ARG(3),ARG(4)); CALL Draw(olewin,ARG(1),ARG(4))

RETURN


FillProgInd:
PARSE ARG n

	x1 = g_xpos.n + 12; y1 = g_ypos.n + 8
	x2 = g_len.n - 24; y2 = g_ypos.n + g_hei.5 - 8

	IF ARG(2) = 0 THEN DO
		CALL SetAPen(olewin,0); CALL RectFill(olewin,x1,y1,x1 + x2,y2)
		END

	CALL SetAPen(olewin,ARG(3)); CALL RectFill(olewin,x1,y1,x1 + ARG(2) * x2 % 100,y2)

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_hei.5 = 20; g_offx.5 = 0; g_offy.5 = 0

	g_sx = char.w % 2;	g_sy = char.h % 4
	g_onoff. = 0

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

	n = 1

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

	n1.nmain = n
	x = box.left; y = box.top
	CALL IniGad(2,2,0,'SETUP' nborder,CENTER(GetLocale(1),24))
	y = y + g_hei.3 + 2 * g_sy
	CALL IniGad(2,2,0,'SETUP' nlocale,CENTER(GetLocale(2),24))
	y = y + g_hei.3 + 2 * g_sy
	CALL IniGad(2,2,0,'SETUP' nprog,CENTER(GetLocale(3),24))
	y = y + g_hei.3 + 2 * g_sy
	CALL IniGad(2,2,0,'SETUP' nbases,CENTER(GetLocale(4),24))
	box.h = y
	n2.nmain = n - 1

	n1.nborder = n
	y = box.top
	CALL IniGad(3,2,0,'BORDER' bt '%1' n n + 4'%2%g',win.bt,3)
	CALL IniGad(1,0,1,,GetLocale(5))
	y = y + g_hei.3 + 4 * g_sy
	CALL IniGad(1,2,0,,GetLocale(6))
	y = y + g_hei.3 + 4 * g_sy
	CALL IniGad(1,1,0,,GetLocale(7))
	CALL IniGad(3,0,1,'BORDER' bl '%1' n n + 1'%2%g',win.bl,3)
	n1 = IniGad(3,0,0,'BORDER' br '%1' n n + 2'%2%g',win.br,3)
	n2 = IniGad(1,0,1,,GetLocale(8))
	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 n1.nborder '%2%g',win.bb,3)
	CALL IniGad(1,0,1,,GetLocale(9))
	box.h = MAX(box.h,y)
	n2.nborder = n - 1

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

	n1.nprog = n
	y = box.top
	CALL IniGad(1,2,0,,GetLocale(17))
	y = y + g_hei.3 + 2 * g_sy
	CALL IniGad(2,1,0,'PROGIND OUTER%1' n + 3,GetLocale(18))
	CALL IniGad(2,2,0,'PROGIND INNER%1' n + 2,GetLocale(19))
	CALL IniGad(2,3,0,'PROGIND COLOR%1' n + 1,GetLocale(20))
	y = y + g_hei.3 + 2 * g_sy
	CALL IniGad(5,1,0)
	y = y + g_hei.5 + 2 * g_sy
	CALL IniGad(2,2,0,'PROGIND%1' n - 1,GetLocale(21))
	box.h = MAX(box.h,y)
	n2.nprog = n - 1

	n1.nbases = n
	y = box.top
	CALL IniGad(1,2,0,,GetLocale(14))
	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(15))
	g_gads = IniGad(2,3,0,'HELP',GetLocale(16))

	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 jobID modID (box.w + 2 * g_sx) (box.h + 2 * g_sy) 1 1
	CALL Gadgets(4,g_gads - 1,g_gads)
	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 IF ARG(1) = 8 THEN
		DO n = ARG(2) TO ARG(3)
			IF g_onoff.n THEN CALL NewGad(n,g_type.n)
		END

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


DelGad:
PARSE ARG n,t

	g_onoff.n = 0

	IF t ~= 1 & t ~= 5 THEN CALL RemoveGadget(olewin,GAD.n)

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

RETURN


NewGad:
PARSE ARG n,t

	g_onoff.n = 1

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

	ELSE IF t = 3 THEN
		CALL AddGadGet(olewin,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(olewin,g_xpos.n,g_ypos.n,GAD.n,D2C(32 + g_str.n * 183),g_msg.n)

	ELSE IF t = 5 THEN DO
		CALL DrawProgInd(g_xpos.n + 2, g_ypos.n + 2,g_xpos.n + g_len.n - 2, g_ypos.n + g_hei.t - 2,oleind.outer)
		CALL DrawProgInd(g_xpos.n + 10,g_ypos.n + 6,g_xpos.n + g_len.n - 10,g_ypos.n + g_hei.t - 6,oleind.inner)
		CALL FillProgInd(n,100,oleind.color)
		END

	ELSE DO
		CALL SetAPen(olewin,1)
		CALL Move(olewin,g_xpos.n,g_ypos.n)
		CALL Text(olewin,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 IF t = 5 THEN
		g_len.n = box.w
	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
