OSDN Git Service

ReconnectWait property added
[winbottle/winbottle.git] / bottleclient / SettingForm.pas
index bff0390..add3f5b 100755 (executable)
 unit SettingForm;
 
+{
+  \90Ý\92è\89æ\96Ê\81B\82»\82ê\96¢\96\9e\82Å\82à\82»\82ê\88È\8fã\82Å\82à\82È\82¢\81B
+  Pref\83I\83u\83W\83F\83N\83g\82ð\8eÀ\8dÛ\82É\91\80\8dì\82·\82é\81B
+}
+
 interface
 
 uses
   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
-  ComCtrls, StdCtrls, ExtCtrls, ColorCBX, BottleDef, EllipsEd, Spin,
-  CPCConfigTreeView;
+  ComCtrls, StdCtrls, ExtCtrls, BottleDef, Spin,
+  CPCConfigTreeView, ColorSettingFrame, BottleChainListFrame, SakuraSeekerInstance,
+  ImgList, StrListEditor, SppList, Plugins, Clipbrd;
 
 type
   TfrmSetting = class(TForm)
     PageControl: TPageControl;
     btnClose: TButton;
     tstGeneral: TTabSheet;
-    tstColor: TTabSheet;
+    tstDisplay: TTabSheet;
     tstKeys: TTabSheet;
     rgpWhenReturn: TRadioGroup;
     rgpWhenShiftReturn: TRadioGroup;
     rgpWhenCtrlReturn: TRadioGroup;
     memDefaultScript: TMemo;
     lblDefaultScript: TLabel;
-    grpLocalConfirm: TGroupBox;
-    ColorDialog: TColorDialog;
-    cbxColorScript: TCheckBox;
-    trkColorTimeLag: TTrackBar;
-    trkColorSpeed: TTrackBar;
-    grpColor: TGroupBox;
-    colTalkColorU: TColorCBox;
-    colMetaWordColor: TColorCBox;
-    Label4: TLabel;
-    Label2: TLabel;
-    Label1: TLabel;
-    colTalkColorH: TColorCBox;
-    Label3: TLabel;
-    colMarkUpColor: TColorCBox;
-    Label5: TLabel;
-    colMarkErrorColor: TColorCBox;
-    cbxIgnoreTimeCritical: TCheckBox;
-    lblColorTimeLag: TLabel;
-    lblColorSpeed: TLabel;
-    colBgColor: TColorCBox;
-    Label8: TLabel;
     tstReceive: TTabSheet;
-    cbxPort: TComboBox;
-    Label9: TLabel;
-    cbxAutoStart: TCheckBox;
-    tstChannel: TTabSheet;
-    tvwChannels: TTreeView;
-    rgpUseChannelPrefs: TRadioGroup;
-    pnlChannelOpt: TPanel;
-    edtSoundFile: TEllipsesEdit;
-    cbxSoundArrived: TCheckBox;
-    rgpTargetGhost: TGroupBox;
-    cbxIgnoreIfGhost: TCheckBox;
-    cbxTargetGhost: TComboBox;
-    cbxUsePort: TCheckBox;
-    rgpTabPosition: TRadioGroup;
-    cbxCanAutoAdd: TCheckBox;
     OpenDialog: TOpenDialog;
     spnWaitScriptEnd: TSpinEdit;
     lblWaitScriptEnd: TLabel;
     cbxNoSendGhostList: TCheckBox;
-    TabSheet1: TTabSheet;
+    cbxConfirmOnExit: TCheckBox;
+    ctvBottle: TCPCConfigTreeView;
+    gbxColor: TGroupBox;
+    frmColorSetting: TfrmColorSetting;
+    tstRule: TTabSheet;
+    frmRuleList: TfrmBottleChainList;
+    tstDetailed: TTabSheet;
+    lblFMOName: TLabel;
+    memFMOName: TMemo;
+    tstChannel: TTabSheet;
+    lblAutoJoinChannels: TLabel;
+    memAutoJoinChannels: TMemo;
+    cbxAutoStart: TCheckBox;
+    btnUseCurrentJoinChannels: TButton;
+    ImageList: TImageList;
+    tstSurfacePreview: TTabSheet;
+    lblSurfacePreview: TLabel;
+    lvwPluginList: TListView;
+    lblPluginList: TLabel;
+    ctvSurfacePreview: TCPCConfigTreeView;
+    btnVisibleGhosts: TButton;
+    cbxHideGhosts: TCheckBox;
+    cbxNoExtraSSTPHeaders: TCheckBox;
+    lblLUID: TLabel;
+    edtLUID: TEdit;
+    cbxShowRuler: TCheckBox;
+    rgpTabPosition: TRadioGroup;
+    lblGhostDropDownCount: TLabel;
+    spnGhostDropDownCount: TSpinEdit;
+    cbxIgnoreTimeCritical: TCheckBox;
+    cbxAutoClip: TCheckBox;
+    btnCopyLUID: TButton;
+    tvwCategory: TTreeView;
+    Label1: TLabel;
+    pnlHeading: TPanel;
+    cbxConfirmOnTabClose: TCheckBox;
+    tstConnection: TTabSheet;
     grpProxy: TGroupBox;
