mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-08-14 06:39:12 +02:00
IDE: messages: update on source editor changes
git-svn-id: trunk@45255 -
This commit is contained in:
parent
61bddd2b7a
commit
ed073ee911
@ -27,6 +27,8 @@ unit etMessageFrame;
|
|||||||
|
|
||||||
{$mode objfpc}{$H+}
|
{$mode objfpc}{$H+}
|
||||||
|
|
||||||
|
{$IFNDEF EnableNewExtTools}{$Error Wrong}{$ENDIF}
|
||||||
|
|
||||||
{$I ide.inc}
|
{$I ide.inc}
|
||||||
|
|
||||||
interface
|
interface
|
||||||
@ -142,7 +144,7 @@ type
|
|||||||
function HasContent: boolean;
|
function HasContent: boolean;
|
||||||
function GetShownLineCount(WithHeader, WithProgressLine: boolean): integer;
|
function GetShownLineCount(WithHeader, WithProgressLine: boolean): integer;
|
||||||
procedure RebuildLines; // (main thread)
|
procedure RebuildLines; // (main thread)
|
||||||
function ApplySrcChanges(Changes: TETSrcChanges): boolean; // true if something changed
|
function ApplySrcChanges(Changes: TETSingleSrcChanges): boolean; // true if something changed
|
||||||
property ToolState: TLMVToolState read FToolState write SetToolState;
|
property ToolState: TLMVToolState read FToolState write SetToolState;
|
||||||
public
|
public
|
||||||
// requires Enter/LeaveCriticalSection, write only via main thread
|
// requires Enter/LeaveCriticalSection, write only via main thread
|
||||||
@ -350,7 +352,7 @@ type
|
|||||||
// file
|
// file
|
||||||
function OpenSelection: boolean;
|
function OpenSelection: boolean;
|
||||||
procedure CreateMarksForFile(aSynEdit: TSynEdit; aFilename: string; DeleteOld: boolean);
|
procedure CreateMarksForFile(aSynEdit: TSynEdit; aFilename: string; DeleteOld: boolean);
|
||||||
function ApplySrcChanges(Changes: TETSrcChanges): boolean; // true if something changed
|
function ApplySrcChanges(Changes: TETSingleSrcChanges): boolean; // true if something changed
|
||||||
public
|
public
|
||||||
// properties
|
// properties
|
||||||
property AutoHeaderBackground: TColor read FAutoHeaderBackground write SetAutoHeaderBackground default MsgWndDefAutoHeaderBackground;
|
property AutoHeaderBackground: TColor read FAutoHeaderBackground write SetAutoHeaderBackground default MsgWndDefAutoHeaderBackground;
|
||||||
@ -409,6 +411,7 @@ type
|
|||||||
procedure SearchNextSpeedButtonClick(Sender: TObject);
|
procedure SearchNextSpeedButtonClick(Sender: TObject);
|
||||||
procedure SearchPrevSpeedButtonClick(Sender: TObject);
|
procedure SearchPrevSpeedButtonClick(Sender: TObject);
|
||||||
procedure ShowIDMenuItemClick(Sender: TObject);
|
procedure ShowIDMenuItemClick(Sender: TObject);
|
||||||
|
procedure SrcEditLinesChanged(Sender: TObject);
|
||||||
procedure TranslateMenuItemClick(Sender: TObject);
|
procedure TranslateMenuItemClick(Sender: TObject);
|
||||||
procedure UnhideMsgTypeClick(Sender: TObject);
|
procedure UnhideMsgTypeClick(Sender: TObject);
|
||||||
private
|
private
|
||||||
@ -440,7 +443,8 @@ type
|
|||||||
// source marks
|
// source marks
|
||||||
procedure CreateMarksForFile(aSynEdit: TSynEdit; aFilename: string;
|
procedure CreateMarksForFile(aSynEdit: TSynEdit; aFilename: string;
|
||||||
DeleteOld: boolean);
|
DeleteOld: boolean);
|
||||||
procedure ApplySrcChanges(Changes: TETSrcChanges);
|
procedure ApplySrcChanges(Changes: TETSingleSrcChanges);
|
||||||
|
procedure ApplyMultiSrcChanges(Changes: TETMultiSrcChanges);
|
||||||
|
|
||||||
// message lines
|
// message lines
|
||||||
procedure SelectMsgLine(Msg: TMessageLine; DoScroll: boolean);
|
procedure SelectMsgLine(Msg: TMessageLine; DoScroll: boolean);
|
||||||
@ -1097,7 +1101,7 @@ begin
|
|||||||
inherited Create(AOwner);
|
inherited Create(AOwner);
|
||||||
Lines.OnMarksFixed:=@OnMarksFixed;
|
Lines.OnMarksFixed:=@OnMarksFixed;
|
||||||
FFilter:=TLMsgViewFilter.Create;
|
FFilter:=TLMsgViewFilter.Create;
|
||||||
fPendingChanges:=TETMultiSrcChanges.Create;
|
fPendingChanges:=TETMultiSrcChanges.Create(nil);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
destructor TLMsgWndView.Destroy;
|
destructor TLMsgWndView.Destroy;
|
||||||
@ -1189,9 +1193,9 @@ begin
|
|||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function TLMsgWndView.ApplySrcChanges(Changes: TETSrcChanges): boolean;
|
function TLMsgWndView.ApplySrcChanges(Changes: TETSingleSrcChanges): boolean;
|
||||||
|
|
||||||
function ApplyChanges(CurChanges: TETSrcChanges;
|
function ApplyChanges(CurChanges: TETSingleSrcChanges;
|
||||||
CurLines: TMessageLines): boolean;
|
CurLines: TMessageLines): boolean;
|
||||||
var
|
var
|
||||||
FromY: integer;
|
FromY: integer;
|
||||||
@ -1238,7 +1242,7 @@ function TLMsgWndView.ApplySrcChanges(Changes: TETSrcChanges): boolean;
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
var
|
var
|
||||||
Queue: TETSrcChanges;
|
Queue: TETSingleSrcChanges;
|
||||||
Change: TETSrcChange;
|
Change: TETSrcChange;
|
||||||
Node: TAvgLvlTreeNode;
|
Node: TAvgLvlTreeNode;
|
||||||
aFilename: String;
|
aFilename: String;
|
||||||
@ -1269,7 +1273,7 @@ begin
|
|||||||
// apply all pending changes to Tool.WorkerMessages
|
// apply all pending changes to Tool.WorkerMessages
|
||||||
Node:=PendingChanges.AllChanges.FindLowest;
|
Node:=PendingChanges.AllChanges.FindLowest;
|
||||||
while Node<>nil do begin
|
while Node<>nil do begin
|
||||||
ApplyChanges(TETSrcChanges(Node.Data),Tool.WorkerMessages);
|
ApplyChanges(TETSingleSrcChanges(Node.Data),Tool.WorkerMessages);
|
||||||
Node:=Node.Successor;
|
Node:=Node.Successor;
|
||||||
end;
|
end;
|
||||||
PendingChanges.Clear;
|
PendingChanges.Clear;
|
||||||
@ -2951,11 +2955,12 @@ begin
|
|||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function TMessagesCtrl.ApplySrcChanges(Changes: TETSrcChanges): boolean;
|
function TMessagesCtrl.ApplySrcChanges(Changes: TETSingleSrcChanges): boolean;
|
||||||
var
|
var
|
||||||
i: Integer;
|
i: Integer;
|
||||||
begin
|
begin
|
||||||
Result:=false;
|
Result:=false;
|
||||||
|
//debugln(['TMessagesCtrl.ApplySrcChanges ViewCount=',ViewCount]);
|
||||||
for i:=0 to ViewCount-1 do
|
for i:=0 to ViewCount-1 do
|
||||||
if Views[i].ApplySrcChanges(Changes) then
|
if Views[i].ApplySrcChanges(Changes) then
|
||||||
Result:=true;
|
Result:=true;
|
||||||
@ -3260,6 +3265,13 @@ begin
|
|||||||
MessagesCtrl.Options:=MessagesCtrl.Options+[mcoShowMessageID];
|
MessagesCtrl.Options:=MessagesCtrl.Options+[mcoShowMessageID];
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure TMessagesFrame.SrcEditLinesChanged(Sender: TObject);
|
||||||
|
begin
|
||||||
|
debugln(['TMessagesFrame.SrcEditLinesChanged ',DbgSName(Sender)]);
|
||||||
|
if Sender is TETSynPlugin then
|
||||||
|
ApplySrcChanges(TETSynPlugin(Sender).Changes);
|
||||||
|
end;
|
||||||
|
|
||||||
procedure TMessagesFrame.TranslateMenuItemClick(Sender: TObject);
|
procedure TMessagesFrame.TranslateMenuItemClick(Sender: TObject);
|
||||||
begin
|
begin
|
||||||
if mcoShowTranslated in MessagesCtrl.Options then
|
if mcoShowTranslated in MessagesCtrl.Options then
|
||||||
@ -3653,6 +3665,7 @@ begin
|
|||||||
Images:=IDEImages.Images_12;
|
Images:=IDEImages.Images_12;
|
||||||
PopupMenu:=MsgCtrlPopupMenu;
|
PopupMenu:=MsgCtrlPopupMenu;
|
||||||
end;
|
end;
|
||||||
|
MessagesCtrl.SourceMarks:=ExtToolsMarks;
|
||||||
|
|
||||||
// search
|
// search
|
||||||
SearchPanel.Visible:=false; // by default the search is hidden
|
SearchPanel.Visible:=false; // by default the search is hidden
|
||||||
@ -3714,11 +3727,19 @@ begin
|
|||||||
MessagesCtrl.CreateMarksForFile(aSynEdit,aFilename,DeleteOld);
|
MessagesCtrl.CreateMarksForFile(aSynEdit,aFilename,DeleteOld);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TMessagesFrame.ApplySrcChanges(Changes: TETSrcChanges);
|
procedure TMessagesFrame.ApplySrcChanges(Changes: TETSingleSrcChanges);
|
||||||
begin
|
begin
|
||||||
MessagesCtrl.ApplySrcChanges(Changes);
|
MessagesCtrl.ApplySrcChanges(Changes);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure TMessagesFrame.ApplyMultiSrcChanges(Changes: TETMultiSrcChanges);
|
||||||
|
var
|
||||||
|
Node: TAvgLvlTreeNode;
|
||||||
|
begin
|
||||||
|
for Node in Changes.PendingChanges do
|
||||||
|
ApplySrcChanges(TETSingleSrcChanges(Node.Data));
|
||||||
|
end;
|
||||||
|
|
||||||
procedure TMessagesFrame.SelectMsgLine(Msg: TMessageLine; DoScroll: boolean);
|
procedure TMessagesFrame.SelectMsgLine(Msg: TMessageLine; DoScroll: boolean);
|
||||||
begin
|
begin
|
||||||
MessagesCtrl.Select(Msg,DoScroll);
|
MessagesCtrl.Select(Msg,DoScroll);
|
||||||
|
@ -27,6 +27,8 @@ unit etMessagesWnd;
|
|||||||
|
|
||||||
{$mode objfpc}{$H+}
|
{$mode objfpc}{$H+}
|
||||||
|
|
||||||
|
{$IFNDEF EnableNewExtTools}{$Error Wrong}{$ENDIF}
|
||||||
|
|
||||||
interface
|
interface
|
||||||
|
|
||||||
uses
|
uses
|
||||||
@ -51,7 +53,6 @@ type
|
|||||||
protected
|
protected
|
||||||
function GetViews(Index: integer): TExtToolView; override;
|
function GetViews(Index: integer): TExtToolView; override;
|
||||||
public
|
public
|
||||||
SourceMarks: TETMarks;
|
|
||||||
procedure ClearCustomMessages(const ViewCaption: string='');
|
procedure ClearCustomMessages(const ViewCaption: string='');
|
||||||
function AddCustomMessage(TheUrgency: TMessageLineUrgency; Msg: string;
|
function AddCustomMessage(TheUrgency: TMessageLineUrgency; Msg: string;
|
||||||
aSrcFilename: string=''; LineNumber: integer=0; Column: integer=0;
|
aSrcFilename: string=''; LineNumber: integer=0; Column: integer=0;
|
||||||
@ -85,42 +86,10 @@ implementation
|
|||||||
{ TMessagesView }
|
{ TMessagesView }
|
||||||
|
|
||||||
procedure TMessagesView.FormCreate(Sender: TObject);
|
procedure TMessagesView.FormCreate(Sender: TObject);
|
||||||
var
|
|
||||||
ImgIDInfo: Integer;
|
|
||||||
ImgIDHint: Integer;
|
|
||||||
ImgIDNote: Integer;
|
|
||||||
ImgIDWarning: Integer;
|
|
||||||
ImgIDError: Integer;
|
|
||||||
ImgIDFatal: Integer;
|
|
||||||
begin
|
begin
|
||||||
IDEMessagesWindow:=Self;
|
IDEMessagesWindow:=Self;
|
||||||
Caption:='Messages';
|
Caption:='Messages';
|
||||||
|
|
||||||
SourceMarks:=TETMarks.Create(Self);
|
|
||||||
ImgIDInfo:=IDEImages.LoadImage(12, 'state12x12_information');
|
|
||||||
ImgIDHint:=IDEImages.LoadImage(12, 'state12x12_hint');
|
|
||||||
ImgIDNote:=IDEImages.LoadImage(12, 'state12x12_note');
|
|
||||||
ImgIDWarning:=IDEImages.LoadImage(12, 'state12x12_warning');
|
|
||||||
ImgIDError:=IDEImages.LoadImage(12, 'state12x12_error');
|
|
||||||
ImgIDFatal:=IDEImages.LoadImage(12, 'state12x12_fatal');
|
|
||||||
with SourceMarks do begin
|
|
||||||
ImageList:=IDEImages.Images_12;
|
|
||||||
//OnGetSynEditOfFile:=@SourceMarksGetSynEditOfFile;
|
|
||||||
MarkStyles[mluNone].ImageIndex:=-1;
|
|
||||||
MarkStyles[mluProgress].ImageIndex:=-1;
|
|
||||||
MarkStyles[mluDebug].ImageIndex:= ImgIDInfo;
|
|
||||||
MarkStyles[mluVerbose3].ImageIndex:=ImgIDInfo;
|
|
||||||
MarkStyles[mluVerbose2].ImageIndex:=ImgIDInfo;
|
|
||||||
MarkStyles[mluVerbose].ImageIndex:=ImgIDInfo;
|
|
||||||
MarkStyles[mluHint].ImageIndex:=ImgIDHint;
|
|
||||||
MarkStyles[mluNote].ImageIndex:=ImgIDNote;
|
|
||||||
MarkStyles[mluWarning].ImageIndex:=ImgIDWarning;
|
|
||||||
MarkStyles[mluImportant].ImageIndex:=-1;
|
|
||||||
MarkStyles[mluError].ImageIndex:=ImgIDError;
|
|
||||||
MarkStyles[mluFatal].ImageIndex:=ImgIDFatal;
|
|
||||||
MarkStyles[mluPanic].ImageIndex:=ImgIDFatal;
|
|
||||||
end;
|
|
||||||
MessagesFrame1.MessagesCtrl.SourceMarks:=SourceMarks;
|
|
||||||
MessagesFrame1.MessagesCtrl.OnOpenMessage:=@OnOpenMessage;
|
MessagesFrame1.MessagesCtrl.OnOpenMessage:=@OnOpenMessage;
|
||||||
|
|
||||||
ActiveControl:=MessagesFrame1.MessagesCtrl;
|
ActiveControl:=MessagesFrame1.MessagesCtrl;
|
||||||
|
@ -45,6 +45,8 @@ unit etQuickFixes;
|
|||||||
|
|
||||||
{$mode objfpc}{$H+}
|
{$mode objfpc}{$H+}
|
||||||
|
|
||||||
|
{$IFNDEF EnableNewExtTools}{$Error Wrong}{$ENDIF}
|
||||||
|
|
||||||
interface
|
interface
|
||||||
|
|
||||||
uses
|
uses
|
||||||
|
@ -27,6 +27,10 @@ unit etSrcEditMarks;
|
|||||||
|
|
||||||
{$mode objfpc}{$H+}
|
{$mode objfpc}{$H+}
|
||||||
|
|
||||||
|
{$IFNDEF EnableNewExtTools}{$Error Wrong}{$ENDIF}
|
||||||
|
|
||||||
|
{$DEFINE VerboseETSrcChange}
|
||||||
|
|
||||||
interface
|
interface
|
||||||
|
|
||||||
uses
|
uses
|
||||||
@ -102,14 +106,10 @@ type
|
|||||||
property Priority: integer read FPriority write FPriority;
|
property Priority: integer read FPriority write FPriority;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{ TExtToolSynGutterMarkProvider }
|
var
|
||||||
|
ExtToolsMarks: TETMarks = nil;
|
||||||
TExtToolSynGutterMarkProvider = class(TSynGutterLOvProviderBookmarks)
|
|
||||||
protected
|
|
||||||
procedure AdjustColorForMark(AMark: TSynEditMark; var AColor: TColor;
|
|
||||||
var APriority: Integer); override;
|
|
||||||
end;
|
|
||||||
|
|
||||||
|
type
|
||||||
TETSrcChangeAction = (
|
TETSrcChangeAction = (
|
||||||
etscaInsert,
|
etscaInsert,
|
||||||
etscaDelete
|
etscaDelete
|
||||||
@ -128,20 +128,29 @@ type
|
|||||||
function AsString: string;
|
function AsString: string;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{ TETSrcChanges - edits of single file}
|
TETMultiSrcChanges = class;
|
||||||
|
|
||||||
TETSrcChanges = class
|
{ TETSingleSrcChanges - edits of single file}
|
||||||
|
|
||||||
|
TETSingleSrcChanges = class
|
||||||
private
|
private
|
||||||
FFilename: string;
|
FFilename: string;
|
||||||
FFirst: TETSrcChange;
|
FFirst: TETSrcChange;
|
||||||
FLast: TETSrcChange;
|
FLast: TETSrcChange;
|
||||||
|
fInPendingTree: boolean;
|
||||||
|
FMultiSrcChanges: TETMultiSrcChanges;
|
||||||
procedure Append(Change: TETSrcChange);
|
procedure Append(Change: TETSrcChange);
|
||||||
procedure Remove(Change: TETSrcChange);
|
procedure Remove(Change: TETSrcChange);
|
||||||
procedure SetFilename(AValue: string);
|
procedure SetFilename(AValue: string);
|
||||||
|
procedure SetMultiSrcChanges(AValue: TETMultiSrcChanges);
|
||||||
|
procedure SetInPendingTree(AValue: boolean);
|
||||||
|
protected
|
||||||
|
property InPendingTree: boolean read FInPendingTree write SetInPendingTree;
|
||||||
public
|
public
|
||||||
constructor Create;
|
constructor Create;
|
||||||
destructor Destroy; override;
|
destructor Destroy; override;
|
||||||
procedure Clear;
|
procedure Clear;
|
||||||
|
property MultiSrcChanges: TETMultiSrcChanges read FMultiSrcChanges write SetMultiSrcChanges;
|
||||||
property First: TETSrcChange read FFirst;
|
property First: TETSrcChange read FFirst;
|
||||||
property Last: TETSrcChange read FLast;
|
property Last: TETSrcChange read FLast;
|
||||||
property Filename: string read FFilename write SetFilename;
|
property Filename: string read FFilename write SetFilename;
|
||||||
@ -157,39 +166,50 @@ type
|
|||||||
|
|
||||||
{ TETMultiSrcChanges - edits of all files }
|
{ TETMultiSrcChanges - edits of all files }
|
||||||
|
|
||||||
TETMultiSrcChanges = class
|
TETMultiSrcChanges = class(TComponent)
|
||||||
private
|
private
|
||||||
fAllChanges: TAvgLvlTree; // tree of TETSrcChanges sorted for Filename
|
fAllChanges: TAvgLvlTree; // tree of TETSingleSrcChanges sorted for Filename
|
||||||
public
|
FAutoSync: boolean;
|
||||||
constructor Create;
|
fPendingChanges: TAvgLvlTree; // tree of TETSingleSrcChanges sorted for Filename
|
||||||
destructor Destroy; override;
|
FOnSync: TNotifyEvent;
|
||||||
function Count: integer; inline;
|
|
||||||
procedure Clear;
|
|
||||||
function GetChanges(const aFilename: string; CreateIfNotExists: boolean): TETSrcChanges;
|
|
||||||
function AdaptCaret(const aFilename: string; var Line,Col: integer;
|
|
||||||
LeftBound: boolean // true = position is bound to character on the left
|
|
||||||
): boolean;
|
|
||||||
property AllChanges: TAvgLvlTree read fAllChanges; // tree of TETSrcChanges sorted for Filename
|
|
||||||
end;
|
|
||||||
|
|
||||||
{ TETSynPlugin - create one per file, not one per synedit }
|
|
||||||
|
|
||||||
TETSynPlugin = class(TLazSynEditPlugin)
|
|
||||||
private
|
|
||||||
FChanges: TETSrcChanges;
|
|
||||||
FOnChanged: TNotifyEvent;
|
|
||||||
FSyncQueued: boolean;
|
FSyncQueued: boolean;
|
||||||
procedure SetSyncQueued(AValue: boolean);
|
procedure SetSyncQueued(AValue: boolean);
|
||||||
protected
|
protected
|
||||||
procedure DoSync({%H-}Data: PtrInt); // called by Application.QueueAsyncCall
|
procedure DoSync({%H-}Data: PtrInt); // called by Application.QueueAsyncCall
|
||||||
|
public
|
||||||
|
constructor Create(AOwner: TComponent); override;
|
||||||
|
destructor Destroy; override;
|
||||||
|
function Count: integer; inline;
|
||||||
|
procedure Clear;
|
||||||
|
function GetChanges(const aFilename: string; CreateIfNotExists: boolean): TETSingleSrcChanges;
|
||||||
|
function AdaptCaret(const aFilename: string; var Line,Col: integer;
|
||||||
|
LeftBound: boolean // true = position is bound to character on the left
|
||||||
|
): boolean;
|
||||||
|
property AllChanges: TAvgLvlTree read fAllChanges; // tree of TETSingleSrcChanges sorted for Filename
|
||||||
|
property PendingChanges: TAvgLvlTree read fPendingChanges; // tree of TETSingleSrcChanges sorted for Filename
|
||||||
|
property SyncQueued: boolean read FSyncQueued write SetSyncQueued;
|
||||||
|
property OnSync: TNotifyEvent read FOnSync write FOnSync; // called by Application.QueueAsyncCall
|
||||||
|
property AutoSync: boolean read FAutoSync write FAutoSync; // true = call OnSync via Application.QueueAsyncCall
|
||||||
|
end;
|
||||||
|
|
||||||
|
{ TETSynPlugin - create one per file, not one per synedit }
|
||||||
|
|
||||||
|
TIsEnabledEvent = function(Sender: TObject): boolean of object;
|
||||||
|
|
||||||
|
TETSynPlugin = class(TLazSynEditPlugin)
|
||||||
|
private
|
||||||
|
FChanges: TETSingleSrcChanges;
|
||||||
|
FEnabled: boolean;
|
||||||
|
FOnIsEnabled: TIsEnabledEvent;
|
||||||
|
protected
|
||||||
procedure OnLineEdit(Sender: TSynEditStrings; aLinePos, aBytePos, aCount,
|
procedure OnLineEdit(Sender: TSynEditStrings; aLinePos, aBytePos, aCount,
|
||||||
aLineBrkCnt: Integer; {%H-}aText: String);
|
aLineBrkCnt: Integer; {%H-}aText: String);
|
||||||
public
|
public
|
||||||
constructor Create(AOwner: TComponent); override;
|
constructor Create(AOwner: TComponent); override;
|
||||||
destructor Destroy; override;
|
destructor Destroy; override;
|
||||||
property Changes: TETSrcChanges read FChanges;
|
property Changes: TETSingleSrcChanges read FChanges write FChanges;
|
||||||
property SyncQueued: boolean read FSyncQueued write SetSyncQueued;
|
property Enabled: boolean read FEnabled write FEnabled;
|
||||||
property OnChanged: TNotifyEvent read FOnChanged write FOnChanged; // called by Application.QueueAsyncCall
|
property OnIsEnabled: TIsEnabledEvent read FOnIsEnabled write FOnIsEnabled;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function IsCaretInFront(Line1, Col1, Line2, Col2: integer): boolean; inline; overload;
|
function IsCaretInFront(Line1, Col1, Line2, Col2: integer): boolean; inline; overload;
|
||||||
@ -332,8 +352,8 @@ end;
|
|||||||
|
|
||||||
function CompareETSrcChangesFilenames(Changes1, Changes2: Pointer): integer;
|
function CompareETSrcChangesFilenames(Changes1, Changes2: Pointer): integer;
|
||||||
var
|
var
|
||||||
SrcChanges1: TETSrcChanges absolute Changes1;
|
SrcChanges1: TETSingleSrcChanges absolute Changes1;
|
||||||
SrcChanges2: TETSrcChanges absolute Changes2;
|
SrcChanges2: TETSingleSrcChanges absolute Changes2;
|
||||||
begin
|
begin
|
||||||
Result:=CompareFilenames(SrcChanges1.Filename,SrcChanges2.Filename);
|
Result:=CompareFilenames(SrcChanges1.Filename,SrcChanges2.Filename);
|
||||||
end;
|
end;
|
||||||
@ -341,7 +361,7 @@ end;
|
|||||||
function CompareFilenameAndETSrcChanges(aFilenameStr, Changes: Pointer
|
function CompareFilenameAndETSrcChanges(aFilenameStr, Changes: Pointer
|
||||||
): integer;
|
): integer;
|
||||||
var
|
var
|
||||||
SrcChanges: TETSrcChanges absolute Changes;
|
SrcChanges: TETSingleSrcChanges absolute Changes;
|
||||||
begin
|
begin
|
||||||
Result:=CompareFilenames(AnsiString(aFilenameStr),SrcChanges.Filename);
|
Result:=CompareFilenames(AnsiString(aFilenameStr),SrcChanges.Filename);
|
||||||
end;
|
end;
|
||||||
@ -408,7 +428,7 @@ end;
|
|||||||
|
|
||||||
procedure Test_MergeTETSrcChanges;
|
procedure Test_MergeTETSrcChanges;
|
||||||
var
|
var
|
||||||
Changes: TETSrcChanges;
|
Changes: TETSingleSrcChanges;
|
||||||
|
|
||||||
procedure Check(Title: string; aChanges: array of TETSrcChange);
|
procedure Check(Title: string; aChanges: array of TETSrcChange);
|
||||||
|
|
||||||
@ -448,7 +468,7 @@ var
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
begin
|
begin
|
||||||
Changes:=TETSrcChanges.Create;
|
Changes:=TETSingleSrcChanges.Create;
|
||||||
try
|
try
|
||||||
Changes.ConsistencyCheck;
|
Changes.ConsistencyCheck;
|
||||||
|
|
||||||
@ -542,41 +562,81 @@ end;
|
|||||||
|
|
||||||
{ TETMultiSrcChanges }
|
{ TETMultiSrcChanges }
|
||||||
|
|
||||||
constructor TETMultiSrcChanges.Create;
|
|
||||||
begin
|
|
||||||
fAllChanges:=TAvgLvlTree.Create(@CompareETSrcChangesFilenames);
|
|
||||||
end;
|
|
||||||
|
|
||||||
destructor TETMultiSrcChanges.Destroy;
|
|
||||||
begin
|
|
||||||
Clear;
|
|
||||||
FreeAndNil(fAllChanges);
|
|
||||||
inherited Destroy;
|
|
||||||
end;
|
|
||||||
|
|
||||||
// inline
|
// inline
|
||||||
function TETMultiSrcChanges.Count: integer;
|
function TETMultiSrcChanges.Count: integer;
|
||||||
begin
|
begin
|
||||||
Result:=fAllChanges.Count;
|
Result:=fAllChanges.Count;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure TETMultiSrcChanges.SetSyncQueued(AValue: boolean);
|
||||||
|
begin
|
||||||
|
//debugln(['TETMultiSrcChanges.SetSyncQueued ',AValue]);
|
||||||
|
if csDesigning in ComponentState then
|
||||||
|
AValue:=false;
|
||||||
|
if FSyncQueued=AValue then Exit;
|
||||||
|
FSyncQueued:=AValue;
|
||||||
|
if SyncQueued then
|
||||||
|
Application.QueueAsyncCall(@DoSync,0)
|
||||||
|
else
|
||||||
|
Application.RemoveAsyncCalls(Self);
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TETMultiSrcChanges.DoSync(Data: PtrInt);
|
||||||
|
var
|
||||||
|
Node: TAvgLvlTreeNode;
|
||||||
|
NextNode: TAvgLvlTreeNode;
|
||||||
|
begin
|
||||||
|
//debugln(['TETMultiSrcChanges.DoSync Files=',fPendingChanges.Count]);
|
||||||
|
FSyncQueued:=false;
|
||||||
|
if fPendingChanges.Count=0 then exit;
|
||||||
|
if Assigned(OnSync) then
|
||||||
|
OnSync(Self);
|
||||||
|
// clear pending
|
||||||
|
Node:=fPendingChanges.FindLowest;
|
||||||
|
while Node<>nil do begin
|
||||||
|
NextNode:=Node.Successor;
|
||||||
|
TETSingleSrcChanges(Node.Data).Clear; // this removes Node from fPendingChanges
|
||||||
|
Node:=NextNode;
|
||||||
|
end;
|
||||||
|
fPendingChanges.Clear;
|
||||||
|
//debugln(['TETMultiSrcChanges.DoSync END FSyncQueued=',FSyncQueued,' fPendingChanges=',fPendingChanges.Count]);
|
||||||
|
end;
|
||||||
|
|
||||||
|
constructor TETMultiSrcChanges.Create(AOwner: TComponent);
|
||||||
|
begin
|
||||||
|
inherited Create(AOwner);
|
||||||
|
fAllChanges:=TAvgLvlTree.Create(@CompareETSrcChangesFilenames);
|
||||||
|
fPendingChanges:=TAvgLvlTree.Create(@CompareETSrcChangesFilenames);
|
||||||
|
end;
|
||||||
|
|
||||||
|
destructor TETMultiSrcChanges.Destroy;
|
||||||
|
begin
|
||||||
|
SyncQueued:=false;
|
||||||
|
Clear;
|
||||||
|
FreeAndNil(fPendingChanges);
|
||||||
|
FreeAndNil(fAllChanges);
|
||||||
|
inherited Destroy;
|
||||||
|
end;
|
||||||
|
|
||||||
procedure TETMultiSrcChanges.Clear;
|
procedure TETMultiSrcChanges.Clear;
|
||||||
begin
|
begin
|
||||||
|
SyncQueued:=false;
|
||||||
|
fPendingChanges.Clear;
|
||||||
fAllChanges.FreeAndClear;
|
fAllChanges.FreeAndClear;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function TETMultiSrcChanges.GetChanges(const aFilename: string;
|
function TETMultiSrcChanges.GetChanges(const aFilename: string;
|
||||||
CreateIfNotExists: boolean): TETSrcChanges;
|
CreateIfNotExists: boolean): TETSingleSrcChanges;
|
||||||
var
|
var
|
||||||
Node: TAvgLvlTreeNode;
|
Node: TAvgLvlTreeNode;
|
||||||
begin
|
begin
|
||||||
Node:=fAllChanges.FindKey(Pointer(aFilename),@CompareFilenameAndETSrcChanges);
|
Node:=fAllChanges.FindKey(Pointer(aFilename),@CompareFilenameAndETSrcChanges);
|
||||||
if Node<>nil then
|
if Node<>nil then
|
||||||
Result:=TETSrcChanges(Node.Data)
|
Result:=TETSingleSrcChanges(Node.Data)
|
||||||
else if CreateIfNotExists then begin
|
else if CreateIfNotExists then begin
|
||||||
Result:=TETSrcChanges.Create;
|
Result:=TETSingleSrcChanges.Create;
|
||||||
Result.Filename:=aFilename;
|
Result.Filename:=aFilename;
|
||||||
fAllChanges.Add(Result);
|
Result.MultiSrcChanges:=Self;
|
||||||
end else
|
end else
|
||||||
Result:=nil;
|
Result:=nil;
|
||||||
end;
|
end;
|
||||||
@ -584,7 +644,7 @@ end;
|
|||||||
function TETMultiSrcChanges.AdaptCaret(const aFilename: string; var Line,
|
function TETMultiSrcChanges.AdaptCaret(const aFilename: string; var Line,
|
||||||
Col: integer; LeftBound: boolean): boolean;
|
Col: integer; LeftBound: boolean): boolean;
|
||||||
var
|
var
|
||||||
Changes: TETSrcChanges;
|
Changes: TETSingleSrcChanges;
|
||||||
begin
|
begin
|
||||||
Changes:=GetChanges(aFilename,false);
|
Changes:=GetChanges(aFilename,false);
|
||||||
if Changes=nil then
|
if Changes=nil then
|
||||||
@ -623,12 +683,26 @@ begin
|
|||||||
Result+='-To='+IntToStr(ToPos.Y)+','+IntToStr(ToPos.X);
|
Result+='-To='+IntToStr(ToPos.Y)+','+IntToStr(ToPos.X);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{ TETSrcChanges }
|
{ TETSingleSrcChanges }
|
||||||
|
|
||||||
procedure TETSrcChanges.Append(Change: TETSrcChange);
|
procedure TETSingleSrcChanges.SetInPendingTree(AValue: boolean);
|
||||||
|
begin
|
||||||
|
if FMultiSrcChanges=nil then AValue:=false;
|
||||||
|
if FInPendingTree=AValue then Exit;
|
||||||
|
FInPendingTree:=AValue;
|
||||||
|
if fInPendingTree then begin
|
||||||
|
FMultiSrcChanges.fPendingChanges.Add(Self);
|
||||||
|
if FMultiSrcChanges.AutoSync then
|
||||||
|
FMultiSrcChanges.SyncQueued:=true;
|
||||||
|
end else
|
||||||
|
FMultiSrcChanges.fPendingChanges.Remove(Self);
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TETSingleSrcChanges.Append(Change: TETSrcChange);
|
||||||
begin
|
begin
|
||||||
if First=nil then begin
|
if First=nil then begin
|
||||||
FFirst:=Change;
|
FFirst:=Change;
|
||||||
|
InPendingTree:=true;
|
||||||
end else begin
|
end else begin
|
||||||
FLast.Next:=Change;
|
FLast.Next:=Change;
|
||||||
Change.Prev:=Last;
|
Change.Prev:=Last;
|
||||||
@ -636,10 +710,13 @@ begin
|
|||||||
fLast:=Change;
|
fLast:=Change;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TETSrcChanges.Remove(Change: TETSrcChange);
|
procedure TETSingleSrcChanges.Remove(Change: TETSrcChange);
|
||||||
begin
|
begin
|
||||||
if First=Change then
|
if First=Change then begin
|
||||||
FFirst:=Change.Next;
|
FFirst:=Change.Next;
|
||||||
|
if FFirst=nil then
|
||||||
|
InPendingTree:=false;
|
||||||
|
end;
|
||||||
if Last=Change then
|
if Last=Change then
|
||||||
fLast:=Change.Prev;
|
fLast:=Change.Prev;
|
||||||
if Change.Prev<>nil then
|
if Change.Prev<>nil then
|
||||||
@ -650,28 +727,53 @@ begin
|
|||||||
Change.Next:=nil;
|
Change.Next:=nil;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TETSrcChanges.SetFilename(AValue: string);
|
procedure TETSingleSrcChanges.SetFilename(AValue: string);
|
||||||
var
|
var
|
||||||
HasChanged: Boolean;
|
HasChanged: Boolean;
|
||||||
begin
|
begin
|
||||||
if FFilename=AValue then Exit;
|
if FFilename=AValue then Exit;
|
||||||
HasChanged:=CompareFilenames(FFilename,AValue)<>0;
|
HasChanged:=CompareFilenames(FFilename,AValue)<>0;
|
||||||
|
if HasChanged then begin
|
||||||
|
if FMultiSrcChanges<>nil then
|
||||||
|
raise Exception.Create('TETSingleSrcChanges.SetFilename');
|
||||||
|
end;
|
||||||
FFilename:=AValue;
|
FFilename:=AValue;
|
||||||
if HasChanged then
|
if HasChanged then
|
||||||
Clear;
|
Clear;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
constructor TETSrcChanges.Create;
|
procedure TETSingleSrcChanges.SetMultiSrcChanges(AValue: TETMultiSrcChanges);
|
||||||
|
begin
|
||||||
|
if FMultiSrcChanges=AValue then Exit;
|
||||||
|
if Filename='' then
|
||||||
|
raise Exception.Create('TETSingleSrcChanges.SetMultiSrcChanges empty filename');
|
||||||
|
if (FMultiSrcChanges<>nil) then begin
|
||||||
|
if (csDestroying in FMultiSrcChanges.ComponentState) then begin
|
||||||
|
fInPendingTree:=false;
|
||||||
|
end else begin
|
||||||
|
InPendingTree:=false;
|
||||||
|
FMultiSrcChanges.fAllChanges.Remove(Self);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
FMultiSrcChanges:=AValue;
|
||||||
|
if FMultiSrcChanges<>nil then begin
|
||||||
|
FMultiSrcChanges.fAllChanges.Add(Self);
|
||||||
|
InPendingTree:=First<>nil;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
constructor TETSingleSrcChanges.Create;
|
||||||
begin
|
begin
|
||||||
end;
|
end;
|
||||||
|
|
||||||
destructor TETSrcChanges.Destroy;
|
destructor TETSingleSrcChanges.Destroy;
|
||||||
begin
|
begin
|
||||||
|
MultiSrcChanges:=nil;
|
||||||
Clear;
|
Clear;
|
||||||
inherited Destroy;
|
inherited Destroy;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TETSrcChanges.Clear;
|
procedure TETSingleSrcChanges.Clear;
|
||||||
var
|
var
|
||||||
Item: TETSrcChange;
|
Item: TETSrcChange;
|
||||||
CurItem: TETSrcChange;
|
CurItem: TETSrcChange;
|
||||||
@ -684,9 +786,10 @@ begin
|
|||||||
end;
|
end;
|
||||||
fFirst:=nil;
|
fFirst:=nil;
|
||||||
FLast:=nil;
|
FLast:=nil;
|
||||||
|
InPendingTree:=false;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TETSrcChanges.GetRange(out MinY, MaxY, LineDiffBehindMaxY: integer);
|
procedure TETSingleSrcChanges.GetRange(out MinY, MaxY, LineDiffBehindMaxY: integer);
|
||||||
// true if there are changes
|
// true if there are changes
|
||||||
// All changes were done between lines MinY and MaxY (inclusive).
|
// All changes were done between lines MinY and MaxY (inclusive).
|
||||||
// Lines behind MaxY are moved by LineDiffBehindMaxY.
|
// Lines behind MaxY are moved by LineDiffBehindMaxY.
|
||||||
@ -718,16 +821,16 @@ begin
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
// inline
|
// inline
|
||||||
function TETSrcChanges.Add(Action: TETSrcChangeAction; const FromPos,
|
function TETSingleSrcChanges.Add(Action: TETSrcChangeAction; const FromPos,
|
||||||
ToPos: TPoint): TETSrcChange;
|
ToPos: TPoint): TETSrcChange;
|
||||||
begin
|
begin
|
||||||
Result:=Add(Action,FromPos.Y,FromPos.X,ToPos.Y,ToPos.X);
|
Result:=Add(Action,FromPos.Y,FromPos.X,ToPos.Y,ToPos.X);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function TETSrcChanges.Add(Action: TETSrcChangeAction; FromPosY, FromPosX,
|
function TETSingleSrcChanges.Add(Action: TETSrcChangeAction; FromPosY, FromPosX,
|
||||||
ToPosY, ToPosX: integer): TETSrcChange;
|
ToPosY, ToPosX: integer): TETSrcChange;
|
||||||
|
|
||||||
procedure RaiseFromBehindToPos;
|
procedure RaiseFromPosBehindToPos;
|
||||||
begin
|
begin
|
||||||
raise Exception.CreateFmt('TETSrcChanges.Add FromPos=%s,%s behind ToPos=%s,%s',[FromPosY,FromPosX,ToPosY,ToPosX]);
|
raise Exception.CreateFmt('TETSrcChanges.Add FromPos=%s,%s behind ToPos=%s,%s',[FromPosY,FromPosX,ToPosY,ToPosX]);
|
||||||
end;
|
end;
|
||||||
@ -738,6 +841,7 @@ function TETSrcChanges.Add(Action: TETSrcChangeAction; FromPosY, FromPosX,
|
|||||||
exit(false);
|
exit(false);
|
||||||
// check if addition can be merged
|
// check if addition can be merged
|
||||||
if Action=etscaInsert then begin
|
if Action=etscaInsert then begin
|
||||||
|
// Insertion
|
||||||
if (Prev.ToPos.Y=Cur.FromPos.Y) and (Prev.ToPos.X=Cur.FromPos.X) then begin
|
if (Prev.ToPos.Y=Cur.FromPos.Y) and (Prev.ToPos.X=Cur.FromPos.X) then begin
|
||||||
// Cur is an insert exactly behind Prev insert -> append insert
|
// Cur is an insert exactly behind Prev insert -> append insert
|
||||||
Prev.ToPos.Y:=Cur.ToPos.Y;
|
Prev.ToPos.Y:=Cur.ToPos.Y;
|
||||||
@ -757,6 +861,7 @@ function TETSrcChanges.Add(Action: TETSrcChangeAction; FromPosY, FromPosX,
|
|||||||
end;
|
end;
|
||||||
// ToDo: insert exactly in front
|
// ToDo: insert exactly in front
|
||||||
end else begin
|
end else begin
|
||||||
|
// Deletion
|
||||||
if IsCaretInFrontOrSame(Cur.FromPos,Prev.FromPos)
|
if IsCaretInFrontOrSame(Cur.FromPos,Prev.FromPos)
|
||||||
and IsCaretInFrontOrSame(Prev.FromPos,Cur.ToPos) then begin
|
and IsCaretInFrontOrSame(Prev.FromPos,Cur.ToPos) then begin
|
||||||
// Cur delete extends Prev delete => combine delete
|
// Cur delete extends Prev delete => combine delete
|
||||||
@ -783,7 +888,7 @@ begin
|
|||||||
|
|
||||||
// consistency check
|
// consistency check
|
||||||
if IsCaretInFront(ToPosY,ToPosX,FromPosY,FromPosX) then
|
if IsCaretInFront(ToPosY,ToPosX,FromPosY,FromPosX) then
|
||||||
RaiseFromBehindToPos;
|
RaiseFromPosBehindToPos;
|
||||||
|
|
||||||
Result:=TETSrcChange.Create(Action, FromPosY, FromPosX, ToPosY, ToPosX);
|
Result:=TETSrcChange.Create(Action, FromPosY, FromPosX, ToPosY, ToPosX);
|
||||||
|
|
||||||
@ -799,7 +904,7 @@ begin
|
|||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function TETSrcChanges.AdaptCaret(var Line, Col: integer; LeftBound: boolean
|
function TETSingleSrcChanges.AdaptCaret(var Line, Col: integer; LeftBound: boolean
|
||||||
): boolean;
|
): boolean;
|
||||||
var
|
var
|
||||||
Change: TETSrcChange;
|
Change: TETSrcChange;
|
||||||
@ -817,7 +922,7 @@ begin
|
|||||||
Result:=(Line<>OldLine) or (Col<>OldCol);
|
Result:=(Line<>OldLine) or (Col<>OldCol);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TETSrcChanges.ConsistencyCheck;
|
procedure TETSingleSrcChanges.ConsistencyCheck;
|
||||||
|
|
||||||
procedure E(Msg: string);
|
procedure E(Msg: string);
|
||||||
begin
|
begin
|
||||||
@ -827,6 +932,7 @@ procedure TETSrcChanges.ConsistencyCheck;
|
|||||||
var
|
var
|
||||||
Change: TETSrcChange;
|
Change: TETSrcChange;
|
||||||
List: TFPList;
|
List: TFPList;
|
||||||
|
ReallyInPendingTree: Boolean;
|
||||||
begin
|
begin
|
||||||
if (First=nil)<>(Last=nil) then
|
if (First=nil)<>(Last=nil) then
|
||||||
E('(First=nil)<>(Last=nil)');
|
E('(First=nil)<>(Last=nil)');
|
||||||
@ -853,9 +959,19 @@ begin
|
|||||||
finally
|
finally
|
||||||
List.Free;
|
List.Free;
|
||||||
end;
|
end;
|
||||||
|
if MultiSrcChanges<>nil then begin
|
||||||
|
if MultiSrcChanges.fAllChanges.Find(Self)=nil then
|
||||||
|
E('MultiSrcChanges.fAllChanges.Find(Self)=nil');
|
||||||
|
ReallyInPendingTree:=MultiSrcChanges.fPendingChanges.Find(Self)<>nil;
|
||||||
|
if InPendingTree<>ReallyInPendingTree then
|
||||||
|
E('InPendingTree<>ReallyInPendingTree');
|
||||||
|
end else begin
|
||||||
|
if InPendingTree then
|
||||||
|
E('MultiSrcChanges=nil InPendingTree=true');
|
||||||
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TETSrcChanges.WriteDebugReport(Title: string);
|
procedure TETSingleSrcChanges.WriteDebugReport(Title: string);
|
||||||
var
|
var
|
||||||
Change: TETSrcChange;
|
Change: TETSrcChange;
|
||||||
begin
|
begin
|
||||||
@ -869,25 +985,6 @@ end;
|
|||||||
|
|
||||||
{ TETSynPlugin }
|
{ TETSynPlugin }
|
||||||
|
|
||||||
procedure TETSynPlugin.DoSync(Data: PtrInt);
|
|
||||||
begin
|
|
||||||
FSyncQueued:=false;
|
|
||||||
if FChanges.First=nil then exit;
|
|
||||||
if Assigned(OnChanged) then
|
|
||||||
OnChanged(Self);
|
|
||||||
FChanges.Clear;
|
|
||||||
end;
|
|
||||||
|
|
||||||
procedure TETSynPlugin.SetSyncQueued(AValue: boolean);
|
|
||||||
begin
|
|
||||||
if FSyncQueued=AValue then Exit;
|
|
||||||
FSyncQueued:=AValue;
|
|
||||||
if SyncQueued then
|
|
||||||
Application.QueueAsyncCall(@DoSync,0)
|
|
||||||
else
|
|
||||||
Application.RemoveAsyncCalls(Self);
|
|
||||||
end;
|
|
||||||
|
|
||||||
procedure TETSynPlugin.OnLineEdit(Sender: TSynEditStrings; aLinePos, aBytePos,
|
procedure TETSynPlugin.OnLineEdit(Sender: TSynEditStrings; aLinePos, aBytePos,
|
||||||
aCount, aLineBrkCnt: Integer; aText: String);
|
aCount, aLineBrkCnt: Integer; aText: String);
|
||||||
{
|
{
|
||||||
@ -906,6 +1003,10 @@ procedure TETSynPlugin.OnLineEdit(Sender: TSynEditStrings; aLinePos, aBytePos,
|
|||||||
LinePos=290 BytePos=1 Count=-69 LineBrkCnt=0 Text=""
|
LinePos=290 BytePos=1 Count=-69 LineBrkCnt=0 Text=""
|
||||||
}
|
}
|
||||||
begin
|
begin
|
||||||
|
if not Enabled then exit;
|
||||||
|
if Changes=nil then exit;
|
||||||
|
if Assigned(OnIsEnabled) and not OnIsEnabled(Self) then exit;
|
||||||
|
|
||||||
{$IFDEF VerboseETSrcChange}
|
{$IFDEF VerboseETSrcChange}
|
||||||
debugln(['TETSynPlugin.OnLineEdit LinePos=',aLinePos,' BytePos=',aBytePos,' Count=',aCount,' LineBrkCnt=',aLineBrkCnt,' Text="',dbgstr(aText),'"']);
|
debugln(['TETSynPlugin.OnLineEdit LinePos=',aLinePos,' BytePos=',aBytePos,' Count=',aCount,' LineBrkCnt=',aLineBrkCnt,' Text="',dbgstr(aText),'"']);
|
||||||
{$ENDIF}
|
{$ENDIF}
|
||||||
@ -922,24 +1023,20 @@ begin
|
|||||||
end else if aLineBrkCnt<0 then begin
|
end else if aLineBrkCnt<0 then begin
|
||||||
// delete line breaks / empty lines
|
// delete line breaks / empty lines
|
||||||
FChanges.Add(etscaDelete,aLinePos,aBytePos,aLinePos-aLineBrkCnt,1);
|
FChanges.Add(etscaDelete,aLinePos,aBytePos,aLinePos-aLineBrkCnt,1);
|
||||||
end else
|
end;
|
||||||
exit;
|
|
||||||
SyncQueued:=true;
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
constructor TETSynPlugin.Create(AOwner: TComponent);
|
constructor TETSynPlugin.Create(AOwner: TComponent);
|
||||||
begin
|
begin
|
||||||
inherited Create(AOwner);
|
inherited Create(AOwner);
|
||||||
FChanges:=TETSrcChanges.Create;
|
|
||||||
ViewedTextBuffer.AddEditHandler(@OnLineEdit);
|
ViewedTextBuffer.AddEditHandler(@OnLineEdit);
|
||||||
|
FEnabled:=true;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
destructor TETSynPlugin.Destroy;
|
destructor TETSynPlugin.Destroy;
|
||||||
begin
|
begin
|
||||||
SyncQueued:=false;
|
|
||||||
ViewedTextBuffer.RemoveEditHandler(@OnLineEdit);
|
ViewedTextBuffer.RemoveEditHandler(@OnLineEdit);
|
||||||
inherited Destroy;
|
inherited Destroy;
|
||||||
FreeAndNil(FChanges);
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{ TETMark }
|
{ TETMark }
|
||||||
@ -964,6 +1061,8 @@ var
|
|||||||
u: TMessageLineUrgency;
|
u: TMessageLineUrgency;
|
||||||
begin
|
begin
|
||||||
inherited Create(AOwner);
|
inherited Create(AOwner);
|
||||||
|
if ExtToolsMarks=nil then
|
||||||
|
ExtToolsMarks:=Self;
|
||||||
for u:=low(TMessageLineUrgency) to high(TMessageLineUrgency) do
|
for u:=low(TMessageLineUrgency) to high(TMessageLineUrgency) do
|
||||||
fMarkStyles[u]:=TETMarkStyle.Create(u,clNone);
|
fMarkStyles[u]:=TETMarkStyle.Create(u,clNone);
|
||||||
fMarkStyles[mluHint].Color:=clGreen;
|
fMarkStyles[mluHint].Color:=clGreen;
|
||||||
@ -978,6 +1077,8 @@ destructor TETMarks.Destroy;
|
|||||||
var
|
var
|
||||||
u: TMessageLineUrgency;
|
u: TMessageLineUrgency;
|
||||||
begin
|
begin
|
||||||
|
if ExtToolsMarks=Self then
|
||||||
|
ExtToolsMarks:=nil;
|
||||||
for u:=low(TMessageLineUrgency) to high(TMessageLineUrgency) do
|
for u:=low(TMessageLineUrgency) to high(TMessageLineUrgency) do
|
||||||
FreeAndNil(fMarkStyles[u]);
|
FreeAndNil(fMarkStyles[u]);
|
||||||
inherited Destroy;
|
inherited Destroy;
|
||||||
@ -1047,21 +1148,6 @@ begin
|
|||||||
inherited Destroy;
|
inherited Destroy;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{ TExtToolSynGutterMarkProvider }
|
|
||||||
|
|
||||||
procedure TExtToolSynGutterMarkProvider.AdjustColorForMark(AMark: TSynEditMark;
|
|
||||||
var AColor: TColor; var APriority: Integer);
|
|
||||||
var
|
|
||||||
ETMark: TETMark;
|
|
||||||
begin
|
|
||||||
//DebugLn(['TExtToolSynGutterMarkProvider.AdjustColorForMark Line=',AMark.Line,' Color=',AMark.Column]);
|
|
||||||
if (AMark is TETMark) then begin
|
|
||||||
ETMark:=TETMark(AMark);
|
|
||||||
AColor:=ETMark.SourceMarks.MarkStyles[ETMark.Urgency].Color;
|
|
||||||
end else
|
|
||||||
inherited AdjustColorForMark(AMark, AColor, APriority);
|
|
||||||
end;
|
|
||||||
|
|
||||||
{ TLMsgViewLine }
|
{ TLMsgViewLine }
|
||||||
|
|
||||||
destructor TLMsgViewLine.Destroy;
|
destructor TLMsgViewLine.Destroy;
|
||||||
|
@ -66,7 +66,7 @@ uses
|
|||||||
IDEHelpManager, MacroPromptDlg, TransferMacros, CodeContextForm,
|
IDEHelpManager, MacroPromptDlg, TransferMacros, CodeContextForm,
|
||||||
SrcEditHintFrm,
|
SrcEditHintFrm,
|
||||||
{$IFDEF EnableNewExtTools}
|
{$IFDEF EnableNewExtTools}
|
||||||
etMessagesWnd,
|
etMessagesWnd, etSrcEditMarks,
|
||||||
{$ELSE}
|
{$ELSE}
|
||||||
MsgView,
|
MsgView,
|
||||||
{$ENDIF}
|
{$ENDIF}
|
||||||
@ -92,8 +92,6 @@ type
|
|||||||
TPackageForSourceEditorEvent = function(out APackage: TIDEPackage;
|
TPackageForSourceEditorEvent = function(out APackage: TIDEPackage;
|
||||||
ASrcEdit: TObject): TLazPackageFile of object;
|
ASrcEdit: TObject): TLazPackageFile of object;
|
||||||
|
|
||||||
TOnLinesInsertedDeleted = procedure(Sender : TObject;
|
|
||||||
FirstLine,Count : Integer) of Object;
|
|
||||||
TPlaceBookMarkEvent = procedure(Sender: TObject; var Mark: TSynEditMark) of object;
|
TPlaceBookMarkEvent = procedure(Sender: TObject; var Mark: TSynEditMark) of object;
|
||||||
TPlaceBookMarkIdEvent = procedure(Sender: TObject; ID: Integer) of object;
|
TPlaceBookMarkIdEvent = procedure(Sender: TObject; ID: Integer) of object;
|
||||||
TBookMarkActionEvent = procedure(Sender: TObject; ID: Integer; Toggle: Boolean) of object;
|
TBookMarkActionEvent = procedure(Sender: TObject; ID: Integer; Toggle: Boolean) of object;
|
||||||
@ -108,6 +106,9 @@ type
|
|||||||
hcmSoftKeepEOL // Soft Center (distance to screen edge) Caret, but keep EOL at right border
|
hcmSoftKeepEOL // Soft Center (distance to screen edge) Caret, but keep EOL at right border
|
||||||
);
|
);
|
||||||
|
|
||||||
|
{$IFNDEF EnableNewExtTools}
|
||||||
|
TOnLinesInsertedDeleted = procedure(Sender : TObject;
|
||||||
|
FirstLine,Count : Integer) of Object;
|
||||||
|
|
||||||
{ TSynEditPlugin1 }
|
{ TSynEditPlugin1 }
|
||||||
|
|
||||||
@ -129,6 +130,7 @@ type
|
|||||||
constructor Create(AOwner: TComponent); override;
|
constructor Create(AOwner: TComponent); override;
|
||||||
destructor Destroy; override;
|
destructor Destroy; override;
|
||||||
end;
|
end;
|
||||||
|
{$ENDIF}
|
||||||
|
|
||||||
{ TSourceEditCompletion }
|
{ TSourceEditCompletion }
|
||||||
|
|
||||||
@ -251,8 +253,13 @@ type
|
|||||||
FEditor: TIDESynEditor;
|
FEditor: TIDESynEditor;
|
||||||
FTempCaret: TPoint;
|
FTempCaret: TPoint;
|
||||||
FTempTopLine: Integer;
|
FTempTopLine: Integer;
|
||||||
|
{$IFDEF EnableNewExtTools}
|
||||||
|
FEditPlugin: TETSynPlugin; // used to update the "Messages Window"
|
||||||
|
// when text is inserted/deleted
|
||||||
|
{$ELSE}
|
||||||
FEditPlugin: TSynEditPlugin1; // used to get the LinesInserted and
|
FEditPlugin: TSynEditPlugin1; // used to get the LinesInserted and
|
||||||
// LinesDeleted messages
|
// LinesDeleted messages
|
||||||
|
{$ENDIF}
|
||||||
FOnIfdefNodeStateRequest: TSynMarkupIfdefStateRequest;
|
FOnIfdefNodeStateRequest: TSynMarkupIfdefStateRequest;
|
||||||
FLastIfDefNodeScannerStep: integer;
|
FLastIfDefNodeScannerStep: integer;
|
||||||
|
|
||||||
@ -320,15 +327,12 @@ type
|
|||||||
|
|
||||||
procedure UpdateIfDefNodeStates(Force: Boolean = False);
|
procedure UpdateIfDefNodeStates(Force: Boolean = False);
|
||||||
protected
|
protected
|
||||||
ErrorMsgs: TStrings;
|
|
||||||
|
|
||||||
procedure ProcessCommand(Sender: TObject;
|
procedure ProcessCommand(Sender: TObject;
|
||||||
var Command: TSynEditorCommand; var AChar: TUTF8Char; Data: pointer);
|
var Command: TSynEditorCommand; var AChar: TUTF8Char; Data: pointer);
|
||||||
procedure ProcessUserCommand(Sender: TObject;
|
procedure ProcessUserCommand(Sender: TObject;
|
||||||
var Command: TSynEditorCommand; var AChar: TUTF8Char; Data: pointer);
|
var Command: TSynEditorCommand; var AChar: TUTF8Char; Data: pointer);
|
||||||
procedure UserCommandProcessed(Sender: TObject;
|
procedure UserCommandProcessed(Sender: TObject;
|
||||||
var Command: TSynEditorCommand; var AChar: TUTF8Char; Data: pointer);
|
var Command: TSynEditorCommand; var AChar: TUTF8Char; Data: pointer);
|
||||||
procedure ccAddMessage(Texts: String);
|
|
||||||
function AutoCompleteChar(Char: TUTF8Char; var AddChar: boolean;
|
function AutoCompleteChar(Char: TUTF8Char; var AddChar: boolean;
|
||||||
Category: TAutoCompleteOption): boolean;
|
Category: TAutoCompleteOption): boolean;
|
||||||
function AutoBlockCompleteChar(Char: TUTF8Char; var AddChar: boolean;
|
function AutoBlockCompleteChar(Char: TUTF8Char; var AddChar: boolean;
|
||||||
@ -352,7 +356,9 @@ type
|
|||||||
procedure StartIdentCompletionBox(JumpToError: boolean);
|
procedure StartIdentCompletionBox(JumpToError: boolean);
|
||||||
procedure StartWordCompletionBox(JumpToError: boolean);
|
procedure StartWordCompletionBox(JumpToError: boolean);
|
||||||
|
|
||||||
{$IFNDEF EnableNewExtTools}
|
{$IFDEF EnableNewExtTools}
|
||||||
|
function IsFirstShared(Sender: TObject): boolean;
|
||||||
|
{$ELSE}
|
||||||
procedure LinesInserted(sender: TObject; FirstLine, Count: Integer);
|
procedure LinesInserted(sender: TObject; FirstLine, Count: Integer);
|
||||||
procedure LinesDeleted(sender: TObject; FirstLine, Count: Integer);
|
procedure LinesDeleted(sender: TObject; FirstLine, Count: Integer);
|
||||||
{$ENDIF}
|
{$ENDIF}
|
||||||
@ -891,6 +897,11 @@ type
|
|||||||
TSrcEditMangerHandlerType = (
|
TSrcEditMangerHandlerType = (
|
||||||
semhtCopyPaste
|
semhtCopyPaste
|
||||||
);
|
);
|
||||||
|
TSrcEditManagerUpdateFlag = (
|
||||||
|
ufMgrActiveEditorChanged,
|
||||||
|
ufShowWindowOnTop,
|
||||||
|
ufShowWindowOnTopFocus);
|
||||||
|
TSrcEditManagerUpdateFlags = set of TSrcEditManagerUpdateFlag;
|
||||||
|
|
||||||
{ TSourceEditorManagerBase }
|
{ TSourceEditorManagerBase }
|
||||||
(* Implement all Methods with the Interface types *)
|
(* Implement all Methods with the Interface types *)
|
||||||
@ -903,7 +914,7 @@ type
|
|||||||
FUpdateLock: Integer;
|
FUpdateLock: Integer;
|
||||||
FActiveEditorLock: Integer;
|
FActiveEditorLock: Integer;
|
||||||
FAutoFocusLock: Integer;
|
FAutoFocusLock: Integer;
|
||||||
FUpdateFlags: set of (ufMgrActiveEditorChanged, ufShowWindowOnTop, ufShowWindowOnTopFocus);
|
FUpdateFlags: TSrcEditManagerUpdateFlags;
|
||||||
procedure FreeSourceWindows;
|
procedure FreeSourceWindows;
|
||||||
function GetActiveSourceWindowIndex: integer;
|
function GetActiveSourceWindowIndex: integer;
|
||||||
function GetSourceWindowByLastFocused(Index: Integer): TSourceEditorWindowInterface;
|
function GetSourceWindowByLastFocused(Index: Integer): TSourceEditorWindowInterface;
|
||||||
@ -912,6 +923,9 @@ type
|
|||||||
fProducers: TFPList; // list of TSourceMarklingProducer
|
fProducers: TFPList; // list of TSourceMarklingProducer
|
||||||
FChangeNotifyLists: Array [TsemChangeReason] of TMethodList;
|
FChangeNotifyLists: Array [TsemChangeReason] of TMethodList;
|
||||||
FHandlers: array[TSrcEditMangerHandlerType] of TMethodList;
|
FHandlers: array[TSrcEditMangerHandlerType] of TMethodList;
|
||||||
|
{$IFDEF EnableNewExtTools}
|
||||||
|
FChangesQueuedForMsgWnd: TETMultiSrcChanges;// source editor changes waiting to be applied to the Messages window
|
||||||
|
{$ENDIF}
|
||||||
function GetActiveSourceWindow: TSourceEditorWindowInterface; override;
|
function GetActiveSourceWindow: TSourceEditorWindowInterface; override;
|
||||||
procedure SetActiveSourceWindow(const AValue: TSourceEditorWindowInterface); override;
|
procedure SetActiveSourceWindow(const AValue: TSourceEditorWindowInterface); override;
|
||||||
function GetSourceWindows(Index: integer): TSourceEditorWindowInterface; override;
|
function GetSourceWindows(Index: integer): TSourceEditorWindowInterface; override;
|
||||||
@ -923,6 +937,9 @@ type
|
|||||||
function GetSourceEditors(Index: integer): TSourceEditorInterface; override;
|
function GetSourceEditors(Index: integer): TSourceEditorInterface; override;
|
||||||
function GetUniqueSourceEditors(Index: integer): TSourceEditorInterface; override;
|
function GetUniqueSourceEditors(Index: integer): TSourceEditorInterface; override;
|
||||||
function GetMarklingProducers(Index: integer): TSourceMarklingProducer; override;
|
function GetMarklingProducers(Index: integer): TSourceMarklingProducer; override;
|
||||||
|
{$IFDEF EnableNewExtTools}
|
||||||
|
procedure SyncMessageWnd(Sender: TObject);
|
||||||
|
{$ENDIF}
|
||||||
public
|
public
|
||||||
procedure BeginAutoFocusLock;
|
procedure BeginAutoFocusLock;
|
||||||
procedure EndAutoFocusLock;
|
procedure EndAutoFocusLock;
|
||||||
@ -1126,6 +1143,10 @@ type
|
|||||||
// marks
|
// marks
|
||||||
function OnSourceMarksGetFilename(ASourceEditor: TObject): string;
|
function OnSourceMarksGetFilename(ASourceEditor: TObject): string;
|
||||||
procedure OnSourceMarksAction(AMark: TSourceMark; AAction: TMarksAction);
|
procedure OnSourceMarksAction(AMark: TSourceMark; AAction: TMarksAction);
|
||||||
|
{$IFDEF EnableNewExtTools}
|
||||||
|
procedure OnSourceMarksGetSynEdit(Sender: TObject; aFilename: string;
|
||||||
|
var aSynEdit: TSynEdit);
|
||||||
|
{$ENDIF}
|
||||||
property CodeTemplateModul: TSynEditAutoComplete
|
property CodeTemplateModul: TSynEditAutoComplete
|
||||||
read FCodeTemplateModul write FCodeTemplateModul;
|
read FCodeTemplateModul write FCodeTemplateModul;
|
||||||
// goto dialog
|
// goto dialog
|
||||||
@ -1235,7 +1256,7 @@ type
|
|||||||
read FOnPackageForSourceEditor write FOnPackageForSourceEditor;
|
read FOnPackageForSourceEditor write FOnPackageForSourceEditor;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function SourceEditorManager: TSourceEditorManager;
|
function SourceEditorManager: TSourceEditorManager; inline;
|
||||||
|
|
||||||
|
|
||||||
//=============================================================================
|
//=============================================================================
|
||||||
@ -2318,9 +2339,20 @@ procedure TSourceEditorSharedValues.SetCodeBuffer(const AValue: TCodeBuffer);
|
|||||||
var
|
var
|
||||||
i: Integer;
|
i: Integer;
|
||||||
SrcEdit: TSourceEditor;
|
SrcEdit: TSourceEditor;
|
||||||
|
SharedEdit: TSourceEditor;
|
||||||
|
{$IFDEF EnableNewExtTools}
|
||||||
|
ETChanges: TETSingleSrcChanges;
|
||||||
|
{$ENDIF}
|
||||||
begin
|
begin
|
||||||
if FCodeBuffer = AValue then exit;
|
if FCodeBuffer = AValue then exit;
|
||||||
if FCodeBuffer<>nil then begin
|
if FCodeBuffer<>nil then begin
|
||||||
|
{$IFDEF EnableNewExtTools}
|
||||||
|
for i := 0 to FSharedEditorList.Count - 1 do begin
|
||||||
|
SharedEdit := SharedEditors[i];
|
||||||
|
if SharedEdit.FEditPlugin<>nil then
|
||||||
|
SharedEdit.FEditPlugin.Changes:=nil;
|
||||||
|
end;
|
||||||
|
{$ENDIF}
|
||||||
FCodeBuffer.RemoveChangeHook(@OnCodeBufferChanged);
|
FCodeBuffer.RemoveChangeHook(@OnCodeBufferChanged);
|
||||||
if FCodeBuffer.Scanner<>nil then
|
if FCodeBuffer.Scanner<>nil then
|
||||||
DisconnectScanner(FCodeBuffer.Scanner);
|
DisconnectScanner(FCodeBuffer.Scanner);
|
||||||
@ -2354,34 +2386,48 @@ begin
|
|||||||
FCodeBuffer.AddChangeHook(@OnCodeBufferChanged);
|
FCodeBuffer.AddChangeHook(@OnCodeBufferChanged);
|
||||||
if FCodeBuffer.Scanner<>nil then
|
if FCodeBuffer.Scanner<>nil then
|
||||||
ConnectScanner(FCodeBuffer.Scanner);
|
ConnectScanner(FCodeBuffer.Scanner);
|
||||||
|
{$IFDEF EnableNewExtTools}
|
||||||
|
ETChanges := SourceEditorManager.FChangesQueuedForMsgWnd.GetChanges(
|
||||||
|
FCodeBuffer.Filename,true);
|
||||||
|
for i := 0 to FSharedEditorList.Count - 1 do begin
|
||||||
|
SharedEdit:=SharedEditors[i];
|
||||||
|
if assigned(SharedEdit.FEditPlugin) then
|
||||||
|
SharedEdit.FEditPlugin.Changes := ETChanges;
|
||||||
|
end;
|
||||||
|
{$ENDIF}
|
||||||
if (FIgnoreCodeBufferLock <= 0) and (not FCodeBuffer.IsEqual(SynEditor.Lines))
|
if (FIgnoreCodeBufferLock <= 0) and (not FCodeBuffer.IsEqual(SynEditor.Lines))
|
||||||
then begin
|
then begin
|
||||||
{$IFDEF IDE_DEBUG}
|
{$IFDEF IDE_DEBUG}
|
||||||
debugln(' *** WARNING *** : TSourceEditor.SetCodeBuffer - loosing marks: ',FCodeBuffer.Filename);
|
debugln(' *** WARNING *** : TSourceEditor.SetCodeBuffer - loosing marks: ',FCodeBuffer.Filename);
|
||||||
{$ENDIF}
|
{$ENDIF}
|
||||||
for i := 0 to FSharedEditorList.Count - 1 do
|
for i := 0 to FSharedEditorList.Count - 1 do begin
|
||||||
if assigned(SharedEditors[i].FEditPlugin) then
|
SharedEdit:=SharedEditors[i];
|
||||||
SharedEditors[i].FEditPlugin.Enabled := False;
|
if assigned(SharedEdit.FEditPlugin) then
|
||||||
|
SharedEdit.FEditPlugin.Enabled := False;
|
||||||
|
end;
|
||||||
SynEditor.BeginUpdate;
|
SynEditor.BeginUpdate;
|
||||||
SynEditor.InvalidateAllIfdefNodes;
|
SynEditor.InvalidateAllIfdefNodes;
|
||||||
FCodeBuffer.AssignTo(SynEditor.Lines, false);
|
FCodeBuffer.AssignTo(SynEditor.Lines, false);
|
||||||
FEditorStampCommitedToCodetools:=(SynEditor.Lines as TSynEditLines).TextChangeStamp;
|
FEditorStampCommitedToCodetools:=(SynEditor.Lines as TSynEditLines).TextChangeStamp;
|
||||||
SynEditor.EndUpdate;
|
SynEditor.EndUpdate;
|
||||||
for i := 0 to FSharedEditorList.Count - 1 do begin
|
for i := 0 to FSharedEditorList.Count - 1 do begin
|
||||||
if assigned(SharedEditors[i].FEditPlugin) then
|
SharedEdit:=SharedEditors[i];
|
||||||
SharedEditors[i].FEditPlugin.Enabled := True;
|
if assigned(SharedEdit.FEditPlugin) then
|
||||||
if SharedEditors[i].Visible then
|
SharedEdit.FEditPlugin.Enabled := True;
|
||||||
SharedEditors[i].UpdateIfDefNodeStates(True);
|
if SharedEdit.Visible then
|
||||||
|
SharedEdit.UpdateIfDefNodeStates(True);
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
for i := 0 to FSharedEditorList.Count - 1 do begin
|
for i := 0 to FSharedEditorList.Count - 1 do begin
|
||||||
if SharedEditors[i].IsActiveOnNoteBook then SharedEditors[i].SourceNotebook.UpdateStatusBar;
|
SharedEdit:=SharedEditors[i];
|
||||||
|
if SharedEdit.IsActiveOnNoteBook then
|
||||||
|
SharedEdit.SourceNotebook.UpdateStatusBar;
|
||||||
// HasExecutionMarks is shared through synedit => this is only needed once
|
// HasExecutionMarks is shared through synedit => this is only needed once
|
||||||
// but HasExecutionMarks must be called on each synedit, so each synedit is notified
|
// but HasExecutionMarks must be called on each synedit, so each synedit is notified
|
||||||
if (DebugBoss.State in [dsPause, dsRun]) and
|
if (DebugBoss.State in [dsPause, dsRun]) and
|
||||||
not SharedEditors[i].HasExecutionMarks and (FCodeBuffer.FileName <> '')
|
not SharedEdit.HasExecutionMarks and (FCodeBuffer.FileName <> '')
|
||||||
then
|
then
|
||||||
SharedEditors[i].FillExecutionMarks;
|
SharedEdit.FillExecutionMarks;
|
||||||
end;
|
end;
|
||||||
finally
|
finally
|
||||||
DebugBoss.UnLockCommandProcessing;
|
DebugBoss.UnLockCommandProcessing;
|
||||||
@ -2798,10 +2844,12 @@ Begin
|
|||||||
FEditor.Beautifier := ASharedEditor.EditorComponent.Beautifier;
|
FEditor.Beautifier := ASharedEditor.EditorComponent.Beautifier;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
{$IFDEF EnableNewExtTools}
|
||||||
|
FEditPlugin := TETSynPlugin.Create(FEditor);
|
||||||
|
FEditPlugin.OnIsEnabled:=@IsFirstShared;
|
||||||
|
{$ELSE}
|
||||||
FEditPlugin := TSynEditPlugin1.Create(FEditor);
|
FEditPlugin := TSynEditPlugin1.Create(FEditor);
|
||||||
// IMPORTANT: when you add/remove events below, don't forget updating UnbindEditor
|
// IMPORTANT: when you add/remove events below, don't forget updating UnbindEditor
|
||||||
{$IFDEF EnableNewExtTools}
|
|
||||||
{$ELSE}
|
|
||||||
FEditPlugin.OnLinesInserted := @LinesInserted;
|
FEditPlugin.OnLinesInserted := @LinesInserted;
|
||||||
FEditPlugin.OnLinesDeleted := @LinesDeleted;
|
FEditPlugin.OnLinesDeleted := @LinesDeleted;
|
||||||
{$ENDIF}
|
{$ENDIF}
|
||||||
@ -4324,11 +4372,6 @@ Begin
|
|||||||
UpdateIfDefNodeStates(True);
|
UpdateIfDefNodeStates(True);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TSourceEditor.ccAddMessage(Texts: String);
|
|
||||||
Begin
|
|
||||||
ErrorMsgs.Add(Texts);
|
|
||||||
End;
|
|
||||||
|
|
||||||
function TSourceEditor.AutoCompleteChar(Char: TUTF8Char; var AddChar: boolean;
|
function TSourceEditor.AutoCompleteChar(Char: TUTF8Char; var AddChar: boolean;
|
||||||
Category: TAutoCompleteOption): boolean;
|
Category: TAutoCompleteOption): boolean;
|
||||||
// returns true if handled
|
// returns true if handled
|
||||||
@ -5632,7 +5675,13 @@ begin
|
|||||||
Result := FEditor.GetWordAtRowCol(ACaretPos);
|
Result := FEditor.GetWordAtRowCol(ACaretPos);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{$IFNDEF EnableNewExtTools}
|
{$IFDEF EnableNewExtTools}
|
||||||
|
function TSourceEditor.IsFirstShared(Sender: TObject): boolean;
|
||||||
|
begin
|
||||||
|
Result:=SharedEditors[0]=Self;
|
||||||
|
end;
|
||||||
|
|
||||||
|
{$ELSE}
|
||||||
procedure TSourceEditor.LinesDeleted(sender: TObject; FirstLine, Count: Integer
|
procedure TSourceEditor.LinesDeleted(sender: TObject; FirstLine, Count: Integer
|
||||||
);
|
);
|
||||||
begin
|
begin
|
||||||
@ -5691,8 +5740,12 @@ begin
|
|||||||
TSynPluginSyncronizedEditBase(EditorComponent.Plugin[i]).OnDeactivate := nil;
|
TSynPluginSyncronizedEditBase(EditorComponent.Plugin[i]).OnDeactivate := nil;
|
||||||
end;
|
end;
|
||||||
if FEditPlugin<>nil then begin
|
if FEditPlugin<>nil then begin
|
||||||
|
{$IFDEF EnableNewExtTools}
|
||||||
|
FEditPlugin.Enabled:=false;
|
||||||
|
{$ELSE}
|
||||||
FEditPlugin.OnLinesInserted := nil;
|
FEditPlugin.OnLinesInserted := nil;
|
||||||
FEditPlugin.OnLinesDeleted := nil;
|
FEditPlugin.OnLinesDeleted := nil;
|
||||||
|
{$ENDIF}
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@ -8693,6 +8746,7 @@ begin
|
|||||||
Editors[i].ClearExecutionMarks;
|
Editors[i].ClearExecutionMarks;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
{$IFNDEF EnableNewExtTools}
|
||||||
{ TSynEditPlugin1 }
|
{ TSynEditPlugin1 }
|
||||||
|
|
||||||
constructor TSynEditPlugin1.Create(AOwner: TComponent);
|
constructor TSynEditPlugin1.Create(AOwner: TComponent);
|
||||||
@ -8724,6 +8778,7 @@ function TSynEditPlugin1.OwnedByEditor: Boolean;
|
|||||||
begin
|
begin
|
||||||
Result := True;
|
Result := True;
|
||||||
end;
|
end;
|
||||||
|
{$ENDIF}
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
@ -9044,6 +9099,13 @@ begin
|
|||||||
Result:=TSourceMarklingProducer(fProducers[Index]);
|
Result:=TSourceMarklingProducer(fProducers[Index]);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
{$IFDEF EnableNewExtTools}
|
||||||
|
procedure TSourceEditorManagerBase.SyncMessageWnd(Sender: TObject);
|
||||||
|
begin
|
||||||
|
MessagesView.MessagesFrame1.ApplyMultiSrcChanges(Sender as TETMultiSrcChanges);
|
||||||
|
end;
|
||||||
|
{$ENDIF}
|
||||||
|
|
||||||
procedure TSourceEditorManagerBase.BeginAutoFocusLock;
|
procedure TSourceEditorManagerBase.BeginAutoFocusLock;
|
||||||
begin
|
begin
|
||||||
inc(FAutoFocusLock);
|
inc(FAutoFocusLock);
|
||||||
@ -9199,7 +9261,7 @@ var
|
|||||||
i: TsemChangeReason;
|
i: TsemChangeReason;
|
||||||
h: TSrcEditMangerHandlerType;
|
h: TSrcEditMangerHandlerType;
|
||||||
begin
|
begin
|
||||||
FMacroRecorder := TIdeEditorMacro.Create(self);
|
FMacroRecorder := TIdeEditorMacro.Create(Self);
|
||||||
FMacroRecorder.OnStateChange := @DoMacroRecorderState;
|
FMacroRecorder.OnStateChange := @DoMacroRecorderState;
|
||||||
OnEditorMacroStateChange := @DoMacroRecorderState;
|
OnEditorMacroStateChange := @DoMacroRecorderState;
|
||||||
if EditorMacroForRecording = nil then
|
if EditorMacroForRecording = nil then
|
||||||
@ -9218,6 +9280,11 @@ begin
|
|||||||
FUpdateLock := 0;
|
FUpdateLock := 0;
|
||||||
FActiveEditorLock := 0;
|
FActiveEditorLock := 0;
|
||||||
fProducers := TFPList.Create;
|
fProducers := TFPList.Create;
|
||||||
|
{$IFDEF EnableNewExtTools}
|
||||||
|
FChangesQueuedForMsgWnd:=TETMultiSrcChanges.Create(Self);
|
||||||
|
FChangesQueuedForMsgWnd.AutoSync:=true;
|
||||||
|
FChangesQueuedForMsgWnd.OnSync:=@SyncMessageWnd;
|
||||||
|
{$ENDIF}
|
||||||
inherited;
|
inherited;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@ -9227,6 +9294,9 @@ var
|
|||||||
cr: TsemChangeReason;
|
cr: TsemChangeReason;
|
||||||
h: TSrcEditMangerHandlerType;
|
h: TSrcEditMangerHandlerType;
|
||||||
begin
|
begin
|
||||||
|
{$IFDEF EnableNewExtTools}
|
||||||
|
FreeAndNil(FChangesQueuedForMsgWnd);
|
||||||
|
{$ENDIF}
|
||||||
for i:=MarklingProducerCount-1 downto 0 do
|
for i:=MarklingProducerCount-1 downto 0 do
|
||||||
MarklingProducers[i].Free;
|
MarklingProducers[i].Free;
|
||||||
FreeAndNil(fProducers);
|
FreeAndNil(fProducers);
|
||||||
@ -10346,6 +10416,18 @@ begin
|
|||||||
Editor.UpdateExecutionSourceMark;
|
Editor.UpdateExecutionSourceMark;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
{$IFDEF EnableNewExtTools}
|
||||||
|
procedure TSourceEditorManager.OnSourceMarksGetSynEdit(Sender: TObject;
|
||||||
|
aFilename: string; var aSynEdit: TSynEdit);
|
||||||
|
var
|
||||||
|
SrcEdit: TSourceEditor;
|
||||||
|
begin
|
||||||
|
SrcEdit:=SourceEditorIntfWithFilename(aFilename);
|
||||||
|
if SrcEdit=nil then exit;
|
||||||
|
aSynEdit:=SrcEdit.EditorComponent;
|
||||||
|
end;
|
||||||
|
{$ENDIF}
|
||||||
|
|
||||||
function TSourceEditorManager.GotoDialog: TfrmGoto;
|
function TSourceEditorManager.GotoDialog: TfrmGoto;
|
||||||
begin
|
begin
|
||||||
if FGotoDialog=nil then
|
if FGotoDialog=nil then
|
||||||
@ -10396,6 +10478,9 @@ begin
|
|||||||
SourceEditorMarks:=TSourceMarks.Create(Self);
|
SourceEditorMarks:=TSourceMarks.Create(Self);
|
||||||
SourceEditorMarks.OnGetFilename:=@OnSourceMarksGetFilename;
|
SourceEditorMarks.OnGetFilename:=@OnSourceMarksGetFilename;
|
||||||
SourceEditorMarks.OnAction:=@OnSourceMarksAction;
|
SourceEditorMarks.OnAction:=@OnSourceMarksAction;
|
||||||
|
{$IFDEF EnableNewExtTools}
|
||||||
|
SourceEditorMarks.ExtToolsMarks.OnGetSynEditOfFile:=@OnSourceMarksGetSynEdit;
|
||||||
|
{$ENDIF}
|
||||||
|
|
||||||
// code templates
|
// code templates
|
||||||
FCodeTemplateModul:=TSynEditAutoComplete.Create(Self);
|
FCodeTemplateModul:=TSynEditAutoComplete.Create(Self);
|
||||||
|
@ -41,7 +41,11 @@ uses
|
|||||||
Classes, SysUtils, AVL_Tree, Graphics, Controls, LCLProc,
|
Classes, SysUtils, AVL_Tree, Graphics, Controls, LCLProc,
|
||||||
MenuIntf,
|
MenuIntf,
|
||||||
SynEdit, SynEditMarks, SynEditMarkupGutterMark,
|
SynEdit, SynEditMarks, SynEditMarkupGutterMark,
|
||||||
SrcEditorIntf;
|
SrcEditorIntf
|
||||||
|
{$IFDEF EnableNewExtTools}
|
||||||
|
, IDEExternToolIntf, etSrcEditMarks
|
||||||
|
{$ENDIF}
|
||||||
|
;
|
||||||
|
|
||||||
type
|
type
|
||||||
TAdditionalHilightAttribute =
|
TAdditionalHilightAttribute =
|
||||||
@ -187,6 +191,9 @@ type
|
|||||||
FCurrentLineBreakPointImg: Integer;
|
FCurrentLineBreakPointImg: Integer;
|
||||||
FCurrentLineImg: Integer;
|
FCurrentLineImg: Integer;
|
||||||
FCurrentLineDisabledBreakPointImg: Integer;
|
FCurrentLineDisabledBreakPointImg: Integer;
|
||||||
|
{$IFDEF EnableNewExtTools}
|
||||||
|
FExtToolsMarks: TETMarks;
|
||||||
|
{$ENDIF}
|
||||||
FSourceLineImg: Integer;
|
FSourceLineImg: Integer;
|
||||||
FImgList: TImageList;
|
FImgList: TImageList;
|
||||||
fInactiveBreakPointImg: Integer;
|
fInactiveBreakPointImg: Integer;
|
||||||
@ -230,6 +237,9 @@ type
|
|||||||
property OnGetFilename: TGetFilenameEvent read FOnGetFilename
|
property OnGetFilename: TGetFilenameEvent read FOnGetFilename
|
||||||
write FOnGetFilename;
|
write FOnGetFilename;
|
||||||
property OnAction: TMarksActionEvent read FOnAction write FOnAction;
|
property OnAction: TMarksActionEvent read FOnAction write FOnAction;
|
||||||
|
{$IFDEF EnableNewExtTools}
|
||||||
|
property ExtToolsMarks: TETMarks read FExtToolsMarks;
|
||||||
|
{$ENDIF}
|
||||||
public
|
public
|
||||||
// icon index
|
// icon index
|
||||||
property ActiveBreakPointImg: Integer read fActiveBreakPointImg;
|
property ActiveBreakPointImg: Integer read fActiveBreakPointImg;
|
||||||
@ -536,6 +546,13 @@ end;
|
|||||||
procedure TSourceMarks.CreateImageList;
|
procedure TSourceMarks.CreateImageList;
|
||||||
var
|
var
|
||||||
i: Integer;
|
i: Integer;
|
||||||
|
{$IFDEF EnableNewExtTools}
|
||||||
|
ImgIDFatal: Integer;
|
||||||
|
ImgIDError: Integer;
|
||||||
|
ImgIDWarning: Integer;
|
||||||
|
ImgIDNote: Integer;
|
||||||
|
ImgIDHint: Integer;
|
||||||
|
{$ENDIF}
|
||||||
begin
|
begin
|
||||||
// create default mark icons
|
// create default mark icons
|
||||||
ImgList:=TImageList.Create(Self);
|
ImgList:=TImageList.Create(Self);
|
||||||
@ -568,6 +585,28 @@ begin
|
|||||||
FCurrentLineDisabledBreakPointImg := AddImage('debugger_current_line_disabled_breakpoint');
|
FCurrentLineDisabledBreakPointImg := AddImage('debugger_current_line_disabled_breakpoint');
|
||||||
// load source line
|
// load source line
|
||||||
FSourceLineImg:=AddImage('debugger_source_line');
|
FSourceLineImg:=AddImage('debugger_source_line');
|
||||||
|
|
||||||
|
{$IFDEF EnableNewExtTools}
|
||||||
|
ExtToolsMarks.ImageList:=ImgList;
|
||||||
|
ImgIDFatal:=AddImage('state11x11_fatal');
|
||||||
|
ImgIDError:=AddImage('state11x11_error');
|
||||||
|
ImgIDWarning:=AddImage('state11x11_warning');
|
||||||
|
ImgIDNote:=AddImage('state11x11_note');
|
||||||
|
ImgIDHint:=AddImage('state11x11_hint');
|
||||||
|
ExtToolsMarks.MarkStyles[mluNone].ImageIndex:=-1;
|
||||||
|
ExtToolsMarks.MarkStyles[mluProgress].ImageIndex:=-1;
|
||||||
|
ExtToolsMarks.MarkStyles[mluDebug].ImageIndex:=-1;
|
||||||
|
ExtToolsMarks.MarkStyles[mluVerbose3].ImageIndex:=-1;
|
||||||
|
ExtToolsMarks.MarkStyles[mluVerbose2].ImageIndex:=-1;
|
||||||
|
ExtToolsMarks.MarkStyles[mluVerbose].ImageIndex:=-1;
|
||||||
|
ExtToolsMarks.MarkStyles[mluHint].ImageIndex:=ImgIDHint;
|
||||||
|
ExtToolsMarks.MarkStyles[mluNote].ImageIndex:=ImgIDNote;
|
||||||
|
ExtToolsMarks.MarkStyles[mluWarning].ImageIndex:=ImgIDWarning;
|
||||||
|
ExtToolsMarks.MarkStyles[mluImportant].ImageIndex:=-1;
|
||||||
|
ExtToolsMarks.MarkStyles[mluError].ImageIndex:=ImgIDError;
|
||||||
|
ExtToolsMarks.MarkStyles[mluFatal].ImageIndex:=ImgIDFatal;
|
||||||
|
ExtToolsMarks.MarkStyles[mluPanic].ImageIndex:=ImgIDFatal;
|
||||||
|
{$ENDIF}
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function TSourceMarks.FindFirstMarkNode(ASrcEditID: TObject; ALine: integer
|
function TSourceMarks.FindFirstMarkNode(ASrcEditID: TObject; ALine: integer
|
||||||
@ -593,12 +632,18 @@ begin
|
|||||||
inherited Create(TheOwner);
|
inherited Create(TheOwner);
|
||||||
fItems:=TList.Create;
|
fItems:=TList.Create;
|
||||||
fSortedItems:=TAVLTree.Create(@CompareSourceMarks);
|
fSortedItems:=TAVLTree.Create(@CompareSourceMarks);
|
||||||
|
{$IFDEF EnableNewExtTools}
|
||||||
|
FExtToolsMarks:=TETMarks.Create(nil);
|
||||||
|
{$ENDIF}
|
||||||
CreateImageList;
|
CreateImageList;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
destructor TSourceMarks.Destroy;
|
destructor TSourceMarks.Destroy;
|
||||||
begin
|
begin
|
||||||
Clear;
|
Clear;
|
||||||
|
{$IFDEF EnableNewExtTools}
|
||||||
|
FreeAndNil(FExtToolsMarks);
|
||||||
|
{$ENDIF}
|
||||||
FreeThenNil(FItems);
|
FreeThenNil(FItems);
|
||||||
FreeThenNil(fSortedItems);
|
FreeThenNil(fSortedItems);
|
||||||
inherited Destroy;
|
inherited Destroy;
|
||||||
|
@ -46,14 +46,21 @@ uses
|
|||||||
{$IFDEF WinIME}
|
{$IFDEF WinIME}
|
||||||
LazSynIMM,
|
LazSynIMM,
|
||||||
{$ENDIF}
|
{$ENDIF}
|
||||||
Classes, SysUtils, Controls, LCLProc, LCLType, Graphics, Menus, LazarusIDEStrConsts,
|
Classes, SysUtils,
|
||||||
|
// LCL
|
||||||
|
Controls, LCLProc, LCLType, Graphics, Menus,
|
||||||
|
// synedit
|
||||||
SynEdit, SynEditMiscClasses, SynGutter, SynGutterBase, SynEditMarks, SynEditTypes,
|
SynEdit, SynEditMiscClasses, SynGutter, SynGutterBase, SynEditMarks, SynEditTypes,
|
||||||
SynGutterLineNumber, SynGutterCodeFolding, SynGutterMarks, SynGutterChanges,
|
SynGutterLineNumber, SynGutterCodeFolding, SynGutterMarks, SynGutterChanges,
|
||||||
SynGutterLineOverview, SynEditMarkup, SynEditMarkupGutterMark, SynEditMarkupSpecialLine,
|
SynGutterLineOverview, SynEditMarkup, SynEditMarkupGutterMark, SynEditMarkupSpecialLine,
|
||||||
SynEditTextBuffer, SynEditFoldedView, SynTextDrawer, SynEditTextBase, LazSynEditText,
|
SynEditTextBuffer, SynEditFoldedView, SynTextDrawer, SynEditTextBase, LazSynEditText,
|
||||||
SynPluginTemplateEdit, SynPluginSyncroEdit, LazSynTextArea, SynEditHighlighter,
|
SynPluginTemplateEdit, SynPluginSyncroEdit, LazSynTextArea, SynEditHighlighter,
|
||||||
SynEditHighlighterFoldBase, SynHighlighterPas, SynEditMarkupHighAll, SynEditKeyCmds,
|
SynEditHighlighterFoldBase, SynHighlighterPas, SynEditMarkupHighAll, SynEditKeyCmds,
|
||||||
SynEditMarkupIfDef, SynEditMiscProcs;
|
SynEditMarkupIfDef, SynEditMiscProcs,
|
||||||
|
{$IFDEF EnableNewExtTools}
|
||||||
|
etSrcEditMarks,
|
||||||
|
{$ENDIF}
|
||||||
|
LazarusIDEStrConsts;
|
||||||
|
|
||||||
type
|
type
|
||||||
|
|
||||||
@ -2005,7 +2012,16 @@ procedure TIDESynGutterLOvProviderIDEMarks.AdjustColorForMark(AMark: TSynEditMar
|
|||||||
var AColor: TColor; var APriority: Integer);
|
var AColor: TColor; var APriority: Integer);
|
||||||
var
|
var
|
||||||
i: Integer;
|
i: Integer;
|
||||||
|
{$IFDEF EnableNewExtTools}
|
||||||
|
ETMark: TETMark;
|
||||||
|
{$ENDIF}
|
||||||
begin
|
begin
|
||||||
|
{$IFDEF EnableNewExtTools}
|
||||||
|
if (AMark is TETMark) then begin
|
||||||
|
ETMark:=TETMark(AMark);
|
||||||
|
AColor:=ETMark.SourceMarks.MarkStyles[ETMark.Urgency].Color;
|
||||||
|
end else begin
|
||||||
|
{$ENDIF}
|
||||||
inc(APriority, 1);
|
inc(APriority, 1);
|
||||||
if not AMark.IsBookmark then begin
|
if not AMark.IsBookmark then begin
|
||||||
//if (AMark.ImageList = SourceEditorMarks.ImgList) then begin
|
//if (AMark.ImageList = SourceEditorMarks.ImgList) then begin
|
||||||
@ -2030,11 +2046,9 @@ begin
|
|||||||
inc(APriority, 1);
|
inc(APriority, 1);
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
// else begin
|
{$IFDEF EnableNewExtTools}
|
||||||
// AColor := TColor(FRGBBreakColor);
|
end;
|
||||||
// inc(APriority);
|
{$ENDIF}
|
||||||
// end;
|
|
||||||
//end;
|
|
||||||
inherited AdjustColorForMark(AMark, AColor, APriority);
|
inherited AdjustColorForMark(AMark, AColor, APriority);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user