1 { Copyright (C) 2005
2
3 *****************************************************************************
4 See the file COPYING.modifiedLGPL.txt, included in this distribution,
5 for details about the license.
6 *****************************************************************************
7
8 Author: Lagunov Aleksey
9
10 Abstract:
11 Property Editors for TTreeView.
12 }
13
14 unit TreeViewPropEdit;
15
16 {$mode objfpc}{$H+}
17
18 interface
19
20 uses
21 Classes, SysUtils,
22 // LCL
23 Forms, Dialogs, Buttons, Controls, StdCtrls, ComCtrls,
24 // IdeIntf
25 PropEdits, ComponentEditors, ObjInspStrConsts, IDEImagesIntf, IDEWindowIntf;
26
27 type
28
29 { TTreeViewItemsEditorForm }
30
31 TTreeViewItemsEditorForm = class(TForm)
32 BtnApply: TBitBtn;
33 BtnCancel: TBitBtn;
34 BtnHelp: TBitBtn;
35 BtnOK: TBitBtn;
36 BtnSave: TButton;
37 BtnNewItem: TButton;
38 BtnNewSubItem: TButton;
39 BtnDelete: TButton;
40 BtnLoad: TButton;
41 edtText: TEdit;
42 edtIndexImg: TEdit;
43 edtIndexSel: TEdit;
44 edtIndexState: TEdit;
45 GroupBox1: TGroupBox;
46 GroupBox2: TGroupBox;
47 LabelText: TLabel;
48 LabelImageIndex: TLabel;
49 LabelSelectedIndex: TLabel;
50 LabelStateIndex: TLabel;
51 OpenDialog1: TOpenDialog;
52 MoveDownBtn: TSpeedButton;
53 MoveUpBtn: TSpeedButton;
54 SaveDialog1: TSaveDialog;
55 TreeView1: TTreeView;
56 procedure BtnNewItemClick(Sender: TObject);
57 procedure Edit1Change(Sender: TObject);
58 procedure FormClose(Sender: TObject; var {%H-}CloseAction: TCloseAction);
59 procedure FormCreate(Sender: TObject);
60 procedure MoveUpBtnClick(Sender: TObject);
61 procedure MoveDownBtnClick(Sender: TObject);
62 procedure TreeView1SelectionChanged(Sender: TObject);
63 procedure btnApplyClick(Sender: TObject);
64 procedure btnDeleteClick(Sender: TObject);
65 procedure btnLoadClick(Sender: TObject);
66 procedure btnSaveClick(Sender: TObject);
67 procedure edtIndexStateEditingDone(Sender: TObject);
68 private
69 FTreeView: TCustomTreeView;
70 FModified: Boolean;
71 procedure LoadFromTree(ATreeView: TCustomTreeView);
72 procedure SaveToTree;
73 procedure UpdateEnabledStates;
74 public
75 end;
76
77
78 type
79 TTreeViewItemsProperty = class(TClassPropertyEditor)
80 public
81 procedure Edit; override;
GetAttributesnull82 function GetAttributes: TPropertyAttributes; override;
83 end;
84
85 { TTreeViewComponentEditor }
86
87 TTreeViewComponentEditor = class(TComponentEditor)
88 public
89 procedure ExecuteVerb(Index: Integer); override;
GetVerbnull90 function GetVerb(Index: Integer): string; override;
GetVerbCountnull91 function GetVerbCount: Integer; override;
92 end;
93
94 implementation
95
96 {$R *.lfm}
97
EditTreeViewnull98 function EditTreeView(ATreeView: TCustomTreeView):boolean;
99 var
100 TreeViewItemsEditorForm: TTreeViewItemsEditorForm;
101 begin
102 TreeViewItemsEditorForm:=TTreeViewItemsEditorForm.Create(Application);
103 try
104 TreeViewItemsEditorForm.LoadFromTree(ATreeView);
105 if TreeViewItemsEditorForm.ShowModal = mrOk then
106 TreeViewItemsEditorForm.SaveToTree;
107 Result:=TreeViewItemsEditorForm.FModified;
108 finally
109 TreeViewItemsEditorForm.Free;
110 end;
111 end;
112
113 { TTreeViewItemsEditorForm }
114
115 procedure TTreeViewItemsEditorForm.FormCreate(Sender: TObject);
116 begin
117 Caption := sccsTrEdtCaption;
118
119 GroupBox1.Caption := sccsTrEdtGrpLCaption;
120 BtnNewItem.Caption := sccsTrEdtNewItem;
121 BtnNewSubItem.Caption := sccsTrEdtNewSubItem;
122 BtnDelete.Caption := sccsTrEdtDelete;
123 BtnLoad.Caption := sccsTrEdtLoad;
124 BtnSave.Caption := sccsTrEdtSave;
125 BtnApply.Caption := sccsTrEdtApply;
126 IDEImages.AssignImage(MoveUpBtn, 'arrow_up');
127 IDEImages.AssignImage(MoveDownBtn, 'arrow_down');
128 MoveUpBtn.Hint:=rscdMoveUp;
129 MoveDownBtn.Hint:=rscdMoveDown;
130
131 GroupBox2.Caption := sccsTrEdtGrpRCaption;
132 LabelText.Caption := sccsTrEdtLabelText;
133 LabelImageIndex.Caption := sccsTrEdtLabelImageIndex;
134 LabelSelectedIndex.Caption := sccsTrEdtLabelSelIndex;
135 LabelStateIndex.Caption := sccsTrEdtLabelStateIndex;
136
137 OpenDialog1.Title := sccsTrEdtOpenDialog;
138 SaveDialog1.Title := sccsTrEdtSaveDialog;
139 IDEDialogLayoutList.ApplyLayout(Self);
140 end;
141
142 procedure TTreeViewItemsEditorForm.FormClose(Sender: TObject;
143 var CloseAction: TCloseAction);
144 begin
145 IDEDialogLayoutList.SaveLayout(Self);
146 end;
147
148 procedure TTreeViewItemsEditorForm.BtnNewItemClick(Sender: TObject);
149 var
150 S: String;
151 begin
152 S := sccsTrEdtItem + IntToStr(TreeView1.Items.Count);
153 if (Sender as TComponent).Tag = 1 then
154 TreeView1.Selected := TreeView1.Items.Add(TreeView1.Selected, S)
155 else
156 TreeView1.Selected := TreeView1.Items.AddChild(TreeView1.Selected, S);
157
158 GroupBox2.Enabled := TreeView1.Items.Count > 0;
159
160 edtText.SetFocus;
161 edtText.SelectAll;
162 end;
163
164 procedure TTreeViewItemsEditorForm.Edit1Change(Sender: TObject);
165 begin
166 if Assigned(TreeView1.Selected) then
167 TreeView1.Selected.Text := edtText.Text;
168 end;
169
170 procedure TTreeViewItemsEditorForm.MoveUpBtnClick(Sender: TObject);
171 var
172 CurNode, PrevNode: TTreeNode;
173 begin
174 CurNode := TreeView1.Selected; Assert(Assigned(CurNode));
175 PrevNode := CurNode.GetPrevSibling; Assert(Assigned(PrevNode));
176 CurNode.MoveTo(PrevNode, naInsert);
177 UpdateEnabledStates;
178 end;
179
180 procedure TTreeViewItemsEditorForm.MoveDownBtnClick(Sender: TObject);
181 var
182 CurNode, NextNode: TTreeNode;
183 begin
184 CurNode := TreeView1.Selected; Assert(Assigned(CurNode));
185 NextNode := CurNode.GetNextSibling; Assert(Assigned(NextNode));
186 CurNode.MoveTo(NextNode, naInsertBehind);
187 UpdateEnabledStates;
188 end;
189
190 procedure TTreeViewItemsEditorForm.TreeView1SelectionChanged(Sender: TObject);
191 begin
192 if Assigned(TreeView1.Selected) then
193 begin
194 edtText.Text := TreeView1.Selected.Text;
195 edtIndexImg.Text := IntToStr(TreeView1.Selected.ImageIndex);
196 edtIndexSel.Text := IntToStr(TreeView1.Selected.SelectedIndex);
197 edtIndexState.Text := IntToStr(TreeView1.Selected.StateIndex);
198 end;
199 UpdateEnabledStates;
200 end;
201
202 procedure TTreeViewItemsEditorForm.btnApplyClick(Sender: TObject);
203 begin
204 SaveToTree;
205 end;
206
207 procedure TTreeViewItemsEditorForm.btnDeleteClick(Sender: TObject);
208 var
209 TempNode: TTreeNode;
210 begin
211 if Assigned(TreeView1.Selected) then
212 begin
213 TempNode := TreeView1.Selected.GetNextSibling;
214 if TempNode = nil then
215 TempNode := TreeView1.Selected.GetPrevSibling;
216 if TempNode = nil then
217 TempNode := TreeView1.Selected.Parent;
218 TreeView1.Items.Delete(TreeView1.Selected);
219 if TempNode <> nil then
220 TreeView1.Selected := TempNode;
221 UpdateEnabledStates;
222 TreeView1.SetFocus;
223 end;
224 end;
225
226 procedure TTreeViewItemsEditorForm.btnLoadClick(Sender: TObject);
227 begin
228 if OpenDialog1.Execute then
229 begin
230 TreeView1.LoadFromFile(OpenDialog1.FileName);
231 UpdateEnabledStates;
232 end;
233 end;
234
235 procedure TTreeViewItemsEditorForm.btnSaveClick(Sender: TObject);
236 begin
237 if SaveDialog1.Execute then
238 TreeView1.SaveToFile(SaveDialog1.FileName);
239 end;
240
241 procedure TTreeViewItemsEditorForm.edtIndexStateEditingDone(Sender: TObject);
242 begin
243 if Assigned(TreeView1.Selected) then
244 begin
245 TreeView1.Selected.ImageIndex := StrToIntDef(edtIndexImg.Text, -1);
246 TreeView1.Selected.SelectedIndex := StrToIntDef(edtIndexSel.Text, -1);
247 TreeView1.Selected.StateIndex := StrToIntDef(edtIndexState.Text, -1);
248
249 edtIndexImg.Text := IntToStr(TreeView1.Selected.ImageIndex);
250 edtIndexSel.Text := IntToStr(TreeView1.Selected.SelectedIndex);
251 edtIndexState.Text := IntToStr(TreeView1.Selected.StateIndex);
252 end;
253 end;
254
255 procedure TTreeViewItemsEditorForm.LoadFromTree(ATreeView: TCustomTreeView);
256 begin
257 FTreeView := ATreeView;
258 if Assigned(ATreeView) then
259 begin
260 TreeView1.Images := ATreeView.Images;
261 TreeView1.StateImages := ATreeView.StateImages;
262 TreeView1.Items.Assign(ATreeView.Items);
263 end;
264 UpdateEnabledStates;
265 end;
266
267 procedure TTreeViewItemsEditorForm.SaveToTree;
268 begin
269 if Assigned(FTreeView) then
270 begin
271 FTreeView.Items.Assign(TreeView1.Items);
272 FModified := True;
273 end;
274 end;
275
276 procedure TTreeViewItemsEditorForm.UpdateEnabledStates;
277 var
278 CurNode: TTreeNode;
279 begin
280 CurNode := TreeView1.Selected;
281 MoveUpBtn.Enabled := Assigned(CurNode) and Assigned(CurNode.GetPrevSibling);
282 MoveDownBtn.Enabled:=Assigned(CurNode) and Assigned(CurNode.GetNextSibling);
283 GroupBox2.Enabled := Assigned(CurNode);
284 end;
285
286
287 { TTreeViewItemsProperty }
288
289 procedure TTreeViewItemsProperty.Edit;
290 begin
291 if EditTreeView(GetComponent(0) as TCustomTreeView) then
292 Modified;
293 end;
294
GetAttributesnull295 function TTreeViewItemsProperty.GetAttributes: TPropertyAttributes;
296 begin
297 Result := [paDialog, paReadOnly, paRevertable];
298 end;
299
300 { TTreeViewComponentEditor }
301 procedure TTreeViewComponentEditor.ExecuteVerb(Index: Integer);
302 var
303 Hook: TPropertyEditorHook;
304 begin
305 If Index = 0 then
306 begin
307 GetHook(Hook);
308 if EditTreeView(GetComponent as TCustomTreeView) then
309 if Assigned(Hook) then
310 Hook.Modified(Self);
311 end;
312 end;
313
TTreeViewComponentEditor.GetVerbnull314 function TTreeViewComponentEditor.GetVerb(Index: Integer): string;
315 begin
316 Result := '';
317 If Index = 0 then
318 Result := sccsTrEdt;
319 end;
320
TTreeViewComponentEditor.GetVerbCountnull321 function TTreeViewComponentEditor.GetVerbCount: Integer;
322 begin
323 Result := 1;
324 end;
325
326 initialization
327 RegisterPropertyEditor(ClassTypeInfo(TTreeNodes), TTreeView, 'Items', TTreeViewItemsProperty);
328 RegisterComponentEditor(TTreeView,TTreeViewComponentEditor);
329 end.
330
331