[Lazarus] white flash when opening new unit while debugging
David Emerson
dle3ab at angelbase.com
Wed Nov 4 01:54:44 CET 2009
Mattias Gaertner wrote:
> On Tue, 03 Nov 2009 17:46:48 +0000
> Martin <lazarus at mfriebe.de> wrote:
>
>> Mattias Gärtner wrote:
>>
>>> Zitat von Martin <lazarus at mfriebe.de>
>>>> have you looked at using
>>>> StartLine := Min(Old:ogCaret.Y, LogCaret.Y);
>>>> EndLine := Max(Old:ogCaret.Y, LogCaret.Y);
>>>>
>>> Sometimes synedit gives me too many lines, sometimes not enough. I
>>> need the real insert range.
>>>
>> Even if you use the info from the caret?
>>
>
> For example:
>
> inserting one line:
> OldCaret=(x=1,y=47) NewCaret=(x=1,y=48) FirstLinePos=47 LastLinePos=48
>
You mean inserting a full line using paste? so you have a complet new
line 47, and the old line 47 is now 48? But then the info from the
caret is correct, with one addition
Text changed between 47/1 and 48/1 Since there is nothing before line
48/1 That means the line has not changed (ending on the next line with
pos=1 means that the last modified think is the linefeed)
> replacing one line with one line
> OldCaret=(x=1,y=48) NewCaret=(x=1,y=48) FirstLinePos=46 LastLinePos=48
>
Good point, if you had a selection before, then the caret is *not*
sufficient
But in this situation, even if the line range was correct, this would
bring back the problem of detecting how much of line 47 was changed.
=> it could be that only the last few chars where selected, in this case
the insert (according to you) should not re-indent line 47
=> or line 47 was fully selected, and should be re-indented
So this case is a good example, even the combination of correct
line-range and both carets are not enough. You must additionally take in
account the selection that was present before the edit took place.
(and you must take in account if the selection is persistent, or
will/will-not be overwritten)
> replacing one line with one line
> OldCaret=(x=1,y=47) NewCaret=(x=1,y=48) FirstLinePos=46 LastLinePos=48
>
>
>
>> Yes, I looked at the FirstLinePos, LastLinePos range => it is wrong
>> sometimes. But the caret seems to be ok for all I have seen.
>>
>> Also, as I wrote before: FirstLinePos, LastLinePos is not usable for
>> you, because in syncro-mode it will report more lines than you need
>> (and that is by design).
>>
>
> Yes.
> How to find out if synedit is in syncro mode?
>
Currently not available. The syncroEditModule is created in sourceditor
line 2565 => So a reference could be kept. Same would have to be done
for TemplateEdits
And then each time any similar module is added, check will need to be
added.
There is no central point, Synedit doesn't know. It was one of the
important design goals that the syncro module can extend synedit,
without synedit having to know about it.
Which is why (even if fixed) the FirstLinePos, LastLinePos range will
always include such kind of edits.
Similar, it will be with persistent blocks, the can be moved to a new
location, which will edit both places (delete them at the old place /
insert them at the new place). Changed lines will be including all of this.
>
>
>> In syncro mode, you can press enter inside a cell, and the cell
>> willbecome multi-line => indenting in this case must be limited to
>> the cell which was active,
>> -FirstLinePos, LastLinePos will include the range for *all* cells =>
>> if you indent every line in that range, the syncro module, will keep
>> copying every change you make accross all cells => total chaos.
>> - the caret will give you the correct range
>>
>
> How?
>
After the example with the overwriting of a selection. The correct
answer is:
The caret and observing the selection (hooking synedit to know what it
was before the edit action).
The end of story is, it seems there is no simple way to do this.
If I have time I will fix the line-range. But as far as I am concerned
it is of little value. Using this (even now) the auto indent will cause
big trouble if used during synro or template mode (if someone does paste
into a cell)
The combination of monitoring block and caret (and maybe even more)
would solve it. (as already noted above => replacing a selected line OR
replacing a partly selected line, including the linefeed)
However instead of filling he generic beautifier with more and more IDE
specific code, I would suggest to have a subclass of the Beautifier
residing in source-editor. Every synedit that is created in the IDE will
be assigned the special IDEBeautifier. the ide beautifier can then sort
out what happened.
It basically has to know how synedit will react, and calculate the
required data.
Martin
More information about the Lazarus
mailing list