IDE: messages: icons showing quick fixes

git-svn-id: trunk@19428 -
This commit is contained in:
mattias 2009-04-14 16:19:53 +00:00
parent 9480593b9c
commit 3b3ee7ffbb
3 changed files with 110 additions and 14 deletions

View File

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

View File

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

View File

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