// QLOOK.SR

get "BRAVO.DF"
get "CHAR.DF"
get "GINN.DF"

// Incoming Procedures

external [
	marks
	updatedisplay
	invalidatewindow
	invalidatedoc
	setmessage
	movec
	codechange
	cpparabounds
	invalidateband
	invalidatesel
	changeformata
	hidemark
	ckhp
	ckspecs
	insert
	cpc
	pollkeyboard
	];

// Incoming Statics

external [
	xleftmargstd
	xrightmargstd
	comt
	rgprogram
	rgview
	vwwcurrent
	vww
	rgdoc
	selaux
	sdoc
	selection
	fdebug
	hdebug
	rgfcode
	vwindowstripe // %%
	];

// Outgoing Procedures

external [
	lookey
	];

// Outgoing Statics

// Local

let lookeyformatted(doc) = valof
[
rgprogram ! doc = false
setmessage(" No longer a program")
resultis 0
]

and lookinvisible(lookmask, turnon) = valof
[
let doc = rgdoc ! vwwcurrent ;
let visflag = turnon? lookmask, 0;
let old = rgview ! doc
if (old & lookmask) eq visflag then resultis 0
rgview ! doc = old xor lookmask
invalidatedoc(doc) ;
resultis 0
]

and lookey(char) = valof
[
let doc = rgdoc ! vwwcurrent
switchon char-#200 into
	[
case chcr: resultis lookinvisible(lookcrmask, true)
case chsp: resultis lookinvisible(lookspmask, true)
case chtab: resultis lookinvisible(looktabmask, true)
case $h:resultis lookinvisible(looktrailermask, true)
case $\: resultis lookinvisible(lookmarkermask, true) ;
case $=: invalidatesel(selection)
	invalidatesel(selaux)
	resultis lookinvisible(lookremarkmask, true) ;
case shcr: resultis lookinvisible(lookcrmask, false)
case shsp: resultis lookinvisible(lookspmask, false)
case shtab: resultis lookinvisible(looktabmask, false)
case $H: resultis lookinvisible(looktrailermask, false)
case $|: resultis lookinvisible(lookmarkermask, false) ;
case $+: invalidatesel(selection)
	invalidatesel(selaux)
	resultis lookinvisible(lookremarkmask, false) ;
case $f: resultis lookeyformatted(doc)
case $W: vwindowstripe = false ; resultis 0
case $w: vwindowstripe = true ; resultis 0
default: endcase
	]
doc = selection >> SEL.doc
if rgprogram ! doc then resultis 0
let kind = (rgfcode ! (char-#200)) << FCODE.kind // %%
let fontchange = kind eq klook % kind eq knormal // %%
if (cpc(selection>>SEL.cplast, selection>>SEL.cpfirst) ls 0) &
    fontchange then
	[
	let ans = insert(char)
	if hdebug then ckhp()
	if fdebug then ckspecs()
	resultis ans
	]
let change = vec changel
movec(change, change+changel-1, 0)
codechange(change, char-#200)
let tcpfirst, tcplast, dum = nil, nil, nil
test cpc(selection>>SEL.cplast, selection>>SEL.cpfirst) ls 0
ifso	[
	doc = selection >> SEL.doc
	cpparabounds(doc, selection >> SEL.cpfirst,
		lv tcpfirst, lv dum, lv tcplast)
	// some day change bugshape too
	]
ifnot	[
	tcpfirst = selection >> SEL.cpfirst
	tcplast = selection >> SEL.cplast
	unless fontchange do
		[
		cpparabounds(doc,tcpfirst, lv tcpfirst, lv dum, lv dum)
		cpparabounds(doc, tcplast, lv dum, lv dum, lv tcplast)
		]
	]
invalidateband(doc, tcpfirst, tcplast)
invalidatesel(selection)
invalidatesel(selaux)
changeformata(change, doc, tcpfirst, tcplast)
hidemark()
if hdebug then ckhp()
if fdebug then ckspecs()
resultis 0
]