mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-06-18 00:08:27 +02:00
IDE: messages: icons showing quick fixes
git-svn-id: trunk@19428 -
This commit is contained in:
parent
9480593b9c
commit
3b3ee7ffbb
@ -17,7 +17,7 @@ inherited MessagesView: TMessagesView
|
|||||||
Top = 0
|
Top = 0
|
||||||
Width = 722
|
Width = 722
|
||||||
Align = alClient
|
Align = alClient
|
||||||
DefaultItemHeight = 15
|
DefaultItemHeight = 19
|
||||||
PopupMenu = MainPopupMenu
|
PopupMenu = MainPopupMenu
|
||||||
ReadOnly = True
|
ReadOnly = True
|
||||||
ScrollBars = ssAutoBoth
|
ScrollBars = ssAutoBoth
|
||||||
@ -28,7 +28,13 @@ inherited MessagesView: TMessagesView
|
|||||||
end
|
end
|
||||||
object MainPopupMenu: TPopupMenu[1]
|
object MainPopupMenu: TPopupMenu[1]
|
||||||
OnPopup = MainPopupMenuPopup
|
OnPopup = MainPopupMenuPopup
|
||||||
left = 46
|
left = 48
|
||||||
top = 41
|
top = 8
|
||||||
|
end
|
||||||
|
object IdleTimer1: TIdleTimer[2]
|
||||||
|
AutoEnabled = True
|
||||||
|
OnTimer = IdleTimer1Timer
|
||||||
|
left = 166
|
||||||
|
top = 8
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -7,11 +7,12 @@ LazarusResources.Add('TMessagesView','FORMDATA',[
|
|||||||
+'t'#2'O'#11'ClientWidth'#3#210#2#10'KeyPreview'#9#12'OnDeactivate'#7#14'Form'
|
+'t'#2'O'#11'ClientWidth'#3#210#2#10'KeyPreview'#9#12'OnDeactivate'#7#14'Form'
|
||||||
+'Deactivate'#9'OnKeyDown'#7#19'MessagesViewKeyDown'#0#242#2#0#9'TTreeView'#15
|
+'Deactivate'#9'OnKeyDown'#7#19'MessagesViewKeyDown'#0#242#2#0#9'TTreeView'#15
|
||||||
+'MessageTreeView'#4'Left'#2#0#6'Height'#2'O'#3'Top'#2#0#5'Width'#3#210#2#5'A'
|
+'MessageTreeView'#4'Left'#2#0#6'Height'#2'O'#3'Top'#2#0#5'Width'#3#210#2#5'A'
|
||||||
+'lign'#7#8'alClient'#17'DefaultItemHeight'#2#15#9'PopupMenu'#7#13'MainPopupM'
|
+'lign'#7#8'alClient'#17'DefaultItemHeight'#2#19#9'PopupMenu'#7#13'MainPopupM'
|
||||||
+'enu'#8'ReadOnly'#9#10'ScrollBars'#7#10'ssAutoBoth'#8'ShowRoot'#8#8'TabOrder'
|
+'enu'#8'ReadOnly'#9#10'ScrollBars'#7#10'ssAutoBoth'#8'ShowRoot'#8#8'TabOrder'
|
||||||
+#2#0#6'OnExit'#7#15'MessageViewExit'#7'Options'#11#19'tvoAllowMultiselect'#17
|
+#2#0#6'OnExit'#7#15'MessageViewExit'#7'Options'#11#19'tvoAllowMultiselect'#17
|
||||||
+'tvoAutoItemHeight'#16'tvoHideSelection'#21'tvoKeepCollapsedNodes'#11'tvoRea'
|
+'tvoAutoItemHeight'#16'tvoHideSelection'#21'tvoKeepCollapsedNodes'#11'tvoRea'
|
||||||
+'dOnly'#14'tvoShowButtons'#12'tvoShowLines'#11'tvoToolTips'#0#0#0#242#2#1#10
|
+'dOnly'#14'tvoShowButtons'#12'tvoShowLines'#11'tvoToolTips'#0#0#0#242#2#1#10
|
||||||
+'TPopupMenu'#13'MainPopupMenu'#7'OnPopup'#7#18'MainPopupMenuPopup'#4'left'#2
|
+'TPopupMenu'#13'MainPopupMenu'#7'OnPopup'#7#18'MainPopupMenuPopup'#4'left'#2
|
||||||
+'.'#3'top'#2')'#0#0#0
|
+'0'#3'top'#2#8#0#0#242#2#2#10'TIdleTimer'#10'IdleTimer1'#11'AutoEnabled'#9#7
|
||||||
|
+'OnTimer'#7#15'IdleTimer1Timer'#4'left'#3#166#0#3'top'#2#8#0#0#0
|
||||||
]);
|
]);
|
||||||
|
107
ide/msgview.pp
107
ide/msgview.pp
@ -41,13 +41,19 @@ interface
|
|||||||
uses
|
uses
|
||||||
Classes, SysUtils, AVL_Tree,
|
Classes, SysUtils, AVL_Tree,
|
||||||
LCLProc, LResources, LCLType, ClipBrd, Controls, Dialogs, FileUtil, Forms,
|
LCLProc, LResources, LCLType, ClipBrd, Controls, Dialogs, FileUtil, Forms,
|
||||||
Menus, StdCtrls, ComCtrls, LDockCtrl, Graphics,
|
Menus, ExtCtrls, StdCtrls, ComCtrls, LDockCtrl, Graphics,
|
||||||
IDEExternToolIntf, IDECommands, MenuIntf, IDEMsgIntf, LazIDEIntf,
|
CodeToolManager,
|
||||||
|
IDEImagesIntf, IDEExternToolIntf, IDECommands, MenuIntf, IDEMsgIntf, LazIDEIntf,
|
||||||
DialogProcs, EnvironmentOpts,
|
DialogProcs, EnvironmentOpts,
|
||||||
LazarusIDEStrConsts, IDEOptionDefs, IDEProcs, InputHistory, infobuild,
|
LazarusIDEStrConsts, IDEOptionDefs, IDEProcs, InputHistory, infobuild,
|
||||||
KeyMapping;
|
KeyMapping;
|
||||||
|
|
||||||
type
|
type
|
||||||
|
TLazMsgLineFlag = (
|
||||||
|
lmlfHasQuickFixValid,
|
||||||
|
lmlfHasQuickFix
|
||||||
|
);
|
||||||
|
TLazMsgLineFlags = set of TLazMsgLineFlag;
|
||||||
|
|
||||||
{ TLazMessageLine }
|
{ TLazMessageLine }
|
||||||
|
|
||||||
@ -55,6 +61,7 @@ type
|
|||||||
private
|
private
|
||||||
FColumn: integer;
|
FColumn: integer;
|
||||||
FFilename: string;
|
FFilename: string;
|
||||||
|
FFlags: TLazMsgLineFlags;
|
||||||
FLineNumber: integer;
|
FLineNumber: integer;
|
||||||
FNode: TAVLTreeNode;
|
FNode: TAVLTreeNode;
|
||||||
public
|
public
|
||||||
@ -63,11 +70,13 @@ type
|
|||||||
property Filename: string read FFilename write FFilename;
|
property Filename: string read FFilename write FFilename;
|
||||||
property LineNumber: integer read FLineNumber write FLineNumber;
|
property LineNumber: integer read FLineNumber write FLineNumber;
|
||||||
property Column: integer read FColumn write FColumn;
|
property Column: integer read FColumn write FColumn;
|
||||||
|
property Flags: TLazMsgLineFlags read FFlags write FFlags;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{ TMessagesView }
|
{ TMessagesView }
|
||||||
|
|
||||||
TMessagesView = class(TIDEMessagesWindowInterface)
|
TMessagesView = class(TIDEMessagesWindowInterface)
|
||||||
|
IdleTimer1: TIdleTimer;
|
||||||
MessageTreeView: TTreeView;
|
MessageTreeView: TTreeView;
|
||||||
MainPopupMenu: TPopupMenu;
|
MainPopupMenu: TPopupMenu;
|
||||||
procedure CopyAllMenuItemClick(Sender: TObject);
|
procedure CopyAllMenuItemClick(Sender: TObject);
|
||||||
@ -77,6 +86,7 @@ type
|
|||||||
procedure FormDeactivate(Sender: TObject);
|
procedure FormDeactivate(Sender: TObject);
|
||||||
procedure HelpMenuItemClick(Sender: TObject);
|
procedure HelpMenuItemClick(Sender: TObject);
|
||||||
procedure ClearMenuItemClick(Sender: TObject);
|
procedure ClearMenuItemClick(Sender: TObject);
|
||||||
|
procedure IdleTimer1Timer(Sender: TObject);
|
||||||
procedure MainPopupMenuPopup(Sender: TObject);
|
procedure MainPopupMenuPopup(Sender: TObject);
|
||||||
procedure MessageViewDblClicked(Sender: TObject);
|
procedure MessageViewDblClicked(Sender: TObject);
|
||||||
procedure MessageViewClicked(Sender: TObject);
|
procedure MessageViewClicked(Sender: TObject);
|
||||||
@ -102,15 +112,19 @@ type
|
|||||||
function GetVisibleItems(Index: integer): TLazMessageLine;
|
function GetVisibleItems(Index: integer): TLazMessageLine;
|
||||||
procedure SetLastLineIsProgress(const AValue: boolean);
|
procedure SetLastLineIsProgress(const AValue: boolean);
|
||||||
procedure DoSelectionChange;
|
procedure DoSelectionChange;
|
||||||
|
function UpdateMsgIcons: boolean; // true if complete
|
||||||
protected
|
protected
|
||||||
fBlockLevel: integer;
|
fBlockLevel: integer;
|
||||||
FLastSelectedIndex: integer;
|
FLastSelectedIndex: integer;
|
||||||
|
ImgIDNone: integer;
|
||||||
|
ImgIDHasQuickFix: integer;
|
||||||
function GetSelectedLineIndex: integer;
|
function GetSelectedLineIndex: integer;
|
||||||
procedure SetSelectedLineIndex(const AValue: integer);
|
procedure SetSelectedLineIndex(const AValue: integer);
|
||||||
function FindNextItem(const Filename: string;
|
function FindNextItem(const Filename: string;
|
||||||
FirstLine, LineCount: integer): TAVLTreeNode;
|
FirstLine, LineCount: integer): TAVLTreeNode;
|
||||||
procedure UpdateMsgSrcPos(Line: TLazMessageLine);
|
procedure UpdateMsgSrcPos(Line: TLazMessageLine);
|
||||||
function GetLines(Index: integer): TIDEMessageLine; override;
|
function GetLines(Index: integer): TIDEMessageLine; override;
|
||||||
|
procedure Changed;
|
||||||
public
|
public
|
||||||
ControlDocker: TLazControlDocker;
|
ControlDocker: TLazControlDocker;
|
||||||
constructor Create(TheOwner: TComponent); override;
|
constructor Create(TheOwner: TComponent); override;
|
||||||
@ -290,6 +304,10 @@ begin
|
|||||||
FSrcPositions := TAVLTree.Create(@CompareMsgSrcPositions);
|
FSrcPositions := TAVLTree.Create(@CompareMsgSrcPositions);
|
||||||
FLastSelectedIndex := -1;
|
FLastSelectedIndex := -1;
|
||||||
|
|
||||||
|
ImgIDNone := IDEImages.LoadImage(16, 'state_error');
|
||||||
|
ImgIDHasQuickFix := IDEImages.LoadImage(16, 'ce_function');
|
||||||
|
MessageTreeView.Images:=IDEImages.Images_16;
|
||||||
|
|
||||||
Caption := lisMenuViewMessages;
|
Caption := lisMenuViewMessages;
|
||||||
MessageTreeView.OnAdvancedCustomDrawItem := @MessageViewDrawItem;
|
MessageTreeView.OnAdvancedCustomDrawItem := @MessageViewDrawItem;
|
||||||
|
|
||||||
@ -315,8 +333,6 @@ begin
|
|||||||
{$IFDEF EnableIDEDocking}
|
{$IFDEF EnableIDEDocking}
|
||||||
ControlDocker.Manager:=LazarusIDE.DockingManager;
|
ControlDocker.Manager:=LazarusIDE.DockingManager;
|
||||||
{$ENDIF}
|
{$ENDIF}
|
||||||
|
|
||||||
FQuickFixItems:=TFPList.Create;
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
destructor TMessagesView.Destroy;
|
destructor TMessagesView.Destroy;
|
||||||
@ -376,6 +392,7 @@ begin
|
|||||||
Line.VisiblePosition:=Line.VisiblePosition-1;
|
Line.VisiblePosition:=Line.VisiblePosition-1;
|
||||||
end;
|
end;
|
||||||
//ConsistencyCheck;
|
//ConsistencyCheck;
|
||||||
|
Changed;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{------------------------------------------------------------------------------
|
{------------------------------------------------------------------------------
|
||||||
@ -388,6 +405,7 @@ var
|
|||||||
i: integer;
|
i: integer;
|
||||||
LastItem: TLazMessageLine;
|
LastItem: TLazMessageLine;
|
||||||
ToStoreMessage : Boolean;
|
ToStoreMessage : Boolean;
|
||||||
|
TVNode: TTreeNode;
|
||||||
begin
|
begin
|
||||||
ToStoreMessage := VisibleLine;
|
ToStoreMessage := VisibleLine;
|
||||||
//ConsistencyCheck;
|
//ConsistencyCheck;
|
||||||
@ -423,12 +441,15 @@ begin
|
|||||||
i := FVisibleItems.Count - 1;
|
i := FVisibleItems.Count - 1;
|
||||||
VisibleItems[i].VisiblePosition := -1;
|
VisibleItems[i].VisiblePosition := -1;
|
||||||
FVisibleItems.Delete(i);
|
FVisibleItems.Delete(i);
|
||||||
MessageTreeView.Items.TopLvlItems[i].Text := Msg;
|
TVNode:=MessageTreeView.Items.TopLvlItems[i];
|
||||||
|
TVNode.Text := Msg;
|
||||||
end
|
end
|
||||||
else begin
|
else begin
|
||||||
// add new line
|
// add new line
|
||||||
MessageTreeView.Items.Add(nil,Msg)// add line
|
TVNode:=MessageTreeView.Items.Add(nil,Msg);// add line
|
||||||
end;
|
end;
|
||||||
|
TVNode.ImageIndex:=ImgIDNone;
|
||||||
|
TVNode.SelectedIndex:=ImgIDNone;
|
||||||
NewMsg.VisiblePosition := FVisibleItems.Count;
|
NewMsg.VisiblePosition := FVisibleItems.Count;
|
||||||
FVisibleItems.Add(NewMsg);
|
FVisibleItems.Add(NewMsg);
|
||||||
FLastLineIsProgress := ProgressLine;
|
FLastLineIsProgress := ProgressLine;
|
||||||
@ -437,6 +458,7 @@ begin
|
|||||||
//DebugLn(['TMessagesView.Add ',MessageTreeView.TopIndex]);
|
//DebugLn(['TMessagesView.Add ',MessageTreeView.TopIndex]);
|
||||||
end;
|
end;
|
||||||
//ConsistencyCheck;
|
//ConsistencyCheck;
|
||||||
|
Changed;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TMessagesView.AddMsg(const Msg, CurDir: string; OriginalIndex: integer);
|
procedure TMessagesView.AddMsg(const Msg, CurDir: string; OriginalIndex: integer);
|
||||||
@ -589,6 +611,7 @@ var
|
|||||||
i: integer;
|
i: integer;
|
||||||
Line: TLazMessageLine;
|
Line: TLazMessageLine;
|
||||||
ShowLine: boolean;
|
ShowLine: boolean;
|
||||||
|
TVNode: TTreeNode;
|
||||||
begin
|
begin
|
||||||
// remove temporary lines
|
// remove temporary lines
|
||||||
ClearTillLastSeparator;
|
ClearTillLastSeparator;
|
||||||
@ -615,9 +638,15 @@ begin
|
|||||||
begin
|
begin
|
||||||
Line := VisibleItems[i];
|
Line := VisibleItems[i];
|
||||||
if MessageTreeView.Items.Count > i then
|
if MessageTreeView.Items.Count > i then
|
||||||
MessageTreeView.Items.TopLvlItems[i].Text := Line.Msg
|
begin
|
||||||
else
|
TVNode:=MessageTreeView.Items.TopLvlItems[i];
|
||||||
MessageTreeView.Items.Add(nil,Line.Msg);
|
TVNode.Text := Line.Msg;
|
||||||
|
end else
|
||||||
|
begin
|
||||||
|
TVNode:=MessageTreeView.Items.Add(nil,Line.Msg);
|
||||||
|
end;
|
||||||
|
TVNode.ImageIndex:=ImgIDNone;
|
||||||
|
TVNode.SelectedIndex:=ImgIDNone;
|
||||||
end;
|
end;
|
||||||
while MessageTreeView.Items.Count > FVisibleItems.Count do
|
while MessageTreeView.Items.Count > FVisibleItems.Count do
|
||||||
MessageTreeView.Items.TopLvlItems[MessageTreeView.Items.Count - 1].Free;
|
MessageTreeView.Items.TopLvlItems[MessageTreeView.Items.Count - 1].Free;
|
||||||
@ -899,6 +928,19 @@ begin
|
|||||||
Clear;
|
Clear;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure TMessagesView.IdleTimer1Timer(Sender: TObject);
|
||||||
|
begin
|
||||||
|
if UpdateMsgIcons then begin
|
||||||
|
// done
|
||||||
|
IdleTimer1.FireOnIdle:=false;
|
||||||
|
IdleTimer1.AutoEnabled:=false;
|
||||||
|
IdleTimer1.Enabled:=false;
|
||||||
|
exit;
|
||||||
|
end;
|
||||||
|
// not yet complete: next on idle
|
||||||
|
IdleTimer1.FireOnIdle:=true;
|
||||||
|
end;
|
||||||
|
|
||||||
procedure TMessagesView.MainPopupMenuPopup(Sender: TObject);
|
procedure TMessagesView.MainPopupMenuPopup(Sender: TObject);
|
||||||
var
|
var
|
||||||
i: LongInt;
|
i: LongInt;
|
||||||
@ -976,6 +1018,7 @@ const
|
|||||||
|
|
||||||
begin
|
begin
|
||||||
if Stage<>cdPostPaint then exit;
|
if Stage<>cdPostPaint then exit;
|
||||||
|
Changed;
|
||||||
|
|
||||||
//DebugLn(['TMessagesView.MessageViewDrawItem Index=',Node.Index,' Count=',MessageTreeView.Items.Count,' TheText="',TheText,'"']);
|
//DebugLn(['TMessagesView.MessageViewDrawItem Index=',Node.Index,' Count=',MessageTreeView.Items.Count,' TheText="',TheText,'"']);
|
||||||
|
|
||||||
@ -1090,6 +1133,47 @@ begin
|
|||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
function TMessagesView.UpdateMsgIcons: boolean;
|
||||||
|
var
|
||||||
|
TVNode: TTreeNode;
|
||||||
|
Index: LongInt;
|
||||||
|
Msg: TLazMessageLine;
|
||||||
|
i: Integer;
|
||||||
|
QuickFixItem: TIDEMsgQuickFixItem;
|
||||||
|
begin
|
||||||
|
//debugln(['TMessagesView.UpdateMsgIcons START']);
|
||||||
|
Result:=true;
|
||||||
|
TVNode:=MessageTreeView.TopItem;
|
||||||
|
while TVNode<>nil do begin
|
||||||
|
Index:=TVNode.AbsoluteIndex;
|
||||||
|
if Index<VisibleItemCount then begin
|
||||||
|
Msg:=VisibleItems[Index];
|
||||||
|
if not (lmlfHasQuickFixValid in Msg.Flags) then begin
|
||||||
|
//debugln(['TMessagesView.UpdateMsgIcons ',Msg.Msg]);
|
||||||
|
Msg.Flags:=Msg.Flags+[lmlfHasQuickFixValid];
|
||||||
|
CodeToolBoss.ActivateWriteLock;
|
||||||
|
try
|
||||||
|
for i:=0 to IDEMsgQuickFixes.Count-1 do begin
|
||||||
|
QuickFixItem:=IDEMsgQuickFixes[i];
|
||||||
|
//debugln(['TMessagesView.UpdateMsgIcons ',QuickFixItem.Name]);
|
||||||
|
if (imqfoMenuItem in QuickFixItem.Steps)
|
||||||
|
and QuickFixItem.IsApplicable(Msg) then begin
|
||||||
|
Msg.Flags:=Msg.Flags+[lmlfHasQuickFix];
|
||||||
|
TVNode.ImageIndex:=ImgIDHasQuickFix;
|
||||||
|
TVNode.SelectedIndex:=ImgIDHasQuickFix;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
finally
|
||||||
|
CodeToolBoss.DeactivateWriteLock;
|
||||||
|
end;
|
||||||
|
// next on idle
|
||||||
|
exit(false);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
TVNode:=TVNode.GetNextVisible;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
procedure TMessagesView.SetSelectedLineIndex(const AValue: integer);
|
procedure TMessagesView.SetSelectedLineIndex(const AValue: integer);
|
||||||
begin
|
begin
|
||||||
if AValue>=0 then begin
|
if AValue>=0 then begin
|
||||||
@ -1115,6 +1199,11 @@ begin
|
|||||||
Result:=Items[Index];
|
Result:=Items[Index];
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure TMessagesView.Changed;
|
||||||
|
begin
|
||||||
|
IdleTimer1.AutoEnabled:=true;
|
||||||
|
end;
|
||||||
|
|
||||||
procedure TMessagesView.ConsistencyCheck;
|
procedure TMessagesView.ConsistencyCheck;
|
||||||
var
|
var
|
||||||
i: Integer;
|
i: Integer;
|
||||||
|
Loading…
Reference in New Issue
Block a user