OSDN Git Service

Subst版正規表現チェック関数、SafeAndCheckRegExpSubst関数を導入。
[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     procedure ChangeActionStatus;
70   public
71     { Public \90é\8c¾ }
72     function Execute: boolean;
73   end;
74
75 var
76   frmConstEditor: TfrmConstEditor;
77
78 implementation
79
80 const
81   IcoGroup = 0;
82   IcoConst = 1;
83   IcoIfGhostGroup = 7;
84
85
86 {$R *.DFM}
87
88 { TfrmConstEditor }
89
90
91
92 function TfrmConstEditor.Execute: boolean;
93 var i: integer;
94 begin
95   cbxConstFile.Items.Clear;
96   for i := 0 to ScriptConstList.Count-1 do begin
97     cbxConstFile.Items.Add(ExtractFileName(ScriptConstList.Files[i].FileName));
98   end;
99   if ScriptConstList.Count > 0 then begin
100     FTargetConstFile := ScriptConstList[0];
101     cbxConstFile.ItemIndex := 0;
102   end else begin
103     FTargetConstFile := nil;
104     cbxConstFile.Text := '';
105   end;
106   UpdateList;
107   ChangeActionStatus;
108   ShowModal;
109   Result := true;
110 end;
111
112 procedure TfrmConstEditor.actDeleteExecute(Sender: TObject);
113 var Node: TTreeNode;
114 begin
115   if tvwConst.Selected = nil then Exit;
116   Node := tvwConst.Selected;
117   if Node.Level = 0 then begin
118     if Node.HasChildren then begin
119       if MessageDlg(Node.Text + '\82É\91®\82·\82é' + IntToStr(Node.Count) + '\8cÂ\82Ì\92è\8c^\8bå\82ð\8dí\8f\9c\82µ\82Ü\82·\82©?',
120                     mtConfirmation, mbOkCancel, 0) = mrCancel then Exit;
121     end;
122   end;
123   FTargetConstFile.Delete(integer(Node.Data));
124   tvwConst.OnChanging := nil;
125   tvwConst.Items.Delete(Node);
126   tvwConst.OnChanging := tvwConstChanging;
127   ChangeActionStatus;
128 end;
129
130 procedure TfrmConstEditor.actMoveUpExecute(Sender: TObject);
131 var Node, DestNode: TTreeNode;
132 begin
133   Node := tvwConst.Selected;
134   if Node = nil then
135     Exit;
136   FTargetConstFile.MoveUp(integer(Node.Data));
137   if Node.getPrevSibling <> nil then begin
138     DestNode := Node.getPrevSibling;
139     Node.MoveTo(DestNode, naInsert);
140   end else if Node.Level = 1 then begin
141     //\91O\82Ì\83O\83\8b\81[\83v\82Ì\96\96\94ö\82É\88Ú\93®\82·\82é
142     if Node.Parent.getPrevSibling = nil then Exit;
143     DestNode := Node.Parent.getPrevSibling;
144     Node.MoveTo(DestNode, naAddChild);
145   end;
146 end;
147
148 procedure TfrmConstEditor.actMoveDownExecute(Sender: TObject);
149 var Node, DestNode, NextNode: TTreeNode;
150 begin
151   Node := tvwConst.Selected;
152   if Node = nil then
153     Exit;
154   FTargetConstFile.MoveDown(integer(Node.Data));
155   if Node.getNextSibling <> nil then begin
156     NextNode := Node.getNextSibling;
157     NextNode.MoveTo(Node, naInsert);
158   end else if Node.Level = 1 then begin
159     //\8e\9f\82Ì\83O\83\8b\81[\83v\82Ì\90æ\93ª\82É\88Ú\93®\82·\82é
160     if Node.Parent.getNextSibling = nil then Exit;
161     DestNode := Node.Parent.getNextSibling;
162     Node.MoveTo(DestNode, naAddChildFirst);
163   end;
164 end;
165
166 procedure TfrmConstEditor.tvwConstChange(Sender: TObject; Node: TTreeNode);
167 var ConstData: TScriptConst;
168     MenuData: TScriptConstMenu;
169     ID: integer;
170 begin
171   ChangeActionStatus;
172   if Node <> nil then
173   begin
174     pageConstText.Enabled := true;
175     ID := integer(Node.Data); // \96{\93\96\82Í\82â\82è\82½\82­\82È\82¢\83L\83\83\83X\83g
176     if Node.Level = 0 then begin
177       MenuData := ScriptConstList.GetMenuByID(ID);
178       pageConstText.ActivePage := tstMenu;
179       edtMenuCaption.Text := MenuData.Caption;
180       edtMenuIfGhost.Text := MenuData.IfGhost;
181     end else begin
182       ConstData := ScriptConstList.GetConstByID(ID);
183       pageConstText.ActivePage := tstConst;
184       edtConstCaption.Text := ConstData.Caption;
185       edtConstScript.Text := ConstData.ConstText;
186       cbxConstShortCut.Text := ShortCutToText(ConstData.ShortCut);
187     end;
188     FTargetItemID := ID;
189   end;
190 end;
191
192 procedure TfrmConstEditor.FormCreate(Sender: TObject);
193 var c: char;
194     i: integer;
195 begin
196   if Application.Terminated then Exit;
197   //\83\81\83j\83\85\81[\8dì\90¬
198   for c := 'A' to 'Z' do begin
199     cbxConstShortCut.Items.Add('Ctrl+' + c);
200   end;
201   for c := 'A' to 'Z' do begin
202     cbxConstShortCut.Items.Add('Shift+Ctrl+' + c);
203   end;
204   for c := 'A' to 'Z' do begin
205     cbxConstShortCut.Items.Add('Alt+Ctrl+' + c);
206   end;
207   for i := 1 to 12 do begin
208     cbxConstShortCut.Items.Add('F' + IntToStr(i));
209   end;
210   for i := 1 to 12 do begin
211     cbxConstShortCut.Items.Add('Shift+F' + IntToStr(i));
212   end;
213   tvwConst.DoubleBuffered := true;
214 end;
215
216 procedure TfrmConstEditor.PopUpMenuPopup(Sender: TObject);
217 begin
218   ChangeActionStatus;
219   // \88È\89º\82Í\89E\83N\83\8a\83b\83N\8e\9e\82É\83G\83\89\81[\82ð\8bN\82±\82³\82È\82¢\82½\82ß\82Ì
220   // \83g\83\8a\83b\83N\93I\82È\83R\81[\83h
221   if tvwConst.Selected <> nil then
222     tvwConst.Selected.Selected := true;
223 end;
224
225 procedure TfrmConstEditor.btnCloseClick(Sender: TObject);
226 begin
227   ModalResult := mrOk;
228 end;
229
230 procedure TfrmConstEditor.UpdateList;
231 var i, j: integer;
232     MenuNode, ConstNode: TTreeNode;
233 begin
234   tvwConst.OnChanging := nil;
235   tvwConst.Items.BeginUpdate;
236   for i := tvwConst.Items.Count-1 downto 0 do begin
237     tvwConst.Items[i].Delete;
238   end;
239   if FTargetConstFile <> nil then begin
240     MenuNode := nil;
241     for i := 0 to FTargetConstFile.Count-1 do begin
242       MenuNode := tvwConst.Items.Add(MenuNode, FTargetConstFile[i].Caption);
243       if FTargetConstFile[i].IfGhost <> '' then begin
244         MenuNode.ImageIndex := IcoIfGhostGroup;
245         MenuNode.SelectedIndex := IcoIfGhostGroup;
246       end else begin
247         MenuNode.ImageIndex := IcoGroup;
248         MenuNode.SelectedIndex := IcoGroup;
249       end;
250       MenuNode.Data := Pointer(FTargetConstFile[i].ID);
251       for j := 0 to FTargetConstFile[i].Count-1 do begin
252         ConstNode := tvwConst.Items.AddChild(MenuNode, FTargetConstFile[i][j].Caption);
253         ConstNode.ImageIndex := IcoConst;
254         ConstNode.SelectedIndex := IcoConst;
255         ConstNode.Data := Pointer(FTargetConstFile[i][j].ID);
256       end;
257       MenuNode.Expand(false);
258     end;
259   end;
260   tvwConst.Items.EndUpdate;
261   if tvwConst.Items.Count > 0 then tvwConst.Items[0].Selected := true;
262   tvwConst.OnChanging := tvwConstChanging;
263 end;
264
265 procedure TfrmConstEditor.tvwConstChanging(Sender: TObject;
266   Node: TTreeNode; var AllowChange: Boolean);
267 var ConstData: TScriptConst;
268     MenuData:  TScriptConstMenu;
269     CanUpdate: boolean;
270 begin
271   // \91I\91ð\82ª\88Ú\93®\82·\82é\82Ü\82¦\82Ì\83A\83C\83e\83\80\82Ì\83f\81[\83^\82ð\8dX\90V\82·\82é
272   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¢
273
274   ConstData := ScriptConstList.GetConstByID(FTargetItemID);
275   CanUpdate := false; // \83t\83\89\83O
276   if ConstData <> nil then begin
277     if edtConstCaption.Text <> ConstData.Caption then CanUpdate := true;
278     if edtConstScript.Text <> ConstData.ConstText then CanUpdate := true;
279     if TextToShortCut(cbxConstShortCut.Text) <> ConstData.ShortCut then CanUpdate := true;
280     if edtConstCaption.Text = '' then CanUpdate := false;
281     if edtConstScript.Text = '' then CanUpdate := false;
282     if CanUpdate then begin
283       ConstData.Caption := edtConstCaption.Text;
284       ConstData.ConstText := edtConstScript.Text;
285       try
286         ConstData.ShortCut := TextToShortCut(cbxConstShortCut.Text);
287       except
288         ConstData.ShortCut := 0;
289       end;
290       GetNodeByID(FTargetItemID).Text := ConstData.Caption;
291     end;
292   end else begin
293     MenuData := ScriptConstList.GetMenuByID(FTargetItemId);
294     if edtMenuCaption.Text <> MenuData.Caption then CanUpdate := true;
295     if edtMenuIfGhost.Text <> MenuData.IfGhost then CanUpdate := true;
296     if edtMenuCaption.Text = '' then CanUpdate := false;
297     if CanUpdate then begin
298       MenuData.Caption := edtMenuCaption.Text;
299       MenuData.IfGhost := edtMenuIfGhost.Text;
300       with GetNodeByID(FTargetItemID) do begin
301         Text := MenuData.Caption;
302         if MenuData.IfGhost <> '' then begin
303           ImageIndex := IcoIfGhostGroup;
304           SelectedIndex := IcoIfGhostGroup;
305         end else begin
306           ImageIndex := IcoGroup;
307           SelectedIndex := IcoGroup;
308         end;
309       end;
310     end;
311   end;
312 end;
313
314 function TfrmConstEditor.GetNodeByID(ID: integer): TTreeNode;
315 var i: integer;
316 begin
317   Result := nil;
318   for i := 0 to tvwConst.Items.Count-1 do
319     if integer(tvwConst.Items[i].Data) = ID then begin
320       Result := tvwConst.Items[i];
321       Exit;
322     end;
323 end;
324
325 procedure TfrmConstEditor.cbxConstFileChange(Sender: TObject);
326 begin
327   FTargetConstFile := ScriptConstList[cbxConstFile.ItemIndex];
328   ChangeActionStatus;
329   UpdateList;
330 end;
331
332 procedure TfrmConstEditor.actNewGroupExecute(Sender: TObject);
333 var MenuData: TScriptConstMenu;
334     Node: TTreeNode;
335 begin
336   MenuData := FTargetConstFile.AddMenu;
337   Node := tvwConst.Items.Add(nil, MenuData.Caption);
338   Node.Data := Pointer(MenuData.ID);
339   Node.Selected := true;
340   edtMenuCaption.SetFocus;
341   edtMenuCaption.SelectAll;
342 end;
343
344 procedure TfrmConstEditor.actNewConstExecute(Sender: TObject);
345 var ConstData: TScriptConst;
346     MenuData: TScriptConstMenu;
347     MenuNode, NewNode: TTreeNode;
348     ID: integer;
349 begin
350   if tvwConst.Selected = nil then
351   begin
352     ShowMessage('\83O\83\8b\81[\83v\82ð\8dì\90¬\81E\91I\91ð\82µ\82Ä\82­\82¾\82³\82¢');
353     Exit;
354   end;
355   if tvwConst.Selected.Level = 0 then
356     MenuNode := tvwConst.Selected
357   else
358     MenuNode := tvwConst.Selected.Parent;
359   ID := integer(MenuNode.Data);
360   MenuData := FTargetConstFile.GetMenuByID(ID);
361   ConstData := MenuData.AddConst;
362   NewNode := tvwConst.Items.AddChild(MenuNode, ConstData.Caption);
363   NewNode.ImageIndex := 1;
364   NewNode.SelectedIndex := 1;
365   NewNode.Data := Pointer(ConstData.ID);
366   NewNode.Selected := true;
367   edtConstCaption.SetFocus;
368   edtConstCaption.SelectAll;
369 end;
370
371 procedure TfrmConstEditor.edtExit(Sender: TObject);
372 var dummy: boolean;
373 begin
374   tvwConstChanging(self, nil, dummy);
375 end;
376
377 procedure TfrmConstEditor.ChangeActionStatus;
378 var
379   Selected: TTreeNode;
380 begin
381   // \8fó\91Ô\82É\89\9e\82\82Ä\83\81\83j\83\85\81[\93\99\82Ì\97L\8cø\81E\96³\8cø\82ð\90Ø\91Ö\82¦\82é
382   Selected := tvwConst.Selected;
383   pageConstText.Enabled := Selected <> nil;
384   actMoveDown.Enabled := Selected <> nil;
385   actNewConst.Enabled := Selected <> nil;
386   actDelete.Enabled   := Selected <> nil;
387   actMoveUp.Enabled   := Selected <> nil;
388 end;
389
390 end.