OSDN Git Service

BottleChainListFrame.dfm 1.15
authorE01 <e01@users.sourceforge.jp>
Sun, 21 Mar 2004 07:20:29 +0000 (07:20 +0000)
committerE01 <e01@users.sourceforge.jp>
Sun, 21 Mar 2004 07:20:29 +0000 (07:20 +0000)
ReplacePresetEditor.pas 1.8
ReplacePresetEditor.dfm 1.5
StrReplace.pas 1.8
ConstEditor.pas 1.11
StrReplaceFrame.dfm 1.4
StrReplaceFrame.pas 1.3
StrReplaceDialog.pas 1.2
マージ

bottleclient/BottleChainListFrame.dfm
bottleclient/ConstEditor.pas
bottleclient/MainForm.dfm
bottleclient/ReplacePresetEditor.dfm
bottleclient/ReplacePresetEditor.pas
bottleclient/StrReplace.pas
bottleclient/StrReplaceDialog.pas
bottleclient/StrReplaceFrame.dfm
bottleclient/StrReplaceFrame.pas

index 790bfd5..d967d8a 100755 (executable)
@@ -1,17 +1,17 @@
 object frmBottleChainList: TfrmBottleChainList
   Left = 0
   Top = 0
-  Width = 362
-  Height = 260
+  Width = 423
+  Height = 265
   TabOrder = 0
   DesignSize = (
-    362
-    260)
+    423
+    265)
   object lstRules: TCheckListBox
     Left = 0
     Top = 0
-    Width = 289
-    Height = 260
+    Width = 351
+    Height = 265
     OnClickCheck = lstRulesClickCheck
     Align = alLeft
     Anchors = [akLeft, akTop, akRight, akBottom]
@@ -23,61 +23,66 @@ object frmBottleChainList: TfrmBottleChainList
     OnMeasureItem = lstRulesMeasureItem
   end
   object btnDelete: TButton
-    Left = 294
-    Top = 200
+    Left = 356
+    Top = 205
     Width = 65
     Height = 25
+    Hint = #12523#12540#12523#12434#21066#38500
     Anchors = [akRight, akBottom]
     Caption = #21066#38500'(&D)'
     TabOrder = 5
     OnClick = btnDeleteClick
   end
   object btnAdd: TButton
-    Left = 294
-    Top = 232
+    Left = 356
+    Top = 235
     Width = 65
     Height = 25
+    Hint = #26032#12375#12356#12523#12540#12523#12434#36861#21152
     Anchors = [akRight, akBottom]
     Caption = #36861#21152'(&A)'
     TabOrder = 6
     OnClick = btnAddClick
   end
   object btnDown: TButton
-    Left = 294
-    Top = 96
-    Width = 67
+    Left = 356
+    Top = 101
+    Width = 65
     Height = 25
+    Hint = #19979#12395#31227#21205
     Anchors = [akRight, akBottom]
     Caption = #19979#12408'(&D)'
     TabOrder = 2
     OnClick = btnDownClick
   end
   object btnUp: TButton
-    Left = 294
-    Top = 64
-    Width = 67
+    Left = 356
+    Top = 69
+    Width = 65
     Height = 25
+    Hint = #12523#12540#12523#12434#19978#12395#31227#21205
     Anchors = [akRight, akBottom]
     Caption = #19978#12408'(&U)'
     TabOrder = 1
     OnClick = btnUpClick
   end
   object btnEdit: TButton
-    Left = 294
-    Top = 136
+    Left = 356
+    Top = 141
     Width = 65
     Height = 25
+    Hint = #29694#22312#12398#12523#12540#12523#12434#32232#38598
     Anchors = [akRight, akBottom]
     Caption = #32232#38598'(&E)'
     TabOrder = 3
     OnClick = EditRule
   end
   object btnDuplicate: TButton
-    Left = 294
-    Top = 168
+    Left = 356
+    Top = 173
     Width = 65
     Height = 25
-    Hint = #12523#12540#12523#12434#35079#35069#12375#12414#12377
+    Hint = #29694#22312#12398#12523#12540#12523#12434#35079#35069
     Anchors = [akRight, akBottom]
     Caption = #12467#12500#12540'(&C)'
     TabOrder = 4
index 4a44892..3f6f8ad 100755 (executable)
@@ -190,26 +190,10 @@ begin
 end;
 
 procedure TfrmConstEditor.FormCreate(Sender: TObject);
-var c: char;
-    i: integer;
 begin
   if Application.Terminated then Exit;
   //\83\81\83j\83\85\81[\8dì\90¬
-  for c := 'A' to 'Z' do begin
-    cbxConstShortCut.Items.Add('Ctrl+' + c);
-  end;
-  for c := 'A' to 'Z' do begin
-    cbxConstShortCut.Items.Add('Shift+Ctrl+' + c);
-  end;
-  for c := 'A' to 'Z' do begin
-    cbxConstShortCut.Items.Add('Alt+Ctrl+' + c);
-  end;
-  for i := 1 to 12 do begin
-    cbxConstShortCut.Items.Add('F' + IntToStr(i));
-  end;
-  for i := 1 to 12 do begin
-    cbxConstShortCut.Items.Add('Shift+F' + IntToStr(i));
-  end;
+  BuildShortCutList(cbxConstShortCut.Items);
   tvwConst.DoubleBuffered := true;
 end;
 
index 99e4d8d..3c2622d 100755 (executable)
@@ -27,7 +27,7 @@ object frmSender: TfrmSender
   TextHeight = 12
   object StatusBar: TStatusBar
     Left = 0
-    Top = 233
+    Top = 241
     Width = 526
     Height = 19
     Panels = <
