OSDN Git Service

f76a538c5e208aae85ea34bd7e15b45644cbeaec
[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, SsPlayTime, StrUtils,
15   SpecialCharEditor, ReplacePresetListFrame;
16
17 type
18   TfrmSetting = class(TForm)
19     PageControl: TPageControl;
20     btnClose: TButton;
21     tstGeneral: TTabSheet;
22     tstDisplay: TTabSheet;
23     tstKeys: TTabSheet;
24     rgpWhenReturn: TRadioGroup;
25     rgpWhenShiftReturn: TRadioGroup;
26     rgpWhenCtrlReturn: TRadioGroup;
27     memDefaultScript: TMemo;
28     lblDefaultScript: TLabel;
29     tstReceive: TTabSheet;
30     OpenDialog: TOpenDialog;
31     spnWaitScriptEnd: TSpinEdit;
32     lblWaitScriptEnd: TLabel;
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     tstChannel: TTabSheet;
43     lblAutoJoinChannels: TLabel;
44     memAutoJoinChannels: TMemo;
45     cbxAutoStart: TCheckBox;
46     btnUseCurrentJoinChannels: TButton;
47     ImageList: TImageList;
48     tstSurfacePreview: TTabSheet;
49     lblSurfacePreview: TLabel;
50     lvwPluginList: TListView;
51     lblPluginList: TLabel;
52     ctvSurfacePreview: TCPCConfigTreeView;
53     btnVisibleGhosts: TButton;
54     cbxHideGhosts: TCheckBox;
55     cbxNoExtraSSTPHeaders: TCheckBox;
56     lblLUID: TLabel;
57     edtLUID: TEdit;
58     cbxShowRuler: TCheckBox;
59     rgpTabPosition: TRadioGroup;
60     lblGhostDropDownCount: TLabel;
61     spnGhostDropDownCount: TSpinEdit;
62     cbxIgnoreTimeCritical: TCheckBox;
63     cbxAutoClip: TCheckBox;
64     btnCopyLUID: TButton;
65     tvwCategory: TTreeView;
66     Label1: TLabel;
67     pnlHeading: TPanel;
68     cbxConfirmOnTabClose: TCheckBox;
69     tstConnection: TTabSheet;
70     grpProxy: TGroupBox;
71     lblProxyAddress: TLabel;
72     lblProxyPort: TLabel;
73     Label6: TLabel;
74     edtProxyAddress: TEdit;
75     edtProxyPort: TEdit;
76     cbxUseHttpProxy: TCheckBox;
77     spnReconnectWait: TSpinEdit;
78     lblReconnectWait: TLabel;
79     lblPartialConfirmFormat: TLabel;
80     edtPartialConfirmFormat: TEdit;
81     cbxAutoPartialConfirm: TCheckBox;
82     tstPlayTime: TTabSheet;
83     grpPlayTimeParams: TGroupBox;
84     lblPlayTimeProfile: TLabel;
85     cbxPlayTimeProfile: TComboBox;
86     spnCostDBChar: TSpinEdit;
87     spnCostWait: TSpinEdit;
88     spnCostSurface: TSpinEdit;
89     spnCostChar: TSpinEdit;
90     spnCostQuickChar: TSpinEdit;
91     lblCostWait: TLabel;
92     lblCostSurface: TLabel;
93     lblCostChar: TLabel;
94     lblCostDBChar: TLabel;
95     lblCostQuickChar: TLabel;
96     btnSavePlayTimeProfile: TButton;
97     lvwCostSpecials: TListView;
98     lblCostSpecials: TLabel;
99     btnPlaySpecialAdd: TButton;
100     btnPlaySpecialDelete: TButton;
101     gbxTabWidth: TGroupBox;
102     cbxAutoTabWidth: TCheckBox;
103     spnTabWidth: TSpinEdit;
104     lblBrowser: TLabel;
105     edtBrowserName: TEdit;
106     BrowserLocateOpenDialog: TOpenDialog;
107     btnBrowserLocate: TButton;
108     tstPresetReplace: TTabSheet;
109     ReplacePresetList: TfrmReplacePresetList;
110     cbxAskUseHttpProxy: TCheckBox;
111     cbxNoWarnOfEmptyFMO: TCheckBox;
112     cbxProxyNeedAuthentication: TCheckBox;
113     edtProxyUser: TEdit;
114     edtProxyPass: TEdit;
115     lblProxyUser: TLabel;
116     lblProxyPass: TLabel;
117     procedure FormClose(Sender: TObject; var Action: TCloseAction);
118     procedure edtProxyPortKeyPress(Sender: TObject; var Key: Char);
119     procedure ctvBottleNodeChecked(Sender: TObject;
120       Node: TCPCConfigItemNode);
121     procedure ctvBottleNodeChecking(Sender: TObject;
122       Node: TCPCConfigItemNode; var Allow: Boolean);
123     procedure tstRuleShow(Sender: TObject);
124     procedure btnUseCurrentJoinChannelsClick(Sender: TObject);
125     procedure btnVisibleGhostsClick(Sender: TObject);
126     procedure lvwPluginListDblClick(Sender: TObject);
127     procedure edtLUIDEnter(Sender: TObject);
128     procedure edtLUIDExit(Sender: TObject);
129     procedure btnCopyLUIDClick(Sender: TObject);
130     procedure FormCreate(Sender: TObject);
131     procedure tvwCategoryChange(Sender: TObject; Node: TTreeNode);
132     procedure tvwCategoryMouseMove(Sender: TObject; Shift: TShiftState; X,
133       Y: Integer);
134     procedure cbxPlayTimeProfileChange(Sender: TObject);
135     procedure btnSavePlayTimeProfileClick(Sender: TObject);
136     procedure spnCostWaitChange(Sender: TObject);
137     procedure btnPlaySpecialAddClick(Sender: TObject);
138     procedure btnPlaySpecialDeleteClick(Sender: TObject);
139     procedure lvwCostSpecialsDblClick(Sender: TObject);
140     procedure spnTabWidthChange(Sender: TObject);
141     procedure cbxAutoTabWidthClick(Sender: TObject);
142     procedure btnBrowserLocateClick(Sender: TObject);
143     procedure tstPresetReplaceShow(Sender: TObject);
144     procedure cbxProxyNeedAuthenticationClick(Sender: TObject);
145   private
146     { Private \90é\8c¾ }
147     FOldLUID: String;
148     FSpinUpdateFlag: boolean;
149     procedure LoadPlayTimeProfiles;
150     procedure PlayTimeParamsToSpinControl(Params: TSsPlayTimeParams);
151     procedure SpinControlToPlayTimeParams(Params: TSsPlayTimeParams);
152     procedure UpdateSpecialChars;
153   public
154     { Public \90é\8c¾ }
155     procedure Execute;
156   end;
157
158 var
159   frmSetting: TfrmSetting;
160
161 const
162   DefaultNode = -1;
163   ChannelDefaultGhost = '(\83`\83\83\83\93\83l\83\8b\90\84\8f§\83S\81[\83X\83g)';
164   CheckedBottle = 22;
165   UnCheckedBottle = 17;
166
167 implementation
168
169 {$R *.DFM}
170
171 const
172   SettingIcon = 4;
173
174 procedure TfrmSetting.Execute;
175 var i: integer;
176     Node: TCPCGroupNode;
177 begin
178   PageControl.ActivePage := tstGeneral;
179   memDefaultScript.Text := Pref.DefaultScript;
180   cbxShowRuler.Checked := Pref.ShowRuler;
181   cbxIgnoreTimeCritical.Checked := Pref.IgnoreTimeCritical;
182   edtPartialConfirmFormat.Text := Pref.PartialConfirmFormat;
183   cbxAutoPartialConfirm.Checked := Pref.AutoPartialConfirm;
184   cbxConfirmOnExit.Checked := Pref.ConfirmOnExit;
185   cbxConfirmOnTabClose.Checked := Pref.ConfirmOnTabClose;
186   cbxAutoClip.Checked := Pref.AutoClip;
187   //
188   with frmColorSetting do begin
189     Color['H'] := Pref.TalkColorH;
190     Color['U'] := Pref.TalkColorU;
191     Color['Synchro'] := Pref.TalkColorS;
192     Color['Tag'] := Pref.MarkUpColor;
193     Color['Meta'] := Pref.MetaWordColor;
194     Color['Error'] := Pref.MarkErrorColor;
195     Color['Text'] := Pref.TextColor;
196     Color['Background'] := Pref.BgColor;
197   end;
198   //
199   cbxPlayTimeProfile.Items.Clear;
200   cbxPlayTimeProfile.Items.Add(Pref.PlayTimeParams.ProfileName);
201   cbxPlayTimeProfile.ItemIndex := 0;
202   LoadPlayTimeProfiles;
203   PlayTimeParamsToSpinControl(Pref.PlayTimeParams);
204   UpdateSpecialChars;
205   //
206   cbxAutoStart.Checked := Pref.AutoStart;
207   rgpTabPosition.ItemIndex := Ord(Pref.TabPosition);
208   spnTabWidth.Value := Pref.TabWidth;
209   if Pref.TabWidth <= 0 then
210     spnTabWidth.Value := 0;
211   cbxAutoTabWidth.Checked := Pref.TabWidth <= 0;
212   spnGhostDropDownCount.Value := Pref.GhostDropDownCount;
213   try
214     with ctvBottle do begin
215       (GetNodeFromKeyPath('Arrive\NoTranslate') as TCPCCheckBoxNode).Checked := Pref.NoTranslate;
216       (GetNodeFromKeyPath('Arrive\NoDescript') as TCPCCheckBoxNode).Checked := Pref.NoDescript;
217       if Pref.NoTransUrl then
218         (GetNodeFromKeyPath('Arrive\UrlTag\NoSelection') as TCPCRadioNode).Check
219       else
220         (GetNodeFromKeyPath('Arrive\UrlTag\WithSelection') as TCPCRadioNode).Check;
221       (GetNodeFromKeyPath('Arrive\SilentWhenHidden') as TCPCCheckBoxNode).Checked := Pref.SilentWhenHidden;
222       (GetNodeFromKeyPath('Arrive\FixMessySurface') as TCPCCheckBoxNode).Checked := Pref.FixMessySurface;
223       (GetNodeFromKeyPath('Arrive\HUTagTo01Tag') as TCPCCheckBoxNode).Checked := Pref.HUTagTo01Tag;
224       (GetNodeFromKeyPath('Out\ResetIfGhostAfterSend') as TCPCCheckBoxNode).Checked := Pref.ResetIfGhostAfterSend;
225       (GetNodeFromKeyPath('Out\ClearAfterSend') as TCPCCheckBoxNode).Checked := Pref.ClearAfterSend;
226       (GetNodeFromKeyPath('Out\NeedConfirmBeforeSend') as TCPCCheckBoxNode).Checked := Pref.NeedConfirmBeforeSend;
227       (GetNodeFromKeyPath('Out\Confirm') as TCPCCheckBoxNode).Checked := not Pref.NoConfirm;
228       (GetNodeFromKeyPath('Out\Warn\ScopeChangeInSynchronize') as TCPCCheckBoxNode).Checked := Pref.WarnScopeChangeInSynchronize;
229       (GetNodeFromKeyPath('Out\Warn\YenTNotExist') as TCPCCheckBoxNode).Checked := Pref.WarnYenTNotExist;
230     end;
231   except
232     on E: Exception do ShowMessage(E.Message);
233   end;
234   //cbxIgnoreFrequentYenS.Checked := Pref.IgnoreFrequentYenS;
235   spnWaitScriptEnd.Value := Pref.WaitScriptEnd;
236   //
237   rgpWhenReturn.ItemIndex := Ord(Pref.WhenReturn);
238   rgpWhenShiftReturn.ItemIndex := Ord(Pref.WhenShiftReturn);
239   rgpWhenCtrlReturn.ItemIndex := Ord(Pref.WhenCtrlReturn);
240   //
241   cbxUseHttpProxy.Checked := Pref.UseHttpProxy;
242   cbxAskUseHttpProxy.Checked := Pref.AskUseHttpProxy;
243   cbxProxyNeedAuthentication.Checked := Pref.ProxyNeedAuthentication;
244   cbxProxyNeedAuthenticationClick(Self);
245   edtProxyAddress.Text := Pref.ProxyAddress;
246   edtProxyPort.Text := IntToStr(Pref.ProxyPort);
247   edtProxyUser.Text := Pref.ProxyUser;
248   edtProxyPass.Text := Pref.ProxyPass;
249   //
250   spnReconnectWait.Value := Pref.ReconnectWait;
251   //
252   edtLUID.Text := Pref.LUID;
253   //
254   memFMOName.Lines := Pref.FMOName;
255   cbxHideGhosts.Checked := Pref.HideGhosts;
256   memAutoJoinChannels.Lines := Pref.AutoJoinChannels;
257   cbxNoExtraSSTPHeaders.Checked := Pref.NoExtraSSTPHeaders;
258   //
259   with ctvSurfacePreview do
260   begin
261     (GetNodeFromKeyPath('OnHint\DoPreview') as TCPCCheckBoxNode).Checked := Pref.SurfacePreviewOnHint;
262     (GetNodeFromKeyPath('OnScriptPoint\DoPreview') as TCPCCheckBoxNode).Checked := Pref.SurfacePreviewOnScriptPoint;
263     Node := GetNodeFromKeyPath('OnScriptPoint\Position') as TCPCGroupNode;
264     (Node.Item[Ord(Pref.SurfacePreviewOnScriptPointPosition)] as TCPCRadioNode).Check;
265   end;
266   for i := 0 to Spps.Count-1 do
267   begin
268     with lvwPluginList.Items.Add do
269     begin
270       Caption := ExtractFileName(Spps.SppItem[i].ModuleName);
271       SubItems.Add(Spps.SppItem[i].PluginName);
272     end;
273   end;
274   edtBrowserName.Text := Pref.BrowserExeName;
275   cbxNoWarnOfEmptyFMO.Checked := Pref.NoWarnOfEmptyFMO;
276
277   //
278   ShowModal;
279 end;
280
281 procedure TfrmSetting.FormClose(Sender: TObject; var Action: TCloseAction);
282 var i: integer;
283     Node: TCPCGroupNode;
284 begin
285   Pref.DefaultScript := memDefaultScript.Text;
286   Pref.ShowRuler := cbxShowRuler.Checked;
287   Pref.IgnoreTimeCritical := cbxIgnoreTimeCritical.Checked;
288   Pref.PartialConfirmFormat := edtPartialConfirmFormat.Text;
289   Pref.AutoPartialConfirm := cbxAutoPartialConfirm.Checked;
290   Pref.ConfirmOnExit := cbxConfirmOnExit.Checked;
291   Pref.ConfirmOnTabClose := cbxConfirmOnTabClose.Checked;
292   Pref.AutoClip := cbxAutoClip.Checked;
293   //
294   with frmColorSetting do begin
295     Pref.TalkColorH := Color['H'];
296     Pref.TalkColorU := Color['U'];
297     Pref.TalkColorS := Color['Synchro'];
298     Pref.MarkUpColor := Color['Tag'];
299     Pref.MetaWordColor := Color['Meta'];
300     Pref.MarkErrorColor := Color['Error'];
301     Pref.TextColor := Color['Text'];
302     Pref.BgColor := Color['Background'];
303   end;
304   //
305   Pref.PlayTimeParams.ProfileName := cbxPlayTimeProfile.Text;
306   SpinControlToPlayTimeParams(Pref.PlayTimeParams);
307   //
308   Pref.AutoStart := cbxAutoStart.Checked;
309   Pref.TabPosition := TTabPosition(rgpTabPosition.ItemIndex);
310   Pref.TabWidth := spnTabWidth.Value;
311   if cbxAutoTabWidth.Checked then
312     Pref.TabWidth := 0;
313   Pref.GhostDropDownCount := spnGhostDropDownCount.Value;
314   try
315     with ctvBottle do begin
316       Pref.NoTranslate := (GetNodeFromKeyPath('Arrive\NoTranslate') as TCPCCheckBoxNode).Checked;
317       Pref.NoDescript := (GetNodeFromKeyPath('Arrive\NoDescript') as TCPCCheckBoxNode).Checked;
318       Pref.NoTransUrl := (GetNodeFromKeyPath('Arrive\UrlTag\NoSelection') as TCPCRadioNode).Checked;
319       Pref.SilentWhenHidden := (GetNodeFromKeyPath('Arrive\SilentWhenHidden') as TCPCCheckBoxNode).Checked;
320       Pref.FixMessySurface := (GetNodeFromKeyPath('Arrive\FixMessySurface') as TCPCCheckBoxNode).Checked;
321       Pref.HUTagTo01Tag := (GetNodeFromKeyPath('Arrive\HUTagTo01Tag') as TCPCCheckBoxNode).Checked;
322       Pref.ResetIfGhostAfterSend := (GetNodeFromKeyPath('Out\ResetIfGhostAfterSend') as TCPCCheckBoxNode).Checked;
323       Pref.ClearAfterSend := (GetNodeFromKeyPath('Out\ClearAfterSend') as TCPCCheckBoxNode).Checked;
324       Pref.NeedConfirmBeforeSend := (GetNodeFromKeyPath('Out\NeedConfirmBeforeSend') as TCPCCheckBoxNode).Checked;
325       Pref.NoConfirm := not (GetNodeFromKeyPath('Out\Confirm') as TCPCCheckBoxNode).Checked;
326       Pref.WarnYenTNotExist := (GetNodeFromKeyPath('Out\Warn\YenTNotExist') as TCPCCheckBoxNode).Checked;
327       Pref.WarnScopeChangeInSynchronize := (GetNodeFromKeyPath('Out\Warn\ScopeChangeInSynchronize') as TCPCCheckBoxNode).Checked;
328     end;
329   except
330     on E: Exception do ShowMessage(E.Message);
331   end;
332   //Pref.IgnoreFrequentYenS := cbxIgnoreFrequentYenS.Checked;
333   Pref.WaitScriptEnd := spnWaitScriptEnd.Value;
334   //
335   Pref.WhenReturn := TReturnKeyFunction(rgpWhenReturn.ItemIndex);
336   Pref.WhenShiftReturn := TReturnKeyFunction(rgpWhenShiftReturn.ItemIndex);
337   Pref.WhenCtrlReturn := TReturnKeyFunction(rgpWhenCtrlReturn.ItemIndex);
338   //
339   Pref.UseHttpProxy := cbxUseHttpProxy.Checked;
340   Pref.AskUseHttpProxy := cbxAskUseHttpProxy.Checked;
341   Pref.ProxyAddress := edtProxyAddress.Text;
342   Pref.ProxyPort := StrToInt(edtProxyPort.Text);
343   Pref.ProxyUser := edtProxyUser.Text;
344   Pref.ProxyPass := edtProxyPass.Text;
345   Pref.ProxyNeedAuthentication := cbxProxyNeedAuthentication.Checked;
346   //
347   Pref.ReconnectWait := spnReconnectWait.Value;
348   //
349   Pref.LUID := edtLUID.Text;
350   //
351   Pref.FMOName := memFMOName.Lines;
352   SakuraSeeker.FileMappingTarget := Pref.FMOName;
353   Pref.HideGhosts := cbxHideGhosts.Checked;
354   Pref.NoExtraSSTPHeaders := cbxNoExtraSSTPHeaders.Checked;
355   //
356   Pref.AutoJoinChannels := memAutoJoinChannels.Lines;
357   //
358   with ctvSurfacePreview do
359   begin
360     Pref.SurfacePreviewOnHint := (GetNodeFromKeyPath('OnHint\DoPreview') as TCPCCheckBoxNode).Checked;
361     Pref.SurfacePreviewOnScriptPoint := (GetNodeFromKeyPath('OnScriptPoint\DoPreview') as TCPCCheckBoxNode).Checked;
362     Node := GetNodeFromKeyPath('OnScriptPoint\Position') as TCPCGroupNode;
363     for i := 0 to Node.Count-1 do
364       if (Node.Item[i] as TCPCRadioNode).Checked then
365         Pref.SurfacePreviewOnScriptPointPosition := TSurfacePreviewOnScriptPointPosition(i);
366   end;
367   //
368   Pref.BrowserExeName := edtBrowserName.Text;
369   Pref.NoWarnOfEmptyFMO := cbxNoWarnOfEmptyFMO.Checked;
370 end;
371
372 procedure TfrmSetting.edtProxyPortKeyPress(Sender: TObject; var Key: Char);
373 begin
374   if not(Key in ['0'..'9']) then Key := Char(0);
375 end;
376
377 procedure TfrmSetting.ctvBottleNodeChecked(Sender: TObject;
378   Node: TCPCConfigItemNode);
379 begin
380   //ShowMessage(ctvBottle.GetFullKeyPath(Node));
381 end;
382
383 procedure TfrmSetting.ctvBottleNodeChecking(Sender: TObject;
384   Node: TCPCConfigItemNode; var Allow: Boolean);
385 begin
386   if Node.KeyName = 'IgnoreBottle' then begin
387     MessageDlg('\82±\82Ì\8b@\94\\82Í\8eÀ\91\95\82³\82ê\82Ä\82¢\82Ü\82¹\82ñ', mtError, [mbOk], 0);
388     Allow := false;
389   end;
390 end;
391
392 procedure TfrmSetting.tstRuleShow(Sender: TObject);
393 begin
394   frmRuleList.UpdateDisplay;
395 end;
396
397 procedure TfrmSetting.btnUseCurrentJoinChannelsClick(Sender: TObject);
398 begin
399   memAutoJoinChannels.Lines := JoinChannels;
400 end;
401
402 procedure TfrmSetting.btnVisibleGhostsClick(Sender: TObject);
403 var i: integer;
404     FullGhosts: TStringList;
405 begin
406   FullGhosts := TStringList.Create;
407   SakuraSeeker.BeginDetect;
408   try
409     for i := 0 to SakuraSeeker.Count-1 do
410       FullGhosts.Add(SakuraSeeker[i].Name);
411     StrListEdit(Pref.VisibleGhostsList, '\83S\81[\83X\83g\82ð\8ew\92è', true, FullGhosts);
412   finally
413     FullGhosts.Free;
414   end;
415 end;
416
417 procedure TfrmSetting.lvwPluginListDblClick(Sender: TObject);
418 var Index: integer;
419 begin
420   if lvwPluginList.Selected = nil then
421     Exit;
422   Index := lvwPluginList.Selected.Index;
423   if pfConfigure in Spps.SppItem[Index].PluginFunctions then
424     Spps.SppItem[Index].Configure
425   else
426     ShowMessage('\92Ç\89Á\82Ì\90Ý\92è\8d\80\96Ú\82Í\82 \82è\82Ü\82¹\82ñ\81B');
427 end;
428
429 procedure TfrmSetting.edtLUIDEnter(Sender: TObject);
430 begin
431   FOldLUID := edtLUID.Text;
432 end;
433
434 procedure TfrmSetting.edtLUIDExit(Sender: TObject);
435 var TmpLUID: String;
436     i: integer;
437     Err: boolean;
438 begin
439   TmpLUID := edtLUID.Text;
440   i := 1;
441   Err := false;
442   if Length(TmpLUID) <> 82 then
443     Err := true
444   else
445     while i <= Length(TmpLUID) do
446     begin
447       if not (TmpLUID[i] in ['0'..'9', 'a'..'z', 'A'..'Z', '.', ',']) then
448       begin
449         Err := true;
450         Break;
451       end;
452       Inc(i);
453     end;
454   if Err then
455   begin
456     ShowMessage('LUID\82Ì\93à\97e\82ª\95s\90³\82Å\82·');
457     edtLUID.Text := FOldLUID;
458   end;
459 end;
460
461 procedure TfrmSetting.btnCopyLUIDClick(Sender: TObject);
462 begin
463   Clipboard.SetTextBuf(PChar(edtLUID.Text));
464 end;
465
466 procedure TfrmSetting.FormCreate(Sender: TObject);
467 var
468   i: integer;
469   Cap: String;
470   Node: TTreeNode;
471 begin
472   for i := 0 to PageControl.PageCount-1 do
473   begin
474     Cap := PageControl.Pages[i].Caption;
475     if Pos(':', Cap) > 0 then
476       Cap := Copy(Cap, 1, Pos(':', Cap)-1);
477     Node := tvwCategory.Items.Add(nil, Cap);
478     Node.ImageIndex := -1;
479     Node.SelectedIndex := SettingIcon;
480   end;
481   tvwCategoryChange(Self, tvwCategory.Items[0]);
482   tvwCategory.Items[0].Selected := true;
483 end;
484
485 procedure TfrmSetting.tvwCategoryChange(Sender: TObject; Node: TTreeNode);
486 begin
487   PageControl.ActivePageIndex := Node.Index;
488   pnlHeading.Caption := PageControl.ActivePage.Caption;
489 end;
490
491 procedure TfrmSetting.tvwCategoryMouseMove(Sender: TObject;
492   Shift: TShiftState; X, Y: Integer);
493 var
494   Node: TTreeNode;
495   NewHint: String;
496   CPos: TPoint;
497 begin
498   Node := tvwCategory.GetNodeAt(X, Y);
499   if Node <> nil then
500   begin
501     NewHint := PageControl.Pages[Node.Index].Caption;
502     if tvwCategory.Hint <> NewHint then
503     begin
504       tvwCategory.Hint := NewHint;
505       GetCursorPos(CPos);
506       Application.ActivateHint(CPos);
507     end;
508   end else
509   begin
510     tvwCategory.Hint := '';
511     Application.HideHint;
512   end;
513 end;
514
515 procedure TfrmSetting.PlayTimeParamsToSpinControl(Params: TSsPlayTimeParams);
516 begin
517   FSpinUpdateFlag := true;
518   with Params do
519   begin
520     spnCostWait.Value         := CostWait;
521     spnCostSurface.Value      := CostSurface;
522     spnCostChar.Value         := CostChar;
523     spnCostDBChar.Value       := CostDBChar;
524     spnCostQuickChar.Value    := CostQuickChar;
525     lvwCostSpecials.Items.Clear;
526   end;
527   FSpinUpdateFlag := false;
528 end;
529
530 procedure TfrmSetting.SpinControlToPlayTimeParams(Params: TSsPlayTimeParams);
531 begin
532   with Params do
533   begin
534     CostWait         := spnCostWait.Value;
535     CostSurface      := spnCostSurface.Value;
536     CostChar         := spnCostChar.Value;
537     CostDBChar       := spnCostDBChar.Value;
538     CostQuickChar    := spnCostQuickChar.Value;
539   end;
540 end;
541
542
543 procedure TfrmSetting.LoadPlayTimeProfiles;
544 var i: integer;
545     F: TSearchRec;
546     Path, Item: String;
547 begin
548   Path := ExtractFilePath(Application.ExeName);
549   i := FindFirst(Path + 'playtime\*.txt', 0, F);
550   if i = 0 then begin
551     repeat
552       Item := ChangeFileExt(F.Name, '');
553       if cbxPlayTimeProfile.Items.IndexOf(Item) < 0 then
554         cbxPlayTimeProfile.Items.Add(ChangeFileExt(F.Name, ''));
555       i := FindNext(F);
556     until i <> 0;
557   end;
558   FindClose(F);
559 end;
560
561 procedure TfrmSetting.cbxPlayTimeProfileChange(Sender: TObject);
562 var
563   Params: TSsPlayTimeParams;
564   Strs: TStringList;
565   Path, ProName: String;
566 begin
567   try
568     Strs := TStringList.Create;
569     ProName := cbxPlayTimeProfile.Text;
570     try
571       Path := ExtractFilePath(Application.ExeName) + 'playtime\';
572       Strs.LoadFromFile(Path + ProName + '.txt');
573       Params := StringToComponent(Strs.Text) as TSsPlayTimeParams;
574       try
575         PlayTimeParamsToSpinControl(Params);
576         Pref.PlayTimeParams.Assign(Params);
577         UpdateSpecialChars;
578       finally
579         Params.Free;
580       end;
581     finally
582       Strs.Free;
583     end;
584     with cbxPlayTimeProfile do
585     begin
586       Items.Clear;
587       LoadPlayTimeProfiles;
588       ItemIndex := Items.IndexOf(ProName);
589     end;
590   except
591     ; // Do nothing
592   end;
593 end;
594
595 procedure TfrmSetting.btnSavePlayTimeProfileClick(Sender: TObject);
596 var
597   ProfileName, Path, FileName: String;
598   Strs: TStringList;
599 begin
600   ProfileName := cbxPlayTimeProfile.Text;
601   if InputQuery('\83v\83\8d\83t\83@\83C\83\8b\96¼', '\95Û\91\82·\82é\83v\83\8d\83t\83@\83C\83\8b\96¼', ProfileName) then
602   begin
603     try
604       Path := ExtractFilePath(Application.ExeName) + 'playtime\';
605       FileName := Path + ProfileName + '.txt';
606       if FileExists(FileName) then
607         if MessageDlg(Format('\83v\83\8d\83t\83@\83C\83\8b"%s"\82ð\8fã\8f\91\82«\82µ\82Ü\82·', [ProfileName]),
608           mtConfirmation, mbOkCancel, 0) = mrCancel then
609           Exit;
610       Strs := TStringList.Create;
611       try
612         SpinControlToPlayTimeParams(Pref.PlayTimeParams);
613         Pref.PlayTimeParams.ProfileName := ProfileName;
614         Strs.Text := ComponentToString(Pref.PlayTimeParams);
615         Strs.SaveToFile(FileName);
616       finally
617         Strs.Free;
618       end;
619       with cbxPlayTimeProfile do
620       begin
621         Items.Clear;
622         Items.Add(ProfileName);
623         ItemIndex := 0;
624         LoadPlayTimeProfiles;
625       end;
626     except
627       on E: Exception do
628         ShowMessage('\95Û\91\82É\8e¸\94s\82µ\82Ü\82µ\82½\81B' + E.Message);
629     end;
630   end;
631 end;
632
633 procedure TfrmSetting.spnCostWaitChange(Sender: TObject);
634 var
635   ProName: String;
636 const
637   Modified = '(\95Ï\8dX\8dÏ\82Ý)';
638 begin
639   if FSpinUpdateFlag then
640     Exit;
641   ProName := cbxPlayTimeProfile.Text;
642   if Copy(ProName, Length(ProName)-Length(Modified)+1, Length(Modified)) <> Modified then
643   begin
644     ProName := Format('%s%s', [ProName, Modified]);
645     with cbxPlayTimeProfile do
646     begin
647       Items.Clear;
648       Items.Add(ProName);
649       ItemIndex := 0;
650       LoadPlayTimeProfiles;
651     end;
652   end;
653 end;
654
655 procedure TfrmSetting.btnPlaySpecialAddClick(Sender: TObject);
656 var
657   Item: TListItem;
658   SPChar: TSsPlayTimeSpecialChar;
659 begin
660   Application.CreateForm(TfrmSpecialCharEditor, frmSpecialCharEditor);
661   try
662     with frmSpecialCharEditor do
663     begin
664       SpecialChar := '';
665       Cost := 50;
666       if Execute then
667       begin
668         SPChar := Pref.PlayTimeParams.SpecialChars.Add as TSsPlayTimeSpecialChar;
669         SPChar.Char := SpecialChar;
670         SPChar.Wait := Cost;
671         Item := lvwCostSpecials.Items.Add;
672         Item.Caption := SPChar.DisplayChar;
673         Item.SubItems.Add(IntToStr(Cost));
674         spnCostWaitChange(Self);
675       end;
676     end;
677   finally
678     frmSpecialCharEditor.Release;
679   end;
680 end;
681
682 procedure TfrmSetting.btnPlaySpecialDeleteClick(Sender: TObject);
683 begin
684   with lvwCostSpecials do
685     if Selected <> nil then
686     begin
687       Pref.PlayTimeParams.SpecialChars.Delete(Selected.Index);
688       Selected.Delete;
689       spnCostWaitChange(Self);
690     end;
691 end;
692
693 procedure TfrmSetting.lvwCostSpecialsDblClick(Sender: TObject);
694 var
695   Item: TListItem;
696   SPChar: TSsPlayTimeSpecialChar;
697 begin
698   with lvwCostSpecials do
699   begin
700     Item := Selected;
701     if Item <> nil then
702     begin
703       Application.CreateForm(TfrmSpecialCharEditor, frmSpecialCharEditor);
704       try
705         with frmSpecialCharEditor do
706         begin
707           SPChar := Pref.PlayTimeParams.SpecialChars.Items[Item.Index] as TSsPlayTimeSpecialChar;
708           SpecialChar := SPChar.Char;
709           Cost := SPChar.Wait;
710           if Execute then
711           begin
712             SPChar.Char := SpecialChar;
713             SPChar.Wait := Cost;
714             Item.Caption := SPChar.DisplayChar;
715             Item.SubItems[0] := IntToStr(Cost);
716             spnCostWaitChange(Self);
717           end;
718         end;
719       finally
720         frmSpecialCharEditor.Release;
721       end;
722     end;
723   end;
724 end;
725
726 procedure TfrmSetting.UpdateSpecialChars;
727 var
728   i: integer;
729   Item: TListItem;
730   SPChar: TSsPlayTimeSpecialChar;
731 begin
732   with lvwCostSpecials do
733   begin
734     Items.Clear;
735     for i := 0 to Pref.PlayTimeParams.SpecialChars.Count-1 do
736     begin
737       SPChar := Pref.PlayTimeParams.SpecialChars.Items[i] as TSsPlayTimeSpecialChar;
738       Item := Items.Add;
739       Item.Caption := SPChar.DisplayChar;
740       Item.SubItems.Add(IntToStr(SPChar.Wait));
741     end;
742   end;
743 end;
744
745 procedure TfrmSetting.spnTabWidthChange(Sender: TObject);
746 begin
747   with cbxAutoTabWidth do
748   begin
749     OnClick := nil;
750     cbxAutoTabWidth.Checked := false;
751     OnClick := cbxAutoTabWidthClick;
752   end;
753 end;
754
755 procedure TfrmSetting.cbxAutoTabWidthClick(Sender: TObject);
756 begin
757   with spnTabWidth do
758   begin
759     OnChange := nil;
760     try
761       if not cbxAutoTabWidth.Checked then
762         if Value = 0 then
763           Value := 80;
764     finally
765       OnChange := spnTabWidthChange;
766     end;
767   end;
768 end;
769
770 procedure TfrmSetting.btnBrowserLocateClick(Sender: TObject);
771 begin
772   with BrowserLocateOpenDialog do
773   begin
774     FileName := edtBrowserName.Text;
775     if Execute then
776       edtBrowserName.Text := FileName;
777   end;
778 end;
779
780 procedure TfrmSetting.tstPresetReplaceShow(Sender: TObject);
781 begin
782   ReplacePresetList.UpdateControls;
783 end;
784
785 procedure TfrmSetting.cbxProxyNeedAuthenticationClick(Sender: TObject);
786 begin
787   with cbxProxyNeedAuthentication do
788   begin
789     edtProxyUser.Enabled := Checked;
790     edtProxyPass.Enabled := Checked;
791     lblProxyUser.Enabled := Checked;
792     lblProxyPass.Enabled := Checked;
793   end;
794 end;
795
796 end.