OSDN Git Service

プリセット置換後自動でローカル確認するオプションを追加。
[winbottle/winbottle.git] / bottleclient / ReplacePresetEditor.pas
1 unit ReplacePresetEditor;
2
3 interface
4
5 uses
6   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
7   Dialogs, ComCtrls, StrReplaceFrame, StdCtrls, StrReplace, ExtCtrls,
8   Menus, BottleDef;
9
10 {
11   \83t\83H\81[\83\80\82ÌAutoSize = true\82É\90Ý\92è\82³\82ê\82Ä\82¢\82é\82½\82ß\81A
12   \83t\83H\81[\83\80\82Í\92\86\96¡\82É\89\9e\82\82Ä\8e©\93®\93I\82É\8fk\82Þ\81B
13
14   \82³\82ç\82É\81A\83t\83H\81[\83\80\82Í\81A\82·\82×\82Ä Align = alTop \82É\90Ý\92è\82³\82ê\82½3\82Â\82Ì
15   \83p\83l\83\8b\82É\82æ\82Á\82Ä\8bæ\90Ø\82ç\82ê\82Ä\82¢\82é\81B
16
17   \88ê\94Ô\8fã\82Ì\83p\83l\83\8b pnlPairsEditor \82Æ\81A
18   \88ê\94Ô\89º\82Ì\83p\83l\83\8b pnlOkCancelButtons \82Í\81A\8fí\82É\95\\8e¦\82³\82ê\82Ä\82¢\82é\82ª\81A
19   \90^\82ñ\92\86\82Ì\83p\83l\83\8b pnlPresetProperties \82Í\81AAskForTitle\83v\83\8d\83p\83e\83B\82É
20   \89\9e\82\82Ä\81A\95\\8e¦\82³\82ê\82½\82è\89B\82ê\82½\82è\82·\82é\81B
21   \82±\82ê\82ç\82Ì\8c\8b\89Ê\81A\83t\83H\81[\83\80\8e©\90g\82ª\8e©\93®\93I\82É\90L\82Ñ\8fk\82Ý\82·\82é\82æ\82¤\82É\82È\82Á\82Ä\82¢\82é\81B
22
23   \83t\83H\81[\83\80\82Ì\91å\82«\82³\82ð\95Ï\8dX\82µ\82½\82¢\81A\82Æ\82¢\82Á\82½\8fê\8d\87\82É\82Í\81A
24   \88ê\92U AutoSize = false \82É\82µ\82Ä\83T\83C\83Y\95Ï\8dX\82µ\82½\8cã\82Å\81A
25   \95K\82¸ AutoSize = true \82É\96ß\82µ\82Ä\82¨\82­\82±\82Æ\81B
26 }
27
28 type
29   TfrmReplacePresetEditor = class(TForm)
30     pnlPairsEditor: TPanel;
31     lvwPairs: TListView;
32     btnAdd: TButton;
33     btnDelete: TButton;
34     btnMoveUp: TButton;
35     btnMoveDown: TButton;
36     StrReplaceFrame: TfrmStrReplaceFrame;
37     pnlPresetProperties: TPanel;
38     pnlOkCancelButtons: TPanel;
39     btnOk: TButton;
40     btnCancel: TButton;
41     gbxPresetProperties: TGroupBox;
42     cbxShortCut: TComboBox;
43     edtTitle: TEdit;
44     lblTitle: TLabel;
45     lblShortCut: TLabel;
46     cbxConfirmAfterReplace: TCheckBox;
47     procedure btnAddClick(Sender: TObject);
48     procedure btnDeleteClick(Sender: TObject);
49     procedure btnMoveUpClick(Sender: TObject);
50     procedure btnMoveDownClick(Sender: TObject);
51     procedure lvwPairsChange(Sender: TObject; Item: TListItem;
52       Change: TItemChange);
53     procedure btnOkClick(Sender: TObject);
54     procedure btnCancelClick(Sender: TObject);
55     procedure FormCreate(Sender: TObject);
56   private
57     FPairs: TReplacePairCollection;
58     procedure SetPairs(const Value: TReplacePairCollection);
59     function GetAskForTitle: Boolean;
60     function GetShortCut: TShortCut;
61     function GetTitle: string;
62     function GetConfirmAfterReplace: Boolean;
63     procedure SetAskForTitle(const Value: Boolean);
64     procedure SetShortCut(const Value: TShortCut);
65     procedure SetTitle(const Value: string);
66     procedure SetConfirmAfterReplace(const Value: Boolean);
67   protected
68     procedure MoveItem(const Delta: Integer);
69     procedure UpdateControls;
70     procedure UpdateListViewItem(Target: TListItem);
71     procedure FollowEdit;
72     procedure FrameUpdate(Sender: TObject);
73   public
74     constructor Create(AOwner: TCOmponent); override;
75     destructor Destroy; override;
76     property Pairs: TReplacePairCollection read FPairs write SetPairs;
77     property Title: string read GetTitle write SetTitle;
78     property ShortCut: TShortCut read GetShortCut write SetShortCut;
79     property AskForTitle: Boolean read GetAskForTitle write SetAskForTitle;
80     property ConfirmAfterReplace: Boolean read GetConfirmAfterReplace write SetConfirmAfterReplace;
81     function Execute: Boolean;
82   end;
83
84 implementation
85
86 {$R *.dfm}
87
88 { TfrmReplacePresetEditor }
89
90 constructor TfrmReplacePresetEditor.Create(AOwner: TCOmponent);
91 begin
92   inherited;
93   FPairs := TReplacePairCollection.Create(TReplacePair);
94 end;
95
96 destructor TfrmReplacePresetEditor.Destroy;
97 begin
98   FPairs.Free;
99   inherited;
100 end;
101
102 procedure TfrmReplacePresetEditor.SetPairs(const Value: TReplacePairCollection);
103 begin
104   FPairs.Assign(Value);
105   UpdateControls;
106 end;
107
108 procedure TfrmReplacePresetEditor.UpdateControls;
109 var
110   i, SelectedIndex: Integer;
111 begin
112   if lvwPairs.Selected <> nil then
113     SelectedIndex := lvwPairs.Selected.Index
114   else
115     SelectedIndex := -1;
116   with lvwPairs.Items do
117   begin
118     Clear;
119     BeginUpdate;
120     try
121       for i := 0 to FPairs.Count-1 do
122       begin
123         UpdateListViewItem(Add);
124       end;
125       if (SelectedIndex > -1) and (lvwPairs.Selected <> nil) then
126         if (lvwPairs.Selected.Index <> SelectedIndex) and
127         (lvwPairs.Items.Count-1 > SelectedIndex) then
128           lvwPairs.Items[SelectedIndex].Selected := true; 
129     finally
130       EndUpdate;
131     end;
132   end;
133 end;
134
135 procedure TfrmReplacePresetEditor.btnAddClick(Sender: TObject);
136 var
137   New: TListItem;
138 begin
139   // \90V\82µ\82­\89Á\82¦\82Ä\82»\82ê\82ð\91I\91ð
140   StrReplaceFrame.OnContentUpdate := nil;
141   try
142     StrReplaceFrame.Pair := FPairs.Add;
143     New := lvwPairs.Items.Add;
144     lvwPairs.Selected := New;
145     UpdateListViewItem(New);
146     // \83t\83H\81[\83J\83X\88Ú\93®\81A\95Ò\8fW\8aJ\8en
147     StrReplaceFrame.edtOldPattern.SetFocus;
148   finally
149     StrReplaceFrame.OnContentUpdate := FrameUpdate;
150   end;
151 end;
152
153 procedure TfrmReplacePresetEditor.UpdateListViewItem(Target: TListItem);
154 var
155   Pair: TReplacePair;
156 begin
157   with Target do
158   begin
159     lvwPairs.Items.BeginUpdate;
160     try
161       Pair := FPairs[Target.Index];
162       Caption := Pair.BeforeStr;
163       SubItems.Clear;
164       SubItems.Add(Pair.AfterStr);
165       if Pair.UseRegExp then
166         SubItems.Add('Y')
167       else
168         SubItems.Add('-');
169       if not Pair.IgnoreCase then
170         SubItems.Add('Y')
171       else
172         SubItems.Add('-');
173     finally
174       lvwPairs.Items.EndUpdate;
175     end;
176   end;
177 end;
178
179 procedure TfrmReplacePresetEditor.btnDeleteClick(Sender: TObject);
180 var
181   TargetIndex: Integer;
182 begin
183   if lvwPairs.Selected = nil then
184     Exit;
185   TargetIndex := lvwPairs.Selected.Index;
186   FPairs.Delete(TargetIndex);
187   lvwPairs.Items.Delete(TargetIndex);
188 end;
189
190 procedure TfrmReplacePresetEditor.btnMoveUpClick(Sender: TObject);
191 begin
192   MoveItem(-1);
193 end;
194
195 procedure TfrmReplacePresetEditor.btnMoveDownClick(Sender: TObject);
196 begin
197   MoveItem(1);
198 end;
199
200 procedure TfrmReplacePresetEditor.lvwPairsChange(Sender: TObject;
201   Item: TListItem; Change: TItemChange);
202 begin
203   if Change <> ctState then
204     Exit;
205   with StrReplaceFrame do
206   begin
207     if lvwPairs.Selected = nil then
208     begin
209       Enabled := false;
210     end else
211     begin
212       Enabled := true;
213       Pair := FPairs[lvwPairs.Selected.Index];
214     end;
215   end;
216 end;
217
218 function TfrmReplacePresetEditor.Execute: Boolean;
219 begin
220   UpdateControls;
221   StrReplaceFrame.OnContentUpdate := FrameUpdate; 
222   if lvwPairs.Items.Count > 0 then
223   begin
224     lvwPairs.Items[0].Selected := true;
225   end;
226   Result := ShowModal = mrOk;
227 end;
228
229 procedure TfrmReplacePresetEditor.btnOkClick(Sender: TObject);
230 var
231   i: integer;
232 begin
233   if Pairs.Count = 0 then
234   begin
235     ShowMessage('\8dÅ\92á1\82Â\82Ì\92u\8a·\83\8b\81[\83\8b\82ð\90Ý\92è\82µ\82Ä\82­\82¾\82³\82¢');
236     Exit;
237   end;
238   for i := 0 to Pairs.Count-1 do
239     if not Pairs[i].IsValidPair then
240     begin
241       ShowMessage(Format('%d\94Ô\96Ú\82Ì\95\8e\9a\97ñ\83y\83A\82É\83G\83\89\81[\82ª\82 \82è\82Ü\82·', [i+1]));
242       Exit;
243     end;
244   if AskForTitle and (Title = '') then
245   begin
246     ShowMessage('\83v\83\8a\83Z\83b\83g\82Ì\83^\83C\83g\83\8b\82ð\8ew\92è\82µ\82Ä\82­\82¾\82³\82¢');
247     Exit;
248   end;
249   ModalResult := mrOk;
250 end;
251
252 procedure TfrmReplacePresetEditor.btnCancelClick(Sender: TObject);
253 begin
254   ModalResult := mrCancel;
255 end;
256
257 procedure TfrmReplacePresetEditor.FollowEdit;
258 var
259   CurrentPair: TReplacePair;
260 begin
261   if lvwPairs.Selected <> nil then
262   begin
263     CurrentPair := FPairs[lvwPairs.Selected.Index];
264     CurrentPair.Assign(StrReplaceFrame.Pair);
265     UpdateListViewItem(lvwPairs.Selected);
266   end;
267 end;
268
269 procedure TfrmReplacePresetEditor.FrameUpdate(Sender: TObject);
270 begin
271   FollowEdit;
272 end;
273
274 procedure TfrmReplacePresetEditor.MoveItem(const Delta: Integer);
275 var
276   TargetIndex: Integer;
277   Item: TReplacePair;
278 begin
279   if lvwPairs.Selected = nil then
280     Exit;
281   StrReplaceFrame.OnContentUpdate := nil;
282   try
283     TargetIndex := lvwPairs.Selected.Index;
284     // \94Í\88Í\83`\83F\83b\83N
285     if (Delta < 0) and (TargetIndex < -Delta) then
286       Exit;
287     if (Delta > 0) and (TargetIndex >= Pairs.Count-Delta) then
288       Exit;
289     if Delta = 0 then
290       Exit; // \88ê\89\9e
291     // \88ê\92U\83R\83\8c\83N\83V\83\87\83\93\82©\82ç\8aO\82µ\82Ä
292     Item := FPairs.Items[TargetIndex];
293     Item.Collection := nil;
294     // \90V\82µ\82­INSERT\82µ\82½\90V\8bK\8d\80\96Ú\82É\91ã\93ü
295     FPairs.Insert(TargetIndex + Delta).Assign(Item);
296     UpdateControls;
297     // \83\8a\83X\83g\83r\83\85\81[\82Ì\91I\91ð\83A\83C\83e\83\80\82ð\93®\82©\82·
298     lvwPairs.Items[TargetIndex + Delta].Selected := true;
299   finally
300     StrReplaceFrame.OnContentUpdate := FrameUpdate;
301   end;
302 end;
303
304 function TfrmReplacePresetEditor.GetAskForTitle: Boolean;
305 begin
306   Result := pnlPresetProperties.Visible;
307 end;
308
309 function TfrmReplacePresetEditor.GetShortCut: TShortCut;
310 begin
311   Result := TextToShortCut(cbxShortCut.Text);
312 end;
313
314 function TfrmReplacePresetEditor.GetTitle: string;
315 begin
316   Result := edtTitle.Text;
317 end;
318
319 procedure TfrmReplacePresetEditor.SetAskForTitle(const Value: Boolean);
320 begin
321   pnlPresetProperties.Visible := Value;
322 end;
323
324 procedure TfrmReplacePresetEditor.SetShortCut(const Value: TShortCut);
325 begin
326   cbxShortCut.Text := ShortCutToText(Value);
327 end;
328
329 procedure TfrmReplacePresetEditor.SetTitle(const Value: string);
330 begin
331   edtTitle.Text := Value;
332 end;
333
334 procedure TfrmReplacePresetEditor.SetConfirmAfterReplace(const Value: Boolean);
335 begin
336   cbxConfirmAfterReplace.Checked := Value;
337 end;
338
339 function TfrmReplacePresetEditor.GetConfirmAfterReplace: Boolean;
340 begin
341   result := cbxConfirmAfterReplace.Checked;
342 end;
343
344 procedure TfrmReplacePresetEditor.FormCreate(Sender: TObject);
345 begin
346   BuildShortCutList(cbxShortCut.Items);
347 end;
348
349 end.