-    cbxUseHttpProxy: TCheckBox;
-    edtProxyAddress: TEdit;
-    edtProxyPort: TEdit;
     lblProxyAddress: TLabel;
     lblProxyPort: TLabel;
     Label6: TLabel;
-    cbxWarnPost: TCheckBox;
-    cbxConfirmOnExit: TCheckBox;
-    ctvBottle: TCPCConfigTreeView;
-    procedure ColorPick(Sender: TObject; var Col: TColor);
+    edtProxyAddress: TEdit;
+    edtProxyPort: TEdit;
+    cbxUseHttpProxy: TCheckBox;
+    spnReconnectWait: TSpinEdit;
+    lblReconnectWait: TLabel;
     procedure FormClose(Sender: TObject; var Action: TCloseAction);
-    procedure cbxPortChange(Sender: TObject);
-    procedure edtSoundFileButtonClick(Sender: TObject);
-    procedure tvwChannelsCompare(Sender: TObject; Node1, Node2: TTreeNode;
-      Data: Integer; var Compare: Integer);
-    procedure tvwChannelsChange(Sender: TObject; Node: TTreeNode);
-    procedure rgpUseChannelPrefsClick(Sender: TObject);
-    procedure cbxSoundArrivedClick(Sender: TObject);
-    procedure edtSoundFileChange(Sender: TObject);
-    procedure cbxTargetGhostChange(Sender: TObject);
-    procedure cbxIgnoreIfGhostClick(Sender: TObject);
-    procedure cbxUsePortClick(Sender: TObject);
-    procedure cbxCanAutoAddClick(Sender: TObject);
     procedure edtProxyPortKeyPress(Sender: TObject; var Key: Char);
-    procedure cbxWarnPostClick(Sender: TObject);
     procedure ctvBottleNodeChecked(Sender: TObject;
       Node: TCPCConfigItemNode);
     procedure ctvBottleNodeChecking(Sender: TObject;
       Node: TCPCConfigItemNode; var Allow: Boolean);
+    procedure tstRuleShow(Sender: TObject);
+    procedure btnUseCurrentJoinChannelsClick(Sender: TObject);
+    procedure btnVisibleGhostsClick(Sender: TObject);
+    procedure lvwPluginListDblClick(Sender: TObject);
+    procedure edtLUIDEnter(Sender: TObject);
+    procedure edtLUIDExit(Sender: TObject);
+    procedure btnCopyLUIDClick(Sender: TObject);
+    procedure FormCreate(Sender: TObject);
+    procedure tvwCategoryChange(Sender: TObject; Node: TTreeNode);
+    procedure tvwCategoryMouseMove(Sender: TObject; Shift: TShiftState; X,
+      Y: Integer);
   private
     { Private \90é\8c¾ }
-    function SelChPref: TChannelPrefs;
-    function BottleImage(ChPref: TChannelPrefs): integer;
+    FOldLUID: String;
   public
     { Public \90é\8c¾ }
     procedure Execute;
@@ -113,44 +114,35 @@ implementation
 
 {$R *.DFM}
 
-uses MainForm;
-
-procedure TfrmSetting.ColorPick(Sender: TObject; var Col: TColor);
-begin
-  ColorDialog.Color := Col;
-  if ColorDialog.Execute then begin
-    Col := ColorDialog.Color;
-  end;
-end;
+const
+  SettingIcon = 4;
 
 procedure TfrmSetting.Execute;
 var i: integer;
-    Node: TTreeNode;
+    Node: TCPCGroupNode;
 begin
   PageControl.ActivePage := tstGeneral;
   memDefaultScript.Text := Pref.DefaultScript;
