/ideintf/treeviewpropedit.pas

http://github.com/graemeg/lazarus · Pascal · 290 lines · 219 code · 46 blank · 25 comment · 16 complexity · 7ead0d201658d3e8c06bfd0eaf3e9d41 MD5 · raw file

  1. { Copyright (C) 2005
  2. *****************************************************************************
  3. * *
  4. * See the file COPYING.modifiedLGPL.txt, included in this distribution, *
  5. * for details about the copyright. *
  6. * *
  7. * This program is distributed in the hope that it will be useful, *
  8. * but WITHOUT ANY WARRANTY; without even the implied warranty of *
  9. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. *
  10. * *
  11. *****************************************************************************
  12. Author: Lagunov Aleksey
  13. Abstract:
  14. Property Editors for TTreeView.
  15. }
  16. unit TreeViewPropEdit;
  17. {$mode objfpc}{$H+}
  18. interface
  19. uses
  20. Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, Buttons,
  21. PropEdits, Componenteditors, StdCtrls, ComCtrls, ObjInspStrConsts, ExtCtrls;
  22. type
  23. { TTreeViewItemsEditorForm }
  24. TTreeViewItemsEditorForm = class(TForm)
  25. BtnApply: TBitBtn;
  26. BtnCancel: TBitBtn;
  27. BtnHelp: TBitBtn;
  28. BtnOK: TBitBtn;
  29. BtnSave: TButton;
  30. BtnNewItem: TButton;
  31. BtnNewSubItem: TButton;
  32. BtnDelete: TButton;
  33. BtnLoad: TButton;
  34. edtText: TEdit;
  35. edtIndexImg: TEdit;
  36. edtIndexSel: TEdit;
  37. edtIndexState: TEdit;
  38. GroupBox1: TGroupBox;
  39. GroupBox2: TGroupBox;
  40. LabelText: TLabel;
  41. LabelImageIndex: TLabel;
  42. LabelSelectedIndex: TLabel;
  43. LabelStateIndex: TLabel;
  44. OpenDialog1: TOpenDialog;
  45. SaveDialog1: TSaveDialog;
  46. TreeView1: TTreeView;
  47. procedure BtnNewItemClick(Sender: TObject);
  48. procedure Edit1Change(Sender: TObject);
  49. procedure FormCreate(Sender: TObject);
  50. procedure TreeView1SelectionChanged(Sender: TObject);
  51. procedure btnApplyClick(Sender: TObject);
  52. procedure btnDeleteClick(Sender: TObject);
  53. procedure btnLoadClick(Sender: TObject);
  54. procedure btnSaveClick(Sender: TObject);
  55. procedure edtIndexStateEditingDone(Sender: TObject);
  56. private
  57. FTreeView: TTreeView;
  58. FModified: Boolean;
  59. procedure LoadFromTree(ATreeView:TTreeView);
  60. procedure SaveToTree;
  61. public
  62. end;
  63. type
  64. TTreeViewItemsProperty = class(TClassPropertyEditor)
  65. public
  66. procedure Edit; override;
  67. function GetAttributes: TPropertyAttributes; override;
  68. end;
  69. { TTreeViewComponentEditor }
  70. TTreeViewComponentEditor = class(TComponentEditor)
  71. public
  72. procedure ExecuteVerb(Index: Integer); override;
  73. function GetVerb(Index: Integer): string; override;
  74. function GetVerbCount: Integer; override;
  75. end;
  76. implementation
  77. function EditTreeView(ATreeView: TTreeView):boolean;
  78. var
  79. TreeViewItemsEditorForm: TTreeViewItemsEditorForm;
  80. begin
  81. TreeViewItemsEditorForm:=TTreeViewItemsEditorForm.Create(Application);
  82. try
  83. TreeViewItemsEditorForm.LoadFromTree(ATreeView);
  84. if TreeViewItemsEditorForm.ShowModal = mrOk then
  85. TreeViewItemsEditorForm.SaveToTree;
  86. Result:=TreeViewItemsEditorForm.FModified;
  87. finally
  88. TreeViewItemsEditorForm.Free;
  89. end;
  90. end;
  91. { TTreeViewItemsEditorForm }
  92. procedure TTreeViewItemsEditorForm.BtnNewItemClick(Sender: TObject);
  93. var
  94. S: String;
  95. begin
  96. S := sccsTrEdtItem + IntToStr(TreeView1.Items.Count);
  97. if (Sender as TComponent).Tag = 1 then
  98. TreeView1.Selected := TreeView1.Items.Add(TreeView1.Selected, S)
  99. else
  100. TreeView1.Selected := TreeView1.Items.AddChild(TreeView1.Selected, S);
  101. GroupBox2.Enabled := TreeView1.Items.Count > 0;
  102. edtText.SetFocus;
  103. edtText.SelectAll;
  104. end;
  105. procedure TTreeViewItemsEditorForm.Edit1Change(Sender: TObject);
  106. begin
  107. if Assigned(TreeView1.Selected) then
  108. TreeView1.Selected.Text := edtText.Text;
  109. end;
  110. procedure TTreeViewItemsEditorForm.FormCreate(Sender: TObject);
  111. begin
  112. Caption := sccsTrEdtCaption;
  113. GroupBox1.Caption := sccsTrEdtGrpLCaption;
  114. BtnNewItem.Caption := sccsTrEdtNewItem;
  115. BtnNewSubItem.Caption := sccsTrEdtNewSubItem;
  116. BtnDelete.Caption := sccsTrEdtDelete;
  117. BtnLoad.Caption := sccsTrEdtLoad;
  118. BtnSave.Caption := sccsTrEdtSave;
  119. BtnApply.Caption := sccsTrEdtApply;
  120. GroupBox2.Caption := sccsTrEdtGrpRCaption;
  121. LabelText.Caption := sccsTrEdtLabelText;
  122. LabelImageIndex.Caption := sccsTrEdtLabelImageIndex;
  123. LabelSelectedIndex.Caption := sccsTrEdtLabelSelIndex;
  124. LabelStateIndex.Caption := sccsTrEdtLabelStateIndex;
  125. OpenDialog1.Title := sccsTrEdtOpenDialog;
  126. SaveDialog1.Title := sccsTrEdtSaveDialog;
  127. end;
  128. procedure TTreeViewItemsEditorForm.TreeView1SelectionChanged(Sender: TObject);
  129. begin
  130. if Assigned(TreeView1.Selected) then
  131. begin
  132. edtText.Text := TreeView1.Selected.Text;
  133. edtIndexImg.Text := IntToStr(TreeView1.Selected.ImageIndex);
  134. edtIndexSel.Text := IntToStr(TreeView1.Selected.SelectedIndex);
  135. edtIndexState.Text := IntToStr(TreeView1.Selected.StateIndex);
  136. end;
  137. end;
  138. procedure TTreeViewItemsEditorForm.btnApplyClick(Sender: TObject);
  139. begin
  140. SaveToTree;
  141. end;
  142. procedure TTreeViewItemsEditorForm.btnDeleteClick(Sender: TObject);
  143. var
  144. TempNode: TTreeNode;
  145. begin
  146. if Assigned(TreeView1.Selected) then
  147. begin
  148. TempNode := TreeView1.Selected.GetNextSibling;
  149. if TempNode = nil then
  150. TempNode := TreeView1.Selected.GetPrevSibling;
  151. if TempNode = nil then
  152. TempNode := TreeView1.Selected.Parent;
  153. TreeView1.Items.Delete(TreeView1.Selected);
  154. if TempNode <> nil then
  155. TreeView1.Selected := TempNode;
  156. GroupBox2.Enabled := TreeView1.Items.Count > 0;
  157. TreeView1.SetFocus;
  158. end;
  159. end;
  160. procedure TTreeViewItemsEditorForm.btnLoadClick(Sender: TObject);
  161. begin
  162. if OpenDialog1.Execute then
  163. begin
  164. TreeView1.LoadFromFile(OpenDialog1.FileName);
  165. GroupBox2.Enabled := TreeView1.Items.Count > 0;
  166. end;
  167. end;
  168. procedure TTreeViewItemsEditorForm.btnSaveClick(Sender: TObject);
  169. begin
  170. if SaveDialog1.Execute then
  171. TreeView1.SaveToFile(SaveDialog1.FileName);
  172. end;
  173. procedure TTreeViewItemsEditorForm.edtIndexStateEditingDone(Sender: TObject);
  174. begin
  175. if Assigned(TreeView1.Selected) then
  176. begin
  177. TreeView1.Selected.ImageIndex := StrToIntDef(edtIndexImg.Text, -1);
  178. TreeView1.Selected.SelectedIndex := StrToIntDef(edtIndexSel.Text, -1);
  179. TreeView1.Selected.StateIndex := StrToIntDef(edtIndexState.Text, -1);
  180. edtIndexImg.Text := IntToStr(TreeView1.Selected.ImageIndex);
  181. edtIndexSel.Text := IntToStr(TreeView1.Selected.SelectedIndex);
  182. edtIndexState.Text := IntToStr(TreeView1.Selected.StateIndex);
  183. end;
  184. end;
  185. procedure TTreeViewItemsEditorForm.LoadFromTree(ATreeView: TTreeView);
  186. begin
  187. FTreeView := ATreeView;
  188. if Assigned(ATreeView) then
  189. begin
  190. TreeView1.Images := ATreeView.Images;
  191. TreeView1.StateImages := ATreeView.StateImages;
  192. TreeView1.Items.Assign(ATreeView.Items);
  193. end;
  194. GroupBox2.Enabled := TreeView1.Items.Count > 0;
  195. end;
  196. procedure TTreeViewItemsEditorForm.SaveToTree;
  197. begin
  198. if Assigned(FTreeView) then
  199. begin
  200. FTreeView.Items.Assign(TreeView1.Items);
  201. FModified := True;
  202. end;
  203. end;
  204. { TTreeViewItemsProperty }
  205. procedure TTreeViewItemsProperty.Edit;
  206. begin
  207. if EditTreeView(GetComponent(0) as TTreeView) then
  208. Modified;
  209. end;
  210. function TTreeViewItemsProperty.GetAttributes: TPropertyAttributes;
  211. begin
  212. Result := [paDialog, paReadOnly, paRevertable];
  213. end;
  214. { TTreeViewComponentEditor }
  215. procedure TTreeViewComponentEditor.ExecuteVerb(Index: Integer);
  216. var
  217. Hook: TPropertyEditorHook;
  218. begin
  219. If Index = 0 then
  220. begin
  221. GetHook(Hook);
  222. if EditTreeView(GetComponent as TTreeView) then
  223. if Assigned(Hook) then
  224. Hook.Modified(Self);
  225. end;
  226. end;
  227. function TTreeViewComponentEditor.GetVerb(Index: Integer): string;
  228. begin
  229. Result := '';
  230. If Index = 0 then
  231. Result := sccsTrEdt;
  232. end;
  233. function TTreeViewComponentEditor.GetVerbCount: Integer;
  234. begin
  235. Result := 1;
  236. end;
  237. initialization
  238. {$I treeviewpropedit.lrs}
  239. RegisterPropertyEditor(ClassTypeInfo(TTreeNodes), TTreeView, 'Items', TTreeViewItemsProperty);
  240. RegisterComponentEditor(TTreeView,TTreeViewComponentEditor);
  241. end.