OSDN Git Service

Added ConfirmOnTabClose
[winbottle/winbottle.git] / bottleclient / SettingForm.pas
1 unit SettingForm;
2
3 {
4   \90Ý\92è\89æ\96Ê\81B\82»\82ê\96¢\96\9e\82Å\82à\82»\82ê\88È\8fã\82Å\82à\82È\82¢\81B
5   Pref\83I\83u\83W\83F\83N\83g\82ð\8eÀ\8dÛ\82É\91\80\8dì\82·\82é\81B
6 }
7
8 interface
9
10 uses
11   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
12   ComCtrls, StdCtrls, ExtCtrls, BottleDef, Spin,
13   CPCConfigTreeView, ColorSettingFrame, BottleChainListFrame, SakuraSeekerInstance,
14   ImgList, StrListEditor, SppList, Plugins, Clipbrd;
15
16 type
17   TfrmSetting = class(TForm)
18     PageControl: TPageControl;
19     btnClose: TButton;
20     tstGeneral: TTabSheet;
21     tstDisplay: TTabSheet;
22     tstKeys: TTabSheet;
23     rgpWhenReturn: TRadioGroup;
24     rgpWhenShiftReturn: TRadioGroup;
25     rgpWhenCtrlReturn: TRadioGroup;
26     memDefaultScript: TMemo;
27     lblDefaultScript: TLabel;
28     tstReceive: TTabSheet;
29     OpenDialog: TOpenDialog;
30     spnWaitScriptEnd: TSpinEdit;
31     lblWaitScriptEnd: TLabel;
32     cbxNoSendGhostList: TCheckBox;
33     cbxConfirmOnExit: TCheckBox;
34     ctvBottle: TCPCConfigTreeView;
35     gbxColor: TGroupBox;
36     frmColorSetting: TfrmColorSetting;
37     tstRule: TTabSheet;
38     frmRuleList: TfrmBottleChainList;
39     tstDetailed: TTabSheet;
40     lblFMOName: TLabel;
41     memFMOName: TMemo;
42     grpProxy: TGroupBox;
43     lblProxyAddress: TLabel;
44     lblProxyPort: TLabel;
45     edtProxyAddress: TEdit;
46     edtProxyPort: TEdit;
47     cbxUseHttpProxy: TCheckBox;
48     tstChannel: TTabSheet;
49     lblAutoJoinChannels: TLabel;
50     memAutoJoinChannels: TMemo;
51     cbxAutoStart: TCheckBox;
52     btnUseCurrentJoinChannels: TButton;
53     Label6: TLabel;
54     ImageList: TImageList;
55     tstSurfacePreview: TTabSheet;
56     lblSurfacePreview: TLabel;
57     lvwPluginList: TListView;
58     lblPluginList: TLabel;
59     ctvSurfacePreview: TCPCConfigTreeView;
60     btnVisibleGhosts: TButton;
61     cbxHideGhosts: TCheckBox;
62     cbxNoExtraSSTPHeaders: TCheckBox;
63     lblLUID: TLabel;
64     edtLUID: TEdit;
65     cbxShowRuler: TCheckBox;
66     rgpTabPosition: TRadioGroup;
67     lblGhostDropDownCount: TLabel;
68     spnGhostDropDownCount: TSpinEdit;
69     cbxIgnoreTimeCritical: TCheckBox;
70     cbxAutoClip: TCheckBox;
71     btnCopyLUID: TButton;
72     tvwCategory: TTreeView;
73     Label1: TLabel;
74     pnlHeading: TPanel;
75     cbxConfirmOnTabClose: TCheckBox;
76     procedure FormClose(Sender: TObject; var Action: TCloseAction);
77     procedure edtProxyPortKeyPress(Sender: TObject; var Key: Char);
78     procedure ctvBottleNodeChecked(Sender: TObject;
79       Node: TCPCConfigItemNode);
80     procedure ctvBottleNodeChecking(Sender: TObject;
81       Node: TCPCConfigItemNode; var Allow: Boolean);
82     procedure tstRuleShow(Sender: TObject);
83     procedure btnUseCurrentJoinChannelsClick(Sender: TObject);
84     procedure btnVisibleGhostsClick(Sender: TObject);
85     procedure lvwPluginListDblClick(Sender: TObject);
86     procedure edtLUIDEnter(Sender: TObject);
87     procedure edtLUIDExit(Sender: TObject);
88     procedure btnCopyLUIDClick(Sender: TObject);
89     procedure FormCreate(Sender: TObject);
90     procedure tvwCategoryChange(Sender: TObject; Node: TTreeNode);
91   private
92     { Private \90é\8c¾ }
93     FOldLUID: String;
94   public
95     { Public \90é\8c¾ }
96     procedure Execute;
97   end;
98
99 var
100   frmSetting: TfrmSetting;
101
102 const
103   DefaultNode = -1;
104   ChannelDefaultGhost = '(\83`\83\83\83\93\83l\83\8b\90\84\8f§\83S\81[\83X\83g)';
105   CheckedBottle = 22;
106   UnCheckedBottle = 17;
107
108 implementation
109
110 {$R *.DFM}
111
112 procedure TfrmSetting.Execute;
113 var i: integer;
114     Node: TCPCGroupNode;
115 begin
116   PageControl.ActivePage := tstGeneral;
117   memDefaultScript.Text := Pref.DefaultScript;
118   cbxShowRuler.Checked := Pref.ShowRuler;
119   cbxIgnoreTimeCritical.Checked := Pref.IgnoreTimeCritical;
120   cbxNoSendGhostList.Checked := Pref.NoSendGhostList;
121   cbxConfirmOnExit.Checked := Pref.ConfirmOnExit;
122   cbxConfirmOnTabClose.Checked := Pref.ConfirmOnTabClose;
123   cbxAutoClip.Checked := Pref.AutoClip;
124   //
125   with frmColorSetting do begin
126     Color['H'] := Pref.TalkColorH;
127     Color['U'] := Pref.TalkColorU;
128     Color['Synchro'] := Pref.TalkColorS;
129     Color['Tag'] := Pref.MarkUpColor;
130     Color['Meta'] := Pref.MetaWordColor;
131     Color['Error'] := Pref.MarkErrorColor;
132     Color['Background'] := Pref.BgColor;
133   end;
134   //
135   cbxAutoStart.Checked := Pref.AutoStart;
136   rgpTabPosition.ItemIndex := Ord(Pref.TabPosition);
137   spnGhostDropDownCount.Value := Pref.GhostDropDownCount;
138   try
139     with ctvBottle do begin
140       (GetNodeFromKeyPath('Arrive\NoTranslate') as TCPCCheckBoxNode).Checked := Pref.NoTranslate;
141       (GetNodeFromKeyPath('Arrive\NoDescript') as TCPCCheckBoxNode).Checked := Pref.NoDescript;
142       if Pref.NoTransUrl then
143         (GetNodeFromKeyPath('Arrive\UrlTag\NoSelection') as TCPCRadioNode).Check
144       else
145         (GetNodeFromKeyPath('Arrive\UrlTag\WithSelection') as TCPCRadioNode).Check;
146       (GetNodeFromKeyPath('Arrive\SilentWhenHidden') as TCPCCheckBoxNode).Checked := Pref.SilentWhenHidden;
147       (GetNodeFromKeyPath('Arrive\FixMessySurface') as TCPCCheckBoxNode).Checked := Pref.FixMessySurface;
148       (GetNodeFromKeyPath('Arrive\HUTagTo01Tag') as TCPCCheckBoxNode).Checked := Pref.HUTagTo01Tag;
149       (GetNodeFromKeyPath('Out\ResetIfGhostAfterSend') as TCPCCheckBoxNode).Checked := Pref.ResetIfGhostAfterSend;
150       (GetNodeFromKeyPath('Out\ClearAfterSend') as TCPCCheckBoxNode).Checked := Pref.ClearAfterSend;
151       (GetNodeFromKeyPath('Out\NeedConfirmBeforeSend') as TCPCCheckBoxNode).Checked := Pref.NeedConfirmBeforeSend;
152       (GetNodeFromKeyPath('Out\Confirm') as TCPCCheckBoxNode).Checked := not Pref.NoConfirm;
153       (GetNodeFromKeyPath('Out\Warn\ScopeChangeInSynchronize') as TCPCCheckBoxNode).Checked := Pref.WarnScopeChangeInSynchronize;
154       (GetNodeFromKeyPath('Out\Warn\YenTNotExist') as TCPCCheckBoxNode).Checked := Pref.WarnYenTNotExist;
155     end;
156   except
157     on E: Exception do ShowMessage(E.Message);
158   end;
159   //cbxIgnoreFrequentYenS.Checked := Pref.IgnoreFrequentYenS;
160   spnWaitScriptEnd.Value := Pref.WaitScriptEnd;
161   //
162   rgpWhenReturn.ItemIndex := Ord(Pref.WhenReturn);
163   rgpWhenShiftReturn.ItemIndex := Ord(Pref.WhenShiftReturn);
164   rgpWhenCtrlReturn.ItemIndex := Ord(Pref.WhenCtrlReturn);
165   //
166   cbxUseHttpProxy.Checked := Pref.UseHttpProxy;
167   edtProxyAddress.Text := Pref.ProxyAddress;
168   edtProxyPort.Text := IntToStr(Pref.ProxyPort);
169   edtLUID.Text := Pref.LUID;
170   //
171   memFMOName.Lines := Pref.FMOName;
172   cbxHideGhosts.Checked := Pref.HideGhosts;
173   memAutoJoinChannels.Lines := Pref.AutoJoinChannels;
174   cbxNoExtraSSTPHeaders.Checked := Pref.NoExtraSSTPHeaders;
175   //
176   with ctvSurfacePreview do
177   begin
178     (GetNodeFromKeyPath('OnHint\DoPreview') as TCPCCheckBoxNode).Checked := Pref.SurfacePreviewOnHint;
179     (GetNodeFromKeyPath('OnScriptPoint\DoPreview') as TCPCCheckBoxNode).Checked := Pref.SurfacePreviewOnScriptPoint;
180     Node := GetNodeFromKeyPath('OnScriptPoint\Position') as TCPCGroupNode;
181     (Node.Item[Ord(Pref.SurfacePreviewOnScriptPointPosition)] as TCPCRadioNode).Check;
182   end;
183   for i := 0 to Spps.Count-1 do
184   begin
185     with lvwPluginList.Items.Add do
186     begin
187       Caption := ExtractFileName(Spps.SppItem[i].ModuleName);
188       SubItems.Add(Spps.SppItem[i].PluginName);
189     end;
190   end;
191   //
192   ShowModal;
193 end;
194
195 procedure TfrmSetting.FormClose(Sender: TObject; var Action: TCloseAction);
196 var i: integer;
197     Node: TCPCGroupNode;
198 begin
199   Pref.DefaultScript := memDefaultScript.Text;
200   Pref.ShowRuler := cbxShowRuler.Checked;
201   Pref.IgnoreTimeCritical := cbxIgnoreTimeCritical.Checked;
202   Pref.NoSendGhostList := cbxNoSendGhostList.Checked;
203   Pref.ConfirmOnExit := cbxConfirmOnExit.Checked;
204   Pref.ConfirmOnTabClose := cbxConfirmOnTabClose.Checked;
205   Pref.AutoClip := cbxAutoClip.Checked;
206   //
207   with frmColorSetting do begin
208     Pref.TalkColorH := Color['H'];
209     Pref.TalkColorU := Color['U'];
210     Pref.TalkColorS := Color['Synchro'];
211     Pref.MarkUpColor := Color['Tag'];
212     Pref.MetaWordColor := Color['Meta'];
213     Pref.MarkErrorColor := Color['Error'];
214     Pref.BgColor := Color['Background'];
215   end;
216   //
217   Pref.AutoStart := cbxAutoStart.Checked;
218   Pref.TabPosition := TTabPosition(rgpTabPosition.ItemIndex);
219   Pref.GhostDropDownCount := spnGhostDropDownCount.Value;
220   try
221     with ctvBottle do begin
222       Pref.NoTranslate := (GetNodeFromKeyPath('Arrive\NoTranslate') as TCPCCheckBoxNode).Checked;
223       Pref.NoDescript := (GetNodeFromKeyPath('Arrive\NoDescript') as TCPCCheckBoxNode).Checked;
224       Pref.NoTransUrl := (GetNodeFromKeyPath('Arrive\UrlTag\NoSelection') as TCPCRadioNode).Checked;
225       Pref.SilentWhenHidden := (GetNodeFromKeyPath('Arrive\SilentWhenHidden') as TCPCCheckBoxNode).Checked;
226       Pref.FixMessySurface := (GetNodeFromKeyPath('Arrive\FixMessySurface') as TCPCCheckBoxNode).Checked;
227       Pref.HUTagTo01Tag := (GetNodeFromKeyPath('Arrive\HUTagTo01Tag') as TCPCCheckBoxNode).Checked;
228       Pref.ResetIfGhostAfterSend := (GetNodeFromKeyPath('Out\ResetIfGhostAfterSend') as TCPCCheckBoxNode).Checked;
229       Pref.ClearAfterSend := (GetNodeFromKeyPath('Out\ClearAfterSend') as TCPCCheckBoxNode).Checked;
230       Pref.NeedConfirmBeforeSend := (GetNodeFromKeyPath('Out\NeedConfirmBeforeSend') as TCPCCheckBoxNode).Checked;
231       Pref.NoConfirm := not (GetNodeFromKeyPath('Out\Confirm') as TCPCCheckBoxNode).Checked;
232       Pref.WarnYenTNotExist := (GetNodeFromKeyPath('Out\Warn\YenTNotExist') as TCPCCheckBoxNode).Checked;
233       Pref.WarnScopeChangeInSynchronize := (GetNodeFromKeyPath('Out\Warn\ScopeChangeInSynchronize') as TCPCCheckBoxNode).Checked;
234     end;
235   except
236     on E: Exception do ShowMessage(E.Message);
237   end;
238   //Pref.IgnoreFrequentYenS := cbxIgnoreFrequentYenS.Checked;
239   Pref.WaitScriptEnd := spnWaitScriptEnd.Value;
240   //
241   Pref.WhenReturn := TReturnKeyFunction(rgpWhenReturn.ItemIndex);
242   Pref.WhenShiftReturn := TReturnKeyFunction(rgpWhenShiftReturn.ItemIndex);
243   Pref.WhenCtrlReturn := TReturnKeyFunction(rgpWhenCtrlReturn.ItemIndex);
244   //
245   Pref.UseHttpProxy := cbxUseHttpProxy.Checked;
246   Pref.ProxyAddress := edtProxyAddress.Text;
247   Pref.ProxyPort := StrToInt(edtProxyPort.Text);
248   Pref.LUID := edtLUID.Text;
249   //
250   Pref.FMOName := memFMOName.Lines;
251   SakuraSeeker.FileMappingTarget := Pref.FMOName;
252   Pref.HideGhosts := cbxHideGhosts.Checked;
253   Pref.NoExtraSSTPHeaders := cbxNoExtraSSTPHeaders.Checked;
254   //
255   Pref.AutoJoinChannels := memAutoJoinChannels.Lines;
256   //
257   with ctvSurfacePreview do
258   begin
259     Pref.SurfacePreviewOnHint := (GetNodeFromKeyPath('OnHint\DoPreview') as TCPCCheckBoxNode).Checked;
260     Pref.SurfacePreviewOnScriptPoint := (GetNodeFromKeyPath('OnScriptPoint\DoPreview') as TCPCCheckBoxNode).Checked;
261     Node := GetNodeFromKeyPath('OnScriptPoint\Position') as TCPCGroupNode;
262     for i := 0 to Node.Count-1 do
263       if (Node.Item[i] as TCPCRadioNode).Checked then
264         Pref.SurfacePreviewOnScriptPointPosition := TSurfacePreviewOnScriptPointPosition(i);
265   end;
266 end;
267
268 procedure TfrmSetting.edtProxyPortKeyPress(Sender: TObject; var Key: Char);
269 begin
270   if not(Key in ['0'..'9']) then Key := Char(0);
271 end;
272
273 procedure TfrmSetting.ctvBottleNodeChecked(Sender: TObject;
274   Node: TCPCConfigItemNode);
275 begin
276   //ShowMessage(ctvBottle.GetFullKeyPath(Node));
277 end;
278
279 procedure TfrmSetting.ctvBottleNodeChecking(Sender: TObject;
280   Node: TCPCConfigItemNode; var Allow: Boolean);
281 begin
282   if Node.KeyName = 'IgnoreBottle' then begin
283     MessageDlg('\82±\82Ì\8b@\94\\82Í\8eÀ\91\95\82³\82ê\82Ä\82¢\82Ü\82¹\82ñ', mtError, [mbOk], 0);
284     Allow := false;
285   end;
286 end;
287
288 procedure TfrmSetting.tstRuleShow(Sender: TObject);
289 begin
290   frmRuleList.UpdateDisplay;
291 end;
292
293 procedure TfrmSetting.btnUseCurrentJoinChannelsClick(Sender: TObject);
294 begin
295   memAutoJoinChannels.Lines := JoinChannels;
296 end;
297
298 procedure TfrmSetting.btnVisibleGhostsClick(Sender: TObject);
299 var i: integer;
300     FullGhosts: TStringList;
301 begin
302   FullGhosts := TStringList.Create;
303   SakuraSeeker.BeginDetect;
304   try
305     for i := 0 to SakuraSeeker.Count-1 do
306       FullGhosts.Add(SakuraSeeker[i].Name);
307     StrListEdit(Pref.VisibleGhostsList, '\83S\81[\83X\83g\82ð\8ew\92è', true, FullGhosts);
308   finally
309     FullGhosts.Free;
310   end;
311 end;
312
313 procedure TfrmSetting.lvwPluginListDblClick(Sender: TObject);
314 var Index: integer;
315 begin
316   if lvwPluginList.Selected = nil then
317     Exit;
318   Index := lvwPluginList.Selected.Index;
319   if pfConfigure in Spps.SppItem[Index].PluginFunctions then
320     Spps.SppItem[Index].Configure
321   else
322     ShowMessage('\92Ç\89Á\82Ì\90Ý\92è\8d\80\96Ú\82Í\82 \82è\82Ü\82¹\82ñ\81B');
323 end;
324
325 procedure TfrmSetting.edtLUIDEnter(Sender: TObject);
326 begin
327   FOldLUID := edtLUID.Text;
328 end;
329
330 procedure TfrmSetting.edtLUIDExit(Sender: TObject);
331 var TmpLUID: String;
332     i: integer;
333     Err: boolean;
334 begin
335   TmpLUID := edtLUID.Text;
336   i := 1;
337   Err := false;
338   if Length(TmpLUID) <> 82 then
339     Err := true
340   else
341     while i <= Length(TmpLUID) do
342     begin
343       if not (TmpLUID[i] in ['0'..'9', 'a'..'z', 'A'..'Z', '.', ',']) then
344       begin
345         Err := true;
346         Break;
347       end;
348       Inc(i);
349     end;
350   if Err then
351   begin
352     ShowMessage('LUID\82Ì\93à\97e\82ª\95s\90³\82Å\82·');
353     edtLUID.Text := FOldLUID;
354   end;
355 end;
356
357 procedure TfrmSetting.btnCopyLUIDClick(Sender: TObject);
358 begin
359   Clipboard.SetTextBuf(PChar(edtLUID.Text));
360 end;
361
362 procedure TfrmSetting.FormCreate(Sender: TObject);
363 var
364   i: integer;
365   Cap: String;
366   Node: TTreeNode;
367 begin
368   for i := 0 to PageControl.PageCount-1 do
369   begin
370     Cap := PageControl.Pages[i].Caption;
371     Node := tvwCategory.Items.Add(nil, Cap);
372     Node.ImageIndex := 0;
373   end;
374   tvwCategoryChange(Self, tvwCategory.Items[0]);
375 end;
376
377 procedure TfrmSetting.tvwCategoryChange(Sender: TObject; Node: TTreeNode);
378 begin
379   PageControl.ActivePageIndex := Node.Index;
380   pnlHeading.Caption := Node.Text;
381 end;
382
383 end.