[Oberon] SystemV - Viewer Scroll
Tomas Kral
thomas.kral at email.cz
Mon Mar 18 21:13:58 CET 2019
On Fri, 15 Mar 2019 09:33:10 +0100
Jörg Straube <joerg.straube at iaeth.ch> wrote:
> Textframes knows lines and line breaks, Texts doesn‘t care.
Thank you, having re-read chapters on Texts and Frames.
Interesting, line brakes are kept in `Line' list that is built on the
fly when line is displayed `DisplayLine'.
Updating display is single pass and is fast. I also looked into
`LocateLine' these are all simple procs, I can understand so far.
Forward move seems favoured to backward in `Show' procedure, that I do not understand yet.
Unlike `Modify' proc that is called when a menu bar is moved up or down.
PROCEDURE Modify* (F: Frame; id, dY, Y, H: INTEGER);
BEGIN
Mark(F, FALSE); RemoveMarks(F); SetChangeMark(F, FALSE);
IF id = MenuViewers.extend THEN
IF dY > 0 THEN Display.CopyBlock(F.X, F.Y, F.W, F.H, F.X, F.Y + dY, 0); F.Y := F.Y + dY END;
Extend(F, Y)
ELSIF id = MenuViewers.reduce THEN
Reduce(F, Y + dY);
IF dY > 0 THEN Display.CopyBlock(F.X, F.Y, F.W, F.H, F.X, Y, 0); F.Y := Y END
END;
IF F.H > 0 THEN Mark(F, TRUE); SetChangeMark(F, F.text.changed) END
END Modify;
Modify above almost mimics scroll forward(extend) and backward(reduce), it also nicely shows the idea of `dY'.
Both directions using `CopyBlock'!
I wonder why `Show' does not follow similar pattern of Modify. I can see, howevber, that code is symetric, though.
Show()
if pos < F.pos
extend()
elsif pos > F.pos
CopyBlock()
else
extend()
End.
--
Tomas Kral <thomas.kral at email.cz>
More information about the Oberon
mailing list