diff --git a/ide/idehelpmanager.lfm b/ide/idehelpmanager.lfm index 3f23b9aa3f..324eef6850 100644 --- a/ide/idehelpmanager.lfm +++ b/ide/idehelpmanager.lfm @@ -8,34 +8,34 @@ object HelpSelectorDialog: THelpSelectorDialog ClientWidth = 500 OnClose = HelpSelectorDialogClose Position = poScreenCenter - LCLVersion = '1.3' + LCLVersion = '1.7' object NodesGroupBox: TGroupBox Left = 6 - Height = 239 + Height = 237 Top = 6 Width = 488 Align = alClient BorderSpacing.Around = 6 Caption = 'NodesGroupBox' - ClientHeight = 221 + ClientHeight = 220 ClientWidth = 484 TabOrder = 0 - object NodesListBox: TListBox - Left = 6 - Height = 209 - Top = 6 - Width = 472 + object NodesTreeView: TTreeView + Left = 0 + Height = 220 + Top = 0 + Width = 484 Align = alClient - BorderSpacing.Around = 6 - ItemHeight = 0 - OnDblClick = NodesListBoxDblClick + DefaultItemHeight = 18 TabOrder = 0 + OnDblClick = NodesTreeViewDblClick + OnSelectionChanged = NodesTreeViewSelectionChanged end end object BtnPanel: TButtonPanel Left = 6 - Height = 26 - Top = 251 + Height = 28 + Top = 249 Width = 488 OKButton.Name = 'OKButton' OKButton.DefaultCaption = True diff --git a/ide/idehelpmanager.pas b/ide/idehelpmanager.pas index 68ea12c71d..0aafe61e13 100644 --- a/ide/idehelpmanager.pas +++ b/ide/idehelpmanager.pas @@ -42,8 +42,8 @@ uses // IDEIntf PropEdits, ObjectInspector, ProjectIntf, TextTools, IDEDialogs, LazHelpIntf, LazHelpHTML, HelpFPDoc, MacroIntf, IDEWindowIntf, - IDEMsgIntf, PackageIntf, LazIDEIntf, HelpIntfs, IDEHelpIntf, - IDEExternToolIntf, + IDEMsgIntf, PackageIntf, LazIDEIntf, HelpIntfs, ComCtrls, IDEHelpIntf, + IDEExternToolIntf, IDEImagesIntf, // IDE LazarusIDEStrConsts, TransferMacros, DialogProcs, IDEOptionDefs, ObjInspExt, EnvironmentOpts, AboutFrm, Project, MainBar, @@ -250,16 +250,20 @@ type THelpSelectorDialog = class(TForm) BtnPanel: TButtonPanel; NodesGroupBox: TGroupBox; - NodesListBox: TListBox; + NodesTreeView: TTreeView; procedure HelpSelectorDialogClose(Sender: TObject; var {%H-}CloseAction: TCloseAction); - procedure NodesListBoxDblClick(Sender: TObject); + procedure NodesTreeViewDblClick(Sender: TObject); + procedure NodesTreeViewSelectionChanged(Sender: TObject); private FNodes: THelpNodeQueryList; + FImgIndexDB, FImgIndexNode: Integer; procedure SetNodes(const AValue: THelpNodeQueryList); - procedure FillNodesListBox; + procedure FillNodesTV; + procedure UpdateButtons; public constructor Create(TheOwner: TComponent); override; property Nodes: THelpNodeQueryList read FNodes write SetNodes; + function GetSelectedNodeQuery: THelpNodeQuery; end; { Help Contexts for IDE help } @@ -1024,34 +1028,64 @@ begin IDEDialogLayoutList.SaveLayout(Self); end; -procedure THelpSelectorDialog.NodesListBoxDblClick(Sender: TObject); +procedure THelpSelectorDialog.NodesTreeViewDblClick(Sender: TObject); begin ModalResult := mrOK; end; +procedure THelpSelectorDialog.NodesTreeViewSelectionChanged(Sender: TObject); +begin + UpdateButtons; +end; + procedure THelpSelectorDialog.SetNodes(const AValue: THelpNodeQueryList); begin if FNodes=AValue then exit; FNodes:=AValue; - FillNodesListBox; + FillNodesTV; end; -procedure THelpSelectorDialog.FillNodesListBox; +procedure THelpSelectorDialog.FillNodesTV; var - List: TStringList; i: Integer; NodeQuery: THelpNodeQuery; + Node: THelpNode; + DB: THelpDatabase; + DBTVNode, TVNode: TTreeNode; begin - List:=TStringList.Create; - if (Nodes<>nil) then begin - for i:=0 to Nodes.Count-1 do begin - NodeQuery:=Nodes[i]; - List.Add(NodeQuery.AsString); + NodesTreeView.BeginUpdate; + try + TVNode:=nil; + NodesTreeView.Items.Clear; + if (Nodes<>nil) then begin + for i:=0 to Nodes.Count-1 do begin + NodeQuery:=Nodes[i]; + Node:=NodeQuery.Node; + DB:=Node.Owner; + + DBTVNode:=NodesTreeView.Items.FindTopLvlNode(DB.ID); + if DBTVNode=nil then + begin + DBTVNode:=NodesTreeView.Items.AddChild(nil,DB.ID); + DBTVNode.ImageIndex:=FImgIndexDB; + end; + + TVNode:=NodesTreeView.Items.AddChild(DBTVNode,NodeQuery.AsString); + TVNode.ImageIndex:=FImgIndexNode; + TVNode.Data:=NodeQuery; + + DBTVNode.Expand(true); + end; end; + NodesTreeView.Selected:=TVNode; + finally + NodesTreeView.EndUpdate; end; - NodesListBox.Items.Assign(List); - List.Free; - if NodesListBox.Count > 0 then NodesListBox.ItemIndex := 0; +end; + +procedure THelpSelectorDialog.UpdateButtons; +begin + BtnPanel.OKButton.Enabled:=GetSelectedNodeQuery<>nil; end; constructor THelpSelectorDialog.Create(TheOwner: TComponent); @@ -1062,6 +1096,20 @@ begin Caption := lisHelpSelectorDialog; NodesGroupBox.Caption:=lisSelectAHelpItem; BtnPanel.OKButton.Caption:=lisMenuOk; + + NodesTreeView.Images:=IDEImages.Images_16; + FImgIndexDB:=IDEImages.LoadImage(16, 'item_package'); + FImgIndexNode:=IDEImages.LoadImage(16, 'menu_help'); +end; + +function THelpSelectorDialog.GetSelectedNodeQuery: THelpNodeQuery; +var + TVNode: TTreeNode; +begin + Result:=nil; + TVNode:=NodesTreeView.Selected; + if (TVNode=nil) or (TVNode.Data=nil) then exit; + Result:=TObject(TVNode.Data) as THelpNodeQuery; end; { TIDEHelpDatabases } @@ -1073,7 +1121,6 @@ function TIDEHelpDatabases.ShowHelpSelector(Query: THelpQuery; ): TShowHelpResult; var Dialog: THelpSelectorDialog; - i: LongInt; begin Selection:=nil; Result:=shrNone; @@ -1081,11 +1128,9 @@ begin try Dialog.Nodes:=Nodes; if Dialog.ShowModal=mrOk then begin - i:=Dialog.NodesListBox.ItemIndex; - if i>=0 then begin - Selection:=Nodes[i]; + Selection:=Dialog.GetSelectedNodeQuery; + if Selection<>nil then Result:=shrSuccess; - end; end else begin Result:=shrCancel; end;