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