IDE: use TreeView also for flat component list. Allows use of one FilterEdit for all views. Improve interaction with comp palette.

git-svn-id: trunk@41880 -
This commit is contained in:
juha 2013-06-24 17:54:47 +00:00
parent 2ec180ab41
commit 52a80e24b4
2 changed files with 54 additions and 121 deletions

View File

@ -3,7 +3,6 @@ object ComponentListForm: TComponentListForm
Height = 467 Height = 467
Top = 40 Top = 40
Width = 300 Width = 300
ActiveControl = ListFilterEd
Caption = 'Components' Caption = 'Components'
ClientHeight = 467 ClientHeight = 467
ClientWidth = 300 ClientWidth = 300
@ -44,22 +43,18 @@ object ComponentListForm: TComponentListForm
ClientHeight = 366 ClientHeight = 366
ClientWidth = 294 ClientWidth = 294
TabOrder = 0 TabOrder = 0
object ComponentsListbox: TListBox object ListTree: TTreeView
Left = 2 Left = 2
Height = 362 Height = 362
Top = 2 Top = 2
Width = 290 Width = 290
Align = alClient Align = alClient
ItemHeight = 0 DefaultItemHeight = 18
OnClick = ComponentsClick
OnDblClick = ComponentsDblClick
OnDrawItem = ComponentsListboxDrawItem
OnKeyDown = ComponentsListboxKeyDown
ScrollWidth = 286
Sorted = True
Style = lbOwnerDrawFixed
TabOrder = 0 TabOrder = 0
TopIndex = -1 OnClick = ComponentsClick
OnCustomDrawItem = TreeCustomDrawItem
OnDblClick = ComponentsDblClick
OnKeyDown = TreeKeyDown
end end
end end
end end
@ -87,9 +82,10 @@ object ComponentListForm: TComponentListForm
ReadOnly = True ReadOnly = True
ShowLines = False ShowLines = False
TabOrder = 0 TabOrder = 0
OnClick = ComponentsClick
OnCustomDrawItem = TreeCustomDrawItem OnCustomDrawItem = TreeCustomDrawItem
OnDblClick = ComponentsDblClick OnDblClick = ComponentsDblClick
OnKeyDown = PalletteTreeKeyDown OnKeyDown = TreeKeyDown
Options = [tvoHideSelection, tvoKeepCollapsedNodes, tvoReadOnly, tvoShowButtons, tvoShowRoot, tvoToolTips, tvoNoDoubleClickExpand, tvoThemedDraw] Options = [tvoHideSelection, tvoKeepCollapsedNodes, tvoReadOnly, tvoShowButtons, tvoShowRoot, tvoToolTips, tvoNoDoubleClickExpand, tvoThemedDraw]
end end
end end
@ -117,9 +113,10 @@ object ComponentListForm: TComponentListForm
Align = alClient Align = alClient
ReadOnly = True ReadOnly = True
TabOrder = 0 TabOrder = 0
OnClick = ComponentsClick
OnCustomDrawItem = TreeCustomDrawItem OnCustomDrawItem = TreeCustomDrawItem
OnDblClick = ComponentsDblClick OnDblClick = ComponentsDblClick
OnKeyDown = InheritanceTreeKeyDown OnKeyDown = TreeKeyDown
Options = [tvoHideSelection, tvoKeepCollapsedNodes, tvoReadOnly, tvoShowButtons, tvoShowLines, tvoShowRoot, tvoToolTips, tvoNoDoubleClickExpand, tvoThemedDraw] Options = [tvoHideSelection, tvoKeepCollapsedNodes, tvoReadOnly, tvoShowButtons, tvoShowLines, tvoShowRoot, tvoToolTips, tvoNoDoubleClickExpand, tvoThemedDraw]
end end
end end
@ -148,25 +145,6 @@ object ComponentListForm: TComponentListForm
Caption = 'LabelSearch' Caption = 'LabelSearch'
ParentColor = False ParentColor = False
end end
object ListFilterEd: TListFilterEdit
AnchorSideLeft.Control = LabelSearch
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = LabelSearch
AnchorSideTop.Side = asrCenter
Left = 82
Height = 24
Top = 2
Width = 169
UseFormActivate = True
ButtonWidth = 23
NumGlyphs = 1
BorderSpacing.Left = 5
Font.Color = clBtnShadow
MaxLength = 0
ParentFont = False
TabOrder = 0
FilteredListbox = ComponentsListbox
end
object TreeFilterEd: TTreeFilterEdit object TreeFilterEd: TTreeFilterEdit
AnchorSideLeft.Control = LabelSearch AnchorSideLeft.Control = LabelSearch
AnchorSideLeft.Side = asrBottom AnchorSideLeft.Side = asrBottom
@ -181,7 +159,8 @@ object ComponentListForm: TComponentListForm
Anchors = [akTop, akLeft, akRight] Anchors = [akTop, akLeft, akRight]
BorderSpacing.Left = 5 BorderSpacing.Left = 5
MaxLength = 0 MaxLength = 0
TabOrder = 1 TabOrder = 0
FilteredTreeview = ListTree
end end
end end
object ButtonPanel: TPanel object ButtonPanel: TPanel