@@ -170,14 +170,14 @@ object frmSender: TfrmSender
     Left = 0
     Top = 46
     Width = 526
-    Height = 162
+    Height = 170
     Align = alClient
     BevelOuter = bvNone
     BorderWidth = 2
     TabOrder = 4
     object tabChannel: TTabControl
       Left = 2
-      Top = 134
+      Top = 142
       Width = 522
       Height = 26
       Align = alBottom
@@ -201,7 +201,7 @@ object frmSender: TfrmSender
       Left = 2
       Top = 2
       Width = 522
-      Height = 132
+      Height = 140
       Cursor = crIBeam
       Align = alClient
       Caret.AutoCursor = True
@@ -338,7 +338,7 @@ object frmSender: TfrmSender
   end
   object pnlPanel: TPanel
     Left = 0
-    Top = 208
+    Top = 216
     Width = 526
     Height = 25
     Align = alBottom
@@ -668,7 +668,7 @@ object frmSender: TfrmSender
     object actExitClient: TAction
       Category = #12501#12449#12452#12523
       Caption = 'Client'#32066#20102'(&X)'
-      Hint = 'SSTP Bottle Client'#12398#32066#20102
+      Hint = 'Yasagure Client'#12398#32066#20102
       ImageIndex = 14
       OnExecute = actExitClientExecute
     end
index 9c039c3..9bc9fa9 100644 (file)
 object frmReplacePresetEditor: TfrmReplacePresetEditor
-  Left = 0
-  Top = 0
-  Width = 377
-  Height = 274
-  TabOrder = 0
-  object tvwPresets: TTreeView
+  Left = 511
+  Top = 373
+  AutoSize = True
+  BorderStyle = bsDialog
+  Caption = #25991#23383#21015#12398#32622#25563#12503#12522#12475#12483#12488
+  ClientHeight = 391
+  ClientWidth = 377
+  Color = clBtnFace
+  Font.Charset = SHIFTJIS_CHARSET
+  Font.Color = clWindowText
+  Font.Height = -12
+  Font.Name = #65325#65331' '#65328#12468#12471#12483#12463
+  Font.Style = []
+  OldCreateOrder = True
+  Position = poDesktopCenter
+  OnCreate = FormCreate
+  PixelsPerInch = 96
+  TextHeight = 12
+  object pnlPairsEditor: TPanel
     Left = 0
     Top = 0
     Width = 377
-    Height = 161
+    Height = 273
     Align = alTop
-    Indent = 19
+    BevelOuter = bvNone
+    BorderWidth = 5
     TabOrder = 0
+    object lvwPairs: TListView
+      Left = 5
+      Top = 5
+      Width = 367
+      Height = 124
+      Align = alTop
+      Columns = <
+        item
+          Caption = #32622#25563#21069
+          Width = 125
+        end
+        item
+          Caption = #32622#25563#24460
+          Width = 125
+        end
+        item
+          Caption = #27491#35215#34920#29694
+          Width = 45
+        end
+        item
+          Caption = #22823#25991#23383#12539#23567#25991#23383#12398#21306#21029
+          Width = 45
+        end>
+      HideSelection = False
+      ReadOnly = True
+      RowSelect = True
+      TabOrder = 0
+      ViewStyle = vsReport
+      OnChange = lvwPairsChange
+    end
+    object btnAdd: TButton
+      Left = 77
+      Top = 136
+      Width = 67
+      Height = 25
+      Hint = #32622#25563#12527#12540#12489#12398#12506#12450#12434#36861#21152
+      Caption = #36861#21152'(&I)'
+      TabOrder = 1
+      OnClick = btnAddClick
+    end
+    object btnDelete: TButton
+      Left = 149
+      Top = 136
+      Width = 67
+      Height = 25
+      Hint = #32622#25563#12527#12540#12489#12398#12506#12450#12434#21066#38500
+      Caption = #21066#38500'(&D)'
+      TabOrder = 2
+      OnClick = btnDeleteClick
+    end
+    object btnMoveUp: TButton
+      Left = 229
+      Top = 136
+      Width = 67
+      Height = 25
+      Hint = #19978#12395#31227#21205
+      Caption = #19978#12408'(&U)'
+      TabOrder = 3
+      OnClick = btnMoveUpClick
+    end
+    object btnMoveDown: TButton
+      Left = 301
+      Top = 136
+      Width = 67
+      Height = 25
+      Hint = #19979#12395#31227#21205
+      Caption = #19979#12408'(&W)'
+      TabOrder = 4
+      OnClick = btnMoveDownClick
+    end
+    inline StrReplaceFrame: TfrmStrReplaceFrame
+      Left = 12
+      Top = 168
+      Width = 354
+      Height = 100
+      Enabled = False
+      TabOrder = 5
+    end
   end
-  object PageControl: TPageControl
+  object pnlPresetProperties: TPanel
     Left = 0
-    Top = 161
+    Top = 273
     Width = 377
-    Height = 113
-    ActivePage = tstPreset
-    Align = alClient
-    Style = tsButtons
+    Height = 79
+    Align = alTop
+    BevelOuter = bvNone
+    BorderWidth = 5
     TabOrder = 1
-    object tstPreset: TTabSheet
-      Caption = #12503#12522#12475#12483#12488
-      TabVisible = False
-      object Label1: TLabel
-        Left = 8
-        Top = 16
-        Width = 54
+    Visible = False
+    object gbxPresetProperties: TGroupBox
+      Left = 5
+      Top = 5
+      Width = 367
+      Height = 69
+      Align = alClient
+      Caption = #12503#12522#12475#12483#12488#12398#35373#23450
+      TabOrder = 0
+      object lblTitle: TLabel
+        Left = 16
+        Top = 24
+        Width = 56
         Height = 12
