IDE, SynEdit: add option to have bookmarks restore the scroll pos. Issue #40912

This commit is contained in:
Martin 2024-09-24 22:35:09 +02:00
parent 4696c84166
commit 77c4b7ceae
12 changed files with 233 additions and 27 deletions

View File

@ -132,7 +132,8 @@ type
procedure CopyToClipboard; virtual; abstract; procedure CopyToClipboard; virtual; abstract;
procedure CutToClipboard; virtual; abstract; procedure CutToClipboard; virtual; abstract;
function GetBookMark(BookMark: Integer; out X, Y: Integer): Boolean; 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 // screen and text position mapping
function LineCount: Integer; virtual; abstract; function LineCount: Integer; virtual; abstract;

View File

@ -983,9 +983,10 @@ type
// BoorMark // BoorMark
procedure ClearBookMark(BookMark: Integer); procedure ClearBookMark(BookMark: Integer);
function GetBookMark(BookMark: integer; var X, Y: integer): boolean; function GetBookMark(BookMark: integer; var X, Y: integer): boolean;
function GetBookMark(BookMark: integer; var X, Y, ALeft, ATop: integer): boolean;
procedure GotoBookMark(BookMark: Integer); procedure GotoBookMark(BookMark: Integer);
function IsBookmark(BookMark: integer): boolean; 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; property Marks: TSynEditMarkList read fMarkList;
// Undo/Redo // Undo/Redo
@ -6451,11 +6452,19 @@ end;
procedure TCustomSynEdit.GotoBookMark(BookMark: Integer); procedure TCustomSynEdit.GotoBookMark(BookMark: Integer);
var var
LogCaret: TPoint; LogCaret: TPoint;
m: TSynEditBookMark;
begin begin
if (BookMark in [0..9]) and assigned(fBookMarks[BookMark]) if (BookMark in [0..9]) and assigned(fBookMarks[BookMark])
and (fBookMarks[BookMark].Line <= fLines.Count) and (fBookMarks[BookMark].Line <= fLines.Count)
then begin 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 DoIncPaintLock(Self); // No editing is taking place
FCaret.ChangeOnTouch; FCaret.ChangeOnTouch;
FCaret.LineBytePos := LogCaret; FCaret.LineBytePos := LogCaret;
@ -6470,14 +6479,15 @@ begin
FOnMouseLink(Self, X1, Y, Result); FOnMouseLink(Self, X1, Y, Result);
end; end;
procedure TCustomSynEdit.SetBookMark(BookMark: Integer; X: Integer; Y: Integer); procedure TCustomSynEdit.SetBookMark(BookMark: Integer; X: Integer; Y: Integer; AnLeft: Integer;
AnTop: Integer);
var var
i: Integer; i: Integer;
mark: TSynEditMark; mark: TSynEditBookMark;
begin begin
if (BookMark in [0..9]) and (Y >= 1) and (Y <= Max(1, fLines.Count)) then if (BookMark in [0..9]) and (Y >= 1) and (Y <= Max(1, fLines.Count)) then
begin begin
mark := TSynEditMark.Create(self); mark := TSynEditBookMark.Create(self);
X := PhysicalToLogicalPos(Point(X, Y)).x; X := PhysicalToLogicalPos(Point(X, Y)).x;
with mark do begin with mark do begin
Line := Y; Line := Y;
@ -6486,6 +6496,8 @@ begin
BookmarkNumber := Bookmark; BookmarkNumber := Bookmark;
Visible := true; Visible := true;
InternalImage := (BookMarkOptions.BookmarkImages = nil); InternalImage := (BookMarkOptions.BookmarkImages = nil);
if AnLeft > 0 then
mark.SetTopLeft(AnTop, AnLeft);
end; end;
for i := 0 to 9 do for i := 0 to 9 do
if assigned(fBookMarks[i]) and (fBookMarks[i].Line = Y) then if assigned(fBookMarks[i]) and (fBookMarks[i].Line = Y) then
@ -7448,9 +7460,10 @@ begin
or (fBookMarks[CX].Line <> CaretY); or (fBookMarks[CX].Line <> CaretY);
ClearBookMark(CX); ClearBookMark(CX);
if moveBkm then if moveBkm then
SetBookMark(CX, CaretX, CaretY); SetBookMark(CX, CaretX, CaretY, LeftChar, TopLine);
end else end else
SetBookMark(CX, CaretX, CaretY); //SetBookMark(CX, CaretX, CaretY);
SetBookMark(CX, CaretX, CaretY, LeftChar, TopLine);
end; // if BookMarkOptions.EnableKeys end; // if BookMarkOptions.EnableKeys
end; end;
ecCut: ecCut:
@ -8054,6 +8067,28 @@ begin
end; end;
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; function TCustomSynEdit.IsBookmark(BookMark: integer): boolean;
var var
x, y: integer; x, y: integer;

