<html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"></head><body dir="auto">Trying to understand „TextFrames“ is not an easy task but worth doing.<div><br></div><div>First you have to understand Texts and the internal piece representation of Text.</div><div><br></div><div>Texts (and the pieces) represent a one-dimensional, sequential stream of characters. Pieces help to easily insert or delete characters or a batch of characters without physically moving characters around in memory. The index into this stream is called „pos“.</div><div><br></div><div>As the screen is two-dimensional (x,y coordinates) one of the main tasks of Textframes is to break the sequential Text in two dimensions: one dimension (y axis) is the line, the second dimension (x axis) is the character position in a line. So Textframes knows lines and line breaks, Texts doesn‘t care.</div><div><div>Every line has an „org“ and a „len“. „org“ is the „pos“ of the first character of the line. <a href="http://F.org">F.org</a> is the pos of the first character of the top most line displayed in that Frame.</div><div>All of this and much more is obviously described in NWs documentation. Please have a look at chapter 5</div><div><a href="https://www.inf.ethz.ch/personal/wirth/ProjectOberon/PO.System.pdf">https://www.inf.ethz.ch/personal/wirth/ProjectOberon/PO.System.pdf</a></div><div><br><div dir="ltr"><div>br</div><div>Jörg</div></div><div dir="ltr"><br>Am 15.03.2019 um 09:02 schrieb Tomas Kral <<a href="mailto:thomas.kral@email.cz">thomas.kral@email.cz</a>>:<br><br></div><blockquote type="cite"><div dir="ltr"><span>On Thu, 14 Mar 2019 21:36:28 +0100</span><br><span>Andreas Pirklbauer <<a href="mailto:andreas_pirklbauer@yahoo.com">andreas_pirklbauer@yahoo.com</a>> wrote:</span><br><span></span><br><blockquote type="cite"><span>Using ‘CopyBlock' to optimize scrolling in *both* directions</span><br></blockquote><span></span><br><span>Hi Andreas,</span><br><span></span><br><span>Thank you, looking into your code. I wish, however to understand the</span><br><span>original first.</span><br><span></span><br><span> PROCEDURE Show* (F: Frame; pos: LONGINT);</span><br><span>  (* driven by delta pos - <a href="http://F.org">F.org</a> *) </span><br><span>  IF pos < <a href="http://F.org">F.org</a> THEN (*???*)</span><br><span>  ELSIF pos > <a href="http://F.org">F.org</a> THEN (*???*)</span><br><span>  ELSIF pos = <a href="http://F.org">F.org</a> THEN (*???*)</span><br><span>    (*use of CopyBlock()*)</span><br><span>  ELSE (*???*)</span><br><span>  END ;</span><br><span> END Show;</span><br><span></span><br><span> PROCEDURE Edit* (F: Frame; X, Y: INTEGER; Keys: SET);</span><br><span>   IF Keys = {2} THEN   (*ML, scroll up*)</span><br><span>   ELSIF Keys = {1} THEN   (*MM*) (*!!! up or down !!!*)</span><br><span>   ELSIF Keys = {0} THEN   (*MR, scroll down*)</span><br><span>   END ;</span><br><span>   Show(....);</span><br><span> END Edit;</span><br><span></span><br><span>-- </span><br><span>Tomas Kral <<a href="mailto:thomas.kral@email.cz">thomas.kral@email.cz</a>></span><br><span>--</span><br><span><a href="mailto:Oberon@lists.inf.ethz.ch">Oberon@lists.inf.ethz.ch</a> mailing list for ETH Oberon and related systems</span><br><span><a href="https://lists.inf.ethz.ch/mailman/listinfo/oberon">https://lists.inf.ethz.ch/mailman/listinfo/oberon</a></span><br></div></blockquote></div></div></body></html>