-        Caption = #35373#23450#21517'(&N):'
+        Caption = #12479#12452#12488#12523'(&T):'
         FocusControl = edtTitle
       end
-      object Label2: TLabel
-        Left = 8
+      object lblShortCut: TLabel
+        Left = 16
         Top = 48
         Width = 83
         Height = 12
         Caption = #12471#12519#12540#12488#12459#12483#12488'(&S):'
         FocusControl = cbxShortCut
       end
-      object edtTitle: TEdit
-        Left = 96
-        Top = 8
-        Width = 265
-        Height = 20
-        TabOrder = 0
-      end
       object cbxShortCut: TComboBox
-        Left = 96
+        Left = 112
         Top = 40
         Width = 145
         Height = 20
+        Hint = #12461#12540#12508#12540#12489#12471#12519#12540#12488#12459#12483#12488#12398#35373#23450
         ItemHeight = 12
+        TabOrder = 0
+      end
+      object edtTitle: TEdit
+        Left = 112
+        Top = 16
+        Width = 185
+        Height = 20
+        Hint = #12513#12491#12517#12540#12395#34920#31034#12373#12428#12427#12503#12522#12475#12483#12488#12398#12479#12452#12488#12523#12434#35373#23450
         TabOrder = 1
       end
     end
-    object tstPair: TTabSheet
-      Caption = #12506#12450
-      ImageIndex = 1
-      TabVisible = False
-      inline frmStrReplaceFrame: TfrmStrReplaceFrame
-        Left = 8
-        Top = 3
-        Width = 354
-        Height = 100
-        TabOrder = 0
-      end
+  end
+  object pnlOkCancelButtons: TPanel
+    Left = 0
+    Top = 352
+    Width = 377
+    Height = 39
+    Align = alTop
+    BevelOuter = bvNone
+    TabOrder = 2
+    DesignSize = (
+      377
+      39)
+    object btnOk: TButton
+      Left = 285
+      Top = 6
+      Width = 83
+      Height = 25
+      Hint = #22793#26356#20869#23481#12434#30906#23450#12375#12390#12480#12452#12450#12525#12464#12434#38281#12376#12427
+      Anchors = [akRight, akBottom]
+      Caption = '&OK'
+      Default = True
+      TabOrder = 0
+      OnClick = btnOkClick
+    end
+    object btnCancel: TButton
+      Left = 205
+      Top = 6
+      Width = 75
+      Height = 25
+      Hint = #22793#26356#20869#23481#12434#12461#12515#12531#12475#12523#12375#12390#12480#12452#12450#12525#12464#12434#38281#12376#12427
+      Anchors = [akRight, akBottom]
+      Cancel = True
+      Caption = #12461#12515#12531#12475#12523
+      TabOrder = 1
+      OnClick = btnCancelClick
     end
   end
 end
index c09bbaa..21465a8 100644 (file)
@@ -3,28 +3,333 @@ unit ReplacePresetEditor;
 interface
 
 uses