View File

@ -43,11 +43,10 @@ type
{ TComponentListForm } { TComponentListForm }
TComponentListForm = class(TForm) TComponentListForm = class(TForm)
ListTree: TTreeView;
UseAndCloseButton: TBitBtn; UseAndCloseButton: TBitBtn;
ButtonPanel: TPanel; ButtonPanel: TPanel;
LabelSearch: TLabel; LabelSearch: TLabel;
ComponentsListbox: TListBox;
ListFilterEd: TListFilterEdit;
PageControl: TPageControl; PageControl: TPageControl;
Panel3: TPanel; Panel3: TPanel;
Panel5: TPanel; Panel5: TPanel;
@ -63,20 +62,19 @@ type
procedure UseAndCloseButtonClick(Sender: TObject); procedure UseAndCloseButtonClick(Sender: TObject);
procedure ComponentsDblClick(Sender: TObject); procedure ComponentsDblClick(Sender: TObject);
procedure ComponentsClick(Sender: TObject); procedure ComponentsClick(Sender: TObject);
procedure ComponentsListboxDrawItem(Control: TWinControl; Index: Integer; //procedure ComponentsListboxDrawItem(Control: TWinControl; Index: Integer;
ARect: TRect; State: TOwnerDrawState); // ARect: TRect; State: TOwnerDrawState);
procedure FormClose(Sender: TObject; var CloseAction: TCloseAction); procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);
procedure TreeCustomDrawItem(Sender: TCustomTreeView; procedure TreeCustomDrawItem(Sender: TCustomTreeView;
Node: TTreeNode; State: TCustomDrawState; var DefaultDraw: Boolean); Node: TTreeNode; State: TCustomDrawState; var DefaultDraw: Boolean);
procedure ComponentsListboxKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
procedure InheritanceTreeKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
procedure PageControlChange(Sender: TObject); procedure PageControlChange(Sender: TObject);
procedure PalletteTreeKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); procedure TreeKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
procedure UpdateComponentSelection(Sender: TObject); procedure UpdateComponentSelection(Sender: TObject);
procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
private private
PrevPageIndex: Integer; PrevPageIndex: Integer;
FComponentList: TRegisteredCompList; FComponentList: TRegisteredCompList;
FKeepSelected: Boolean;
procedure ClearSelection; procedure ClearSelection;
procedure ComponentWasAdded; procedure ComponentWasAdded;
procedure FindAllLazarusComponents; procedure FindAllLazarusComponents;
@ -101,11 +99,11 @@ begin
inherited Create(AOwner); inherited Create(AOwner);
FComponentList := TRegisteredCompList.Create; FComponentList := TRegisteredCompList.Create;
UseAndCloseButton.Caption := lisUseAndClose; UseAndCloseButton.Caption := lisUseAndClose;
ComponentsListBox.ItemHeight := ComponentPaletteImageHeight + 1; ListTree.DefaultItemHeight := ComponentPaletteImageHeight + 1;
InheritanceTree.DefaultItemHeight:= ComponentPaletteImageHeight + 1; InheritanceTree.DefaultItemHeight:= ComponentPaletteImageHeight + 1;
PalletteTree.DefaultItemHeight := ComponentPaletteImageHeight + 1; PalletteTree.DefaultItemHeight := ComponentPaletteImageHeight + 1;
//Translations.. //Translations
LabelSearch.Caption := lisMenuFind; LabelSearch.Caption := lisMenuFind;
Caption := lisCmpLstComponents; Caption := lisCmpLstComponents;
TabSheetListBox.Caption := lisCmpLstList; TabSheetListBox.Caption := lisCmpLstList;
@ -115,11 +113,9 @@ begin
//PLEASE add a defaultpage property in TPagecontrol //PLEASE add a defaultpage property in TPagecontrol
PrevPageIndex := -1; PrevPageIndex := -1;
PageControl.ActivePage := TabSheetListBox; PageControl.ActivePage := TabSheetListBox;
TreeFilterEd.Visible := False;
FindAllLazarusComponents; FindAllLazarusComponents;
UpdateComponentSelection(nil); UpdateComponentSelection(nil);
ListFilterEd.InvalidateFilter; TreeFilterEd.InvalidateFilter;
IDEComponentPalette.AddHandlerComponentAdded(@ComponentWasAdded); IDEComponentPalette.AddHandlerComponentAdded(@ComponentWasAdded);
end; end;
@ -139,26 +135,18 @@ end;
procedure TComponentListForm.ClearSelection; procedure TComponentListForm.ClearSelection;
begin begin
if ComponentsListbox.IsVisible then ListTree.Selected := Nil;
ComponentsListbox.ItemIndex := -1 PalletteTree.Selected := Nil;
else if PalletteTree.IsVisible then
PalletteTree.Selected := Nil
else if InheritanceTree.IsVisible then
InheritanceTree.Selected := Nil; InheritanceTree.Selected := Nil;
end; end;
function TComponentListForm.GetSelectedComponent: TRegisteredComponent; function TComponentListForm.GetSelectedComponent: TRegisteredComponent;
var
i: Integer;
begin begin
Result:=nil; Result:=nil;
if ComponentsListbox.IsVisible then if ListTree.IsVisible then
begin begin
i := ComponentsListbox.ItemIndex; if Assigned(ListTree.Selected) then
if i>=0 then begin Result := TRegisteredComponent(ListTree.Selected.Data);
Result := TRegisteredComponent(ComponentsListbox.Items.Objects[i]);
DebugLn(['*** Getting component ', Result.ComponentClass.ClassName, ' from index ', i]);
end;
end end
else if PalletteTree.IsVisible then else if PalletteTree.IsVisible then
begin begin
@ -211,7 +199,7 @@ procedure TComponentListForm.UpdateComponentSelection(Sender: TObject);
var var
AComponent: TRegisteredComponent; AComponent: TRegisteredComponent;
AClassName: string; AClassName: string;
AClassList, List: TStringlist; AClassList, List: TStringList;
i, j, AIndex: Integer; i, j, AIndex: Integer;
ANode: TTreeNode; ANode: TTreeNode;
AClass: TClass; AClass: TClass;
@ -219,18 +207,18 @@ begin
if [csDestroying,csLoading]*ComponentState<>[] then exit; if [csDestroying,csLoading]*ComponentState<>[] then exit;
Screen.Cursor := crHourGlass; Screen.Cursor := crHourGlass;
try try
//First tabsheet (ComponentsListbox) //First tabsheet (List)
ComponentsListbox.Items.BeginUpdate; ListTree.BeginUpdate;
try try
ComponentsListbox.Items.Clear; ListTree.Items.Clear;
for i := 0 to FComponentList.Count-1 do for i := 0 to FComponentList.Count-1 do
begin begin
AComponent := FComponentList[i]; AComponent := FComponentList[i];
AClassName := AComponent.ComponentClass.ClassName; AClassName := AComponent.ComponentClass.ClassName;
ListFilterEd.Items.AddObject(AClassName, AComponent); ANode := ListTree.Items.AddChildObject(Nil, AClassName, AComponent);
end; end;
finally finally
ComponentsListbox.Items.EndUpdate; ListTree.EndUpdate;
end; end;
//Second tabsheet (palette layout) //Second tabsheet (palette layout)
@ -254,8 +242,8 @@ begin
end; end;
//Third tabsheet (component inheritence) //Third tabsheet (component inheritence)
List := TStringlist.Create; List := TStringList.Create;
AClassList := TStringlist.Create; AClassList := TStringList.Create;
InheritanceTree.Items.BeginUpdate; InheritanceTree.Items.BeginUpdate;
try try
InheritanceTree.Items.Clear; InheritanceTree.Items.Clear;
@ -306,7 +294,7 @@ begin
Screen.Cursor := crDefault; Screen.Cursor := crDefault;
end; end;
end; end;
{
procedure TComponentListForm.ComponentsListboxDrawItem(Control: TWinControl; procedure TComponentListForm.ComponentsListboxDrawItem(Control: TWinControl;
Index: Integer; ARect: TRect; State: TOwnerDrawState); Index: Integer; ARect: TRect; State: TOwnerDrawState);
var var
@ -337,7 +325,7 @@ begin
ARect.Top+(ARect.Bottom-ARect.Top-TxtH) div 2, CurStr); ARect.Top+(ARect.Bottom-ARect.Top-TxtH) div 2, CurStr);
end; end;
end; end;
}
procedure TComponentListForm.TreeCustomDrawItem(Sender: TCustomTreeView; procedure TComponentListForm.TreeCustomDrawItem(Sender: TCustomTreeView;
Node: TTreeNode; State: TCustomDrawState; var DefaultDraw: Boolean); Node: TTreeNode; State: TCustomDrawState; var DefaultDraw: Boolean);
var var
@ -384,13 +372,13 @@ begin
end; end;
procedure TComponentListForm.ComponentsDblClick(Sender: TObject); procedure TComponentListForm.ComponentsDblClick(Sender: TObject);
// This is used for all 3 lists / treeviews // This is used for all 3 treeviews
begin begin
UseAndCloseButtonClick(nil); // Select and close this form UseAndCloseButtonClick(nil); // Select and close this form
end; end;
procedure TComponentListForm.ComponentsClick(Sender: TObject); procedure TComponentListForm.ComponentsClick(Sender: TObject);
// This is used for all 3 lists / treeviews // This is used for all 3 treeviews
var var
AComponent: TRegisteredComponent; AComponent: TRegisteredComponent;
begin begin
@ -400,22 +388,7 @@ begin
UpdateButtonState; UpdateButtonState;
end; end;
procedure TComponentListForm.ComponentsListboxKeyDown(Sender: TObject; procedure TComponentListForm.TreeKeyDown(Sender: TObject;
var Key: Word; Shift: TShiftState);
begin
if Key = VK_RETURN then
if (ComponentsListbox.ItemIndex >= 0) then
ComponentsDblClick(Sender);
end;
procedure TComponentListForm.PalletteTreeKeyDown(Sender: TObject;
var Key: Word; Shift: TShiftState);
begin
if Key = VK_RETURN then
ComponentsDblClick(Sender);
end;
procedure TComponentListForm.InheritanceTreeKeyDown(Sender: TObject;
var Key: Word; Shift: TShiftState); var Key: Word; Shift: TShiftState);
begin begin
if Key = VK_RETURN then if Key = VK_RETURN then
@ -428,41 +401,23 @@ begin
'TComponentListForm.PageControlChange: PageControl.PageIndex = PrevPageIndex = %d', 'TComponentListForm.PageControlChange: PageControl.PageIndex = PrevPageIndex = %d',
[PrevPageIndex])); [PrevPageIndex]));
case PageControl.PageIndex of case PageControl.PageIndex of
0: begin 0: TreeFilterEd.FilteredTreeview := ListTree;
ListFilterEd.Visible := True; 1: TreeFilterEd.FilteredTreeview := PalletteTree;
ListFilterEd.SetFocus; 2: TreeFilterEd.FilteredTreeview := InheritanceTree;
if PrevPageIndex > 0 then
ListFilterEd.Text := TreeFilterEd.Text;
ListFilterEd.InvalidateFilter;
TreeFilterEd.Visible := False;
end; end;
1: begin
TreeFilterEd.Visible := True;
TreeFilterEd.FilteredTreeview := PalletteTree;
TreeFilterEd.SetFocus;
if PrevPageIndex <= 0 then
TreeFilterEd.Text := ListFilterEd.Text;
TreeFilterEd.InvalidateFilter; TreeFilterEd.InvalidateFilter;
ListFilterEd.Visible := False;
end;
2: begin
TreeFilterEd.Visible := True;
TreeFilterEd.FilteredTreeview := InheritanceTree;
TreeFilterEd.SetFocus;
if PrevPageIndex <= 0 then
TreeFilterEd.Text := ListFilterEd.Text;
TreeFilterEd.InvalidateFilter;
ListFilterEd.Visible := False;
end;
end;
PrevPageIndex := PageControl.PageIndex; PrevPageIndex := PageControl.PageIndex;
end; end;
procedure TComponentListForm.FormClose(Sender: TObject; var CloseAction: TCloseAction); procedure TComponentListForm.FormClose(Sender: TObject; var CloseAction: TCloseAction);
begin begin
if Parent=nil then begin
ClearSelection;
if not fKeepSelected then
IDEComponentPalette.Selected := Nil;
end
else begin
// Using a dock manager... // Using a dock manager...
if Parent<>nil then
begin
CloseAction := caNone; CloseAction := caNone;
//todo: helper function in DockManager or IDEDockMaster for closing forms. //todo: helper function in DockManager or IDEDockMaster for closing forms.
// Only close the window if it's floating. // Only close the window if it's floating.
@ -474,13 +429,14 @@ begin
TCustomForm(HostDockSite).Close; TCustomForm(HostDockSite).Close;
end; end;
end; end;
FKeepSelected := False;
end; end;
procedure TComponentListForm.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); procedure TComponentListForm.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
//Close the form on escape key like every other IDE dialog does //Close the form on escape key like every other IDE dialog does
begin begin
if (Key=VK_ESCAPE) and (Parent=nil) then if Key=VK_ESCAPE then
UseAndCloseButtonClick(nil); Close;
end; end;
procedure TComponentListForm.UseAndCloseButtonClick(Sender: TObject); procedure TComponentListForm.UseAndCloseButtonClick(Sender: TObject);
@ -491,11 +447,9 @@ begin
AComponent := GetSelectedComponent; AComponent := GetSelectedComponent;
if AComponent<>nil then begin if AComponent<>nil then begin
IDEComponentPalette.Selected := AComponent; IDEComponentPalette.Selected := AComponent;
ClearSelection; FKeepSelected := True;
Close; Close;
end; end;
// IDEComponentPalette.Selected := nil; // Remove component selection from palette.
// Close;
end; end;
end. end.