View File

@ -57,8 +57,9 @@ type
FOldLine: integer; FOldLine: integer;
FOwnerEdit: TSynEditBase; FOwnerEdit: TSynEditBase;
function GetLine: integer; function GetLine: integer;
procedure SetBookmarkNum(AValue: integer);
procedure SetMarkLine(const AValue: TSynEditMarkLine); procedure SetMarkLine(const AValue: TSynEditMarkLine);
procedure SetMarkList(const AValue: TSynEditMarkList); procedure SetMarkList(const AValue: TSynEditMarkList); virtual;
procedure SetOwnerEdit(const AValue: TSynEditBase); procedure SetOwnerEdit(const AValue: TSynEditBase);
protected protected
FColumn, FImage, FPriority: Integer; FColumn, FImage, FPriority: Integer;
@ -73,7 +74,7 @@ type
procedure SetPriority(const AValue: integer); virtual; procedure SetPriority(const AValue: integer); virtual;
procedure SetVisible(const Value: boolean); virtual; procedure SetVisible(const Value: boolean); virtual;
procedure SetInternalImage(const Value: boolean); procedure SetInternalImage(const Value: boolean);
function GetIsBookmark: boolean; function GetIsBookmark: boolean; virtual;
procedure DoChange(AChanges: TSynEditMarkChangeReasons); virtual; procedure DoChange(AChanges: TSynEditMarkChangeReasons); virtual;
procedure ForceChange(AChanges: TSynEditMarkChangeReasons); procedure ForceChange(AChanges: TSynEditMarkChangeReasons);
@ -94,7 +95,7 @@ type
property Priority: integer read FPriority write SetPriority; property Priority: integer read FPriority write SetPriority;
property Visible: boolean read FVisible write SetVisible; 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; property IsBookmark: boolean read GetIsBookmark;
// InternalImage: Use Internal bookmark image 0..9; // InternalImage: Use Internal bookmark image 0..9;
@ -107,6 +108,31 @@ type
property ImageList: TCustomImageList read FImageList write FImageList; property ImageList: TCustomImageList read FImageList write FImageList;
end; 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 }
TSynEditMarkLine = class(TSynSizedDifferentialAVLNode) TSynEditMarkLine = class(TSynSizedDifferentialAVLNode)
@ -349,6 +375,12 @@ begin
Result := FLine; Result := FLine;
end; 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); procedure TSynEditMark.SetMarkLine(const AValue: TSynEditMarkLine);
begin begin
if FMarkLine = AValue then exit; if FMarkLine = AValue then exit;
@ -360,7 +392,7 @@ end;
function TSynEditMark.GetIsBookmark: boolean; function TSynEditMark.GetIsBookmark: boolean;
begin begin
Result := (fBookmarkNum >= 0); Result := False;
end; end;
procedure TSynEditMark.DoChange(AChanges: TSynEditMarkChangeReasons); procedure TSynEditMark.DoChange(AChanges: TSynEditMarkChangeReasons);
@ -460,6 +492,51 @@ begin
DoChange(FChanges); DoChange(FChanges);
end; 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 } { TSynEditMarkLine }
function TSynEditMarkLine.GetMark(Index: Integer): TSynEditMark; function TSynEditMarkLine.GetMark(Index: Integer): TSynEditMark;

View File

@ -196,8 +196,9 @@ type
eoScrollPastEolAddPage, // Allows caret to go into empty space beyond end-of-line position eoScrollPastEolAddPage, // Allows caret to go into empty space beyond end-of-line position
// - Limit to length of longest line + width of one page // - Limit to length of longest line + width of one page
// if eoScrollPastEol also is set, the bigger of the 2 limits is used // 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 // Limit will follow the caret / scrollbar-range extends when caret goes further
eoBookmarkRestoresScroll // Bookmarks also restore scroll pos
); );
TSynEditorOptions2 = set of TSynEditorOption2; TSynEditorOptions2 = set of TSynEditorOption2;

View File

