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+}
{$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);

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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