-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathSearchAndReplaceDialog.bas
More file actions
384 lines (349 loc) · 10.6 KB
/
Copy pathSearchAndReplaceDialog.bas
File metadata and controls
384 lines (349 loc) · 10.6 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
B4J=true
Group=Default Group
ModulesStructureVersion=1
Type=Class
Version=7.8
@EndOfDesignText@
Sub Class_Globals
Private fx As JFX
Private frm As Form
Private findTextField As TextField
Private replaceTextField As TextField
Private resultListView As ListView
Private regexCheckBox As CheckBox
Private searchSourceCheckBox As CheckBox
Private lines As List
End Sub
'Initializes the object. You can add parameters to this method if needed.
Public Sub Initialize(pLines As List)
lines=pLines
frm.Initialize("frm",600,300)
frm.RootPane.LoadLayout("searchandreplace")
Main.loc.LocalizeForm(frm)
End Sub
Public Sub show
frm.Show
End Sub
Sub resultListView_SelectedIndexChanged(Index As Int)
End Sub
Sub findButton_Click
resultListView.Items.Clear
If regexCheckBox.Checked Then
showRegexResult
Else
showResult
End If
End Sub
Sub showRegexResult
Try
Regex.Matcher(findTextField.Text,"").Find
Regex.Replace(findTextField.Text,"",replaceTextField.Text)
Catch
fx.Msgbox(frm,Main.loc.Localize("Expression not correct"),"")
Return
Log(LastException)
End Try
Try
Dim index As Int=-1
For Each line As Map In lines
index=index+1
Dim tf As TextFlow
tf.Initialize
Dim source,target,pattern,sourceLeft,targetLeft As String
source=line.Get("source")
target=line.GetDefault("target","")
sourceLeft=source
targetLeft=target
pattern=findTextField.Text
'Log(pattern)
Dim sourceMatcher,targetMatcher As Matcher
sourceMatcher=Regex.Matcher2(pattern,32,source)
targetMatcher=Regex.Matcher2(pattern,32,target)
Dim inSource,inTarget As Boolean
inSource=Regex.Matcher2(pattern,32,source).Find
inTarget=Regex.Matcher2(pattern,32,target).Find
Dim shouldShow As Boolean=False
If searchSourceCheckBox.Checked Then
If inSource Then
shouldShow=True
End If
Else
If inTarget Then
shouldShow=True
End If
End If
Dim textSegmentsToReplace As List
tf.AddText(Main.loc.Localize("- Source: "))
If shouldShow Then
If searchSourceCheckBox.Checked Then
If inSource Then
Dim sourceSegments As List
sourceSegments.Initialize
Do While sourceMatcher.Find
'Log("Found: " & sourceMatcher.Match)
Dim textBefore As String
textBefore=sourceLeft.SubString2(0,sourceLeft.IndexOf(sourceMatcher.Match))
If textBefore<>"" Then
tf.AddText(textBefore)
sourceSegments.Add(textBefore)
End If
tf.AddText(sourceMatcher.Match).SetColor(fx.Colors.Blue).SetUnderline(True)
sourceSegments.Add(sourceMatcher.Match)
sourceLeft=sourceLeft.SubString2(sourceLeft.IndexOf(sourceMatcher.Match)+sourceMatcher.Match.Length,sourceLeft.Length)
Loop
tf.AddText(sourceLeft)
sourceSegments.Add(sourceLeft)
textSegmentsToReplace=sourceSegments
Else
tf.AddText(source)
End If
Else
tf.AddText(source)
End If
tf.AddText(CRLF&Main.loc.Localize("- Target: "))
If inTarget And searchSourceCheckBox.Checked=False Then
Dim targetSegments As List
targetSegments.Initialize
Do While targetMatcher.Find
Dim find As String
find=targetMatcher.Match
Dim textBefore As String
textBefore=targetLeft.SubString2(0,targetLeft.IndexOf(find))
If textBefore<>"" Then
tf.AddText(textBefore)
targetSegments.Add(textBefore)
End If
tf.AddText(find).SetColor(fx.Colors.Blue).SetUnderline(True)
targetSegments.Add(find)
targetLeft=targetLeft.SubString2(targetLeft.IndexOf(find)+find.Length,targetLeft.Length)
Loop
tf.AddText(targetLeft)
targetSegments.Add(targetLeft)
textSegmentsToReplace=targetSegments
Else
tf.AddText(target)
End If
tf.AddText(CRLF&Main.loc.Localize("- Replace: "))
For Each text As String In textSegmentsToReplace
If text = "" Then
Continue
End If
If Regex.IsMatch2(pattern,32,text) Then
Dim replace As String
replace=Regex.Replace2(pattern,32,text,replaceTextField.Text)
'Log("replace"&replace)
If replaceTextField.Text="" Then
replace=""
End If
'If replace="" And text=CRLF Then
' Continue
'End If
If replace="" Then
tf.AddTextWithStrikethrough(text,"").SetColor(fx.Colors.Red)
Else
tf.AddText(replace).SetColor(fx.Colors.Green).SetUnderline(True)
End If
Else
tf.AddText(text)
End If
Next
Dim tagList As List
tagList.Initialize
tagList.Add(index)
tagList.Add(tf.getText)
tagList.Add(searchSourceCheckBox.Checked)
tagList.Add(tf.getTextInDisplay)
Dim pane As Pane = tf.CreateTextFlow
pane.Tag=tagList
pane.SetSize(resultListView.Width,Utils.MeasureMultilineTextHeight(fx.DefaultFont(15),resultListView.Width,tagList.Get(3)))
resultListView.Items.Add(pane)
End If
Next
Catch
Log(LastException)
fx.Msgbox(frm,Main.loc.Localize("Expression not correct"),"")
Return
End Try
End Sub
Sub showResult
Dim index As Int=-1
For Each line As Map In lines
index=index+1
Dim source,target,find As String
source=line.Get("source")
target=line.GetDefault("target","")
find=findTextField.Text
Dim tf As TextFlow
tf.Initialize
Dim shouldShow As Boolean=False
If searchSourceCheckBox.Checked Then
If source.Contains(find) Then
shouldShow=True
End If
Else
If target.Contains(find) Then
shouldShow=True
End If
End If
If shouldShow Then
tf.AddText(Main.loc.Localize("- Source: "))
Dim textSegmentsToReplace As List
If searchSourceCheckBox.Checked Then
Dim sourceSegments As List
sourceSegments.Initialize
Utils.splitByFind(source,find,sourceSegments)
If source.Contains(find) Then
addText(tf,find,sourceSegments)
Else
tf.AddText(source)
End If
textSegmentsToReplace=sourceSegments
Else
tf.AddText(source)
End If
tf.AddText(CRLF&Main.loc.Localize("- Target: "))
If target.Contains(find) And searchSourceCheckBox.Checked=False Then
Dim targetSegments As List
targetSegments.Initialize
Utils.splitByFind(target,find,targetSegments)
addText(tf,find,targetSegments)
textSegmentsToReplace=targetSegments
Else
tf.AddText(target)
End If
tf.AddText(CRLF&Main.loc.Localize("- Replace: "))
For Each text As String In textSegmentsToReplace
If text=find Then
If replaceTextField.Text="" Then
tf.AddTextWithStrikethrough(find,"").SetColor(fx.Colors.Red)
Else
tf.AddText(replaceTextField.Text).SetColor(fx.Colors.Green).SetUnderline(True)
End If
Else
tf.AddText(text)
End If
Next
Dim tagList As List
tagList.Initialize
tagList.Add(index)
tagList.Add(tf.getText)
tagList.Add(searchSourceCheckBox.Checked)
tagList.Add(tf.getTextInDisplay)
Dim pane As Pane = tf.CreateTextFlow
pane.Tag=tagList
pane.SetSize(resultListView.Width,Utils.MeasureMultilineTextHeight(fx.DefaultFont(15),resultListView.Width,tagList.Get(3)))
resultListView.Items.Add(pane)
End If
Next
End Sub
Sub addText(tf As TextFlow,find As String,textSegments As List)
For Each segment As String In textSegments
If segment=find Then
tf.AddText(find).SetColor(fx.Colors.Blue).SetUnderline(True)
Else
tf.AddText(segment)
End If
Next
End Sub
Sub resultListView_Resize (Width As Double, Height As Double)
For Each p As Pane In resultListView.Items
Dim tagList As List
tagList=p.Tag
p.SetSize(Width,Utils.MeasureMultilineTextHeight(fx.DefaultFont(15),Width,tagList.Get(3)))
Next
End Sub
Sub replaceSelectedButton_MouseClicked (EventData As MouseEvent)
If resultListView.SelectedItem<>Null Then
Dim indices As List = resultListView.GetSelectedIndices
For i = indices.Size - 1 To 0 Step -1
Dim itemIndex As Int = indices.Get(i)
Dim p As Pane
p=resultListView.Items.Get(itemIndex)
Dim tagList As List
tagList=p.Tag
Dim HandleSource As Boolean
HandleSource=tagList.Get(2)
Dim text,after As String
Dim key As String
If HandleSource Then
text=Regex.Split(CRLF&"- ",tagList.Get(1))(0)
text=text.SubString2(Main.loc.Localize("- Source: ").Length,text.Length)
key="source"
Else
text=Regex.Split(CRLF&"- ",tagList.Get(1))(1)
text=text.SubString2(Main.loc.Localize("Target: ").Length,text.Length)
key="target"
End If
after=Regex.Split(CRLF&"- ",tagList.Get(1))(2)
Dim localized As String=Main.loc.Localize("- Replace: ")
localized=localized.SubString2(2,localized.Length)
after=after.SubString2(localized.Length,after.Length)
Dim index As Int=tagList.Get(0)
Dim line As Map = lines.Get(index)
If line.GetDefault(key,"")=text Then
line.Put(key,after)
End If
resultListView.Items.RemoveAt(itemIndex)
Next
Main.LoadLinesToTable
End If
End Sub
Sub replaceAllButton_MouseClicked (EventData As MouseEvent)
If resultListView.Items.Size>0 Then
Dim count As Int=0
Dim tempList As List
tempList.Initialize
tempList.AddAll(resultListView.Items)
For Each p As Pane In tempList
Dim tagList As List
tagList=p.Tag
Dim HandleSource As Boolean
HandleSource=tagList.Get(2)
Dim text,after As String
Dim key As String
If HandleSource Then
text=Regex.Split(CRLF&"- ",tagList.Get(1))(0)
text=text.SubString2(Main.loc.Localize("- Source: ").Length,text.Length)
key="source"
Else
text=Regex.Split(CRLF&"- ",tagList.Get(1))(1)
text=text.SubString2(Main.loc.Localize("Target: ").Length,text.Length)
key="target"
End If
after=Regex.Split(CRLF&"- ",tagList.Get(1))(2)
Dim localized As String=Main.loc.Localize("- Replace: ")
localized=localized.SubString2(2,localized.Length)
after=after.SubString2(localized.Length,after.Length)
Dim index As Int=tagList.Get(0)
Dim line As Map = lines.Get(index)
If line.GetDefault(key,"")=text Then
line.Put(key,after)
End If
resultListView.Items.RemoveAt(resultListView.Items.IndexOf(p))
count=count+1
Next
fx.Msgbox(frm,Main.loc.LocalizeParams("{1} item(s) replaced",Array As String(count)),"")
Main.LoadLinesToTable
End If
End Sub
Sub resultListView_Action
Dim p As Pane
p=resultListView.Items.Get(resultListView.SelectedIndex)
Dim taglist As List
taglist=p.Tag
Dim index As Int = taglist.Get(0)
Main.JumpToRow(index+1,200)
End Sub
Sub replaceTextField_TextChanged (Old As String, New As String)
resultListView.Items.Clear
End Sub
Sub findTextField_TextChanged (Old As String, New As String)
resultListView.Items.Clear
End Sub
Private Sub resultListView_MouseClicked (EventData As MouseEvent)
If EventData.ClickCount == 2 Then
If resultListView.SelectedIndex <> -1 Then
resultListView_Action
End If
End If
End Sub