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