OSDN Git Service

Ver2.12 - ConfigTreeView, FixMessySurface
[winbottle/winbottle.git] / bottleclient / SettingForm.pas
1 unit SettingForm;
2
3 interface
4
5 uses
6   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
7   ComCtrls, StdCtrls, ExtCtrls, ColorCBX, BottleDef, EllipsEd, Spin,
8   CPCConfigTreeView;
9
10 type
11   TfrmSetting = class(TForm)
12     PageControl: TPageControl;
13     btnClose: TButton;
14     tstGeneral: TTabSheet;
15     tstColor: TTabSheet;
16     tstKeys: TTabSheet;
17     rgpWhenReturn: TRadioGroup;
18     rgpWhenShiftReturn: TRadioGroup;
19     rgpWhenCtrlReturn: TRadioGroup;
20     memDefaultScript: TMemo;
21     lblDefaultScript: TLabel;
22     grpLocalConfirm: TGroupBox;
23     ColorDialog: TColorDialog;
24     cbxColorScript: TCheckBox;
25     trkColorTimeLag: TTrackBar;
26     trkColorSpeed: TTrackBar;
27     grpColor: TGroupBox;
28     colTalkColorU: TColorCBox;
29     colMetaWordColor: TColorCBox;
30     Label4: TLabel;
31     Label2: TLabel;
32     Label1: TLabel;
33     colTalkColorH: TColorCBox;
34     Label3: TLabel;
35     colMarkUpColor: TColorCBox;
36     Label5: TLabel;
37     colMarkErrorColor: TColorCBox;
38     cbxIgnoreTimeCritical: TCheckBox;
39     lblColorTimeLag: TLabel;
40     lblColorSpeed: TLabel;
41     colBgColor: TColorCBox;
42     Label8: TLabel;
43     tstReceive: TTabSheet;
44     cbxPort: TComboBox;
45     Label9: TLabel;
46     cbxAutoStart: TCheckBox;
47     tstChannel: TTabSheet;
48     tvwChannels: TTreeView;
49     rgpUseChannelPrefs: TRadioGroup;
50     pnlChannelOpt: TPanel;
51     edtSoundFile: TEllipsesEdit;
52     cbxSoundArrived: TCheckBox;
53     rgpTargetGhost: TGroupBox;
54     cbxIgnoreIfGhost: TCheckBox;
55     cbxTargetGhost: TComboBox;
56     cbxUsePort: TCheckBox;
57     rgpTabPosition: TRadioGroup;
58     cbxCanAutoAdd: TCheckBox;
59     OpenDialog: TOpenDialog;
60     spnWaitScriptEnd: TSpinEdit;
61     lblWaitScriptEnd: TLabel;
62     cbxNoSendGhostList: TCheckBox;
63     TabSheet1: TTabSheet;
64     grpProxy: TGroupBox;
65     cbxUseHttpProxy: TCheckBox;
66     edtProxyAddress: TEdit;
67     edtProxyPort: TEdit;
68     lblProxyAddress: TLabel;
69     lblProxyPort: TLabel;
70     Label6: TLabel;
71     cbxWarnPost: TCheckBox;
72     cbxConfirmOnExit: TCheckBox;
73     ctvBottle: TCPCConfigTreeView;
74     procedure ColorPick(Sender: TObject; var Col: TColor);
75     procedure FormClose(Sender: TObject; var Action: TCloseAction);
76     procedure cbxPortChange(Sender: TObject);
77     procedure edtSoundFileButtonClick(Sender: TObject);
78     procedure tvwChannelsCompare(Sender: TObject; Node1, Node2: TTreeNode;
79       Data: Integer; var Compare: Integer);
80     procedure tvwChannelsChange(Sender: TObject; Node: TTreeNode);
81     procedure rgpUseChannelPrefsClick(Sender: TObject);
82     procedure cbxSoundArrivedClick(Sender: TObject);
83     procedure edtSoundFileChange(Sender: TObject);
84     procedure cbxTargetGhostChange(Sender: TObject);
85     procedure cbxIgnoreIfGhostClick(Sender: TObject);
86     procedure cbxUsePortClick(Sender: TObject);
87     procedure cbxCanAutoAddClick(Sender: TObject);
88     procedure edtProxyPortKeyPress(Sender: TObject; var Key: Char);
89     procedure cbxWarnPostClick(Sender: TObject);
90     procedure ctvBottleNodeChecked(Sender: TObject;
91       Node: TCPCConfigItemNode);
92     procedure ctvBottleNodeChecking(Sender: TObject;
93       Node: TCPCConfigItemNode; var Allow: Boolean);
94   private
95     { Private \90é\8c¾ }
96     function SelChPref: TChannelPrefs;
97     function BottleImage(ChPref: TChannelPrefs): integer;
98   public
99     { Public \90é\8c¾ }
100     procedure Execute;
101   end;
102
103 var
104   frmSetting: TfrmSetting;
105
106 const
107   DefaultNode = -1;
108   ChannelDefaultGhost = '(\83`\83\83\83\93\83l\83\8b\90\84\8f§\83S\81[\83X\83g)';
109   CheckedBottle = 22;
110   UnCheckedBottle = 17;
111
112 implementation
113
114 {$R *.DFM}
115
116 uses MainForm;
117
118 procedure TfrmSetting.ColorPick(Sender: TObject; var Col: TColor);
119 begin
120   ColorDialog.Color := Col;
121   if ColorDialog.Execute then begin
122     Col := ColorDialog.Color;
123   end;
124 end;
125
126 procedure TfrmSetting.Execute;
127 var i: integer;
128     Node: TTreeNode;
129 begin
130   PageControl.ActivePage := tstGeneral;
131   memDefaultScript.Text := Pref.DefaultScript;
132   cbxIgnoreTimeCritical.Checked := Pref.IgnoreTimeCritical;
133   cbxNoSendGhostList.Checked := Pref.NoSendGhostList;
134   cbxConfirmOnExit.Checked := Pref.ConfirmOnExit;
135   //
136   cbxColorScript.Checked := Pref.ColorScript;
137   colTalkColorH.SelColor := Pref.TalkColorH;
138   colTalkColorU.SelColor := Pref.TalkColorU;
139   colMarkUpColor.SelColor := Pref.MarkUpColor;
140   colMetaWordColor.SelColor := Pref.MetaWordColor;
141   colMarkErrorColor.SelColor := Pref.MarkErrorColor;
142   colBgColor.SelColor := Pref.BgColor;
143   trkColorTimeLag.Position := Pref.ColorTimeLagValue;
144   trkColorSpeed.Position := Pref.ColorSpeed;
145   //
146   cbxAutoStart.Checked := Pref.AutoStart;
147   rgpTabPosition.ItemIndex := Ord(Pref.TabPosition);
148   {
149   cbxNoTranslate.Checked := Pref.NoTranslate;
150   cbxNoDescript.Checked := Pref.NoDescript;
151   cbxNoTransUrl.Checked := Pref.NoTransUrl;
152   cbxSilentWhenHidden.Checked := Pref.SilentWhenHidden;
153   }
154   try
155     with ctvBottle do begin
156       (GetNodeFromKeyPath('Arrive\NoTranslate') as TCPCCheckBoxNode).Checked := Pref.NoTranslate;
157       (GetNodeFromKeyPath('Arrive\NoDescript') as TCPCCheckBoxNode).Checked := Pref.NoTranslate;
158       if Pref.NoTransUrl then
159         (GetNodeFromKeyPath('Arrive\UrlTag\NoSelection') as TCPCRadioNode).Check
160       else
161         (GetNodeFromKeyPath('Arrive\UrlTag\WithSelection') as TCPCRadioNode).Check;
162       (GetNodeFromKeyPath('Arrive\SilentWhenHidden') as TCPCCheckBoxNode).Checked := Pref.SilentWhenHidden;
163       (GetNodeFromKeyPath('Arrive\FixMessySurface') as TCPCCheckBoxNode).Checked := Pref.FixMessySurface;
164     end;
165   except
166     on E: Exception do ShowMessage(E.Message);
167   end;
168   //cbxIgnoreFrequentYenS.Checked := Pref.IgnoreFrequentYenS;
169   spnWaitScriptEnd.Value := Pref.WaitScriptEnd;
170   //
171   rgpWhenReturn.ItemIndex := Ord(Pref.WhenReturn);
172   rgpWhenShiftReturn.ItemIndex := Ord(Pref.WhenShiftReturn);
173   rgpWhenCtrlReturn.ItemIndex := Ord(Pref.WhenCtrlReturn);
174   //
175   cbxPort.ItemIndex := cbxPort.Items.Count-1; //\81u\82»\82Ì\91¼\81v
176   for i := 0 to cbxPort.Items.Count-2 do begin
177     if StrToIntDef(cbxPort.Items[i], 0) = Pref.ServerPort then
178       cbxPort.ItemIndex := i;
179   end;
180   cbxUsePort.Checked := Pref.UsePort;
181   cbxPort.Enabled := cbxUsePort.Checked;
182   cbxUsePort.OnClick := cbxUsePortClick; //Dialog\8aJ\82¢\82½\8fu\8aÔ\82É\8cx\8d\90\82³\82ê\82È\82¢\82æ\82¤
183   //
184   //Channels
185   tvwChannels.Items.Clear;
186   Node := tvwChannels.Items.Add(nil, '\83f\83t\83H\83\8b\83g');
187   Node.ImageIndex := 1;
188   Node.SelectedIndex := 1;
189   Node.Data := pointer(DefaultNode);
190   for i := 0 to Pref.ChannelPrefCount-1 do begin
191     Node := tvwChannels.Items.Add(nil, Pref.ChannelPrefIndex[i].ChannelName);
192     Node.Data := pointer(i); //\96{\93\96\82Í\82â\82Á\82¿\82á\82¢\82¯\82È\82¢Int>Pointer\83L\83\83\83X\83g
193     Node.ImageIndex := BottleImage(Pref.ChannelPrefIndex[i]);
194     Node.SelectedIndex := BottleImage(Pref.ChannelPrefIndex[i]);
195   end;
196   cbxTargetGhost.Items.Clear;
197   cbxTargetGhost.Items.Add(ChannelDefaultGhost);
198   frmSender.SakuraSeeker.BeginDetect;
199   for i := 0 to frmSender.SakuraSeeker.Count-1 do begin
200     cbxTargetGhost.Items.Add(frmSender.SakuraSeeker[i].Name);
201   end;
202   rgpUseChannelPrefs.Enabled := false;
203   rgpUseChannelPrefsClick(Self);
204   //
205   cbxUseHttpProxy.Checked := Pref.UseHttpProxy;
206   edtProxyAddress.Text := Pref.ProxyAddress;
207   edtProxyPort.Text := IntToStr(Pref.ProxyPort);
208   ShowModal;
209 end;
210
211 procedure TfrmSetting.FormClose(Sender: TObject; var Action: TCloseAction);
212 begin
213   Pref.DefaultScript := memDefaultScript.Text;
214   Pref.IgnoreTimeCritical := cbxIgnoreTimeCritical.Checked;
215   Pref.NoSendGhostList := cbxNoSendGhostList.Checked;
216   Pref.ConfirmOnExit := cbxConfirmOnExit.Checked;
217   //
218   Pref.ColorScript := cbxColorScript.Checked;
219   Pref.TalkColorH := colTalkColorH.SelColor;
220   Pref.TalkColorU := colTalkColorU.SelColor;
221   Pref.MarkUpColor := colMarkUpColor.SelColor;
222   Pref.MetaWordColor := colMetaWordColor.SelColor;
223   Pref.MarkErrorColor := colMarkErrorColor.SelColor;
224   Pref.BgColor := colBgColor.SelColor;
225   Pref.ColorTimeLagValue := trkColorTimeLag.Position;
226   Pref.ColorSpeed := trkColorSpeed.Position;
227   //
228   Pref.AutoStart := cbxAutoStart.Checked;
229   Pref.TabPosition := TTabPosition(rgpTabPosition.ItemIndex);
230   try
231     with ctvBottle do begin
232       Pref.NoTranslate := (GetNodeFromKeyPath('Arrive\NoTranslate') as TCPCCheckBoxNode).Checked;
233       Pref.NoDescript := (GetNodeFromKeyPath('Arrive\NoDescript') as TCPCCheckBoxNode).Checked;
234       Pref.NoTransUrl := (GetNodeFromKeyPath('Arrive\UrlTag\NoSelection') as TCPCRadioNode).Checked;
235       Pref.SilentWhenHidden := (GetNodeFromKeyPath('Arrive\SilentWhenHidden') as TCPCCheckBoxNode).Checked;
236       Pref.FixMessySurface := (GetNodeFromKeyPath('Arrive\FixMessySurface') as TCPCCheckBoxNode).Checked;
237     end;
238   except
239     on E: Exception do ShowMessage(E.Message);
240   end;
241   //Pref.IgnoreFrequentYenS := cbxIgnoreFrequentYenS.Checked;
242   Pref.WaitScriptEnd := spnWaitScriptEnd.Value;
243   //
244   Pref.WhenReturn := TReturnKeyFunction(rgpWhenReturn.ItemIndex);
245   Pref.WhenShiftReturn := TReturnKeyFunction(rgpWhenShiftReturn.ItemIndex);
246   Pref.WhenCtrlReturn := TReturnKeyFunction(rgpWhenCtrlReturn.ItemIndex);
247   //
248   Pref.UsePort := cbxUsePort.Checked;
249   //
250   Pref.UseHttpProxy := cbxUseHttpProxy.Checked;
251   Pref.ProxyAddress := edtProxyAddress.Text;
252   Pref.ProxyPort := StrToInt(edtProxyPort.Text);
253 end;
254
255 procedure TfrmSetting.cbxPortChange(Sender: TObject);
256 var Str: String;
257     i: integer;
258 begin
259   with cbxPort do begin
260     if ItemIndex = Items.Count-1 then begin
261       //\82»\82Ì\91¼
262       Str := IntToStr(Pref.ServerPort);
263       if InputQuery('\83|\81[\83g\94Ô\8d\86\82Ì\8ew\92è', '\83|\81[\83g\94Ô\8d\86', Str) then begin
264         Pref.ServerPort := StrToIntDef(Str, Pref.ServerPort);
265       end;
266     end else begin
267       Pref.ServerPort := StrToIntDef(Items[ItemIndex], Pref.ServerPort);
268     end;
269     for i := 0 to Items.Count-2 do begin
270       if Pref.ServerPort = StrToInt(Items[i]) then ItemIndex := i;
271     end;
272   end;
273 end;
274
275 procedure TfrmSetting.edtSoundFileButtonClick(Sender: TObject);
276 begin
277   if OpenDialog.Execute then begin
278     edtSoundFile.Text := OpenDialog.FileName;
279   end;
280 end;
281
282 procedure TfrmSetting.tvwChannelsCompare(Sender: TObject; Node1,
283   Node2: TTreeNode; Data: Integer; var Compare: Integer);
284 begin
285   if Node1.Text = '\83f\83t\83H\83\8b\83g' then
286     Compare := -1
287   else if Node2.Text = '\83f\83t\83H\83\8b\83g' then
288     Compare := 1
289   else
290     Compare := AnsiCompareStr(Node1.Text, Node2.Text);
291 end;
292
293 procedure TfrmSetting.tvwChannelsChange(Sender: TObject; Node: TTreeNode);
294 var ChPref: TChannelPrefs;
295 begin
296   rgpUseChannelPrefs.Enabled := true;
297   if integer(Node.Data) = DefaultNode then begin
298     ChPref := Pref.DefChannelPref;
299     cbxCanAutoAdd.Enabled := false;
300     cbxWarnPost.Enabled := false;
301     rgpUseChannelPrefs.Enabled := false;
302     cbxSoundArrived.AllowGrayed := false;
303   end else begin
304     ChPref := Pref.ChannelPrefIndex[integer(Node.Data)];
305     cbxCanAutoAdd.Enabled := true;
306     cbxWarnPost.Enabled := true;
307     rgpUseChannelPrefs.Enabled := true;
308     cbxSoundArrived.AllowGrayed := true;
309   end;
310   cbxCanAutoAdd.Checked := ChPref.CanAutoAdd;
311   cbxWarnPost.Checked := ChPref.WarnPost;
312   if ChPref.UseChannelPrefs then begin
313     rgpUseChannelPrefs.ItemIndex := 0;
314   end else begin
315     rgpUseChannelPrefs.ItemIndex := 1;
316   end;
317   cbxSoundArrived.State := TCheckBoxState(ChPref.SoundArrived);
318   edtSoundFile.Text := ChPref.SoundFile;
319   cbxIgnoreIfGhost.Checked := ChPref.IgnoreIfGhost;
320   if ChPref.TargetGhost <> '' then
321     cbxTargetGhost.Text := ChPref.TargetGhost
322   else
323     cbxTargetGhost.Text := ChannelDefaultGhost;
324 end;
325
326 procedure TfrmSetting.rgpUseChannelPrefsClick(Sender: TObject);
327 begin
328   pnlChannelOpt.Visible := ((rgpUseChannelPrefs.ItemIndex = 0) and
329                             (tvwChannels.Selected <> nil));
330   if SelChPref <> nil then begin
331     SelChPref.UseChannelPrefs := (rgpUseChannelPrefs.ItemIndex = 0);
332     tvwChannels.Selected.ImageIndex := BottleImage(SelChPref);
333     tvwChannels.Selected.SelectedIndex := BottleImage(SelChPref);
334   end;
335 end;
336
337 function TfrmSetting.BottleImage(ChPref: TChannelPrefs): integer;
338 begin
339   if ChPref = Pref.DefChannelPref then Result := 1
340   else if ChPref.UseChannelPrefs then Result := CheckedBottle
341   else Result := UnCheckedBottle;
342 end;
343
344 function TfrmSetting.SelChPref: TChannelPrefs;
345 begin
346   if tvwChannels.Selected = nil then begin
347     Result := nil;
348     Exit;
349   end else if integer(tvwChannels.Selected.Data) = DefaultNode then begin
350     Result := Pref.DefChannelPref;
351   end else begin
352     Result := Pref.ChannelPrefIndex[integer(tvwChannels.Selected.Data)];
353   end;
354 end;
355
356 procedure TfrmSetting.cbxSoundArrivedClick(Sender: TObject);
357 begin
358   SelChPref.SoundArrived := TSoundArrived(cbxSoundArrived.State);
359 end;
360
361 procedure TfrmSetting.edtSoundFileChange(Sender: TObject);
362 begin
363   SelChPref.SoundFile := edtSoundFile.Text;
364 end;
365
366 procedure TfrmSetting.cbxTargetGhostChange(Sender: TObject);
367 begin
368   if cbxTargetGhost.ItemIndex = 0 then
369     SelChPref.TargetGhost := ''
370   else
371     SelChPref.TargetGhost := cbxTargetGhost.Text;
372 end;
373
374 procedure TfrmSetting.cbxIgnoreIfGhostClick(Sender: TObject);
375 begin
376   SelChPref.IgnoreIfGhost := cbxIgnoreIfGhost.Checked;
377 end;
378
379 procedure TfrmSetting.cbxUsePortClick(Sender: TObject);
380 var Re: integer;
381 const Mes = '\8f]\97\88\82Ì\95û\96@\82ð\91I\91ð\82µ\82½\8fê\8d\87\81ASSTP\82ð\8eó\90M\82Å\82«\82é\83S\81[\83X\83g\82Í'+
382             '\83\89\83\93\83_\83\80\82È\88ê\91Ì\82¾\82¯\82Æ\82È\82è\81AIfGhost\82ª\88ê\90Ø\8eg\97p\82Å\82«\82È\82­\82È\82è\82Ü\82·\81B';
383 begin
384   if cbxUsePort.Checked then begin
385     Re := MessageDlg(Mes, mtWarning, mbOkCancel, 0);
386     if Re = mrCancel then cbxUsePort.Checked := false;
387   end;
388   cbxPort.Enabled := cbxUsePort.Checked;
389   Pref.UsePort := cbxUsePort.Checked;
390 end;
391
392 procedure TfrmSetting.cbxCanAutoAddClick(Sender: TObject);
393 begin
394   SelChPref.CanAutoAdd := cbxCanAutoAdd.Checked;
395 end;
396
397 procedure TfrmSetting.edtProxyPortKeyPress(Sender: TObject; var Key: Char);
398 begin
399   if not(Key in ['0'..'9']) then Key := Char(0);
400 end;
401
402 procedure TfrmSetting.cbxWarnPostClick(Sender: TObject);
403 begin
404   SelChPref.WarnPost := cbxWarnPost.Checked;
405 end;
406
407 procedure TfrmSetting.ctvBottleNodeChecked(Sender: TObject;
408   Node: TCPCConfigItemNode);
409 begin
410   //ShowMessage(ctvBottle.GetFullKeyPath(Node));
411 end;
412
413 procedure TfrmSetting.ctvBottleNodeChecking(Sender: TObject;
414   Node: TCPCConfigItemNode; var Allow: Boolean);
415 begin
416   if Node.KeyName = 'IgnoreBottle' then begin
417     MessageDlg('\82±\82Ì\8b@\94\\82Í\8eÀ\91\95\82³\82ê\82Ä\82¢\82Ü\82¹\82ñ', mtError, [mbOk], 0);
418     Allow := false;
419   end;
420 end;
421
422 end.