+  cbxShowRuler.Checked := Pref.ShowRuler;
   cbxIgnoreTimeCritical.Checked := Pref.IgnoreTimeCritical;
   cbxNoSendGhostList.Checked := Pref.NoSendGhostList;
   cbxConfirmOnExit.Checked := Pref.ConfirmOnExit;
+  cbxConfirmOnTabClose.Checked := Pref.ConfirmOnTabClose;
+  cbxAutoClip.Checked := Pref.AutoClip;
   //
-  cbxColorScript.Checked := Pref.ColorScript;
-  colTalkColorH.SelColor := Pref.TalkColorH;
-  colTalkColorU.SelColor := Pref.TalkColorU;
-  colMarkUpColor.SelColor := Pref.MarkUpColor;
-  colMetaWordColor.SelColor := Pref.MetaWordColor;
-  colMarkErrorColor.SelColor := Pref.MarkErrorColor;
-  colBgColor.SelColor := Pref.BgColor;
-  trkColorTimeLag.Position := Pref.ColorTimeLagValue;
-  trkColorSpeed.Position := Pref.ColorSpeed;
+  with frmColorSetting do begin
+    Color['H'] := Pref.TalkColorH;
+    Color['U'] := Pref.TalkColorU;
+    Color['Synchro'] := Pref.TalkColorS;
+    Color['Tag'] := Pref.MarkUpColor;
+    Color['Meta'] := Pref.MetaWordColor;
+    Color['Error'] := Pref.MarkErrorColor;
+    Color['Background'] := Pref.BgColor;
+  end;
   //
   cbxAutoStart.Checked := Pref.AutoStart;
   rgpTabPosition.ItemIndex := Ord(Pref.TabPosition);
-  {
-  cbxNoTranslate.Checked := Pref.NoTranslate;
-  cbxNoDescript.Checked := Pref.NoDescript;
-  cbxNoTransUrl.Checked := Pref.NoTransUrl;
-  cbxSilentWhenHidden.Checked := Pref.SilentWhenHidden;
-  }
+  spnGhostDropDownCount.Value := Pref.GhostDropDownCount;
   try
     with ctvBottle do begin
       (GetNodeFromKeyPath('Arrive\NoTranslate') as TCPCCheckBoxNode).Checked := Pref.NoTranslate;
@@ -161,6 +153,13 @@ begin
         (GetNodeFromKeyPath('Arrive\UrlTag\WithSelection') as TCPCRadioNode).Check;
       (GetNodeFromKeyPath('Arrive\SilentWhenHidden') as TCPCCheckBoxNode).Checked := Pref.SilentWhenHidden;
       (GetNodeFromKeyPath('Arrive\FixMessySurface') as TCPCCheckBoxNode).Checked := Pref.FixMessySurface;
+      (GetNodeFromKeyPath('Arrive\HUTagTo01Tag') as TCPCCheckBoxNode).Checked := Pref.HUTagTo01Tag;
+      (GetNodeFromKeyPath('Out\ResetIfGhostAfterSend') as TCPCCheckBoxNode).Checked := Pref.ResetIfGhostAfterSend;
+      (GetNodeFromKeyPath('Out\ClearAfterSend') as TCPCCheckBoxNode).Checked := Pref.ClearAfterSend;
+      (GetNodeFromKeyPath('Out\NeedConfirmBeforeSend') as TCPCCheckBoxNode).Checked := Pref.NeedConfirmBeforeSend;
+      (GetNodeFromKeyPath('Out\Confirm') as TCPCCheckBoxNode).Checked := not Pref.NoConfirm;
+      (GetNodeFromKeyPath('Out\Warn\ScopeChangeInSynchronize') as TCPCCheckBoxNode).Checked := Pref.WarnScopeChangeInSynchronize;
+      (GetNodeFromKeyPath('Out\Warn\YenTNotExist') as TCPCCheckBoxNode).Checked := Pref.WarnYenTNotExist;
     end;
   except
     on E: Exception do ShowMessage(E.Message);
@@ -172,61 +171,63 @@ begin
   rgpWhenShiftReturn.ItemIndex := Ord(Pref.WhenShiftReturn);
   rgpWhenCtrlReturn.ItemIndex := Ord(Pref.WhenCtrlReturn);
   //
