OSDN Git Service

文字列置換ダイアログとそのエディタ関係の実装の続き。
[winbottle/winbottle.git] / bottleclient / StrReplace.pas
1 unit StrReplace;
2
3 {
4   StrReplace.pas
5   GUI\82©\82ç\93Æ\97§\82µ\82½\81A\95\8e\9a\97ñ\92u\8a·\8aÖ\98A\83\8d\83W\83b\83N\83N\83\89\83X\82Ì\8eÀ\91\95
6 }
7
8 interface
9
10 uses Classes, SysUtils, Forms, Menus, RegexUtils, Contnrs;
11
12 type
13   // \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Æ
14   // \8bL\8fq\82µ\82Ä\82 \82é(\8aÜ\82Ü\82ê\82é\95û\82©\82ç\8aÜ\82Þ\95û\81A\82Ì\8f\87\94Ô)
15
16   // \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Ì
17   TReplacePairRec = record
18     BeforeStr: string;
19     AfterStr:  string;
20     IgnoreCase: boolean;
21     UseRegExp: boolean;
22   end;
23
24   // \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é\83N\83\89\83X
25   TReplacePair = class(TCollectionItem)
26   private
27     FPairRec: TReplacePairRec;
28     procedure SetAfterStr(const Value: string);
29     procedure SetBeforeStr(const Value: string);
30     procedure SetIgnoreCase(const Value: boolean);
31     procedure SetUseRegExp(const Value: boolean);
32     function GetAfterStr: string;
33     function GetBeforeStr: string;
34     function GetIgnoreCase: boolean;
35     function GetUseRegExp: boolean;
36   public
37     function ExecuteReplace(TargetStr: string): string;
38     procedure Assign(Source: TPersistent); override;
39     procedure Clear;
40   published
41     property BeforeStr: string read GetBeforeStr write SetBeforeStr;
42     property AfterStr: string read GetAfterStr write SetAfterStr;
43     property IgnoreCase: boolean read GetIgnoreCase write SetIgnoreCase default false;
44     property UseRegExp: boolean read GetUseRegExp write SetUseRegExp default false;
45   end;
46
47   // TReplacePair\82Ì\83R\83\8c\83N\83V\83\87\83\93\83N\83\89\83X\81B
48   TReplacePairCollection = class(TCollection)
49   private
50     function GetItem(Index: Integer): TReplacePair;
51   public
52     function Add: TReplacePair;
53     property Items[Index: Integer]: TReplacePair read GetItem; default;
54     function ExecuteReplace(TargetStr: string): string;
55   end;
56
57   // 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Ä
58   // 1\82Â\82Ì\83v\83\8a\83Z\83b\83g\90Ý\92è\8d\80\96Ú\82ð\95\\8c»\82·\82é\83N\83\89\83X
59   TReplacePreset = class(TCollectionItem)
60   private
61     FTitle: string;
62     FPairs: TReplacePairCollection;
63     FShortCut: TShortCut;
64     procedure SetPairs(const Value: TReplacePairCollection);
65     procedure SetShortCut(const Value: TShortCut);
66     procedure SetTitle(const Value: string);
67   public
68     constructor Create(Collection: TCollection); override;
69     destructor Destroy; override;
70     procedure Assign(Source: TPersistent); override;
71   published
72     property Pairs: TReplacePairCollection read FPairs write SetPairs;
73     property Title: string read FTitle write SetTitle;
74     property ShortCut: TShortCut read FShortCut write SetShortCut;
75   end;
76
77   TReplacePresetCollection = class(TCollection)
78   private
79     function GetItem(Index: Integer): TReplacePreset;
80   public
81     function Add: TReplacePreset;
82     property Items[Index: Integer]: TReplacePreset read GetItem; default;
83   end;
84
85   // \8dÅ\8fI\93I\82É\82±\82ê\82ð\83V\83\8a\83A\83\89\83C\83Y\82·\82é
86   TReplacePresets = class(TComponent)
87   private
88     FPresets: TReplacePresetCollection;
89     procedure SetPresets(const Value: TReplacePresetCollection);
90   public
91     constructor Create(AOwner: TComponent); override;
92     destructor Destroy; override;
93     procedure Assign(Source: TPersistent); override;
94   published
95     property Presets: TReplacePresetCollection read FPresets write SetPresets;
96   end;
97
98 implementation
99
100 { TReplacePair }
101
102 procedure TReplacePair.Assign(Source: TPersistent);
103 begin
104   if not (Source is TReplacePair) then
105     inherited
106   else
107     FPairRec := (Source as TReplacePair).FPairRec;
108 end;
109
110 procedure TReplacePair.Clear;
111 begin
112   with FPairRec do
113   begin
114     BeforeStr := '';
115     AfterStr := '';
116     UseRegExp := false;
117     IgnoreCase := false;
118   end;
119 end;
120
121 function TReplacePair.ExecuteReplace(TargetStr: string): string;
122 var
123   Options: TReplaceFlags;
124 begin
125   // 1\82Â\82Ì\92u\8a·\82ð\8eÀ\91\95\82·\82é
126   Result := TargetStr;
127   Options := [rfReplaceAll];
128   if IgnoreCase then
129     Options := Options + [rfIgnoreCase];
130   if UseRegExp then
131     Result := StringReplaceRegExp(Result, BeforeStr, AfterStr, Options)
132   else
133     Result := StringReplace(Result, BeforeStr, AfterStr, Options);
134 end;
135
136 function TReplacePair.GetAfterStr: string;
137 begin
138   Result := FPairRec.AfterStr;
139 end;
140
141 function TReplacePair.GetBeforeStr: string;
142 begin
143   Result := FPairRec.BeforeStr;
144 end;
145
146 function TReplacePair.GetIgnoreCase: boolean;
147 begin
148   Result := FPairRec.IgnoreCase;
149 end;
150
151 function TReplacePair.GetUseRegExp: boolean;
152 begin
153   Result := FPairRec.UseRegExp;
154 end;
155
156 procedure TReplacePair.SetAfterStr(const Value: string);
157 begin
158   FPairRec.AfterStr := Value;
159 end;
160
161 procedure TReplacePair.SetBeforeStr(const Value: string);
162 begin
163   FPairRec.BeforeStr := Value;
164 end;
165
166 procedure TReplacePair.SetIgnoreCase(const Value: boolean);
167 begin
168   FPairRec.IgnoreCase := Value;
169 end;
170
171 procedure TReplacePair.SetUseRegExp(const Value: boolean);
172 begin
173   FPairRec.UseRegExp := Value;
174 end;
175
176 { TReplacePreset }
177
178 procedure TReplacePreset.Assign(Source: TPersistent);
179 var
180   Src: TReplacePreset;
181 begin
182   if not (Source is TReplacePreset) then
183     inherited
184   else
185   begin
186     Src := Source as TReplacePreset;
187     Pairs.Assign(Src.Pairs);
188     Title := Src.Title;
189     ShortCut := Src.ShortCut;
190   end;
191 end;
192
193 constructor TReplacePreset.Create(Collection: TCollection);
194 begin
195   inherited;
196   FPairs := TReplacePairCollection.Create(TReplacePair);
197 end;
198
199 destructor TReplacePreset.Destroy;
200 begin
201   FPairs.Free;
202   inherited;
203 end;
204
205 procedure TReplacePreset.SetPairs(const Value: TReplacePairCollection);
206 begin
207   FPairs.Assign(Value);
208 end;
209
210 procedure TReplacePreset.SetShortCut(const Value: TShortCut);
211 begin
212   FShortCut := Value;
213 end;
214
215 procedure TReplacePreset.SetTitle(const Value: string);
216 begin
217   FTitle := Value;
218 end;
219
220 { TReplacePresets }
221
222 procedure TReplacePresets.Assign(Source: TPersistent);
223 begin
224   if not (Source is TReplacePresets) then
225     inherited
226   else
227   begin
228     FPresets.Assign((Source as TReplacePresets).FPresets);
229   end;
230 end;
231
232 constructor TReplacePresets.Create(AOwner: TComponent);
233 begin
234   inherited;
235   FPresets := TReplacePresetCollection.Create(TReplacePreset);
236 end;
237
238 destructor TReplacePresets.Destroy;
239 begin
240   FPresets.Free;
241   inherited;
242 end;
243
244 procedure TReplacePresets.SetPresets(
245   const Value: TReplacePresetCollection);
246 begin
247   FPresets.Assign(Value);
248 end;
249
250 { TReplacePairCollection }
251
252 function TReplacePairCollection.Add: TReplacePair;
253 begin
254   Result := inherited Add as TReplacePair;
255 end;
256
257 function TReplacePairCollection.ExecuteReplace(TargetStr: string): string;
258 var
259   i: Integer;
260 begin
261   Result := TargetStr;
262   for i := 0 to Count-1 do
263   begin
264     Result := (Items[i] as TReplacePair).ExecuteReplace(Result);
265   end;
266 end;
267
268 function TReplacePairCollection.GetItem(Index: Integer): TReplacePair;
269 begin
270   Result := (inherited GetItem(Index)) as TReplacePair;
271 end;
272
273 { TReplacePresetCollection }
274
275 function TReplacePresetCollection.Add: TReplacePreset;
276 begin
277   Result := inherited Add as TReplacePreset;
278 end;
279
280 function TReplacePresetCollection.GetItem(Index: Integer): TReplacePreset;
281 begin
282   Result := inherited GetItem(Index) as TReplacePreset;
283 end;
284
285 initialization
286
287 Classes.RegisterClass(TReplacePresets);
288
289 end.