@ -5636,7 +5636,8 @@ begin
SynEditOptName := 'OverwriteBlock'; SynEditOptName := 'OverwriteBlock';
eoAutoHideCursor: eoAutoHideCursor:
SynEditOptName := 'AutoHideCursor'; SynEditOptName := 'AutoHideCursor';
eoCaretMoveEndsSelection, eoPersistentCaretStopBlink, eoNoScrollOnSelectRange: eoCaretMoveEndsSelection, eoPersistentCaretStopBlink, eoNoScrollOnSelectRange,
eoBookmarkRestoresScroll:
WriteStr(SynEditOptName, SynEditOpt2); WriteStr(SynEditOptName, SynEditOpt2);
else else
SynEditOptName := ''; SynEditOptName := '';
@ -5893,7 +5894,8 @@ begin
SynEditOptName := 'OverwriteBlock'; SynEditOptName := 'OverwriteBlock';
eoAutoHideCursor: eoAutoHideCursor:
SynEditOptName := 'AutoHideCursor'; SynEditOptName := 'AutoHideCursor';
eoCaretMoveEndsSelection, eoPersistentCaretStopBlink, eoNoScrollOnSelectRange: eoCaretMoveEndsSelection, eoPersistentCaretStopBlink, eoNoScrollOnSelectRange,
eoBookmarkRestoresScroll:
WriteStr(SynEditOptName, SynEditOpt2); WriteStr(SynEditOptName, SynEditOpt2);
else else
SynEditOptName := ''; SynEditOptName := '';

View File

@ -47,8 +47,8 @@ object EditorGeneralMiscOptionsFrame: TEditorGeneralMiscOptionsFrame
ChildSizing.ControlsPerLine = 1 ChildSizing.ControlsPerLine = 1
ColumnLayout = clVerticalThenHorizontal ColumnLayout = clVerticalThenHorizontal
Columns = 2 Columns = 2
OnItemClick = EditorOptionsGroupBoxItemClick
TabOrder = 0 TabOrder = 0
OnItemClick = EditorOptionsGroupBoxItemClick
end end
object EditorTrimSpaceTypeComboBox: TComboBox object EditorTrimSpaceTypeComboBox: TComboBox
AnchorSideLeft.Control = Owner AnchorSideLeft.Control = Owner

View File

@ -122,9 +122,10 @@ begin
Items.Add(dlgCopyWordAtCursorOnCopyNone); // 3 Items.Add(dlgCopyWordAtCursorOnCopyNone); // 3
Items.Add(dlgCopyPasteKeepFolds); // 4 Items.Add(dlgCopyPasteKeepFolds); // 4
Items.Add(dlgEditExportBackColor); // 5 Items.Add(dlgEditExportBackColor); // 5
Items.Add(dlgBookmarkSetScroll); // 6
{$IFDEF WinIME} // Keep last, or all subsequnt indexes will depend on it {$IFDEF WinIME} // Keep last, or all subsequnt indexes will depend on it
Items.Add(dlgUseMinimumIme); // 6 Items.Add(dlgUseMinimumIme); // 7
{$ENDIF} {$ENDIF}
end; end;
EditorTrimSpaceTypeComboBox.Items.Add(dlgTrimSpaceTypeLeaveLine); EditorTrimSpaceTypeComboBox.Items.Add(dlgTrimSpaceTypeLeaveLine);
@ -160,8 +161,9 @@ begin
Checked[3] := CopyWordAtCursorOnCopyNone; Checked[3] := CopyWordAtCursorOnCopyNone;
Checked[4] := eoFoldedCopyPaste in SynEditOptions2; Checked[4] := eoFoldedCopyPaste in SynEditOptions2;
Checked[5] := ExportHtmlWithBackground; Checked[5] := ExportHtmlWithBackground;
Checked[6] := eoBookmarkRestoresScroll in SynEditOptions2;
{$IFDEF WinIME} {$IFDEF WinIME}
Checked[6] := UseMinimumIme; Checked[7] := UseMinimumIme;
{$ENDIF} {$ENDIF}
with ScrollOnEditLeftOptions do begin with ScrollOnEditLeftOptions do begin
@ -212,8 +214,12 @@ begin
SynEditOptions2 := SynEditOptions2 - [eoFoldedCopyPaste]; SynEditOptions2 := SynEditOptions2 - [eoFoldedCopyPaste];
TrimSpaceType := TSynEditStringTrimmingType(EditorTrimSpaceTypeComboBox.ItemIndex); TrimSpaceType := TSynEditStringTrimmingType(EditorTrimSpaceTypeComboBox.ItemIndex);
ExportHtmlWithBackground := EditorOptionsGroupBox.Checked[5]; ExportHtmlWithBackground := EditorOptionsGroupBox.Checked[5];
if EditorOptionsGroupBox.Checked[6] then
SynEditOptions2 := SynEditOptions2 + [eoBookmarkRestoresScroll]
else
SynEditOptions2 := SynEditOptions2 - [eoBookmarkRestoresScroll];
{$IFDEF WinIME} {$IFDEF WinIME}
UseMinimumIme := EditorOptionsGroupBox.Checked[6]; UseMinimumIme := EditorOptionsGroupBox.Checked[7];
{$ENDIF} {$ENDIF}
with ScrollOnEditLeftOptions do begin with ScrollOnEditLeftOptions do begin