-  cbxPort.ItemIndex := cbxPort.Items.Count-1; //\81u\82»\82Ì\91¼\81v
-  for i := 0 to cbxPort.Items.Count-2 do begin
-    if StrToIntDef(cbxPort.Items[i], 0) = Pref.ServerPort then
-      cbxPort.ItemIndex := i;
-  end;
-  cbxUsePort.Checked := Pref.UsePort;
-  cbxPort.Enabled := cbxUsePort.Checked;
-  cbxUsePort.OnClick := cbxUsePortClick; //Dialog\8aJ\82¢\82½\8fu\8aÔ\82É\8cx\8d\90\82³\82ê\82È\82¢\82æ\82¤
+  cbxUseHttpProxy.Checked := Pref.UseHttpProxy;
+  edtProxyAddress.Text := Pref.ProxyAddress;
+  edtProxyPort.Text := IntToStr(Pref.ProxyPort);
+  //
+  spnReconnectWait.Value := Pref.ReconnectWait;
   //
-  //Channels
-  tvwChannels.Items.Clear;
-  Node := tvwChannels.Items.Add(nil, '\83f\83t\83H\83\8b\83g');
-  Node.ImageIndex := 1;
-  Node.SelectedIndex := 1;
-  Node.Data := pointer(DefaultNode);
-  for i := 0 to Pref.ChannelPrefCount-1 do begin
-    Node := tvwChannels.Items.Add(nil, Pref.ChannelPrefIndex[i].ChannelName);
-    Node.Data := pointer(i); //\96{\93\96\82Í\82â\82Á\82¿\82á\82¢\82¯\82È\82¢Int>Pointer\83L\83\83\83X\83g
-    Node.ImageIndex := BottleImage(Pref.ChannelPrefIndex[i]);
-    Node.SelectedIndex := BottleImage(Pref.ChannelPrefIndex[i]);
+  edtLUID.Text := Pref.LUID;
+  //
+  memFMOName.Lines := Pref.FMOName;
+  cbxHideGhosts.Checked := Pref.HideGhosts;
+  memAutoJoinChannels.Lines := Pref.AutoJoinChannels;
+  cbxNoExtraSSTPHeaders.Checked := Pref.NoExtraSSTPHeaders;
+  //
+  with ctvSurfacePreview do
+  begin
+    (GetNodeFromKeyPath('OnHint\DoPreview') as TCPCCheckBoxNode).Checked := Pref.SurfacePreviewOnHint;
+    (GetNodeFromKeyPath('OnScriptPoint\DoPreview') as TCPCCheckBoxNode).Checked := Pref.SurfacePreviewOnScriptPoint;
+    Node := GetNodeFromKeyPath('OnScriptPoint\Position') as TCPCGroupNode;
+    (Node.Item[Ord(Pref.SurfacePreviewOnScriptPointPosition)] as TCPCRadioNode).Check;
   end;
-  cbxTargetGhost.Items.Clear;
-  cbxTargetGhost.Items.Add(ChannelDefaultGhost);
-  frmSender.SakuraSeeker.BeginDetect;
-  for i := 0 to frmSender.SakuraSeeker.Count-1 do begin
-    cbxTargetGhost.Items.Add(frmSender.SakuraSeeker[i].Name);
+  for i := 0 to Spps.Count-1 do
+  begin
+    with lvwPluginList.Items.Add do
+    begin
+      Caption := ExtractFileName(Spps.SppItem[i].ModuleName);
+      SubItems.Add(Spps.SppItem[i].PluginName);
+    end;
   end;
-  rgpUseChannelPrefs.Enabled := false;
-  rgpUseChannelPrefsClick(Self);
   //
-  cbxUseHttpProxy.Checked := Pref.UseHttpProxy;
-  edtProxyAddress.Text := Pref.ProxyAddress;
-  edtProxyPort.Text := IntToStr(Pref.ProxyPort);
   ShowModal;
 end;
 
 procedure TfrmSetting.FormClose(Sender: TObject; var Action: TCloseAction);
+var i: integer;
+    Node: TCPCGroupNode;
 begin
   Pref.DefaultScript := memDefaultScript.Text;
+  Pref.ShowRuler := cbxShowRuler.Checked;
   Pref.IgnoreTimeCritical := cbxIgnoreTimeCritical.Checked;
   Pref.NoSendGhostList := cbxNoSendGhostList.Checked;
   Pref.ConfirmOnExit := cbxConfirmOnExit.Checked;
