OSDN Git Service

BlueFolder image added
[winbottle/winbottle.git] / bottleclient / ConstEditor.pas
1 unit ConstEditor;
2
3 interface
4
5 uses
6   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
7   StdCtrls, Buttons, ImgList, ComCtrls, Menus, BottleDef,
8   ActnList, ToolWin, ExtCtrls, ScriptConsts;
9
10 type
11   TfrmConstEditor = class(TForm)
12     tvwConst: TTreeView;
13     imgIcon: TImageList;
14     ToolBar1: TToolBar;
15     tbtnNewGroup: TToolButton;
16     tbtnAddConst: TToolButton;
17     tbtnDelete: TToolButton;
18     btbnUp: TToolButton;
19     tbtnDown: TToolButton;
20     ActionList1: TActionList;
21     actNewGroup: TAction;
22     actNewConst: TAction;
23     actDelete: TAction;
24     actMoveUp: TAction;
25     actMoveDown: TAction;
26     PopUpMenu: TPopupMenu;
27     mnNewGroup: TMenuItem;
28     mnAddConst: TMenuItem;
29     mnUp: TMenuItem;
30     mnDown: TMenuItem;
31     pnlConstText: TPanel;
32     pageConstText: TPageControl;
33     tstMenu: TTabSheet;
34     tstConst: TTabSheet;
35     Label1: TLabel;
36     edtMenuCaption: TEdit;
37     Label2: TLabel;
38     edtMenuIfGhost: TEdit;
39     Label3: TLabel;
40     Label4: TLabel;
41     Label5: TLabel;
42     edtConstCaption: TEdit;
43     edtConstScript: TEdit;
44     cbxConstShortCut: TComboBox;
45     btnClose: TButton;
46     pnlConstFile: TPanel;
47     Label6: TLabel;
48     cbxConstFile: TComboBox;
49     mnDeleteConst: TMenuItem;
50     procedure actDeleteExecute(Sender: TObject);
51     procedure actMoveUpExecute(Sender: TObject);
52     procedure actMoveDownExecute(Sender: TObject);
53     procedure tvwConstChange(Sender: TObject; Node: TTreeNode);
54     procedure FormCreate(Sender: TObject);
55     procedure PopUpMenuPopup(Sender: TObject);
56     procedure btnCloseClick(Sender: TObject);
57     procedure tvwConstChanging(Sender: TObject; Node: TTreeNode;
58       var AllowChange: Boolean);
59     procedure cbxConstFileChange(Sender: TObject);
60     procedure actNewGroupExecute(Sender: TObject);
61     procedure actNewConstExecute(Sender: TObject);
62     procedure edtExit(Sender: TObject);
63   private
64     { Private \90é\8c¾ }
65     FTargetConstFile: TScriptConstFile;
66     FTargetItemID: integer;
67     procedure UpdateList;
68     function GetNodeByID(ID: integer): TTreeNode;
69   public
70     { Public \90é\8c¾ }
71     function Execute: boolean;
72   end;
73
74 var
75   frmConstEditor: TfrmConstEditor;
76
77 implementation
78
79 const
80   IcoGroup = 0;
81   IcoConst = 1;
82   IcoIfGhostGroup = 7;
83
84
85 {$R *.DFM}
86
87 { TfrmConstEditor }
88
89
90
91 function TfrmConstEditor.Execute: boolean;
92 var i: integer;
93 begin
94   cbxConstFile.Items.Clear;
95   for i := 0 to ScriptConstList.Count-1 do begin
96     cbxConstFile.Items.Add(ExtractFileName(ScriptConstList.Files[i].FileName));
97   end;
98   if ScriptConstList.Count > 0 then begin
99     FTargetConstFile := ScriptConstList[0];
100     cbxConstFile.ItemIndex := 0;
101   end else begin
102     FTargetConstFile := nil;
103     cbxConstFile.Text := '';
104   end;
105   UpdateList;
106   ShowModal;
107   Result := true;
108 end;
109
110 procedure TfrmConstEditor.actDeleteExecute(Sender: TObject);
111 var Node: TTreeNode;
112 begin
113   if tvwConst.Selected = nil then Exit;
114   Node := tvwConst.Selected;
115   if Node.Level = 0 then begin
116     if Node.HasChildren then begin
117       if MessageDlg(Node.Text + '\82É\91®\82·\82é' + IntToStr(Node.Count) + '\8cÂ\82Ì\92è\8c^\8bå\82ð\8dí\8f\9c\82µ\82Ü\82·\82©?',
118                     mtConfirmation, mbOkCancel, 0) = mrCancel then Exit;
119     end;
120   end;
121   FTargetConstFile.Delete(integer(Node.Data));
122   tvwConst.OnChanging := nil;
123   tvwConst.Items.Delete(Node);
124   tvwConst.OnChanging := tvwConstChanging;
125 end;
126
127 procedure TfrmConstEditor.actMoveUpExecute(Sender: TObject);
128 var Node, DestNode: TTreeNode;
129 begin
130   Node := tvwConst.Selected;
131   FTargetConstFile.MoveUp(integer(Node.Data));
132   if Node.getPrevSibling <> nil then begin
133     DestNode := Node.getPrevSibling;
134     Node.MoveTo(DestNode, naInsert);
135   end else if Node.Level = 1 then begin
136     //\91O\82Ì\83O\83\8b\81[\83v\82Ì\96\96\94ö\82É\88Ú\93®\82·\82é
137     if Node.Parent.getPrevSibling = nil then Exit;
138     DestNode := Node.Parent.getPrevSibling;
139     Node.MoveTo(DestNode, naAddChild);
140   end;
141 end;
142
143 procedure TfrmConstEditor.actMoveDownExecute(Sender: TObject);
144 var Node, DestNode, NextNode: TTreeNode;
145 begin
146   Node := tvwConst.Selected;
147   FTargetConstFile.MoveDown(integer(Node.Data));
148   if Node.getNextSibling <> nil then begin
149     NextNode := Node.getNextSibling;
150     NextNode.MoveTo(Node, naInsert);
151   end else if Node.Level = 1 then begin
152     //\8e\9f\82Ì\83O\83\8b\81[\83v\82Ì\90æ\93ª\82É\88Ú\93®\82·\82é
153     if Node.Parent.getNextSibling = nil then Exit;
154     DestNode := Node.Parent.getNextSibling;
155     Node.MoveTo(DestNode, naAddChildFirst);
156   end;
157 end;
158
159 procedure TfrmConstEditor.tvwConstChange(Sender: TObject; Node: TTreeNode);
160 var ConstData: TScriptConst;
161     MenuData: TScriptConstMenu;
162     ID: integer;
163 begin
164   if Node = nil then begin
165     pageConstText.Enabled := false;
166   end else begin
167     pageConstText.Enabled := true;
168     ID := integer(Node.Data); // \96{\93\96\82Í\82â\82è\82½\82­\82È\82¢\83L\83\83\83X\83g
169     if Node.Level = 0 then begin
170       MenuData := ScriptConstList.GetMenuByID(ID);
171       pageConstText.ActivePage := tstMenu;
172       edtMenuCaption.Text := MenuData.Caption;
173       edtMenuIfGhost.Text := MenuData.IfGhost;
174     end else begin
175       ConstData := ScriptConstList.GetConstByID(ID);
176       pageConstText.ActivePage := tstConst;
177       edtConstCaption.Text := ConstData.Caption;
178       edtConstScript.Text := ConstData.ConstText;
179       cbxConstShortCut.Text := ShortCutToText(ConstData.ShortCut);
180     end;
181     FTargetItemID := ID;
182   end;
183 end;
184
185 procedure TfrmConstEditor.FormCreate(Sender: TObject);
186 var c: char;
187     i: integer;
188 begin
189   if Application.Terminated then Exit;
190   //\83\81\83j\83\85\81[\8dì\90¬
191   for c := 'A' to 'Z' do begin
192     cbxConstShortCut.Items.Add('Ctrl+' + c);
193   end;
194   for c := 'A' to 'Z' do begin
195     cbxConstShortCut.Items.Add('Shift+Ctrl+' + c);
196   end;
197   for c := 'A' to 'Z' do begin
198     cbxConstShortCut.Items.Add('Alt+Ctrl+' + c);
199   end;
200   for i := 1 to 12 do begin
201     cbxConstShortCut.Items.Add('F' + IntToStr(i));
202   end;
203   for i := 1 to 12 do begin
204     cbxConstShortCut.Items.Add('Shift+F' + IntToStr(i));
205   end;
206   tvwConst.DoubleBuffered := true;
207 end;
208
209 procedure TfrmConstEditor.PopUpMenuPopup(Sender: TObject);
210 begin
211   tvwConst.Selected.Selected := true;
212 end;
213
214 procedure TfrmConstEditor.btnCloseClick(Sender: TObject);
215 begin
216   ModalResult := mrOk;
217 end;
218
219 procedure TfrmConstEditor.UpdateList;
220 var i, j: integer;
221     MenuNode, ConstNode: TTreeNode;
222 begin
223   tvwConst.OnChanging := nil;
224   tvwConst.Items.BeginUpdate;
225   for i := tvwConst.Items.Count-1 downto 0 do begin
226     tvwConst.Items[i].Delete;
227   end;
228   if FTargetConstFile <> nil then begin
229     MenuNode := nil;
230     for i := 0 to FTargetConstFile.Count-1 do begin
231       MenuNode := tvwConst.Items.Add(MenuNode, FTargetConstFile[i].Caption);
232       if FTargetConstFile[i].IfGhost <> '' then begin
233         MenuNode.ImageIndex := IcoIfGhostGroup;
234         MenuNode.SelectedIndex := IcoIfGhostGroup;
235       end else begin
236         MenuNode.ImageIndex := IcoGroup;
237         MenuNode.SelectedIndex := IcoGroup;
238       end;
239       MenuNode.Data := Pointer(FTargetConstFile[i].ID);
240       for j := 0 to FTargetConstFile[i].Count-1 do begin
241         ConstNode := tvwConst.Items.AddChild(MenuNode, FTargetConstFile[i][j].Caption);
242         ConstNode.ImageIndex := IcoConst;
243         ConstNode.SelectedIndex := IcoConst;
244         ConstNode.Data := Pointer(FTargetConstFile[i][j].ID);
245       end;
246       MenuNode.Expand(false);
247     end;
248   end;
249   tvwConst.Items.EndUpdate;
250   if tvwConst.Items.Count > 0 then tvwConst.Items[0].Selected := true;
251   tvwConst.OnChanging := tvwConstChanging;
252 end;
253
254 procedure TfrmConstEditor.tvwConstChanging(Sender: TObject;
255   Node: TTreeNode; var AllowChange: Boolean);
256 var ConstData: TScriptConst;
257     MenuData:  TScriptConstMenu;
258     CanUpdate: boolean;
259 begin
260   // \91I\91ð\82ª\88Ú\93®\82·\82é\82Ü\82¦\82Ì\83A\83C\83e\83\80\82Ì\83f\81[\83^\82ð\8dX\90V\82·\82é
261   if FTargetItemID = 0 then Exit; // \88È\91O\82É\89½\82à\91I\91ð\82µ\82Ä\82¢\82È\82¢\82Ì\82È\82ç\89½\82à\82µ\82È\82¢
262
263   ConstData := ScriptConstList.GetConstByID(FTargetItemID);
264   CanUpdate := false; // \83t\83\89\83O
265   if ConstData <> nil then begin
266     if edtConstCaption.Text <> ConstData.Caption then CanUpdate := true;
267     if edtConstScript.Text <> ConstData.ConstText then CanUpdate := true;
268     if TextToShortCut(cbxConstShortCut.Text) <> ConstData.ShortCut then CanUpdate := true;
269     if edtConstCaption.Text = '' then CanUpdate := false;
270     if edtConstScript.Text = '' then CanUpdate := false;
271     if CanUpdate then begin
272       ConstData.Caption := edtConstCaption.Text;
273       ConstData.ConstText := edtConstScript.Text;
274       try
275         ConstData.ShortCut := TextToShortCut(cbxConstShortCut.Text);
276       except
277         ConstData.ShortCut := 0;
278       end;
279       GetNodeByID(FTargetItemID).Text := ConstData.Caption;
280     end;
281   end else begin
282     MenuData := ScriptConstList.GetMenuByID(FTargetItemId);
283     if edtMenuCaption.Text <> MenuData.Caption then CanUpdate := true;
284     if edtMenuIfGhost.Text <> MenuData.IfGhost then CanUpdate := true;
285     if edtMenuCaption.Text = '' then CanUpdate := false;
286     if CanUpdate then begin
287       MenuData.Caption := edtMenuCaption.Text;
288       MenuData.IfGhost := edtMenuIfGhost.Text;
289       with GetNodeByID(FTargetItemID) do begin
290         Text := MenuData.Caption;
291         if MenuData.IfGhost <> '' then begin
292           ImageIndex := IcoIfGhostGroup;
293           SelectedIndex := IcoIfGhostGroup;
294         end else begin
295           ImageIndex := IcoGroup;
296           SelectedIndex := IcoGroup;
297         end;
298       end;
299     end;
300   end;
301 end;
302
303 function TfrmConstEditor.GetNodeByID(ID: integer): TTreeNode;
304 var i: integer;
305 begin
306   Result := nil;
307   for i := 0 to tvwConst.Items.Count-1 do
308     if integer(tvwConst.Items[i].Data) = ID then begin
309       Result := tvwConst.Items[i];
310       Exit;
311     end;
312 end;
313
314 procedure TfrmConstEditor.cbxConstFileChange(Sender: TObject);
315 begin
316   FTargetConstFile := ScriptConstList[cbxConstFile.ItemIndex];
317   UpdateList;
318 end;
319
320 procedure TfrmConstEditor.actNewGroupExecute(Sender: TObject);
321 var MenuData: TScriptConstMenu;
322     Node: TTreeNode;
323 begin
324   MenuData := FTargetConstFile.AddMenu;
325   Node := tvwConst.Items.Add(nil, MenuData.Caption);
326   Node.Data := Pointer(MenuData.ID);
327   Node.Selected := true;
328   edtMenuCaption.SetFocus;
329   edtMenuCaption.SelectAll;
330 end;
331
332 procedure TfrmConstEditor.actNewConstExecute(Sender: TObject);
333 var ConstData: TScriptConst;
334     MenuData: TScriptConstMenu;
335     MenuNode, NewNode: TTreeNode;
336     ID: integer;
337 begin
338   if tvwConst.Selected = nil then Exit;
339   if tvwConst.Selected.Level = 0 then MenuNode := tvwConst.Selected
340   else MenuNode := tvwConst.Selected.Parent;
341   ID := integer(MenuNode.Data);
342   MenuData := FTargetConstFile.GetMenuByID(ID);
343   ConstData := MenuData.AddConst;
344   NewNode := tvwConst.Items.AddChild(MenuNode, ConstData.Caption);
345   NewNode.ImageIndex := 1;
346   NewNode.SelectedIndex := 1;
347   NewNode.Data := Pointer(ConstData.ID);
348   NewNode.Selected := true;
349   edtConstCaption.SetFocus;
350   edtConstCaption.SelectAll;
351 end;
352
353 procedure TfrmConstEditor.edtExit(Sender: TObject);
354 var dummy: boolean;
355 begin
356   tvwConstChanging(self, nil, dummy);
357 end;
358
359 end.