View File

@ -1833,6 +1833,7 @@ resourcestring
dlgCopyPasteKeepFolds = 'Copy/Paste with fold info'; dlgCopyPasteKeepFolds = 'Copy/Paste with fold info';
dlgUseMinimumIme = 'IME handled by System'; dlgUseMinimumIme = 'IME handled by System';
dlgEditExportBackColor = 'Use Background color in HTML export'; dlgEditExportBackColor = 'Use Background color in HTML export';
dlgBookmarkSetScroll = 'Bookmarks restore scroll position';
dlgUndoLimit = 'Undo limit'; dlgUndoLimit = 'Undo limit';
dlgTabWidths = 'Tab widths'; dlgTabWidths = 'Tab widths';
dlgMarginGutter = 'Margin and gutter'; dlgMarginGutter = 'Margin and gutter';

View File

@ -11240,6 +11240,10 @@ var
UnitInfo: TUnitInfo; UnitInfo: TUnitInfo;
begin begin
UnitInfo := Project1.UnitWithEditorComponent(TSourceEditor(Sender)); UnitInfo := Project1.UnitWithEditorComponent(TSourceEditor(Sender));
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); UnitInfo.AddBookmark(Mark.Column, Mark.Line, Mark.BookmarkNumber);
end; end;
@ -11315,7 +11319,7 @@ Begin
SetMark:=false; SetMark:=false;
end; end;
if SetMark then 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} {$push}{$overflowchecks off}
Inc(BookmarksStamp); Inc(BookmarksStamp);

View File

@ -432,6 +432,7 @@ type
procedure ClearUnitComponentDependencies(ClearTypes: TUnitCompDependencyTypes); procedure ClearUnitComponentDependencies(ClearTypes: TUnitCompDependencyTypes);
// Bookmarks // Bookmarks
function AddBookmark(X, Y, ID: integer):integer; function AddBookmark(X, Y, ID: integer):integer;
function AddBookmark(X, Y, ALeft, ATop, ID: integer):integer;
procedure DeleteBookmark(ID: integer); procedure DeleteBookmark(ID: integer);
// EditorInfo // EditorInfo
// At any time, any UnitInfo has at least one EditorInfo // At any time, any UnitInfo has at least one EditorInfo
@ -1112,6 +1113,7 @@ type
// bookmarks // bookmarks
function AddBookmark(X, Y, ID: Integer; AUnitInfo:TUnitInfo):integer; function AddBookmark(X, Y, ID: Integer; AUnitInfo:TUnitInfo):integer;
function AddBookmark(X, Y, ALeft, ATop, ID: Integer; AUnitInfo:TUnitInfo):integer;
procedure DeleteBookmark(ID: Integer); procedure DeleteBookmark(ID: Integer);
public public
property ActiveBuildMode: TProjectBuildMode read FActiveBuildMode property ActiveBuildMode: TProjectBuildMode read FActiveBuildMode
@ -1837,7 +1839,7 @@ procedure TUnitInfo.SaveToXMLConfig(XMLConfig: TXMLConfig; const Path: string;
SaveData, SaveSession: boolean; UsePathDelim: TPathDelimSwitch); SaveData, SaveSession: boolean; UsePathDelim: TPathDelimSwitch);
var var
AFilename: String; AFilename: String;
i, X, Y: Integer; i, X, Y, L, T: Integer;
s: String; s: String;
BM: TFileBookmark; BM: TFileBookmark;
begin begin
@ -1894,8 +1896,11 @@ begin
then then
Bookmarks.Delete(i) Bookmarks.Delete(i)
else 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.CursorPos := Point(X, Y);
BM.Top := T;
BM.Left := L;
end;
end; end;
FBookmarks.SaveToXMLConfig(XMLConfig,Path+'Bookmarks/'); FBookmarks.SaveToXMLConfig(XMLConfig,Path+'Bookmarks/');
XMLConfig.SetDeleteValue(Path+'Loaded/Value',Loaded,false); XMLConfig.SetDeleteValue(Path+'Loaded/Value',Loaded,false);
@ -2091,7 +2096,7 @@ begin
BM := Bookmarks[i]; BM := Bookmarks[i];
j := Project1.Bookmarks.IndexOfID(BM.ID); j := Project1.Bookmarks.IndexOfID(BM.ID);
if (j < 0) then 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; end;
finally finally
dec(FSetBookmarLock); dec(FSetBookmarLock);
@ -2435,6 +2440,16 @@ begin
Project1.AddBookmark(X, Y, ID, Self); Project1.AddBookmark(X, Y, ID, Self);
end; 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); procedure TUnitInfo.DeleteBookmark(ID: integer);
var var
i: Integer; i: Integer;
@ -5542,6 +5557,12 @@ begin
SessionModified := true; SessionModified := true;
end; 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); procedure TProject.DeleteBookmark(ID: Integer);
var var
i: Integer; i: Integer;

