mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-08-14 17:19:19 +02:00
IDE, SynEdit: add option to have bookmarks restore the scroll pos. Issue #40912
This commit is contained in:
parent
4696c84166
commit
77c4b7ceae
@ -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;
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
@ -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 := '';
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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';
|
||||||
|
@ -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);
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
|
@ -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);
|
||||||
|
Loading…
Reference in New Issue
Block a user