mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-05-30 03:22:48 +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
|
||||
Width = 722
|
||||
Align = alClient
|
||||
DefaultItemHeight = 15
|
||||
DefaultItemHeight = 19
|
||||
PopupMenu = MainPopupMenu
|
||||
ReadOnly = True
|
||||
ScrollBars = ssAutoBoth
|
||||
@ -28,7 +28,13 @@ inherited MessagesView: TMessagesView
|
||||
end
|
||||
object MainPopupMenu: TPopupMenu[1]
|
||||
OnPopup = MainPopupMenuPopup
|
||||
left = 46
|
||||
top = 41
|
||||
left = 48
|
||||
top = 8
|
||||
end
|
||||
object IdleTimer1: TIdleTimer[2]
|
||||
AutoEnabled = True
|
||||
OnTimer = IdleTimer1Timer
|
||||
left = 166
|
||||
top = 8
|
||||
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'
|
||||
+'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'
|
||||
+'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'
|
||||
+#2#0#6'OnExit'#7#15'MessageViewExit'#7'Options'#11#19'tvoAllowMultiselect'#17
|
||||
+'tvoAutoItemHeight'#16'tvoHideSelection'#21'tvoKeepCollapsedNodes'#11'tvoRea'
|
||||
+'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
|
||||
+'.'#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
|
||||
Classes, SysUtils, AVL_Tree,
|
||||
LCLProc, LResources, LCLType, ClipBrd, Controls, Dialogs, FileUtil, Forms,
|
||||
Menus, StdCtrls, ComCtrls, LDockCtrl, Graphics,
|
||||
IDEExternToolIntf, IDECommands, MenuIntf, IDEMsgIntf, LazIDEIntf,
|
||||
Menus, ExtCtrls, StdCtrls, ComCtrls, LDockCtrl, Graphics,
|
||||
CodeToolManager,
|
||||
IDEImagesIntf, IDEExternToolIntf, IDECommands, MenuIntf, IDEMsgIntf, LazIDEIntf,
|
||||
DialogProcs, EnvironmentOpts,
|
||||
LazarusIDEStrConsts, IDEOptionDefs, IDEProcs, InputHistory, infobuild,
|
||||
KeyMapping;
|
||||
|
||||
type
|
||||
TLazMsgLineFlag = (
|
||||
lmlfHasQuickFixValid,
|
||||
lmlfHasQuickFix
|
||||
);
|
||||
TLazMsgLineFlags = set of TLazMsgLineFlag;
|
||||
|
||||
{ TLazMessageLine }
|
||||
|
||||
@ -55,6 +61,7 @@ type
|
||||
private
|
||||
FColumn: integer;
|
||||
FFilename: string;
|
||||
FFlags: TLazMsgLineFlags;
|
||||
FLineNumber: integer;
|
||||
FNode: TAVLTreeNode;
|
||||
public
|
||||
@ -63,11 +70,13 @@ type
|
||||
property Filename: string read FFilename write FFilename;
|
||||
property LineNumber: integer read FLineNumber write FLineNumber;
|
||||
property Column: integer read FColumn write FColumn;
|
||||
property Flags: TLazMsgLineFlags read FFlags write FFlags;
|
||||
end;
|
||||
|
||||
{ TMessagesView }
|
||||
|
||||
TMessagesView = class(TIDEMessagesWindowInterface)
|
||||
IdleTimer1: TIdleTimer;
|
||||
MessageTreeView: TTreeView;
|
||||
MainPopupMenu: TPopupMenu;
|
||||
procedure CopyAllMenuItemClick(Sender: TObject);
|
||||
@ -77,6 +86,7 @@ type
|
||||
procedure FormDeactivate(Sender: TObject);
|
||||
procedure HelpMenuItemClick(Sender: TObject);
|
||||
procedure ClearMenuItemClick(Sender: TObject);
|
||||
procedure IdleTimer1Timer(Sender: TObject);
|
||||
procedure MainPopupMenuPopup(Sender: TObject);
|
||||
procedure MessageViewDblClicked(Sender: TObject);
|
||||
procedure MessageViewClicked(Sender: TObject);
|
||||
@ -102,15 +112,19 @@ type
|
||||
function GetVisibleItems(Index: integer): TLazMessageLine;
|
||||
procedure SetLastLineIsProgress(const AValue: boolean);
|
||||
procedure DoSelectionChange;
|
||||
function UpdateMsgIcons: boolean; // true if complete
|
||||
protected
|
||||
fBlockLevel: integer;
|
||||
FLastSelectedIndex: integer;
|
||||
ImgIDNone: integer;
|
||||
ImgIDHasQuickFix: integer;
|
||||
function GetSelectedLineIndex: integer;
|
||||
procedure SetSelectedLineIndex(const AValue: integer);
|
||||
function FindNextItem(const Filename: string;
|
||||
FirstLine, LineCount: integer): TAVLTreeNode;
|
||||
procedure UpdateMsgSrcPos(Line: TLazMessageLine);
|
||||
function GetLines(Index: integer): TIDEMessageLine; override;
|
||||
procedure Changed;
|
||||
public
|
||||
ControlDocker: TLazControlDocker;
|
||||
constructor Create(TheOwner: TComponent); override;
|
||||
@ -290,6 +304,10 @@ begin
|
||||
FSrcPositions := TAVLTree.Create(@CompareMsgSrcPositions);
|
||||
FLastSelectedIndex := -1;
|
||||
|
||||
ImgIDNone := IDEImages.LoadImage(16, 'state_error');
|
||||
ImgIDHasQuickFix := IDEImages.LoadImage(16, 'ce_function');
|
||||
MessageTreeView.Images:=IDEImages.Images_16;
|
||||
|
||||
Caption := lisMenuViewMessages;
|
||||
MessageTreeView.OnAdvancedCustomDrawItem := @MessageViewDrawItem;
|
||||
|
||||
@ -315,8 +333,6 @@ begin
|
||||
{$IFDEF EnableIDEDocking}
|
||||
ControlDocker.Manager:=LazarusIDE.DockingManager;
|
||||
{$ENDIF}
|
||||
|
||||
FQuickFixItems:=TFPList.Create;
|
||||
end;
|
||||
|
||||
destructor TMessagesView.Destroy;
|
||||
@ -376,6 +392,7 @@ begin
|
||||
Line.VisiblePosition:=Line.VisiblePosition-1;
|
||||
end;
|
||||
//ConsistencyCheck;
|
||||
Changed;
|
||||
end;
|
||||
|
||||
{------------------------------------------------------------------------------
|
||||
@ -388,6 +405,7 @@ var
|
||||
i: integer;
|
||||
LastItem: TLazMessageLine;
|
||||
ToStoreMessage : Boolean;
|
||||
TVNode: TTreeNode;
|
||||
begin
|
||||
ToStoreMessage := VisibleLine;
|
||||
//ConsistencyCheck;
|
||||
@ -423,12 +441,15 @@ begin
|
||||
i := FVisibleItems.Count - 1;
|
||||
VisibleItems[i].VisiblePosition := -1;
|
||||
FVisibleItems.Delete(i);
|
||||
MessageTreeView.Items.TopLvlItems[i].Text := Msg;
|
||||
TVNode:=MessageTreeView.Items.TopLvlItems[i];
|
||||
TVNode.Text := Msg;
|
||||
end
|
||||
else begin
|
||||
// add new line
|
||||
MessageTreeView.Items.Add(nil,Msg)// add line
|
||||
TVNode:=MessageTreeView.Items.Add(nil,Msg);// add line
|
||||
end;
|
||||
TVNode.ImageIndex:=ImgIDNone;
|
||||
TVNode.SelectedIndex:=ImgIDNone;
|
||||
NewMsg.VisiblePosition := FVisibleItems.Count;
|
||||
FVisibleItems.Add(NewMsg);
|
||||
FLastLineIsProgress := ProgressLine;
|
||||
@ -437,6 +458,7 @@ begin
|
||||
//DebugLn(['TMessagesView.Add ',MessageTreeView.TopIndex]);
|
||||
end;
|
||||
//ConsistencyCheck;
|
||||
Changed;
|
||||
end;
|
||||
|
||||
procedure TMessagesView.AddMsg(const Msg, CurDir: string; OriginalIndex: integer);
|
||||
@ -589,6 +611,7 @@ var
|
||||
i: integer;
|
||||
Line: TLazMessageLine;
|
||||
ShowLine: boolean;
|
||||
TVNode: TTreeNode;
|
||||
begin
|
||||
// remove temporary lines
|
||||
ClearTillLastSeparator;
|
||||
@ -615,9 +638,15 @@ begin
|
||||
begin
|
||||
Line := VisibleItems[i];
|
||||
if MessageTreeView.Items.Count > i then
|
||||
MessageTreeView.Items.TopLvlItems[i].Text := Line.Msg
|
||||
else
|
||||
MessageTreeView.Items.Add(nil,Line.Msg);
|
||||
begin
|
||||
TVNode:=MessageTreeView.Items.TopLvlItems[i];
|
||||
TVNode.Text := Line.Msg;
|
||||
end else
|
||||
begin
|
||||
TVNode:=MessageTreeView.Items.Add(nil,Line.Msg);
|
||||
end;
|
||||
TVNode.ImageIndex:=ImgIDNone;
|
||||
TVNode.SelectedIndex:=ImgIDNone;
|
||||
end;
|
||||
while MessageTreeView.Items.Count > FVisibleItems.Count do
|
||||
MessageTreeView.Items.TopLvlItems[MessageTreeView.Items.Count - 1].Free;
|
||||
@ -899,6 +928,19 @@ begin
|
||||
Clear;
|
||||
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);
|
||||
var
|
||||
i: LongInt;
|
||||
@ -976,6 +1018,7 @@ const
|
||||
|
||||
begin
|
||||
if Stage<>cdPostPaint then exit;
|
||||
Changed;
|
||||
|
||||
//DebugLn(['TMessagesView.MessageViewDrawItem Index=',Node.Index,' Count=',MessageTreeView.Items.Count,' TheText="',TheText,'"']);
|
||||
|
||||
@ -1090,6 +1133,47 @@ begin
|
||||
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);
|
||||
begin
|
||||
if AValue>=0 then begin
|
||||
@ -1115,6 +1199,11 @@ begin
|
||||
Result:=Items[Index];
|
||||
end;
|
||||
|
||||
procedure TMessagesView.Changed;
|
||||
begin
|
||||
IdleTimer1.AutoEnabled:=true;
|
||||
end;
|
||||
|
||||
procedure TMessagesView.ConsistencyCheck;
|
||||
var
|
||||
i: Integer;
|
||||
|
Loading…
Reference in New Issue
Block a user