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     procedure btnAddClick(Sender: TObject);
47     procedure btnDeleteClick(Sender: TObject);
48     procedure btnMoveUpClick(Sender: TObject);
49     procedure btnMoveDownClick(Sender: TObject);
50     procedure lvwPairsChange(Sender: TObject; Item: TListItem;
51       Change: TItemChange);
52     procedure btnOkClick(Sender: TObject);
53     procedure btnCancelClick(Sender: TObject);
54     procedure FormCreate(Sender: TObject);
55   private
56     FPairs: TReplacePairCollection;
57     procedure SetPairs(const Value: TReplacePairCollection);
58     function GetAskForTitle: Boolean;
59     function GetShortCut: TShortCut;
60     function GetTitle: string;
61     procedure SetAskForTitle(const Value: Boolean);
62     procedure SetShortCut(const Value: TShortCut);
63     procedure SetTitle(const Value: string);
64   protected
65     procedure MoveItem(const Delta: Integer);
66     procedure UpdateControls;
67     procedure UpdateListViewItem(Target: TListItem);
68     procedure FollowEdit;
69     procedure FrameUpdate(Sender: TObject);
70   public
71     constructor Create(AOwner: TCOmponent); override;
72     destructor Destroy; override;
73     property Pairs: TReplacePairCollection read FPairs write SetPairs;
74     property Title: string read GetTitle write SetTitle;
75     property ShortCut: TShortCut read GetShortCut write SetShortCut;
76     property AskForTitle: Boolean read GetAskForTitle write SetAskForTitle;
77     function Execute: Boolean;
78   end;
79
80 implementation
81
82 {$R *.dfm}
83
84 { TfrmReplacePresetEditor }
85
86 constructor TfrmReplacePresetEditor.Create(AOwner: TCOmponent);
87 begin
88   inherited;
89   FPairs := TReplacePairCollection.Create(TReplacePair);
90 end;
91
92 destructor TfrmReplacePresetEditor.Destroy;
93 begin
94   FPairs.Free;
95   inherited;
96 end;
97
98 procedure TfrmReplacePresetEditor.SetPairs(const Value: TReplacePairCollection);
99 begin
100   FPairs.Assign(Value);
101   UpdateControls;
102 end;
103
104 procedure TfrmReplacePresetEditor.UpdateControls;
105 var
106   i, SelectedIndex: Integer;
107 begin
108   if lvwPairs.Selected <> nil then
109     SelectedIndex := lvwPairs.Selected.Index
110   else
111     SelectedIndex := -1;
112   with lvwPairs.Items do
113   begin
114     Clear;
115     BeginUpdate;
116     try
117       for i := 0 to FPairs.Count-1 do
118       begin
119         UpdateListViewItem(Add);
120       end;
121       if (SelectedIndex > -1) and (lvwPairs.Selected <> nil) then
122         if (lvwPairs.Selected.Index <> SelectedIndex) and
123         (lvwPairs.Items.Count-1 > SelectedIndex) then
124           lvwPairs.Items[SelectedIndex].Selected := true; 
125     finally
126       EndUpdate;
127     end;
128   end;
129 end;
130
131 procedure TfrmReplacePresetEditor.btnAddClick(Sender: TObject);
132 var
133   New: TListItem;
134 begin
135   // \90V\82µ\82­\89Á\82¦\82Ä\82»\82ê\82ð\91I\91ð
136   StrReplaceFrame.OnContentUpdate := nil;
137   try
138     StrReplaceFrame.Pair := FPairs.Add;
139     New := lvwPairs.Items.Add;
140     lvwPairs.Selected := New;
141     UpdateListViewItem(New);
142     // \83t\83H\81[\83J\83X\88Ú\93®\81A\95Ò\8fW\8aJ\8en
143     StrReplaceFrame.edtOldPattern.SetFocus;
144   finally
145     StrReplaceFrame.OnContentUpdate := FrameUpdate;
146   end;
147 end;
148
149 procedure TfrmReplacePresetEditor.UpdateListViewItem(Target: TListItem);
150 var
151   Pair: TReplacePair;
152 begin
153   with Target do
154   begin
155     lvwPairs.Items.BeginUpdate;
156     try
157       Pair := FPairs[Target.Index];
158       Caption := Pair.BeforeStr;
159       SubItems.Clear;
160       SubItems.Add(Pair.AfterStr);
161       if Pair.UseRegExp then
162         SubItems.Add('Y')
163       else
164         SubItems.Add('-');
165       if not Pair.IgnoreCase then
166         SubItems.Add('Y')
167       else
168         SubItems.Add('-');
169     finally
170       lvwPairs.Items.EndUpdate;
171     end;
172   end;
173 end;
174
175 procedure TfrmReplacePresetEditor.btnDeleteClick(Sender: TObject);
176 var
177   TargetIndex: Integer;
178 begin
179   if lvwPairs.Selected = nil then
180     Exit;
181   TargetIndex := lvwPairs.Selected.Index;
182   FPairs.Delete(TargetIndex);
183   lvwPairs.Items.Delete(TargetIndex);
184 end;
185
186 procedure TfrmReplacePresetEditor.btnMoveUpClick(Sender: TObject);
187 begin
188   MoveItem(-1);
189 end;
190
191 procedure TfrmReplacePresetEditor.btnMoveDownClick(Sender: TObject);
192 begin
193   MoveItem(1);
194 end;
195
196 procedure TfrmReplacePresetEditor.lvwPairsChange(Sender: TObject;
197   Item: TListItem; Change: TItemChange);
198 begin
199   if Change <> ctState then
200     Exit;
201   with StrReplaceFrame do
202   begin
203     if lvwPairs.Selected = nil then
204     begin
205       Enabled := false;
206     end else
207     begin
208       Enabled := true;
209       Pair := FPairs[lvwPairs.Selected.Index];
210     end;
211   end;
212 end;
213
214 function TfrmReplacePresetEditor.Execute: Boolean;
215 begin
216   UpdateControls;
217   StrReplaceFrame.OnContentUpdate := FrameUpdate; 
218   if lvwPairs.Items.Count > 0 then
219   begin
220     lvwPairs.Items[0].Selected := true;
221   end;
222   Result := ShowModal = mrOk;
223 end;
224
225 procedure TfrmReplacePresetEditor.btnOkClick(Sender: TObject);
226 begin
227   if Pairs.Count = 0 then
228     ShowMessage('\8dÅ\92á1\82Â\82Ì\92u\8a·\83\8b\81[\83\8b\82ð\90Ý\92è\82µ\82Ä\82­\82¾\82³\82¢')
229   else
230     ModalResult := mrOk;
231 end;
232
233 procedure TfrmReplacePresetEditor.btnCancelClick(Sender: TObject);
234 begin
235   ModalResult := mrCancel;
236 end;
237
238 procedure TfrmReplacePresetEditor.FollowEdit;
239 var
240   CurrentPair: TReplacePair;
241 begin
242   if lvwPairs.Selected <> nil then
243   begin
244     CurrentPair := FPairs[lvwPairs.Selected.Index];
245     CurrentPair.Assign(StrReplaceFrame.Pair);
246     UpdateListViewItem(lvwPairs.Selected);
247   end;
248 end;
249
250 procedure TfrmReplacePresetEditor.FrameUpdate(Sender: TObject);
251 begin
252   FollowEdit;
253 end;
254
255 procedure TfrmReplacePresetEditor.MoveItem(const Delta: Integer);
256 var
257   TargetIndex: Integer;
258   Item: TReplacePair;
259 begin
260   if lvwPairs.Selected = nil then
261     Exit;
262   StrReplaceFrame.OnContentUpdate := nil;
263   try
264     TargetIndex := lvwPairs.Selected.Index;
265     // \94Í\88Í\83`\83F\83b\83N
266     if (Delta < 0) and (TargetIndex < -Delta) then
267       Exit;
268     if (Delta > 0) and (TargetIndex >= Pairs.Count-Delta) then
269       Exit;
270     if Delta = 0 then
271       Exit; // \88ê\89\9e
272     // \88ê\92U\83R\83\8c\83N\83V\83\87\83\93\82©\82ç\8aO\82µ\82Ä
273     Item := FPairs.Items[TargetIndex];
274     Item.Collection := nil;
275     // \90V\82µ\82­INSERT\82µ\82½\90V\8bK\8d\80\96Ú\82É\91ã\93ü
276     FPairs.Insert(TargetIndex + Delta).Assign(Item);
277     UpdateControls;
278     // \83\8a\83X\83g\83r\83\85\81[\82Ì\91I\91ð\83A\83C\83e\83\80\82ð\93®\82©\82·
279     lvwPairs.Items[TargetIndex + Delta].Selected := true;
280   finally
281     StrReplaceFrame.OnContentUpdate := FrameUpdate;
282   end;
283 end;
284
285 function TfrmReplacePresetEditor.GetAskForTitle: Boolean;
286 begin
287   Result := pnlPresetProperties.Visible;
288 end;
289
290 function TfrmReplacePresetEditor.GetShortCut: TShortCut;
291 begin
292   Result := TextToShortCut(cbxShortCut.Text);
293 end;
294
295 function TfrmReplacePresetEditor.GetTitle: string;
296 begin
297   Result := edtTitle.Text;
298 end;
299
300 procedure TfrmReplacePresetEditor.SetAskForTitle(const Value: Boolean);
301 begin
302   pnlPresetProperties.Visible := Value;
303 end;
304
305 procedure TfrmReplacePresetEditor.SetShortCut(const Value: TShortCut);
306 begin
307   cbxShortCut.Text := ShortCutToText(Value);
308 end;
309
310 procedure TfrmReplacePresetEditor.SetTitle(const Value: string);
311 begin
312   edtTitle.Text := Value;
313 end;
314
315 procedure TfrmReplacePresetEditor.FormCreate(Sender: TObject);
316 begin
317   BuildShortCutList(cbxShortCut.Items);
318 end;
319
320 end.