+  Pref.ConfirmOnTabClose := cbxConfirmOnTabClose.Checked;
+  Pref.AutoClip := cbxAutoClip.Checked;
   //
-  Pref.ColorScript := cbxColorScript.Checked;
-  Pref.TalkColorH := colTalkColorH.SelColor;
-  Pref.TalkColorU := colTalkColorU.SelColor;
-  Pref.MarkUpColor := colMarkUpColor.SelColor;
-  Pref.MetaWordColor := colMetaWordColor.SelColor;
-  Pref.MarkErrorColor := colMarkErrorColor.SelColor;
-  Pref.BgColor := colBgColor.SelColor;
-  Pref.ColorTimeLagValue := trkColorTimeLag.Position;
-  Pref.ColorSpeed := trkColorSpeed.Position;
+  with frmColorSetting do begin
+    Pref.TalkColorH := Color['H'];
+    Pref.TalkColorU := Color['U'];
+    Pref.TalkColorS := Color['Synchro'];
+    Pref.MarkUpColor := Color['Tag'];
+    Pref.MetaWordColor := Color['Meta'];
+    Pref.MarkErrorColor := Color['Error'];
+    Pref.BgColor := Color['Background'];
+  end;
   //
   Pref.AutoStart := cbxAutoStart.Checked;
   Pref.TabPosition := TTabPosition(rgpTabPosition.ItemIndex);
+  Pref.GhostDropDownCount := spnGhostDropDownCount.Value;
   try
     with ctvBottle do begin
       Pref.NoTranslate := (GetNodeFromKeyPath('Arrive\NoTranslate') as TCPCCheckBoxNode).Checked;
@@ -234,6 +235,13 @@ begin
       Pref.NoTransUrl := (GetNodeFromKeyPath('Arrive\UrlTag\NoSelection') as TCPCRadioNode).Checked;
       Pref.SilentWhenHidden := (GetNodeFromKeyPath('Arrive\SilentWhenHidden') as TCPCCheckBoxNode).Checked;
       Pref.FixMessySurface := (GetNodeFromKeyPath('Arrive\FixMessySurface') as TCPCCheckBoxNode).Checked;
+      Pref.HUTagTo01Tag := (GetNodeFromKeyPath('Arrive\HUTagTo01Tag') as TCPCCheckBoxNode).Checked;
+      Pref.ResetIfGhostAfterSend := (GetNodeFromKeyPath('Out\ResetIfGhostAfterSend') as TCPCCheckBoxNode).Checked;
+      Pref.ClearAfterSend := (GetNodeFromKeyPath('Out\ClearAfterSend') as TCPCCheckBoxNode).Checked;
+      Pref.NeedConfirmBeforeSend := (GetNodeFromKeyPath('Out\NeedConfirmBeforeSend') as TCPCCheckBoxNode).Checked;
+      Pref.NoConfirm := not (GetNodeFromKeyPath('Out\Confirm') as TCPCCheckBoxNode).Checked;
+      Pref.WarnYenTNotExist := (GetNodeFromKeyPath('Out\Warn\YenTNotExist') as TCPCCheckBoxNode).Checked;
+      Pref.WarnScopeChangeInSynchronize := (GetNodeFromKeyPath('Out\Warn\ScopeChangeInSynchronize') as TCPCCheckBoxNode).Checked;
     end;
   except
     on E: Exception do ShowMessage(E.Message);
@@ -245,177 +253,172 @@ begin
   Pref.WhenShiftReturn := TReturnKeyFunction(rgpWhenShiftReturn.ItemIndex);
   Pref.WhenCtrlReturn := TReturnKeyFunction(rgpWhenCtrlReturn.ItemIndex);
   //
-  Pref.UsePort := cbxUsePort.Checked;
-  //
   Pref.UseHttpProxy := cbxUseHttpProxy.Checked;
   Pref.ProxyAddress := edtProxyAddress.Text;
   Pref.ProxyPort := StrToInt(edtProxyPort.Text);