-  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, 
-  Dialogs, ComCtrls, StrReplaceFrame, StdCtrls, StrReplace;
+  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
+  Dialogs, ComCtrls, StrReplaceFrame, StdCtrls, StrReplace, ExtCtrls,
+  Menus, BottleDef;
+
+{
+  \83t\83H\81[\83\80\82ÌAutoSize = true\82É\90Ý\92è\82³\82ê\82Ä\82¢\82é\82½\82ß\81A
+  \83t\83H\81[\83\80\82Í\92\86\96¡\82É\89\9e\82\82Ä\8e©\93®\93I\82É\8fk\82Þ\81B
+
+  \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Ì
+  \83p\83l\83\8b\82É\82æ\82Á\82Ä\8bæ\90Ø\82ç\82ê\82Ä\82¢\82é\81B
+
+  \88ê\94Ô\8fã\82Ì\83p\83l\83\8b pnlPairsEditor \82Æ\81A
+  \88ê\94Ô\89º\82Ì\83p\83l\83\8b pnlOkCancelButtons \82Í\81A\8fí\82É\95\\8e¦\82³\82ê\82Ä\82¢\82é\82ª\81A
+  \90^\82ñ\92\86\82Ì\83p\83l\83\8b pnlPresetProperties \82Í\81AAskForTitle\83v\83\8d\83p\83e\83B\82É
+  \89\9e\82\82Ä\81A\95\\8e¦\82³\82ê\82½\82è\89B\82ê\82½\82è\82·\82é\81B
+  \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
+
+  \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
+  \88ê\92U AutoSize = false \82É\82µ\82Ä\83T\83C\83Y\95Ï\8dX\82µ\82½\8cã\82Å\81A
+  \95K\82¸ AutoSize = true \82É\96ß\82µ\82Ä\82¨\82­\82±\82Æ\81B
+}
 
 type
-  TfrmReplacePresetEditor = class(TFrame)
-    tvwPresets: TTreeView;
-    PageControl: TPageControl;
-    tstPreset: TTabSheet;
-    tstPair: TTabSheet;
-    frmStrReplaceFrame: TfrmStrReplaceFrame;
-    Label1: TLabel;
-    Label2: TLabel;
-    edtTitle: TEdit;
+  TfrmReplacePresetEditor = class(TForm)
+    pnlPairsEditor: TPanel;
+    lvwPairs: TListView;
+    btnAdd: TButton;
+    btnDelete: TButton;
+    btnMoveUp: TButton;
+    btnMoveDown: TButton;
+    StrReplaceFrame: TfrmStrReplaceFrame;
+    pnlPresetProperties: TPanel;
+    pnlOkCancelButtons: TPanel;
+    btnOk: TButton;
+    btnCancel: TButton;
+    gbxPresetProperties: TGroupBox;
     cbxShortCut: TComboBox;
+    edtTitle: TEdit;
+    lblTitle: TLabel;
+    lblShortCut: TLabel;
+    procedure btnAddClick(Sender: TObject);
+    procedure btnDeleteClick(Sender: TObject);
+    procedure btnMoveUpClick(Sender: TObject);
+    procedure btnMoveDownClick(Sender: TObject);
+    procedure lvwPairsChange(Sender: TObject; Item: TListItem;
+      Change: TItemChange);
+    procedure btnOkClick(Sender: TObject);
+    procedure btnCancelClick(Sender: TObject);
+    procedure FormCreate(Sender: TObject);
   private
-    { Private \90é\8c¾ }
+    FPairs: TReplacePairCollection;
+    procedure SetPairs(const Value: TReplacePairCollection);
+    function GetAskForTitle: Boolean;
+    function GetShortCut: TShortCut;
+    function GetTitle: string;
+    procedure SetAskForTitle(const Value: Boolean);
+    procedure SetShortCut(const Value: TShortCut);
+    procedure SetTitle(const Value: string);
+  protected
+    procedure MoveItem(const Delta: Integer);
+    procedure UpdateControls;
+    procedure UpdateListViewItem(Target: TListItem);
+    procedure FollowEdit;
+    procedure FrameUpdate(Sender: TObject);
   public
-    { Public \90é\8c¾ }
+    constructor Create(AOwner: TCOmponent); override;
+    destructor Destroy; override;
+    property Pairs: TReplacePairCollection read FPairs write SetPairs;
+    property Title: string read GetTitle write SetTitle;
+    property ShortCut: TShortCut read GetShortCut write SetShortCut;
+    property AskForTitle: Boolean read GetAskForTitle write SetAskForTitle;
+    function Execute: Boolean;
   end;
 
 implementation
 
 {$R *.dfm}
 
+{ TfrmReplacePresetEditor }
+
+constructor TfrmReplacePresetEditor.Create(AOwner: TCOmponent);
+begin
+  inherited;
+  FPairs := TReplacePairCollection.Create(TReplacePair);
+end;
+
+destructor TfrmReplacePresetEditor.Destroy;
+begin
+  FPairs.Free;
+  inherited;
+end;
+
+procedure TfrmReplacePresetEditor.SetPairs(const Value: TReplacePairCollection);
+begin
+  FPairs.Assign(Value);
+  UpdateControls;
+end;
+
+procedure TfrmReplacePresetEditor.UpdateControls;
+var
+  i, SelectedIndex: Integer;
+begin
+  if lvwPairs.Selected <> nil then
+    SelectedIndex := lvwPairs.Selected.Index
+  else
+    SelectedIndex := -1;
+  with lvwPairs.Items do
+  begin
+    Clear;
+    BeginUpdate;
+    try
+      for i := 0 to FPairs.Count-1 do
+      begin
+        UpdateListViewItem(Add);
+      end;
+      if (SelectedIndex > -1) and (lvwPairs.Selected <> nil) then
+        if (lvwPairs.Selected.Index <> SelectedIndex) and
+        (lvwPairs.Items.Count-1 > SelectedIndex) then
+          lvwPairs.Items[SelectedIndex].Selected := true; 
+    finally
+      EndUpdate;
+    end;
+  end;
+end;
+
+procedure TfrmReplacePresetEditor.btnAddClick(Sender: TObject);
+var
+  New: TListItem;
+begin
+  // \90V\82µ\82­\89Á\82¦\82Ä\82»\82ê\82ð\91I\91ð
+  StrReplaceFrame.OnContentUpdate := nil;
+  try
+    StrReplaceFrame.Pair := FPairs.Add;
+    New := lvwPairs.Items.Add;
+    lvwPairs.Selected := New;
+    UpdateListViewItem(New);
+    // \83t\83H\81[\83J\83X\88Ú\93®\81A\95Ò\8fW\8aJ\8en
+    StrReplaceFrame.edtOldPattern.SetFocus;
+  finally
+    StrReplaceFrame.OnContentUpdate := FrameUpdate;
+  end;
+end;
+
+procedure TfrmReplacePresetEditor.UpdateListViewItem(Target: TListItem);
+var
+  Pair: TReplacePair;
+begin
+  with Target do
+  begin
+    lvwPairs.Items.BeginUpdate;
+    try
+      Pair := FPairs[Target.Index];
+      Caption := Pair.BeforeStr;
+      SubItems.Clear;
+      SubItems.Add(Pair.AfterStr);
+      if Pair.UseRegExp then
+        SubItems.Add('Y')
+      else
+        SubItems.Add('-');
+      if not Pair.IgnoreCase then
+        SubItems.Add('Y')
+      else
+        SubItems.Add('-');
+    finally
+      lvwPairs.Items.EndUpdate;
+    end;
+  end;
+end;
+
+procedure TfrmReplacePresetEditor.btnDeleteClick(Sender: TObject);
+var
+  TargetIndex: Integer;
+begin
+  if lvwPairs.Selected = nil then
+    Exit;
+  TargetIndex := lvwPairs.Selected.Index;
+  FPairs.Delete(TargetIndex);
+  lvwPairs.Items.Delete(TargetIndex);
+end;
+
+procedure TfrmReplacePresetEditor.btnMoveUpClick(Sender: TObject);
+begin
+  MoveItem(-1);
+end;
+
+procedure TfrmReplacePresetEditor.btnMoveDownClick(Sender: TObject);
+begin
+  MoveItem(1);
+end;
+
+procedure TfrmReplacePresetEditor.lvwPairsChange(Sender: TObject;
+  Item: TListItem; Change: TItemChange);
+begin
+  if Change <> ctState then
+    Exit;
+  with StrReplaceFrame do
+  begin
+    if lvwPairs.Selected = nil then
+    begin
+      Enabled := false;
+    end else
+    begin
+      Enabled := true;
+      Pair := FPairs[lvwPairs.Selected.Index];
+    end;
+  end;
+end;
+
+function TfrmReplacePresetEditor.Execute: Boolean;
+begin
+  UpdateControls;
+  StrReplaceFrame.OnContentUpdate := FrameUpdate; 
+  if lvwPairs.Items.Count > 0 then
+  begin
+    lvwPairs.Items[0].Selected := true;
+  end;
+  Result := ShowModal = mrOk;
+end;
+
+procedure TfrmReplacePresetEditor.btnOkClick(Sender: TObject);
+var
+  i: integer;
+begin
+  if Pairs.Count = 0 then
+  begin
+    ShowMessage('\8dÅ\92á1\82Â\82Ì\92u\8a·\83\8b\81[\83\8b\82ð\90Ý\92è\82µ\82Ä\82­\82¾\82³\82¢');
+    Exit;
+  end;
+  for i := 0 to Pairs.Count-1 do
+    if not Pairs[i].IsValidPair then
+    begin
+      ShowMessage(Format('%d\94Ô\96Ú\82Ì\95\8e\9a\97ñ\83y\83A\82É\83G\83\89\81[\82ª\82 \82è\82Ü\82·', [i+1]));
+      Exit;
+    end;
+  if AskForTitle and (Title = '') then
+  begin
+    ShowMessage('\83v\83\8a\83Z\83b\83g\82Ì\83^\83C\83g\83\8b\82ð\8ew\92è\82µ\82Ä\82­\82¾\82³\82¢');
+    Exit;
+  end;
+  ModalResult := mrOk;
+end;
+
+procedure TfrmReplacePresetEditor.btnCancelClick(Sender: TObject);
+begin
+  ModalResult := mrCancel;
+end;
+
+procedure TfrmReplacePresetEditor.FollowEdit;
+var
+  CurrentPair: TReplacePair;
+begin
+  if lvwPairs.Selected <> nil then
+  begin
+    CurrentPair := FPairs[lvwPairs.Selected.Index];
+    CurrentPair.Assign(StrReplaceFrame.Pair);
+    UpdateListViewItem(lvwPairs.Selected);
+  end;
+end;
+
+procedure TfrmReplacePresetEditor.FrameUpdate(Sender: TObject);
+begin
+  FollowEdit;
+end;
+
+procedure TfrmReplacePresetEditor.MoveItem(const Delta: Integer);
+var
+  TargetIndex: Integer;
+  Item: TReplacePair;
+begin
+  if lvwPairs.Selected = nil then
+    Exit;
+  StrReplaceFrame.OnContentUpdate := nil;
+  try
+    TargetIndex := lvwPairs.Selected.Index;
+    // \94Í\88Í\83`\83F\83b\83N
+    if (Delta < 0) and (TargetIndex < -Delta) then
+      Exit;
+    if (Delta > 0) and (TargetIndex >= Pairs.Count-Delta) then
+      Exit;
+    if Delta = 0 then
+      Exit; // \88ê\89\9e
+    // \88ê\92U\83R\83\8c\83N\83V\83\87\83\93\82©\82ç\8aO\82µ\82Ä
+    Item := FPairs.Items[TargetIndex];
+    Item.Collection := nil;
+    // \90V\82µ\82­INSERT\82µ\82½\90V\8bK\8d\80\96Ú\82É\91ã\93ü
+    FPairs.Insert(TargetIndex + Delta).Assign(Item);
+    UpdateControls;
+    // \83\8a\83X\83g\83r\83\85\81[\82Ì\91I\91ð\83A\83C\83e\83\80\82ð\93®\82©\82·
+    lvwPairs.Items[TargetIndex + Delta].Selected := true;
+  finally
+    StrReplaceFrame.OnContentUpdate := FrameUpdate;
+  end;
+end;
+
+function TfrmReplacePresetEditor.GetAskForTitle: Boolean;
+begin
+  Result := pnlPresetProperties.Visible;
+end;
+
+function TfrmReplacePresetEditor.GetShortCut: TShortCut;
+begin
+  Result := TextToShortCut(cbxShortCut.Text);
+end;
+
+function TfrmReplacePresetEditor.GetTitle: string;
+begin
+  Result := edtTitle.Text;
+end;
+
+procedure TfrmReplacePresetEditor.SetAskForTitle(const Value: Boolean);
+begin
+  pnlPresetProperties.Visible := Value;
+end;
+
+procedure TfrmReplacePresetEditor.SetShortCut(const Value: TShortCut);
+begin
+  cbxShortCut.Text := ShortCutToText(Value);
+end;
+
+procedure TfrmReplacePresetEditor.SetTitle(const Value: string);
+begin
+  edtTitle.Text := Value;
+end;
+
+procedure TfrmReplacePresetEditor.FormCreate(Sender: TObject);
+begin
+  BuildShortCutList(cbxShortCut.Items);
+end;
+
 end.
index 1deb1c0..b19744a 100644 (file)
@@ -7,7 +7,7 @@ unit StrReplace;
 
 interface
 
-uses Classes, SysUtils, Forms, Menus, RegexUtils;
+uses Classes, SysUtils, Forms, Menus, RegexUtils, Contnrs;
 
 type
   // \88È\89º\82Ì5\82Â\82Ì\83N\83\89\83X\82Ì\92è\8b`\82Í\81A\8f¬\82³\82¢\95û\82©\82ç\81¨\91å\82«\82¢\95û\82Ö\81A\82Æ
@@ -15,8 +15,8 @@ type
 
   // \8c\9f\8dõ\8cê\82Æ\92u\8a·\8cê\82Ì\83y\83A\82Æ\82»\82Ì\83I\83v\83V\83\87\83\93\82ð\8bL\98^\82·\82é\8d\\91¢\91Ì
   TReplacePairRec = record
-    BeforeStr: String;
-    AfterStr:  String;
+    BeforeStr: string;
+    AfterStr:  string;
     IgnoreCase: boolean;
     UseRegExp: boolean;
   end;
@@ -25,52 +25,64 @@ type
   TReplacePair = class(TCollectionItem)
   private
     FPairRec: TReplacePairRec;
-    procedure SetAfterStr(const Value: String);
-    procedure SetBeforeStr(const Value: String);
+    procedure SetAfterStr(const Value: string);
+    procedure SetBeforeStr(const Value: string);
     procedure SetIgnoreCase(const Value: boolean);
     procedure SetUseRegExp(const Value: boolean);
-    function GetAfterStr: String;
-    function GetBeforeStr: String;
+    function GetAfterStr: string;
+    function GetBeforeStr: string;
     function GetIgnoreCase: boolean;
     function GetUseRegExp: boolean;
   public
-    function ExecuteReplace(TargetStr: String): String;
+    constructor Create(Collection: TCollection); override;
+    function ExecuteReplace(TargetStr: string): string;
     procedure Assign(Source: TPersistent); override;
+    procedure Clear;
+    function IsValidPair: Boolean;
   published
-    property BeforeStr: String read GetBeforeStr write SetBeforeStr;
-    property AfterStr: String read GetAfterStr write SetAfterStr;
-    property IgnoreCase: boolean read GetIgnoreCase write SetIgnoreCase;
-    property UseRegExp: boolean read GetUseRegExp write SetUseRegExp;
+    property BeforeStr: string read GetBeforeStr write SetBeforeStr;
+    property AfterStr: string read GetAfterStr write SetAfterStr;
+    property IgnoreCase: boolean read GetIgnoreCase write SetIgnoreCase default false;
+    property UseRegExp: boolean read GetUseRegExp write SetUseRegExp default false;
   end;
 
-  // TReplacePair\82Ì\83R\83\8c\83N\83V\83\87\83\93\83N\83\89\83X
+  // TReplacePair\82Ì\83R\83\8c\83N\83V\83\87\83\93\83N\83\89\83X\81B
   TReplacePairCollection = class(TCollection)
+  private
+    function GetItem(Index: Integer): TReplacePair;
   public
-    function ExecuteReplace(TargetStr: String): String;
+    function Add: TReplacePair;
+    property Items[Index: Integer]: TReplacePair read GetItem; default;
+    function ExecuteReplace(TargetStr: string): string;
+    function StringExpression: string;
   end;
 
   // TReplacePair\82Ì\83R\83\8c\83N\83V\83\87\83\93\82ð\95Û\8e\9d\82µ\81A\83^\83C\83g\83\8b\82È\82Ç\82ð\82Ü\82Æ\82ß\82Ä
   // 1\82Â\82Ì\83v\83\8a\83Z\83b\83g\90Ý\92è\8d\80\96Ú\82ð\95\\8c»\82·\82é\83N\83\89\83X
   TReplacePreset = class(TCollectionItem)
   private
-    FTitle: String;
+    FTitle: string;
     FPairs: TReplacePairCollection;
     FShortCut: TShortCut;
     procedure SetPairs(const Value: TReplacePairCollection);
     procedure SetShortCut(const Value: TShortCut);
-    procedure SetTitle(const Value: String);
+    procedure SetTitle(const Value: string);
   public
     constructor Create(Collection: TCollection); override;
     destructor Destroy; override;
     procedure Assign(Source: TPersistent); override;
   published
     property Pairs: TReplacePairCollection read FPairs write SetPairs;
-    property Title: String read FTitle write SetTitle;
+    property Title: string read FTitle write SetTitle;
     property ShortCut: TShortCut read FShortCut write SetShortCut;
   end;
 
-  // \83v\83\8a\83Z\83b\83g\90Ý\92è\8d\80\96ÚTReplacePreset\82Ì\83R\83\8c\83N\83V\83\87\83\93\83N\83\89\83X
   TReplacePresetCollection = class(TCollection)
+  private
+    function GetItem(Index: Integer): TReplacePreset;
+  public
+    function Add: TReplacePreset;
+    property Items[Index: Integer]: TReplacePreset read GetItem; default;
   end;
 
   // \8dÅ\8fI\93I\82É\82±\82ê\82ð\83V\83\8a\83A\83\89\83C\83Y\82·\82é
@@ -98,7 +110,24 @@ begin
     FPairRec := (Source as TReplacePair).FPairRec;
 end;
 
-function TReplacePair.ExecuteReplace(TargetStr: String): String;
+procedure TReplacePair.Clear;
+begin
+  with FPairRec do
+  begin
+    BeforeStr := '';
+    AfterStr := '';
+    UseRegExp := false;
+    IgnoreCase := false;
+  end;
+end;
+
+constructor TReplacePair.Create(Collection: TCollection);
+begin
+  inherited;
+  IgnoreCase := true;
+end;
+
+function TReplacePair.ExecuteReplace(TargetStr: string): string;
 var
   Options: TReplaceFlags;
 begin
@@ -113,12 +142,12 @@ begin
     Result := StringReplace(Result, BeforeStr, AfterStr, Options);
 end;
 
-function TReplacePair.GetAfterStr: String;
+function TReplacePair.GetAfterStr: string;
 begin
   Result := FPairRec.AfterStr;
 end;
 
-function TReplacePair.GetBeforeStr: String;
+function TReplacePair.GetBeforeStr: string;
 begin
   Result := FPairRec.BeforeStr;
 end;
@@ -133,12 +162,25 @@ begin
   Result := FPairRec.UseRegExp;
 end;
 
-procedure TReplacePair.SetAfterStr(const Value: String);
+function TReplacePair.IsValidPair: Boolean;
+begin
+  Result := true;
+  if BeforeStr = '' then
+    Result := false
+  else
+    try
+      ExecuteReplace(' ')
+    except
+      Result := false;
+    end;
+end;
+
+procedure TReplacePair.SetAfterStr(const Value: string);
 begin
   FPairRec.AfterStr := Value;
 end;
 
-procedure TReplacePair.SetBeforeStr(const Value: String);
+procedure TReplacePair.SetBeforeStr(const Value: string);
 begin
   FPairRec.BeforeStr := Value;
 end;
@@ -192,7 +234,7 @@ begin
   FShortCut := Value;
 end;
 
-procedure TReplacePreset.SetTitle(const Value: String);
+procedure TReplacePreset.SetTitle(const Value: string);
 begin
   FTitle := Value;
 end;
@@ -200,15 +242,12 @@ end;
 { TReplacePresets }
 
 procedure TReplacePresets.Assign(Source: TPersistent);
-var
-  Src: TReplacePresets;
 begin
   if not (Source is TReplacePresets) then
     inherited
   else
   begin
-    Src := Source as TReplacePresets;
-    Presets.Assign(Src.Presets);
+    FPresets.Assign((Source as TReplacePresets).FPresets);
   end;
 end;
 
@@ -232,9 +271,14 @@ end;
 
 { TReplacePairCollection }
 
-function TReplacePairCollection.ExecuteReplace(TargetStr: String): String;
+function TReplacePairCollection.Add: TReplacePair;
+begin
+  Result := inherited Add as TReplacePair;
+end;
+
+function TReplacePairCollection.ExecuteReplace(TargetStr: string): string;
 var
-  i: integer;
+  i: Integer;
 begin
   Result := TargetStr;
   for i := 0 to Count-1 do
@@ -243,6 +287,37 @@ begin
   end;
 end;
 
+function TReplacePairCollection.GetItem(Index: Integer): TReplacePair;
+begin
+  Result := (inherited GetItem(Index)) as TReplacePair;
+end;
+
+function TReplacePairCollection.StringExpression: string;
+var
+  i: Integer;
+begin
+  Result := '';
+  for i := 0 to Count-1 do
+  begin
+    if i > 0 then
+      Result := Result + '\81A';
+    Result := Result + Format('\81u%s\81v\81¨\81u%s\81v',
+      [Items[i].BeforeStr, Items[i].AfterStr]);
+  end;
+end;
+
+{ TReplacePresetCollection }
+
+function TReplacePresetCollection.Add: TReplacePreset;
+begin
+  Result := inherited Add as TReplacePreset;
+end;
+
+function TReplacePresetCollection.GetItem(Index: Integer): TReplacePreset;
+begin
+  Result := inherited GetItem(Index) as TReplacePreset;
+end;
+
 initialization
 
 Classes.RegisterClass(TReplacePresets);
index e48e02f..40f6233 100644 (file)
@@ -14,11 +14,11 @@ type
     procedure btnCancelClick(Sender: TObject);
     procedure btnOkClick(Sender: TObject);
   private
-    function GetPairRec: TReplacePairRec;
-    procedure SetPairRec(const Value: TReplacePairRec);
+    function GetPair: TReplacePair;
+    procedure SetPair(const Value: TReplacePair);
     { Private \90é\8c¾ }
   public
-    property PairRec: TReplacePairRec read GetPairRec write SetPairRec;
+    property Pair: TReplacePair read GetPair write SetPair;
     function Execute: boolean;
   end;
 
@@ -36,11 +36,9 @@ end;
 
 procedure TfrmStrReplaceDialog.btnOkClick(Sender: TObject);
 var
-  PairRec: TReplacePairRec;
   Dummy: String;
 begin
-  PairRec := frmStrReplaceFrame.PairRec;
-  with PairRec do
+  with Pair do
   begin
     if UseRegExp and
       (SafeAndCheckRegExpSubst(BeforeStr, AfterStr, [rfReplaceAll], Dummy) <> '') then
@@ -62,14 +60,14 @@ begin
   Result := ShowModal = mrOk;
 end;
 
-function TfrmStrReplaceDialog.GetPairRec: TReplacePairRec;
+function TfrmStrReplaceDialog.GetPair: TReplacePair;
 begin
-  Result := frmStrReplaceFrame.PairRec;
+  Result := frmStrReplaceFrame.Pair;
 end;
 
-procedure TfrmStrReplaceDialog.SetPairRec(const Value: TReplacePairRec);
+procedure TfrmStrReplaceDialog.SetPair(const Value: TReplacePair);
 begin
-  frmStrReplaceFrame.PairRec := Value;
+  frmStrReplaceFrame.Pair := Value;
 end;
 
 end.
index 3f9b595..e63ba95 100644 (file)
@@ -30,6 +30,7 @@ object frmStrReplaceFrame: TfrmStrReplaceFrame
     Height = 20
     Anchors = [akLeft, akTop, akRight]
     TabOrder = 1
+    OnChange = ContentUpdate
   end
   object edtOldPattern: TEdit
     Left = 111
@@ -38,21 +39,26 @@ object frmStrReplaceFrame: TfrmStrReplaceFrame
     Height = 20
     Anchors = [akLeft, akTop, akRight]
     TabOrder = 0
+    OnChange = ContentUpdate
   end
   object cbxUseRegExp: TCheckBox
     Left = 0
     Top = 56
     Width = 193
     Height = 17
+    Hint = #26908#32034#26465#20214#12395#27491#35215#34920#29694#12434#20351#29992#21487#33021#12395#12375#12414#12377
     Caption = #27491#35215#34920#29694'(&R)'
     TabOrder = 2
+    OnClick = ContentUpdate
   end
   object cbxDontIgnoreCase: TCheckBox
     Left = 0
     Top = 80
     Width = 193
     Height = 17
+    Hint = #26908#32034#26178#12395#22823#25991#23383#12539#23567#25991#23383#12434#21306#21029#12375#12414#12377
     Caption = #22823#25991#23383#12539#23567#25991#23383#12434#21306#21029#12377#12427'(&C)'
     TabOrder = 3
+    OnClick = ContentUpdate
   end
 end
index f097c0f..c197134 100644 (file)
@@ -14,14 +14,26 @@ type
     lblNewPattern: TLabel;
     cbxUseRegExp: TCheckBox;
     cbxDontIgnoreCase: TCheckBox;
+    procedure ContentUpdate(Sender: TObject);
   private
-    FPairRec: TReplacePairRec;
-    procedure SetPairRec(const Value: TReplacePairRec);
+    FPair: TReplacePair;
+    FOnContentUpdate: TNotifyEvent;
+    FUpdateCount: Integer;
+    procedure SetPairRec(const Value: TReplacePair);
     procedure UpdateControls;
     procedure ControlsToData;
-    function GetPairRec: TReplacePairRec;
+    function GetPairRec: TReplacePair;
+    procedure SetOnContentUpdate(const Value: TNotifyEvent);
+  protected
+    procedure BeginUpdate;
+    procedure EndUpdate;
+    procedure SetEnabled(Value: boolean); override;
   public
-    property PairRec: TReplacePairRec read GetPairRec write SetPairRec;
+    constructor Create(AOwner: TComponent); override;
+    destructor Destroy; override;
+    property Pair: TReplacePair read GetPairRec write SetPairRec;
+    property OnContentUpdate: TNotifyEvent read FOnContentUpdate
+      write SetOnContentUpdate;
   end;
 
 implementation
@@ -32,7 +44,7 @@ implementation
 
 procedure TfrmStrReplaceFrame.ControlsToData;
 begin
-  with FPairRec do
+  with FPair do
   begin
     BeforeStr  := edtOldPattern.Text;
     AfterStr   := edtNewPattern.Text;
@@ -41,26 +53,78 @@ begin
   end;
 end;
 
-function TfrmStrReplaceFrame.GetPairRec: TReplacePairRec;
+constructor TfrmStrReplaceFrame.Create(AOwner: TComponent);
+begin
+  inherited;
+  FPair := TReplacePair.Create(nil);
+end;
+
+destructor TfrmStrReplaceFrame.Destroy;
+begin
+  FPair.Free;
+  inherited;
+end;
+
+function TfrmStrReplaceFrame.GetPairRec: TReplacePair;
 begin
   ControlsToData;
-  Result := FPairRec;
+  Result := FPair;
 end;
 
-procedure TfrmStrReplaceFrame.SetPairRec(const Value: TReplacePairRec);
+procedure TfrmStrReplaceFrame.SetOnContentUpdate(const Value: TNotifyEvent);
 begin
-  FPairRec := Value;
+  FOnContentUpdate := Value;
+end;
+
+procedure TfrmStrReplaceFrame.SetPairRec(const Value: TReplacePair);
+begin
+  FPair.Assign(Value);
   UpdateControls;
 end;
 
 procedure TfrmStrReplaceFrame.UpdateControls;
 begin
-  with FPairRec do
+  with FPair do
+  begin
+    BeginUpdate;
+    try
+      edtOldPattern.Text := BeforeStr;
+      edtNewPattern.Text := AfterStr;
+      cbxUseRegExp.Checked := UseRegExp;
+      cbxDontIgnoreCase.Checked := not IgnoreCase;
+    finally
+      EndUpdate;
+    end;
+  end;
+end;
+
+procedure TfrmStrReplaceFrame.ContentUpdate(Sender: TObject);
+begin
+  if Assigned(FOnContentUpdate) and (FUpdateCount = 0) then
+    FOnContentUpdate(Self);
+end;
+
+procedure TfrmStrReplaceFrame.BeginUpdate;
+begin
+  Inc(FUpdateCount);
+end;
+
+procedure TfrmStrReplaceFrame.EndUpdate;
+begin
+  Dec(FUpdateCount);
+  if FUpdateCount = 0 then
+    ContentUpdate(Self);
+end;
+
+procedure TfrmStrReplaceFrame.SetEnabled(Value: boolean);
+begin
+  if Enabled <> Value then
   begin
-    edtOldPattern.Text := BeforeStr;
-    edtNewPattern.Text := AfterStr;
-    cbxUseRegExp.Checked := UseRegExp;
-    cbxDontIgnoreCase.Checked := not IgnoreCase;
+    edtOldPattern.Enabled := Value;
+    edtNewPattern.Enabled := Value;
+    cbxUseRegExp.Enabled := Value;
+    cbxDontIgnoreCase.Enabled := Value;
+    inherited SetEnabled(Value);
   end;
 end;