IDE: messages: update on source editor changes

git-svn-id: trunk@45255 -
This commit is contained in:
mattias 2014-05-31 11:41:54 +00:00
parent 61bddd2b7a
commit ed073ee911
7 changed files with 415 additions and 193 deletions

View File

@ -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);

View File

@ -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;

View File

@ -45,6 +45,8 @@ unit etQuickFixes;
{$mode objfpc}{$H+} {$mode objfpc}{$H+}
{$IFNDEF EnableNewExtTools}{$Error Wrong}{$ENDIF}
interface interface
uses uses

View File

@ -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;

View File

@ -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);

View File

@ -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;

View File

@ -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;