[Lazarus] Displaying text with colour and insertion point
lazarus at mfriebe.de
Wed May 16 19:13:53 CEST 2012
On 16/05/2012 16:32, Mark Morgan Lloyd wrote:
> Since it's emulating a mechanical terminal that printed to roll paper,
> the number of lines is indeterminate and increasing. I suppose that I
> could limit it to (say) 1000, but if other people started using it
> there'd be bound to be somebody complain.
Still possible (at least I think)
Highlighter stores something called a range for each line (line as in
textbuffer lines, so scrolling of display does not matter)
They are automatically adjusted if lines are added/inserted/removed
from/to the textbuffer
So you could write a HL, that stores a list of x-positions for each
line, together with the attributes. (If you edit the line itself, you
need to adjust the list)
The highlighter can then return the text, cut into "tokens" (in your
case each continuous group of chars with the same attributes), and
supply the attributes for each token.
By default the "Range" is not freed, when the line is dropped (e.g. if
it is an enum or set, then just the memory is dropped).
But the highlighter allows to override that code, so it can be added.
Depends how interested you are.
I can assist, and help put together the framework, but you'll have to
implement the rest.
Also to get the memory to be freed (using dynamic array for ranges), it
touches a few internal methods. I do not foresee that they will change,
If you look at the 1st example from the tutorial ("SimpleHl").
As I said the ranges move with the lines. And I can make it possible
that you can store a dynamic array (actually pointer to dyn array) as
range, and that it will be freed, if a line is removed.
The array could be something like
TLinePosArray = Array of record
XPos, NumChar: Smallint; // assuming a max line length
Attr: TSynHighlighterAttributes; // could alse be an enum, that you
PLinePosArray = ^TLinePosArray;
The rest should be self-explaining from the tutorial.
More information about the Lazarus