Mattias Gaertner wrote 21 lines
On Tue, 03 Nov 2009 17:46:48 +0000
Martin wrote:
> Mattias G?rtner wrote:
>
>> Zitat von Martin
>>> 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)
Show quoted text 16 lines
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.
Show quoted text 13 lines
> 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