[Lazarus] pointers in writing extension for Lazarus
Martin
lazarus at mfriebe.de
Wed Dec 5 22:53:43 CET 2012
On 05/12/2012 21:23, ik wrote:
> Hello,
>
> For a very long time now (7-8 years), that I wish to add Lazarus
> possibility to split edit of my current edit (and other open files)
> vertically and horizontally.
> I understand that many people here don't like the idea, so I wish to
> write an extension for, rather then adding it to the UI itself.
Actually, it is on my list too. But hasn't made priority yet.
> Can you please give me some pointers in the matter on how to start
> writing it, what should I be looking for etc... ?
Actually, you are looking at 2 things that you will need.
The first is in SynEdit. Though that depends, I will get to that in a
moment.
The 2nd, is in the IDE (SourceEditor, project, ...). That is
- Adding a splitter (or rather, if the view is not yet splitted, it will
just be a tiny bit on the right gutter/scrollbar)
- Adding the ability to save and restore the layout, with the project
session (this is not the window manager, as it is still seen as one
editor, in one tab)
Back to SynEdit. There is a decision on functional issues.
Currently if you have 2 Editors in 2 windows, editing one file, then
they are truly 2 editors. 2
- 2 carets (if the OS supports (GTK), and the option "Persistent caret"
is set. Each has it's location, and each shows that location in the
statusbar.
- 2 selections, and tey can be in different places
- 2 syncro edits
...
IMHO that is not what one expects from a split view. It should be one of
each (one editor).
- Except for each split it will remember (but not show, unless active)
the caret pos.
- But for example it is one selection. Changing the selection affects
all splits (as they are views on the same editor).
***** SynEdit
*** "2 Edit approach"
Yet the first (2 edit) is already implemented. The 2nd still needs doing.
If chosen, it should be done in a way, that it can later be replaced.
*** "1 Edit approach"
If the 2nd is done, it raises the question, if each split should have a
wincontrol (with a handle). The difference is, if you edit something in
the upper split, that is also seen in the lomer split, the with ore
wincontrol (on most OS) the invalidate is the minimum rectangle covering
both lines.
This repaints a lot of text that has not changed (battery life on laptopts)
With the recent introduction of "TLazSynTextArea =
class(TLazSynSurface)" the 2nd solution became a lot easier. (See
ide/SourceSynEditor TopInfoHint). Looking at TopInfoHint would be the
starting point for this. (And then to check for details with me)
***** Project
You need to discover that on your self. Its a while ago, and I can only
give you bits and pieces.
Files, SourceEditor (do not add dopendencies in uses, add events),
main.pp, project.pp (I think someone recently factored some code into a
4th file...)
procedure TSourceEditor.UpdateProjectFile;
begin
if Assigned(Manager) and Assigned(Manager.OnEditorMoved)
then Manager.OnEditorMoved(self);
end;
leads you to main.pp, line 2031
SourceEditorManager.OnEditorMoved := @OnSrcNotebookEditorMoved;
procedure TMainIDE.OnSrcNotebookEditorMoved(Sender: TObject);
var
p: TUnitEditorInfo;
i: Integer;
SrcEdit: TSourceEditor;
begin
SrcEdit := TSourceEditor(Sender);
p :=Project1.EditorInfoWithEditorComponent(SrcEdit);
if p <> nil then begin
p.PageIndex := SrcEdit.PageIndex;
p.WindowIndex :=
SourceEditorManager.IndexOfSourceWindow(SrcEdit.SourceNotebook);
p.IsLocked := SrcEdit.IsLocked;
end
else if SrcEdit.IsNewSharedEditor then begin
// attach to UnitInfo
SrcEdit.IsNewSharedEditor := False;
i := 0;
while (i < SrcEdit.SharedEditorCount) and (SrcEdit.SharedEditors[i]
= SrcEdit) do
inc(i);
p := Project1.EditorInfoWithEditorComponent(SrcEdit.SharedEditors[i]);
p := p.UnitInfo.GetClosedOrNewEditorInfo;
p.EditorComponent := SrcEdit;
p.SyntaxHighlighter := SrcEdit.SyntaxHighlighterType;
p.CustomHighlighter := p.SyntaxHighlighter <>
p.UnitInfo.DefaultSyntaxHighlighter;
end;
end;
Look at the UnitInfo stuff...
More information about the Lazarus
mailing list