-end;
-
-procedure TfrmSetting.cbxPortChange(Sender: TObject);
-var Str: String;
-    i: integer;
-begin
-  with cbxPort do begin
-    if ItemIndex = Items.Count-1 then begin
-      //\82»\82Ì\91¼
-      Str := IntToStr(Pref.ServerPort);
-      if InputQuery('\83|\81[\83g\94Ô\8d\86\82Ì\8ew\92è', '\83|\81[\83g\94Ô\8d\86', Str) then begin
-        Pref.ServerPort := StrToIntDef(Str, Pref.ServerPort);
-      end;
-    end else begin
-      Pref.ServerPort := StrToIntDef(Items[ItemIndex], Pref.ServerPort);
-    end;
-    for i := 0 to Items.Count-2 do begin
-      if Pref.ServerPort = StrToInt(Items[i]) then ItemIndex := i;
-    end;
+  //
+  Pref.ReconnectWait := spnReconnectWait.Value;
+  //
+  Pref.LUID := edtLUID.Text;
+  //
+  Pref.FMOName := memFMOName.Lines;
+  SakuraSeeker.FileMappingTarget := Pref.FMOName;
+  Pref.HideGhosts := cbxHideGhosts.Checked;
+  Pref.NoExtraSSTPHeaders := cbxNoExtraSSTPHeaders.Checked;
+  //
+  Pref.AutoJoinChannels := memAutoJoinChannels.Lines;
+  //
+  with ctvSurfacePreview do
+  begin
+    Pref.SurfacePreviewOnHint := (GetNodeFromKeyPath('OnHint\DoPreview') as TCPCCheckBoxNode).Checked;
+    Pref.SurfacePreviewOnScriptPoint := (GetNodeFromKeyPath('OnScriptPoint\DoPreview') as TCPCCheckBoxNode).Checked;
+    Node := GetNodeFromKeyPath('OnScriptPoint\Position') as TCPCGroupNode;
+    for i := 0 to Node.Count-1 do
+      if (Node.Item[i] as TCPCRadioNode).Checked then
+        Pref.SurfacePreviewOnScriptPointPosition := TSurfacePreviewOnScriptPointPosition(i);
   end;
 end;
 
-procedure TfrmSetting.edtSoundFileButtonClick(Sender: TObject);
+procedure TfrmSetting.edtProxyPortKeyPress(Sender: TObject; var Key: Char);
 begin
-  if OpenDialog.Execute then begin
-    edtSoundFile.Text := OpenDialog.FileName;
-  end;
+  if not(Key in ['0'..'9']) then Key := Char(0);
 end;
 
-procedure TfrmSetting.tvwChannelsCompare(Sender: TObject; Node1,
-  Node2: TTreeNode; Data: Integer; var Compare: Integer);
+procedure TfrmSetting.ctvBottleNodeChecked(Sender: TObject;
+  Node: TCPCConfigItemNode);
 begin
-  if Node1.Text = '\83f\83t\83H\83\8b\83g' then
-    Compare := -1
-  else if Node2.Text = '\83f\83t\83H\83\8b\83g' then
-    Compare := 1
-  else
-    Compare := AnsiCompareStr(Node1.Text, Node2.Text);
+  //ShowMessage(ctvBottle.GetFullKeyPath(Node));
 end;
 
-procedure TfrmSetting.tvwChannelsChange(Sender: TObject; Node: TTreeNode);
-var ChPref: TChannelPrefs;
+procedure TfrmSetting.ctvBottleNodeChecking(Sender: TObject;
+  Node: TCPCConfigItemNode; var Allow: Boolean);
 begin
-  rgpUseChannelPrefs.Enabled := true;
-  if integer(Node.Data) = DefaultNode then begin
-    ChPref := Pref.DefChannelPref;
-    cbxCanAutoAdd.Enabled := false;
-    cbxWarnPost.Enabled := false;
-    rgpUseChannelPrefs.Enabled := false;
-    cbxSoundArrived.AllowGrayed := false;
-  end else begin
-    ChPref := Pref.ChannelPrefIndex[integer(Node.Data)];
-    cbxCanAutoAdd.Enabled := true;
-    cbxWarnPost.Enabled := true;
-    rgpUseChannelPrefs.Enabled := true;
-    cbxSoundArrived.AllowGrayed := true;
-  end;
-  cbxCanAutoAdd.Checked := ChPref.CanAutoAdd;
-  cbxWarnPost.Checked := ChPref.WarnPost;
-  if ChPref.UseChannelPrefs then begin
-    rgpUseChannelPrefs.ItemIndex := 0;
-  end else begin
-    rgpUseChannelPrefs.ItemIndex := 1;
+  if Node.KeyName = 'IgnoreBottle' then begin
+    MessageDlg('\82±\82Ì\8b@\94\\82Í\8eÀ\91\95\82³\82ê\82Ä\82¢\82Ü\82¹\82ñ', mtError, [mbOk], 0);
+    Allow := false;
   end;
