From 77c4b7ceaecbdd14f43665d265a65e3990f05da2 Mon Sep 17 00:00:00 2001 From: Martin Date: Tue, 24 Sep 2024 22:35:09 +0200 Subject: [PATCH] IDE, SynEdit: add option to have bookmarks restore the scroll pos. Issue #40912 --- components/ideintf/srceditorintf.pas | 3 +- components/synedit/synedit.pp | 49 +++++++++++-- components/synedit/syneditmarks.pp | 85 +++++++++++++++++++++- components/synedit/synedittypes.pp | 3 +- ide/editoroptions.pp | 6 +- ide/frames/editor_general_misc_options.lfm | 2 +- ide/frames/editor_general_misc_options.pas | 12 ++- ide/lazarusidestrconsts.pas | 1 + ide/main.pp | 8 +- ide/packages/ideproject/project.pp | 27 ++++++- ide/packages/ideproject/projectdefs.pas | 49 +++++++++++++ ide/sourceeditor.pp | 15 +++- 12 files changed, 233 insertions(+), 27 deletions(-) diff --git a/components/ideintf/srceditorintf.pas b/components/ideintf/srceditorintf.pas index 5d7d68367f..03fe397df4 100644 --- a/components/ideintf/srceditorintf.pas +++ b/components/ideintf/srceditorintf.pas @@ -132,7 +132,8 @@ type procedure CopyToClipboard; virtual; abstract; procedure CutToClipboard; virtual; abstract; function GetBookMark(BookMark: Integer; out X, Y: Integer): Boolean; virtual; abstract; - procedure SetBookMark(BookMark: Integer; X, Y: Integer); virtual; abstract; + function GetBookMark(BookMark: Integer; out X, Y, ALeft, ATop: Integer): Boolean; virtual; abstract; + procedure SetBookMark(BookMark: Integer; X, Y: Integer; AnLeft: Integer = -1; AnTop: Integer = -1); virtual; abstract; // screen and text position mapping function LineCount: Integer; virtual; abstract; diff --git a/components/synedit/synedit.pp b/components/synedit/synedit.pp index ccaa903dd7..9d05f3ae2b 100644 --- a/components/synedit/synedit.pp +++ b/components/synedit/synedit.pp @@ -983,9 +983,10 @@ type // BoorMark procedure ClearBookMark(BookMark: Integer); function GetBookMark(BookMark: integer; var X, Y: integer): boolean; + function GetBookMark(BookMark: integer; var X, Y, ALeft, ATop: integer): boolean; procedure GotoBookMark(BookMark: Integer); function IsBookmark(BookMark: integer): boolean; - procedure SetBookMark(BookMark: Integer; X: Integer; Y: Integer); + procedure SetBookMark(BookMark: Integer; X: Integer; Y: Integer; AnLeft: Integer = -1; AnTop: Integer = -1); property Marks: TSynEditMarkList read fMarkList; // Undo/Redo @@ -6451,11 +6452,19 @@ end; procedure TCustomSynEdit.GotoBookMark(BookMark: Integer); var LogCaret: TPoint; + m: TSynEditBookMark; begin if (BookMark in [0..9]) and assigned(fBookMarks[BookMark]) and (fBookMarks[BookMark].Line <= fLines.Count) then begin - LogCaret:=Point(fBookMarks[BookMark].Column, fBookMarks[BookMark].Line); + m := TSynEditBookMark(fBookMarks[BookMark]); + if (eoBookmarkRestoresScroll in FOptions2) and (m.TopLeftMark <> nil) and + (m.TopLeftMark.Line > 0) + then begin + TopLine := m.TopLeftMark.Line; + LeftChar := m.TopLeftMark.Column; + end; + LogCaret:=Point(m.Column, m.Line); DoIncPaintLock(Self); // No editing is taking place FCaret.ChangeOnTouch; FCaret.LineBytePos := LogCaret; @@ -6470,14 +6479,15 @@ begin FOnMouseLink(Self, X1, Y, Result); end; -procedure TCustomSynEdit.SetBookMark(BookMark: Integer; X: Integer; Y: Integer); +procedure TCustomSynEdit.SetBookMark(BookMark: Integer; X: Integer; Y: Integer; AnLeft: Integer; + AnTop: Integer); var i: Integer; - mark: TSynEditMark; + mark: TSynEditBookMark; begin if (BookMark in [0..9]) and (Y >= 1) and (Y <= Max(1, fLines.Count)) then begin - mark := TSynEditMark.Create(self); + mark := TSynEditBookMark.Create(self); X := PhysicalToLogicalPos(Point(X, Y)).x; with mark do begin Line := Y; @@ -6486,6 +6496,8 @@ begin BookmarkNumber := Bookmark; Visible := true; InternalImage := (BookMarkOptions.BookmarkImages = nil); + if AnLeft > 0 then + mark.SetTopLeft(AnTop, AnLeft); end; for i := 0 to 9 do if assigned(fBookMarks[i]) and (fBookMarks[i].Line = Y) then @@ -7448,9 +7460,10 @@ begin or (fBookMarks[CX].Line <> CaretY); ClearBookMark(CX); if moveBkm then - SetBookMark(CX, CaretX, CaretY); + SetBookMark(CX, CaretX, CaretY, LeftChar, TopLine); end else - SetBookMark(CX, CaretX, CaretY); + //SetBookMark(CX, CaretX, CaretY); + SetBookMark(CX, CaretX, CaretY, LeftChar, TopLine); end; // if BookMarkOptions.EnableKeys end; ecCut: @@ -8054,6 +8067,28 @@ begin end; end; +function TCustomSynEdit.GetBookMark(BookMark: integer; var X, Y, ALeft, ATop: integer): boolean; +var + i: integer; + m: TSynEditMark; +begin + Result := false; + if assigned(Marks) then + for i := 0 to Marks.Count - 1 do + if Marks[i].IsBookmark and (Marks[i].BookmarkNumber = BookMark) then begin + m := Marks[i]; + X := m.Column; + Y := m.Line; + X := LogicalToPhysicalPos(Point(X, Y)).x; + if (m is TSynEditBookMark) and (TSynEditBookMark(m).TopLeftMark <> nil) then begin + ALeft := TSynEditBookMark(m).TopLeftMark.Column; + ATop := TSynEditBookMark(m).TopLeftMark.Line; + end; + Result := true; + Exit; + end; +end; + function TCustomSynEdit.IsBookmark(BookMark: integer): boolean; var x, y: integer; diff --git a/components/synedit/syneditmarks.pp b/components/synedit/syneditmarks.pp index edf3386623..497b921630 100644 --- a/components/synedit/syneditmarks.pp +++ b/components/synedit/syneditmarks.pp @@ -57,8 +57,9 @@ type FOldLine: integer; FOwnerEdit: TSynEditBase; function GetLine: integer; + procedure SetBookmarkNum(AValue: integer); procedure SetMarkLine(const AValue: TSynEditMarkLine); - procedure SetMarkList(const AValue: TSynEditMarkList); + procedure SetMarkList(const AValue: TSynEditMarkList); virtual; procedure SetOwnerEdit(const AValue: TSynEditBase); protected FColumn, FImage, FPriority: Integer; @@ -73,7 +74,7 @@ type procedure SetPriority(const AValue: integer); virtual; procedure SetVisible(const Value: boolean); virtual; procedure SetInternalImage(const Value: boolean); - function GetIsBookmark: boolean; + function GetIsBookmark: boolean; virtual; procedure DoChange(AChanges: TSynEditMarkChangeReasons); virtual; procedure ForceChange(AChanges: TSynEditMarkChangeReasons); @@ -94,7 +95,7 @@ type property Priority: integer read FPriority write SetPriority; property Visible: boolean read FVisible write SetVisible; - property BookmarkNumber: integer read FBookmarkNum write fBookmarkNum; + property BookmarkNumber: integer read FBookmarkNum write SetBookmarkNum; property IsBookmark: boolean read GetIsBookmark; // InternalImage: Use Internal bookmark image 0..9; @@ -107,6 +108,31 @@ type property ImageList: TCustomImageList read FImageList write FImageList; end; + { TSynEditBookMark } + + TSynEditBookMark = class(TSynEditMark) + private type + + { TSynEditTopLeftMark } + + TSynEditTopLeftMark = class(TSynEditMark) + private + FBookMark: TSynEditBookMark; + public + destructor Destroy; override; + end; + + private + FTopLeftMark: TSynEditMark; + procedure SetMarkList(const AValue: TSynEditMarkList); override; + protected + function GetIsBookmark: boolean; override; + public + destructor Destroy; override; + procedure SetTopLeft(ATop, ALeft: integer); + property TopLeftMark: TSynEditMark read FTopLeftMark; + end; + { TSynEditMarkLine } TSynEditMarkLine = class(TSynSizedDifferentialAVLNode) @@ -349,6 +375,12 @@ begin Result := FLine; end; +procedure TSynEditMark.SetBookmarkNum(AValue: integer); +begin + assert(Self is TSynEditBookMark, 'TSynEditMark.SetBookmarkNum: Self is TSynEditBookMark'); + FBookmarkNum := AValue; +end; + procedure TSynEditMark.SetMarkLine(const AValue: TSynEditMarkLine); begin if FMarkLine = AValue then exit; @@ -360,7 +392,7 @@ end; function TSynEditMark.GetIsBookmark: boolean; begin - Result := (fBookmarkNum >= 0); + Result := False; end; procedure TSynEditMark.DoChange(AChanges: TSynEditMarkChangeReasons); @@ -460,6 +492,51 @@ begin DoChange(FChanges); end; +{ TSynEditBookMark } + +procedure TSynEditBookMark.SetMarkList(const AValue: TSynEditMarkList); +begin + inherited SetMarkList(AValue); + if (FMarkList <> nil) and (FTopLeftMark <> nil) then + FMarkList.Add(FTopLeftMark); +end; + +function TSynEditBookMark.GetIsBookmark: boolean; +begin + Result := True; +end; + +destructor TSynEditBookMark.Destroy; +begin + if FTopLeftMark <> nil then begin + TSynEditTopLeftMark(FTopLeftMark).FBookMark := nil; + FTopLeftMark.Free; + end; + inherited Destroy; +end; + +procedure TSynEditBookMark.SetTopLeft(ATop, ALeft: integer); +begin + if (ATop <= 0) or (ALeft <= 0) then + exit; + FTopLeftMark := TSynEditTopLeftMark.Create(OwnerEdit); + TSynEditTopLeftMark(FTopLeftMark).FBookMark := Self; + FTopLeftMark.Line := ATop; + FTopLeftMark.Column := ALeft; + + if (FMarkList <> nil) then + FMarkList.Add(FTopLeftMark); +end; + +{ TSynEditBookMark.TSynEditTopLeftMark } + +destructor TSynEditBookMark.TSynEditTopLeftMark.Destroy; +begin + if FBookMark <> nil then + FBookMark.FTopLeftMark := nil; + inherited Destroy; +end; + { TSynEditMarkLine } function TSynEditMarkLine.GetMark(Index: Integer): TSynEditMark; diff --git a/components/synedit/synedittypes.pp b/components/synedit/synedittypes.pp index 6fe7b4b085..c0a9a9d79a 100644 --- a/components/synedit/synedittypes.pp +++ b/components/synedit/synedittypes.pp @@ -196,8 +196,9 @@ type eoScrollPastEolAddPage, // Allows caret to go into empty space beyond end-of-line position // - Limit to length of longest line + width of one page // if eoScrollPastEol also is set, the bigger of the 2 limits is used - eoScrollPastEolAutoCaret // Allows caret to go into empty space beyond end-of-line position + eoScrollPastEolAutoCaret, // Allows caret to go into empty space beyond end-of-line position // Limit will follow the caret / scrollbar-range extends when caret goes further + eoBookmarkRestoresScroll // Bookmarks also restore scroll pos ); TSynEditorOptions2 = set of TSynEditorOption2; diff --git a/ide/editoroptions.pp b/ide/editoroptions.pp index ab27ea014e..232c440799 100644 --- a/ide/editoroptions.pp +++ b/ide/editoroptions.pp @@ -5636,7 +5636,8 @@ begin SynEditOptName := 'OverwriteBlock'; eoAutoHideCursor: SynEditOptName := 'AutoHideCursor'; - eoCaretMoveEndsSelection, eoPersistentCaretStopBlink, eoNoScrollOnSelectRange: + eoCaretMoveEndsSelection, eoPersistentCaretStopBlink, eoNoScrollOnSelectRange, + eoBookmarkRestoresScroll: WriteStr(SynEditOptName, SynEditOpt2); else SynEditOptName := ''; @@ -5893,7 +5894,8 @@ begin SynEditOptName := 'OverwriteBlock'; eoAutoHideCursor: SynEditOptName := 'AutoHideCursor'; - eoCaretMoveEndsSelection, eoPersistentCaretStopBlink, eoNoScrollOnSelectRange: + eoCaretMoveEndsSelection, eoPersistentCaretStopBlink, eoNoScrollOnSelectRange, + eoBookmarkRestoresScroll: WriteStr(SynEditOptName, SynEditOpt2); else SynEditOptName := ''; diff --git a/ide/frames/editor_general_misc_options.lfm b/ide/frames/editor_general_misc_options.lfm index 0ffed2cd56..50bf0e4b43 100644 --- a/ide/frames/editor_general_misc_options.lfm +++ b/ide/frames/editor_general_misc_options.lfm @@ -47,8 +47,8 @@ object EditorGeneralMiscOptionsFrame: TEditorGeneralMiscOptionsFrame ChildSizing.ControlsPerLine = 1 ColumnLayout = clVerticalThenHorizontal Columns = 2 - OnItemClick = EditorOptionsGroupBoxItemClick TabOrder = 0 + OnItemClick = EditorOptionsGroupBoxItemClick end object EditorTrimSpaceTypeComboBox: TComboBox AnchorSideLeft.Control = Owner diff --git a/ide/frames/editor_general_misc_options.pas b/ide/frames/editor_general_misc_options.pas index f1c02aa5bc..4a617be519 100644 --- a/ide/frames/editor_general_misc_options.pas +++ b/ide/frames/editor_general_misc_options.pas @@ -122,9 +122,10 @@ begin Items.Add(dlgCopyWordAtCursorOnCopyNone); // 3 Items.Add(dlgCopyPasteKeepFolds); // 4 Items.Add(dlgEditExportBackColor); // 5 + Items.Add(dlgBookmarkSetScroll); // 6 {$IFDEF WinIME} // Keep last, or all subsequnt indexes will depend on it - Items.Add(dlgUseMinimumIme); // 6 + Items.Add(dlgUseMinimumIme); // 7 {$ENDIF} end; EditorTrimSpaceTypeComboBox.Items.Add(dlgTrimSpaceTypeLeaveLine); @@ -160,8 +161,9 @@ begin Checked[3] := CopyWordAtCursorOnCopyNone; Checked[4] := eoFoldedCopyPaste in SynEditOptions2; Checked[5] := ExportHtmlWithBackground; + Checked[6] := eoBookmarkRestoresScroll in SynEditOptions2; {$IFDEF WinIME} - Checked[6] := UseMinimumIme; + Checked[7] := UseMinimumIme; {$ENDIF} with ScrollOnEditLeftOptions do begin @@ -212,8 +214,12 @@ begin SynEditOptions2 := SynEditOptions2 - [eoFoldedCopyPaste]; TrimSpaceType := TSynEditStringTrimmingType(EditorTrimSpaceTypeComboBox.ItemIndex); ExportHtmlWithBackground := EditorOptionsGroupBox.Checked[5]; + if EditorOptionsGroupBox.Checked[6] then + SynEditOptions2 := SynEditOptions2 + [eoBookmarkRestoresScroll] + else + SynEditOptions2 := SynEditOptions2 - [eoBookmarkRestoresScroll]; {$IFDEF WinIME} - UseMinimumIme := EditorOptionsGroupBox.Checked[6]; + UseMinimumIme := EditorOptionsGroupBox.Checked[7]; {$ENDIF} with ScrollOnEditLeftOptions do begin diff --git a/ide/lazarusidestrconsts.pas b/ide/lazarusidestrconsts.pas index b25c4287d7..55b8684227 100644 --- a/ide/lazarusidestrconsts.pas +++ b/ide/lazarusidestrconsts.pas @@ -1833,6 +1833,7 @@ resourcestring dlgCopyPasteKeepFolds = 'Copy/Paste with fold info'; dlgUseMinimumIme = 'IME handled by System'; dlgEditExportBackColor = 'Use Background color in HTML export'; + dlgBookmarkSetScroll = 'Bookmarks restore scroll position'; dlgUndoLimit = 'Undo limit'; dlgTabWidths = 'Tab widths'; dlgMarginGutter = 'Margin and gutter'; diff --git a/ide/main.pp b/ide/main.pp index 580172d16f..21a2a334a5 100644 --- a/ide/main.pp +++ b/ide/main.pp @@ -11240,7 +11240,11 @@ var UnitInfo: TUnitInfo; begin UnitInfo := Project1.UnitWithEditorComponent(TSourceEditor(Sender)); - UnitInfo.AddBookmark(Mark.Column, Mark.Line, Mark.BookmarkNumber); + if (Mark is TSynEditBookMark) and (TSynEditBookMark(Mark).TopLeftMark <> nil) then + UnitInfo.AddBookmark(Mark.Column, Mark.Line, + TSynEditBookMark(Mark).Column, TSynEditBookMark(Mark).Line, Mark.BookmarkNumber) + else + UnitInfo.AddBookmark(Mark.Column, Mark.Line, Mark.BookmarkNumber); end; procedure TMainIDE.SrcNotebookEditorClearBookmark(Sender: TObject; var Mark: TSynEditMark); @@ -11315,7 +11319,7 @@ Begin SetMark:=false; end; if SetMark then - ActEdit.EditorComponent.SetBookMark(ID,NewXY.X,NewXY.Y); + ActEdit.EditorComponent.SetBookMark(ID,NewXY.X,NewXY.Y, ActEdit.EditorComponent.LeftChar, ActEdit.EditorComponent.TopLine); {$push}{$overflowchecks off} Inc(BookmarksStamp); diff --git a/ide/packages/ideproject/project.pp b/ide/packages/ideproject/project.pp index b68dd10a8f..c89bdf0bc7 100644 --- a/ide/packages/ideproject/project.pp +++ b/ide/packages/ideproject/project.pp @@ -432,6 +432,7 @@ type procedure ClearUnitComponentDependencies(ClearTypes: TUnitCompDependencyTypes); // Bookmarks function AddBookmark(X, Y, ID: integer):integer; + function AddBookmark(X, Y, ALeft, ATop, ID: integer):integer; procedure DeleteBookmark(ID: integer); // EditorInfo // At any time, any UnitInfo has at least one EditorInfo @@ -1112,6 +1113,7 @@ type // bookmarks function AddBookmark(X, Y, ID: Integer; AUnitInfo:TUnitInfo):integer; + function AddBookmark(X, Y, ALeft, ATop, ID: Integer; AUnitInfo:TUnitInfo):integer; procedure DeleteBookmark(ID: Integer); public property ActiveBuildMode: TProjectBuildMode read FActiveBuildMode @@ -1837,7 +1839,7 @@ procedure TUnitInfo.SaveToXMLConfig(XMLConfig: TXMLConfig; const Path: string; SaveData, SaveSession: boolean; UsePathDelim: TPathDelimSwitch); var AFilename: String; - i, X, Y: Integer; + i, X, Y, L, T: Integer; s: String; BM: TFileBookmark; begin @@ -1894,8 +1896,11 @@ begin then Bookmarks.Delete(i) else - if OpenEditorInfo[0].EditorComponent.GetBookMark(BM.ID, X, Y) then + if OpenEditorInfo[0].EditorComponent.GetBookMark(BM.ID, X, Y, L, T) then begin BM.CursorPos := Point(X, Y); + BM.Top := T; + BM.Left := L; + end; end; FBookmarks.SaveToXMLConfig(XMLConfig,Path+'Bookmarks/'); XMLConfig.SetDeleteValue(Path+'Loaded/Value',Loaded,false); @@ -2091,7 +2096,7 @@ begin BM := Bookmarks[i]; j := Project1.Bookmarks.IndexOfID(BM.ID); if (j < 0) then - OpenEditorInfo[0].EditorComponent.SetBookMark(BM.ID, BM.CursorPos.X, BM.CursorPos.Y); + OpenEditorInfo[0].EditorComponent.SetBookMark(BM.ID, BM.CursorPos.X, BM.CursorPos.Y, BM.Left, BM.Top); end; finally dec(FSetBookmarLock); @@ -2435,6 +2440,16 @@ begin Project1.AddBookmark(X, Y, ID, Self); end; +function TUnitInfo.AddBookmark(X, Y, ALeft, ATop, ID: integer): integer; +begin + if FSetBookmarLock = 0 then + Result := Bookmarks.Add(X, Y, ALeft, ATop, ID) + else + Result := -1; + SessionModified := True; + Project1.AddBookmark(X, Y, ALeft, ATop, ID, Self); +end; + procedure TUnitInfo.DeleteBookmark(ID: integer); var i: Integer; @@ -5542,6 +5557,12 @@ begin SessionModified := true; end; +function TProject.AddBookmark(X, Y, ALeft, ATop, ID: Integer; AUnitInfo: TUnitInfo): integer; +begin + Result := Bookmarks.Add(X, Y, ALeft, ATop, ID, AUnitInfo); + SessionModified := true; +end; + procedure TProject.DeleteBookmark(ID: Integer); var i: Integer; diff --git a/ide/packages/ideproject/projectdefs.pas b/ide/packages/ideproject/projectdefs.pas index a78c97701f..eceb65878e 100644 --- a/ide/packages/ideproject/projectdefs.pas +++ b/ide/packages/ideproject/projectdefs.pas @@ -132,22 +132,32 @@ var type //--------------------------------------------------------------------------- // bookmarks of a single file + + { TFileBookmark } + TFileBookmark = class private fCursorPos: TPoint; fID: integer; + FLeft: integer; + FTop: integer; public constructor Create; constructor Create(NewX,NewY,AnID: integer); + constructor Create(NewX,NewY,NewLeft,NewTop,AnID: integer); procedure SaveToXMLConfig(XMLConfig: TXMLConfig; const Path: string); procedure LoadFromXMLConfig(XMLConfig: TXMLConfig; const Path: string); function X: integer; function Y: integer; + property Top: integer read FTop write FTop; + property Left: integer read FLeft write FLeft; public property CursorPos: TPoint read fCursorPos write fCursorPos; property ID: integer read fID write fID; end; + { TFileBookmarks } + TFileBookmarks = class private FBookmarks:TList; // list of TFileBookmark @@ -163,6 +173,7 @@ type procedure Clear; function Add(ABookmark: TFileBookmark):integer; function Add(X,Y,ID: integer):integer; + function Add(X,Y,ALeft,ATop,ID: integer):integer; function IndexOfID(ID:integer):integer; procedure SaveToXMLConfig(XMLConfig: TXMLConfig; const Path: string); procedure LoadFromXMLConfig(XMLConfig: TXMLConfig; const Path: string); @@ -176,11 +187,16 @@ type TProjectBookmark = class private fCursorPos: TPoint; + FLeft: integer; + FTop: integer; FUnitInfo: TObject; fID: integer; public constructor Create(X,Y, AnID: integer; AUnitInfo:TObject); + constructor Create(X,Y, ALeft, ATop, AnID: integer; AUnitInfo:TObject); property CursorPos: TPoint read fCursorPos write fCursorPos; + property Top: integer read FTop; + property Left: integer read FLeft; property UnitInfo: TObject read FUnitInfo write FUnitInfo; property ID:integer read fID write fID; end; @@ -202,6 +218,7 @@ type procedure Clear; function Add(ABookmark: TProjectBookmark):integer; function Add(X, Y, ID: integer; AUnitInfo: TObject):integer; + function Add(X, Y, ALeft, ATop, ID: integer; AUnitInfo: TObject):integer; procedure DeleteAllWithUnitInfo(AUnitInfo:TObject); function IndexOfID(ID:integer):integer; function BookmarkWithID(ID: integer): TProjectBookmark; @@ -300,10 +317,19 @@ begin inherited Create; fCursorPos.X := X; fCursorPos.Y := Y; + FLeft := -1; + FTop := -1; FUnitInfo := AUnitInfo; fID := AnID; end; +constructor TProjectBookmark.Create(X, Y, ALeft, ATop, AnID: integer; AUnitInfo: TObject); +begin + Create(X, Y, AnID, AUnitInfo); + FLeft := ALeft; + FTop := ATop; +end; + { TProjectBookmarkList } constructor TProjectBookmarkList.Create; @@ -401,6 +427,11 @@ begin Result:=Add(TProjectBookmark.Create(X, Y, ID, AUnitInfo)); end; +function TProjectBookmarkList.Add(X, Y, ALeft, ATop, ID: integer; AUnitInfo: TObject): integer; +begin + Result:=Add(TProjectBookmark.Create(X, Y, ALeft, ATop, ID, AUnitInfo)); +end; + { TProjectJumpHistoryPosition } constructor TProjectJumpHistoryPosition.Create(const AFilename: string; @@ -764,14 +795,25 @@ constructor TFileBookmark.Create(NewX, NewY, AnID: integer); begin fCursorPos.X:=NewX; fCursorPos.Y:=NewY; + FLeft := -1; + FTop := -1; fID:=AnID; end; +constructor TFileBookmark.Create(NewX, NewY, NewLeft, NewTop, AnID: integer); +begin + Create(NewX, NewY, AnID); + FLeft := NewLeft; + FTop := NewTop; +end; + procedure TFileBookmark.SaveToXMLConfig(XMLConfig: TXMLConfig; const Path: string); begin XMLConfig.SetDeleteValue(Path+'X',fCursorPos.X,1); XMLConfig.SetDeleteValue(Path+'Y',fCursorPos.Y,1); + XMLConfig.SetDeleteValue(Path+'Left',FLeft,-1); + XMLConfig.SetDeleteValue(Path+'Top',FTop,-1); XMLConfig.SetDeleteValue(Path+'ID',fID,0); end; @@ -780,6 +822,8 @@ procedure TFileBookmark.LoadFromXMLConfig(XMLConfig: TXMLConfig; begin fCursorPos.X:=XMLConfig.GetValue(Path+'X',1); fCursorPos.Y:=XMLConfig.GetValue(Path+'Y',1); + FLeft:=XMLConfig.GetValue(Path+'Left',-1); + FTop :=XMLConfig.GetValue(Path+'Top',-1); fID:=XMLConfig.GetValue(Path+'ID',0); end; @@ -851,6 +895,11 @@ begin Result:=Add(TFileBookmark.Create(X,Y,ID)); end; +function TFileBookmarks.Add(X, Y, ALeft, ATop, ID: integer): integer; +begin + Result:=Add(TFileBookmark.Create(X,Y,ALeft,ATop,ID)); +end; + function TFileBookmarks.IndexOfID(ID: integer): integer; begin Result:=Count-1; diff --git a/ide/sourceeditor.pp b/ide/sourceeditor.pp index a34207c21a..55ab0f3518 100644 --- a/ide/sourceeditor.pp +++ b/ide/sourceeditor.pp @@ -460,7 +460,8 @@ type procedure CopyToClipboard; override; procedure CutToClipboard; override; function GetBookMark(BookMark: Integer; out X, Y: Integer): Boolean; override; - procedure SetBookMark(BookMark: Integer; X, Y: Integer); override; + function GetBookMark(BookMark: Integer; out X, Y, ALeft, ATop: Integer): Boolean; override; + procedure SetBookMark(BookMark: Integer; X, Y: Integer; AnLeft: Integer = -1; AnTop: Integer = -1); override; procedure ExportAsHtml(AFileName: String); @@ -4947,9 +4948,17 @@ begin Result := FEditor.GetBookMark(BookMark, X, Y); end; -procedure TSourceEditor.SetBookMark(BookMark: Integer; X, Y: Integer); +function TSourceEditor.GetBookMark(BookMark: Integer; out X, Y, ALeft, ATop: Integer): Boolean; begin - FEditor.SetBookMark(BookMark, X, Y); + X := 0; Y := 0; + ALeft := -1; ATop := -1; + Result := FEditor.GetBookMark(BookMark, X, Y, ALeft, ATop); +end; + +procedure TSourceEditor.SetBookMark(BookMark: Integer; X, Y: Integer; AnLeft: Integer; + AnTop: Integer); +begin + FEditor.SetBookMark(BookMark, X, Y, AnLeft, AnTop); end; procedure TSourceEditor.ExportAsHtml(AFileName: String);