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

View File

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