From ed073ee911478ece6992fee841c99fdfa88b3e6a Mon Sep 17 00:00:00 2001 From: mattias Date: Sat, 31 May 2014 11:41:54 +0000 Subject: [PATCH] IDE: messages: update on source editor changes git-svn-id: trunk@45255 - --- ide/etmessageframe.pas | 41 ++++-- ide/etmessageswnd.pas | 35 +---- ide/etquickfixes.pas | 2 + ide/etsrceditmarks.pas | 308 +++++++++++++++++++++++++--------------- ide/sourceeditor.pp | 141 ++++++++++++++---- ide/sourcemarks.pas | 47 +++++- ide/sourcesyneditor.pas | 34 +++-- 7 files changed, 415 insertions(+), 193 deletions(-) diff --git a/ide/etmessageframe.pas b/ide/etmessageframe.pas index aa3ba3216b..7fc0b7cf4c 100644 --- a/ide/etmessageframe.pas +++ b/ide/etmessageframe.pas @@ -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); diff --git a/ide/etmessageswnd.pas b/ide/etmessageswnd.pas index 51144fc5f3..5dab98bf53 100644 --- a/ide/etmessageswnd.pas +++ b/ide/etmessageswnd.pas @@ -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; diff --git a/ide/etquickfixes.pas b/ide/etquickfixes.pas index a477482c14..2adfc571e0 100644 --- a/ide/etquickfixes.pas +++ b/ide/etquickfixes.pas @@ -45,6 +45,8 @@ unit etQuickFixes; {$mode objfpc}{$H+} +{$IFNDEF EnableNewExtTools}{$Error Wrong}{$ENDIF} + interface uses diff --git a/ide/etsrceditmarks.pas b/ide/etsrceditmarks.pas index bf3490e96d..3f6f1cb514 100644 --- a/ide/etsrceditmarks.pas +++ b/ide/etsrceditmarks.pas @@ -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; diff --git a/ide/sourceeditor.pp b/ide/sourceeditor.pp index dfa34eb2d7..6fb800e1bd 100644 --- a/ide/sourceeditor.pp +++ b/ide/sourceeditor.pp @@ -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); diff --git a/ide/sourcemarks.pas b/ide/sourcemarks.pas index ecc0e1d46d..8589d39088 100644 --- a/ide/sourcemarks.pas +++ b/ide/sourcemarks.pas @@ -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; diff --git a/ide/sourcesyneditor.pas b/ide/sourcesyneditor.pas index 1c9c7b48e6..05691e4457 100644 --- a/ide/sourcesyneditor.pas +++ b/ide/sourcesyneditor.pas @@ -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;