-  cbxSoundArrived.State := TCheckBoxState(ChPref.SoundArrived);
-  edtSoundFile.Text := ChPref.SoundFile;
-  cbxIgnoreIfGhost.Checked := ChPref.IgnoreIfGhost;
-  if ChPref.TargetGhost <> '' then
-    cbxTargetGhost.Text := ChPref.TargetGhost
-  else
-    cbxTargetGhost.Text := ChannelDefaultGhost;
 end;
 
-procedure TfrmSetting.rgpUseChannelPrefsClick(Sender: TObject);
+procedure TfrmSetting.tstRuleShow(Sender: TObject);
 begin
-  pnlChannelOpt.Visible := ((rgpUseChannelPrefs.ItemIndex = 0) and
-                            (tvwChannels.Selected <> nil));
-  if SelChPref <> nil then begin
-    SelChPref.UseChannelPrefs := (rgpUseChannelPrefs.ItemIndex = 0);
-    tvwChannels.Selected.ImageIndex := BottleImage(SelChPref);
-    tvwChannels.Selected.SelectedIndex := BottleImage(SelChPref);
-  end;
+  frmRuleList.UpdateDisplay;
 end;
 
-function TfrmSetting.BottleImage(ChPref: TChannelPrefs): integer;
+procedure TfrmSetting.btnUseCurrentJoinChannelsClick(Sender: TObject);
 begin
-  if ChPref = Pref.DefChannelPref then Result := 1
-  else if ChPref.UseChannelPrefs then Result := CheckedBottle
-  else Result := UnCheckedBottle;
+  memAutoJoinChannels.Lines := JoinChannels;
 end;
 
-function TfrmSetting.SelChPref: TChannelPrefs;
+procedure TfrmSetting.btnVisibleGhostsClick(Sender: TObject);
+var i: integer;
+    FullGhosts: TStringList;
 begin
-  if tvwChannels.Selected = nil then begin
-    Result := nil;
-    Exit;
-  end else if integer(tvwChannels.Selected.Data) = DefaultNode then begin
-    Result := Pref.DefChannelPref;
-  end else begin
-    Result := Pref.ChannelPrefIndex[integer(tvwChannels.Selected.Data)];
+  FullGhosts := TStringList.Create;
+  SakuraSeeker.BeginDetect;
+  try
+    for i := 0 to SakuraSeeker.Count-1 do
+      FullGhosts.Add(SakuraSeeker[i].Name);
+    StrListEdit(Pref.VisibleGhostsList, '\83S\81[\83X\83g\82ð\8ew\92è', true, FullGhosts);
+  finally
+    FullGhosts.Free;
   end;
 end;
 
-procedure TfrmSetting.cbxSoundArrivedClick(Sender: TObject);
-begin
-  SelChPref.SoundArrived := TSoundArrived(cbxSoundArrived.State);
-end;
-
-procedure TfrmSetting.edtSoundFileChange(Sender: TObject);
+procedure TfrmSetting.lvwPluginListDblClick(Sender: TObject);
+var Index: integer;
 begin
-  SelChPref.SoundFile := edtSoundFile.Text;
-end;
-
-procedure TfrmSetting.cbxTargetGhostChange(Sender: TObject);
-begin
-  if cbxTargetGhost.ItemIndex = 0 then
-    SelChPref.TargetGhost := ''
+  if lvwPluginList.Selected = nil then
+    Exit;
+  Index := lvwPluginList.Selected.Index;
+  if pfConfigure in Spps.SppItem[Index].PluginFunctions then
+    Spps.SppItem[Index].Configure
   else
-    SelChPref.TargetGhost := cbxTargetGhost.Text;
+    ShowMessage('\92Ç\89Á\82Ì\90Ý\92è\8d\80\96Ú\82Í\82 \82è\82Ü\82¹\82ñ\81B');
 end;
 
-procedure TfrmSetting.cbxIgnoreIfGhostClick(Sender: TObject);
+procedure TfrmSetting.edtLUIDEnter(Sender: TObject);
 begin
-  SelChPref.IgnoreIfGhost := cbxIgnoreIfGhost.Checked;
+  FOldLUID := edtLUID.Text;
 end;
 