View File

@ -132,22 +132,32 @@ var
type type
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
// bookmarks of a single file // bookmarks of a single file
{ TFileBookmark }
TFileBookmark = class TFileBookmark = class
private private
fCursorPos: TPoint; fCursorPos: TPoint;
fID: integer; fID: integer;
FLeft: integer;
FTop: integer;
public public
constructor Create; constructor Create;
constructor Create(NewX,NewY,AnID: integer); constructor Create(NewX,NewY,AnID: integer);
constructor Create(NewX,NewY,NewLeft,NewTop,AnID: integer);
procedure SaveToXMLConfig(XMLConfig: TXMLConfig; const Path: string); procedure SaveToXMLConfig(XMLConfig: TXMLConfig; const Path: string);
procedure LoadFromXMLConfig(XMLConfig: TXMLConfig; const Path: string); procedure LoadFromXMLConfig(XMLConfig: TXMLConfig; const Path: string);
function X: integer; function X: integer;
function Y: integer; function Y: integer;
property Top: integer read FTop write FTop;
property Left: integer read FLeft write FLeft;
public public
property CursorPos: TPoint read fCursorPos write fCursorPos; property CursorPos: TPoint read fCursorPos write fCursorPos;
property ID: integer read fID write fID; property ID: integer read fID write fID;
end; end;
{ TFileBookmarks }
TFileBookmarks = class TFileBookmarks = class
private private
FBookmarks:TList; // list of TFileBookmark FBookmarks:TList; // list of TFileBookmark
@ -163,6 +173,7 @@ type
procedure Clear; procedure Clear;
function Add(ABookmark: TFileBookmark):integer; function Add(ABookmark: TFileBookmark):integer;
function Add(X,Y,ID: integer):integer; function Add(X,Y,ID: integer):integer;
function Add(X,Y,ALeft,ATop,ID: integer):integer;
function IndexOfID(ID:integer):integer; function IndexOfID(ID:integer):integer;
procedure SaveToXMLConfig(XMLConfig: TXMLConfig; const Path: string); procedure SaveToXMLConfig(XMLConfig: TXMLConfig; const Path: string);
procedure LoadFromXMLConfig(XMLConfig: TXMLConfig; const Path: string); procedure LoadFromXMLConfig(XMLConfig: TXMLConfig; const Path: string);
@ -176,11 +187,16 @@ type
TProjectBookmark = class TProjectBookmark = class
private private
fCursorPos: TPoint; fCursorPos: TPoint;
FLeft: integer;
FTop: integer;
FUnitInfo: TObject; FUnitInfo: TObject;
fID: integer; fID: integer;
public public
constructor Create(X,Y, AnID: integer; AUnitInfo:TObject); 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 CursorPos: TPoint read fCursorPos write fCursorPos;
property Top: integer read FTop;
property Left: integer read FLeft;
property UnitInfo: TObject read FUnitInfo write FUnitInfo; property UnitInfo: TObject read FUnitInfo write FUnitInfo;
property ID:integer read fID write fID; property ID:integer read fID write fID;
end; end;
@ -202,6 +218,7 @@ type
procedure Clear; procedure Clear;
function Add(ABookmark: TProjectBookmark):integer; function Add(ABookmark: TProjectBookmark):integer;
function Add(X, Y, ID: integer; AUnitInfo: TObject):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); procedure DeleteAllWithUnitInfo(AUnitInfo:TObject);
function IndexOfID(ID:integer):integer; function IndexOfID(ID:integer):integer;
function BookmarkWithID(ID: integer): TProjectBookmark; function BookmarkWithID(ID: integer): TProjectBookmark;
@ -300,10 +317,19 @@ begin
inherited Create; inherited Create;
fCursorPos.X := X; fCursorPos.X := X;
fCursorPos.Y := Y; fCursorPos.Y := Y;
FLeft := -1;
FTop := -1;
FUnitInfo := AUnitInfo; FUnitInfo := AUnitInfo;
fID := AnID; fID := AnID;
end; end;
constructor TProjectBookmark.Create(X, Y, ALeft, ATop, AnID: integer; AUnitInfo: TObject);
begin
Create(X, Y, AnID, AUnitInfo);
FLeft := ALeft;
FTop := ATop;
end;
{ TProjectBookmarkList } { TProjectBookmarkList }
constructor TProjectBookmarkList.Create; constructor TProjectBookmarkList.Create;
@ -401,6 +427,11 @@ begin
Result:=Add(TProjectBookmark.Create(X, Y, ID, AUnitInfo)); Result:=Add(TProjectBookmark.Create(X, Y, ID, AUnitInfo));
end; 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 } { TProjectJumpHistoryPosition }
constructor TProjectJumpHistoryPosition.Create(const AFilename: string; constructor TProjectJumpHistoryPosition.Create(const AFilename: string;
@ -764,14 +795,25 @@ constructor TFileBookmark.Create(NewX, NewY, AnID: integer);
begin begin
fCursorPos.X:=NewX; fCursorPos.X:=NewX;
fCursorPos.Y:=NewY; fCursorPos.Y:=NewY;
FLeft := -1;
FTop := -1;
fID:=AnID; fID:=AnID;
end; 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; procedure TFileBookmark.SaveToXMLConfig(XMLConfig: TXMLConfig;
const Path: string); const Path: string);
begin begin
XMLConfig.SetDeleteValue(Path+'X',fCursorPos.X,1); XMLConfig.SetDeleteValue(Path+'X',fCursorPos.X,1);
XMLConfig.SetDeleteValue(Path+'Y',fCursorPos.Y,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); XMLConfig.SetDeleteValue(Path+'ID',fID,0);
end; end;
@ -780,6 +822,8 @@ procedure TFileBookmark.LoadFromXMLConfig(XMLConfig: TXMLConfig;
begin begin
fCursorPos.X:=XMLConfig.GetValue(Path+'X',1); fCursorPos.X:=XMLConfig.GetValue(Path+'X',1);
fCursorPos.Y:=XMLConfig.GetValue(Path+'Y',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); fID:=XMLConfig.GetValue(Path+'ID',0);
end; end;
@ -851,6 +895,11 @@ begin
Result:=Add(TFileBookmark.Create(X,Y,ID)); Result:=Add(TFileBookmark.Create(X,Y,ID));
end; 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; function TFileBookmarks.IndexOfID(ID: integer): integer;
begin begin
Result:=Count-1; Result:=Count-1;

View File

@ -460,7 +460,8 @@ type
procedure CopyToClipboard; override; procedure CopyToClipboard; override;
procedure CutToClipboard; override; procedure CutToClipboard; override;
function GetBookMark(BookMark: Integer; out X, Y: Integer): Boolean; 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); procedure ExportAsHtml(AFileName: String);
@ -4947,9 +4948,17 @@ begin
Result := FEditor.GetBookMark(BookMark, X, Y); Result := FEditor.GetBookMark(BookMark, X, Y);
end; end;
procedure TSourceEditor.SetBookMark(BookMark: Integer; X, Y: Integer); function TSourceEditor.GetBookMark(BookMark: Integer; out X, Y, ALeft, ATop: Integer): Boolean;
begin 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; end;
procedure TSourceEditor.ExportAsHtml(AFileName: String); procedure TSourceEditor.ExportAsHtml(AFileName: String);