mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-04-30 19:23:42 +02:00
407 lines
12 KiB
ObjectPascal
407 lines
12 KiB
ObjectPascal
{
|
|
***************************************************************************
|
|
* *
|
|
* This source is free software; you can redistribute it and/or modify *
|
|
* it under the terms of the GNU General Public License as published by *
|
|
* the Free Software Foundation; either version 2 of the License, or *
|
|
* (at your option) any later version. *
|
|
* *
|
|
* This code is distributed in the hope that it will be useful, but *
|
|
* WITHOUT ANY WARRANTY; without even the implied warranty of *
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
|
|
* General Public License for more details. *
|
|
* *
|
|
* A copy of the GNU General Public License is available on the World *
|
|
* Wide Web at <http://www.gnu.org/copyleft/gpl.html>. You can also *
|
|
* obtain it by writing to the Free Software Foundation, *
|
|
* Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
|
|
* *
|
|
***************************************************************************
|
|
|
|
Author: Mattias Gaertner
|
|
|
|
Abstract:
|
|
Editor dialog to edit nodes of Help for IDE windows (controls).
|
|
}
|
|
unit IDEContextHelpEdit;
|
|
|
|
{$mode objfpc}{$H+}
|
|
|
|
interface
|
|
|
|
uses
|
|
Classes, SysUtils, LCLProc, LResources, Forms, Controls, Graphics, Dialogs,
|
|
Buttons, ButtonPanel, StdCtrls, ComCtrls,
|
|
// IDEIntf
|
|
IDEWindowIntf, LazHelpIntf,
|
|
// IDE
|
|
IDEWindowHelp, LazarusIDEStrConsts, ExtCtrls;
|
|
|
|
type
|
|
|
|
{ TContextHelpEditorDlg }
|
|
|
|
TContextHelpEditorDlg = class(TForm)
|
|
ButtonPanel: TButtonPanel;
|
|
TestButton: TButton;
|
|
CreateHelpNodeForControlButton: TButton;
|
|
NodeNameEdit: TEdit;
|
|
NodePathEdit: TEdit;
|
|
NodeHasHelpCheckBox: TCheckBox;
|
|
HelpNodePropertiesGroupBox: TGroupBox;
|
|
NodePathLabel: TLabel;
|
|
NodeNameLabel: TLabel;
|
|
NodesGroupBox: TGroupBox;
|
|
ControlsTreeView: TTreeView;
|
|
HelpNodesTreeView: TTreeView;
|
|
Splitter1: TSplitter;
|
|
WindowControlsGroupBox: TGroupBox;
|
|
procedure CreateHelpNodeForControlButtonClick(Sender: TObject);
|
|
procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);
|
|
procedure FormCreate(Sender: TObject);
|
|
procedure FormDestroy(Sender: TObject);
|
|
procedure HelpNodesTreeViewSelectionChanged(Sender: TObject);
|
|
procedure NodeHasHelpCheckBoxEditingDone(Sender: TObject);
|
|
procedure NodeNameEditEditingDone(Sender: TObject);
|
|
procedure NodePathEditEditingDone(Sender: TObject);
|
|
procedure OkBitBtnClick(Sender: TObject);
|
|
procedure TestButtonClick(Sender: TObject);
|
|
private
|
|
FIDEWindow: TCustomForm;
|
|
FInvoker: TObject;
|
|
FWorkingHelpNodes: TIWHelpTree;
|
|
procedure SetIDEWindow(const AValue: TCustomForm);
|
|
procedure SetInvoker(const AValue: TObject);
|
|
procedure UpdateWindowControlsGroupBoxCaption;
|
|
procedure FillControlsTreeView;
|
|
procedure FillHelpNodesTreeView;
|
|
procedure UpdateHelpNodePropertiesGroupBox;
|
|
procedure SelectHelpNode(AControl: TControl);
|
|
procedure SelectControlNode(AControl: TControl);
|
|
function FindHelpTreeNode(HelpNode: TIWHelpNode): TTreeNode;
|
|
function FindControlTreeNode(AControl: TControl): TTreeNode;
|
|
function GetCurrentControl: TControl;
|
|
function GetCurrentHelpNode: TIWHelpNode;
|
|
procedure SaveHelpNodeProperties;
|
|
public
|
|
property Invoker: TObject read FInvoker write SetInvoker;
|
|
property IDEWindow: TCustomForm read FIDEWindow write SetIDEWindow;
|
|
property WorkingHelpNodes: TIWHelpTree read FWorkingHelpNodes;
|
|
end;
|
|
|
|
var
|
|
ContextHelpEditorDlg: TContextHelpEditorDlg = nil;
|
|
|
|
function ShowContextHelpEditor(Sender: TObject): TModalResult;
|
|
procedure ShowContextHelpForIDE(Sender: TObject);
|
|
|
|
implementation
|
|
|
|
function ShowContextHelpEditor(Sender: TObject): TModalResult;
|
|
begin
|
|
// make sure there is only one editor at a time
|
|
if ContextHelpEditorDlg<>nil then exit;
|
|
|
|
ContextHelpEditorDlg:=TContextHelpEditorDlg.Create(nil);
|
|
try
|
|
ContextHelpEditorDlg.Invoker:=Sender;
|
|
Result:=ContextHelpEditorDlg.ShowModal;
|
|
finally
|
|
ContextHelpEditorDlg.Free;
|
|
ContextHelpEditorDlg:=nil;
|
|
end;
|
|
end;
|
|
|
|
procedure ShowContextHelpForIDE(Sender: TObject);
|
|
begin
|
|
if Sender is TControl then begin
|
|
LoadIDEWindowHelp;
|
|
IDEWindowHelpNodes.InvokeHelp(TControl(Sender));
|
|
end else begin
|
|
DebugLn('ShowContextHelpForIDE Sender=',dbgsName(Sender));
|
|
end;
|
|
end;
|
|
|
|
{ TContextHelpEditorDlg }
|
|
|
|
procedure TContextHelpEditorDlg.FormClose(Sender: TObject;
|
|
var CloseAction: TCloseAction);
|
|
begin
|
|
IDEDialogLayoutList.SaveLayout(Self);
|
|
end;
|
|
|
|
procedure TContextHelpEditorDlg.CreateHelpNodeForControlButtonClick(
|
|
Sender: TObject);
|
|
var
|
|
AControl: TControl;
|
|
begin
|
|
AControl:=GetCurrentControl;
|
|
if AControl=nil then exit;
|
|
WorkingHelpNodes.FindNodeForControl(AControl,true);
|
|
FillHelpNodesTreeView;
|
|
SelectHelpNode(AControl);
|
|
SelectControlNode(AControl);
|
|
end;
|
|
|
|
procedure TContextHelpEditorDlg.FormCreate(Sender: TObject);
|
|
begin
|
|
Caption:=lisEditContextHelp;
|
|
|
|
TestButton.Caption:=dlgCCOTest;
|
|
CreateHelpNodeForControlButton.Caption:=lisCreateHelpNode;
|
|
NodeHasHelpCheckBox.Caption:=lisHasHelp;
|
|
NodePathLabel.Caption:=lisPath;
|
|
NodeNameLabel.Caption:=lisDebugOptionsFrmName;
|
|
NodesGroupBox.Caption:=lisHelpEntries;
|
|
|
|
ButtonPanel.OKButton.OnClick:=@OkBitBtnClick;
|
|
|
|
IDEDialogLayoutList.ApplyLayout(Self, 600, 450);
|
|
|
|
LoadIDEWindowHelp;
|
|
FWorkingHelpNodes:=TIWHelpTree.Create;
|
|
FWorkingHelpNodes.Assign(IDEWindowHelpNodes);
|
|
FillHelpNodesTreeView;
|
|
end;
|
|
|
|
procedure TContextHelpEditorDlg.FormDestroy(Sender: TObject);
|
|
begin
|
|
FreeAndNil(FWorkingHelpNodes);
|
|
end;
|
|
|
|
procedure TContextHelpEditorDlg.HelpNodesTreeViewSelectionChanged(
|
|
Sender: TObject);
|
|
begin
|
|
UpdateHelpNodePropertiesGroupBox;
|
|
end;
|
|
|
|
procedure TContextHelpEditorDlg.NodeHasHelpCheckBoxEditingDone(Sender: TObject);
|
|
begin
|
|
SaveHelpNodeProperties;
|
|
end;
|
|
|
|
procedure TContextHelpEditorDlg.NodeNameEditEditingDone(Sender: TObject);
|
|
begin
|
|
SaveHelpNodeProperties;
|
|
end;
|
|
|
|
procedure TContextHelpEditorDlg.NodePathEditEditingDone(Sender: TObject);
|
|
begin
|
|
SaveHelpNodeProperties;
|
|
end;
|
|
|
|
procedure TContextHelpEditorDlg.OkBitBtnClick(Sender: TObject);
|
|
begin
|
|
WorkingHelpNodes.DeleteLeavesWithoutHelp;
|
|
IDEWindowHelpNodes.Assign(WorkingHelpNodes);
|
|
SaveIDEWindowHelp;
|
|
ModalResult:=mrOk;
|
|
end;
|
|
|
|
procedure TContextHelpEditorDlg.TestButtonClick(Sender: TObject);
|
|
var
|
|
AControl: TControl;
|
|
begin
|
|
AControl:=GetCurrentControl;
|
|
if AControl=nil then exit;
|
|
WorkingHelpNodes.InvokeHelp(AControl);
|
|
end;
|
|
|
|
procedure TContextHelpEditorDlg.SetInvoker(const AValue: TObject);
|
|
var
|
|
AControl: TControl;
|
|
begin
|
|
if FInvoker=AValue then exit;
|
|
FInvoker:=AValue;
|
|
//DebugLn('TContextHelpEditorDlg.SetInvoker Invoker=',dbgsName(Invoker));
|
|
if Invoker is TControl then begin
|
|
AControl:=TControl(Invoker);
|
|
IDEWindow:=GetParentForm(AControl);
|
|
//DebugLn('TContextHelpEditorDlg.SetInvoker IDEWindow=',dbgsName(IDEWindow));
|
|
WorkingHelpNodes.FindNodeForControl(AControl,true);
|
|
FillHelpNodesTreeView;
|
|
SelectHelpNode(AControl);
|
|
SelectControlNode(AControl);
|
|
end;
|
|
end;
|
|
|
|
procedure TContextHelpEditorDlg.UpdateWindowControlsGroupBoxCaption;
|
|
begin
|
|
if IDEWindow<>nil then begin
|
|
WindowControlsGroupBox.Caption:=dbgsName(IDEWindow);
|
|
WindowControlsGroupBox.Enabled:=true;
|
|
end else begin
|
|
WindowControlsGroupBox.Caption:=lisNoIDEWindowSelected;
|
|
WindowControlsGroupBox.Enabled:=false;
|
|
end;
|
|
end;
|
|
|
|
procedure TContextHelpEditorDlg.FillControlsTreeView;
|
|
|
|
procedure Add(AControl: TControl; ParentNode: TTreeNode);
|
|
var
|
|
i: Integer;
|
|
NewNode: TTreeNode;
|
|
begin
|
|
NewNode:=ControlsTreeView.Items.AddChildObject(ParentNode,
|
|
dbgsName(AControl),AControl);
|
|
if AControl is TWinControl then begin
|
|
for i:=0 to TWinControl(AControl).ControlCount-1 do
|
|
Add(TWinControl(AControl).Controls[i],NewNode);
|
|
end;
|
|
NewNode.Expanded:=true;
|
|
end;
|
|
|
|
begin
|
|
ControlsTreeView.BeginUpdate;
|
|
ControlsTreeView.Items.Clear;
|
|
if IDEWindow<>nil then
|
|
Add(IDEWindow,nil);
|
|
ControlsTreeView.EndUpdate;
|
|
end;
|
|
|
|
procedure TContextHelpEditorDlg.FillHelpNodesTreeView;
|
|
|
|
procedure Add(HelpNode: TIWHelpNode; ParentNode: TTreeNode);
|
|
var
|
|
i: Integer;
|
|
NewNode: TTreeNode;
|
|
begin
|
|
NewNode:=HelpNodesTreeView.Items.AddChildObject(ParentNode,
|
|
HelpNode.Name,HelpNode);
|
|
for i:=0 to HelpNode.Count-1 do
|
|
Add(HelpNode[i],NewNode);
|
|
NewNode.Expanded:=true;
|
|
end;
|
|
|
|
begin
|
|
HelpNodesTreeView.BeginUpdate;
|
|
HelpNodesTreeView.Items.Clear;
|
|
Add(WorkingHelpNodes.Root,nil);
|
|
HelpNodesTreeView.EndUpdate;
|
|
end;
|
|
|
|
procedure TContextHelpEditorDlg.UpdateHelpNodePropertiesGroupBox;
|
|
var
|
|
HelpNode: TIWHelpNode;
|
|
begin
|
|
if (csDestroying in ComponentState) then exit;
|
|
HelpNode:=GetCurrentHelpNode;
|
|
if HelpNode<>nil then begin
|
|
HelpNodePropertiesGroupBox.Caption:=HelpNode.Name;
|
|
NodeNameEdit.Text:=HelpNode.Name;
|
|
NodePathEdit.Text:=HelpNode.Path;
|
|
NodeHasHelpCheckBox.Checked:=HelpNode.HasHelp;
|
|
HelpNodePropertiesGroupBox.Enabled:=true;
|
|
end else begin
|
|
HelpNodePropertiesGroupBox.Caption:=lisNoNodeSelected;
|
|
HelpNodePropertiesGroupBox.Enabled:=false;
|
|
end;
|
|
end;
|
|
|
|
procedure TContextHelpEditorDlg.SelectHelpNode(AControl: TControl);
|
|
var
|
|
Node: TTreeNode;
|
|
begin
|
|
Node:=FindHelpTreeNode(WorkingHelpNodes.FindNodeForControl(AControl));
|
|
HelpNodesTreeView.Selected:=Node;
|
|
//DebugLn('TContextHelpEditorDlg.SelectHelpNode Node=',dbgs(Node),' AControl=',dbgsName(AControl),' ',dbgs(HelpNodesTreeView.Selected));
|
|
end;
|
|
|
|
procedure TContextHelpEditorDlg.SelectControlNode(AControl: TControl);
|
|
var
|
|
Node: TTreeNode;
|
|
begin
|
|
Node:=FindControlTreeNode(AControl);
|
|
ControlsTreeView.Selected:=Node;
|
|
end;
|
|
|
|
function TContextHelpEditorDlg.FindHelpTreeNode(HelpNode: TIWHelpNode
|
|
): TTreeNode;
|
|
|
|
function Find(HNode: TIWHelpNode): TTreeNode;
|
|
var
|
|
ParentTreeNode: TTreeNode;
|
|
begin
|
|
if HNode=nil then exit(nil);
|
|
if HNode.Parent=nil then begin
|
|
Result:=HelpNodesTreeView.Items.FindTopLvlNode(HNode.Name);
|
|
end else begin
|
|
ParentTreeNode:=Find(HNode.Parent);
|
|
if ParentTreeNode=nil then
|
|
Result:=nil
|
|
else
|
|
Result:=ParentTreeNode.FindNode(HNode.Name);
|
|
end;
|
|
end;
|
|
|
|
begin
|
|
Result:=Find(HelpNode);
|
|
end;
|
|
|
|
function TContextHelpEditorDlg.FindControlTreeNode(AControl: TControl
|
|
): TTreeNode;
|
|
|
|
function Find(TheControl: TControl): TTreeNode;
|
|
var
|
|
ParentTreeNode: TTreeNode;
|
|
begin
|
|
if TheControl=nil then exit(nil);
|
|
if TheControl.Parent=nil then begin
|
|
Result:=ControlsTreeView.Items.FindTopLvlNode(dbgsName(TheControl));
|
|
end else begin
|
|
ParentTreeNode:=Find(TheControl.Parent);
|
|
if ParentTreeNode=nil then
|
|
Result:=nil
|
|
else
|
|
Result:=ParentTreeNode.FindNode(dbgsName(TheControl));
|
|
end;
|
|
end;
|
|
|
|
begin
|
|
Result:=Find(AControl);
|
|
end;
|
|
|
|
function TContextHelpEditorDlg.GetCurrentControl: TControl;
|
|
var
|
|
Node: TTreeNode;
|
|
begin
|
|
Node:=ControlsTreeView.Selected;
|
|
if Node=nil then exit(nil);
|
|
Result:=TControl(Node.Data);
|
|
end;
|
|
|
|
function TContextHelpEditorDlg.GetCurrentHelpNode: TIWHelpNode;
|
|
var
|
|
Node: TTreeNode;
|
|
begin
|
|
Node:=HelpNodesTreeView.Selected;
|
|
if Node=nil then exit(nil);
|
|
Result:=TIWHelpNode(Node.Data);
|
|
end;
|
|
|
|
procedure TContextHelpEditorDlg.SaveHelpNodeProperties;
|
|
var
|
|
HelpNode: TIWHelpNode;
|
|
begin
|
|
HelpNode:=GetCurrentHelpNode;
|
|
if HelpNode=nil then exit;
|
|
HelpNode.Name:=NodeNameEdit.Text;
|
|
HelpNode.Path:=NodePathEdit.Text;
|
|
HelpNode.HasHelp:=NodeHasHelpCheckBox.Checked;
|
|
end;
|
|
|
|
procedure TContextHelpEditorDlg.SetIDEWindow(const AValue: TCustomForm);
|
|
begin
|
|
if FIDEWindow=AValue then exit;
|
|
FIDEWindow:=AValue;
|
|
UpdateWindowControlsGroupBoxCaption;
|
|
FillControlsTreeView;
|
|
end;
|
|
|
|
initialization
|
|
{$I idecontexthelpedit.lrs}
|
|
|
|
end.
|
|
|