-procedure TfrmSetting.cbxUsePortClick(Sender: TObject);
-var Re: integer;
-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Í'+
-            '\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';
+procedure TfrmSetting.edtLUIDExit(Sender: TObject);
+var TmpLUID: String;
+    i: integer;
+    Err: boolean;
 begin
-  if cbxUsePort.Checked then begin
-    Re := MessageDlg(Mes, mtWarning, mbOkCancel, 0);
-    if Re = mrCancel then cbxUsePort.Checked := false;
+  TmpLUID := edtLUID.Text;
+  i := 1;
+  Err := false;
+  if Length(TmpLUID) <> 82 then
+    Err := true
+  else
+    while i <= Length(TmpLUID) do
+    begin
+      if not (TmpLUID[i] in ['0'..'9', 'a'..'z', 'A'..'Z', '.', ',']) then
+      begin
+        Err := true;
+        Break;
+      end;
+      Inc(i);
+    end;
+  if Err then
+  begin
+    ShowMessage('LUID\82Ì\93à\97e\82ª\95s\90³\82Å\82·');
+    edtLUID.Text := FOldLUID;
   end;
-  cbxPort.Enabled := cbxUsePort.Checked;
-  Pref.UsePort := cbxUsePort.Checked;
-end;
-
-procedure TfrmSetting.cbxCanAutoAddClick(Sender: TObject);
-begin
-  SelChPref.CanAutoAdd := cbxCanAutoAdd.Checked;
 end;
 
-procedure TfrmSetting.edtProxyPortKeyPress(Sender: TObject; var Key: Char);
+procedure TfrmSetting.btnCopyLUIDClick(Sender: TObject);
 begin
-  if not(Key in ['0'..'9']) then Key := Char(0);
+  Clipboard.SetTextBuf(PChar(edtLUID.Text));
 end;
 
-procedure TfrmSetting.cbxWarnPostClick(Sender: TObject);
+procedure TfrmSetting.FormCreate(Sender: TObject);
+var
+  i: integer;
+  Cap: String;
+  Node: TTreeNode;
 begin
-  SelChPref.WarnPost := cbxWarnPost.Checked;
+  for i := 0 to PageControl.PageCount-1 do
+  begin
+    Cap := PageControl.Pages[i].Caption;
+    if Pos(':', Cap) > 0 then
+      Cap := Copy(Cap, 1, Pos(':', Cap)-1);
+    Node := tvwCategory.Items.Add(nil, Cap);
+    Node.ImageIndex := -1;
+    Node.SelectedIndex := SettingIcon;
+  end;
+  tvwCategoryChange(Self, tvwCategory.Items[0]);
+  tvwCategory.Items[0].Selected := true;
 end;
 
-procedure TfrmSetting.ctvBottleNodeChecked(Sender: TObject;
-  Node: TCPCConfigItemNode);
+procedure TfrmSetting.tvwCategoryChange(Sender: TObject; Node: TTreeNode);
 begin
-  //ShowMessage(ctvBottle.GetFullKeyPath(Node));
+  PageControl.ActivePageIndex := Node.Index;
+  pnlHeading.Caption := PageControl.ActivePage.Caption;
 end;
 
-procedure TfrmSetting.ctvBottleNodeChecking(Sender: TObject;
-  Node: TCPCConfigItemNode; var Allow: Boolean);
+procedure TfrmSetting.tvwCategoryMouseMove(Sender: TObject;
+  Shift: TShiftState; X, Y: Integer);
+var
+  Node: TTreeNode;
+  NewHint: String;
+  CPos: TPoint;
 begin
-  if Node.KeyName = 'IgnoreBottle' then begin
-    MessageDlg('\82±\82Ì\8b@\94\\82Í\8eÀ\91\95\82³\82ê\82Ä\82¢\82Ü\82¹\82ñ', mtError, [mbOk], 0);
-    Allow := false;
+  Node := tvwCategory.GetNodeAt(X, Y);
+  if Node <> nil then
+  begin
+    NewHint := PageControl.Pages[Node.Index].Caption;
+    if tvwCategory.Hint <> NewHint then
+    begin
+      tvwCategory.Hint := NewHint;
+      GetCursorPos(CPos);
+      Application.ActivateHint(CPos);
+    end;
+  end else
+  begin
+    tvwCategory.Hint := '';
+    Application.HideHint;
   end;
 end;