~ubuntu-branches/ubuntu/trusty/drpython/trusty

« back to all changes in this revision

Viewing changes to drFindReplaceDialog.py

  • Committer: Bazaar Package Importer
  • Author(s): Luca Falavigna
  • Date: 2008-07-03 22:11:49 UTC
  • mfrom: (0.1.3 upstream) (8 intrepid)
  • mto: This revision was merged to the branch mainline in revision 10.
  • Revision ID: james.westby@ubuntu.com-20080703221149-puu681p4w33g3s3m
* New upstream release.
* Bump epoch due to new version numbering system.
* debian/control:
  - Adjust dependencies for wxwidgets2.8.
* debian/patches/15_output_redirection.dpatch:
  - Set standard output and error to valid UNIX locations.
* Adjust patches for new upstream release:
  - debian/patches/03_pythonfix.dpatch
* Drop patches, implemented upstream:
  - debian/patches/10_ctrl_q_to_exit_as_default_shortcut.dpatch

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
#       Programmer:     Daniel Pozmanter
2
 
#       E-mail:         drpython@bluebottle.com
3
 
#       Note:           You must reply to the verification e-mail to get through.
4
 
#
5
 
#       Copyright 2003-2005 Daniel Pozmanter
6
 
#
7
 
#       Distributed under the terms of the GPL (GNU Public License)
8
 
#
9
 
#       DrPython is free software; you can redistribute it and/or modify
10
 
#       it under the terms of the GNU General Public License as published by
11
 
#       the Free Software Foundation; either version 2 of the License, or
12
 
#       (at your option) any later version.
13
 
#
14
 
#       This program is distributed in the hope that it will be useful,
15
 
#       but WITHOUT ANY WARRANTY; without even the implied warranty of
16
 
#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17
 
#       GNU General Public License for more details.
18
 
#
19
 
#       You should have received a copy of the GNU General Public License
20
 
#       along with this program; if not, write to the Free Software
21
 
#       Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
22
 
        
 
1
#   Programmer: Daniel Pozmanter
 
2
#   E-mail:     drpython@bluebottle.com
 
3
#   Note:       You must reply to the verification e-mail to get through.
 
4
#
 
5
#   Copyright 2003-2007 Daniel Pozmanter
 
6
#
 
7
#   Distributed under the terms of the GPL (GNU Public License)
 
8
#
 
9
#   DrPython is free software; you can redistribute it and/or modify
 
10
#   it under the terms of the GNU General Public License as published by
 
11
#   the Free Software Foundation; either version 2 of the License, or
 
12
#   (at your option) any later version.
 
13
#
 
14
#   This program is distributed in the hope that it will be useful,
 
15
#   but WITHOUT ANY WARRANTY; without even the implied warranty of
 
16
#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
17
#   GNU General Public License for more details.
 
18
#
 
19
#   You should have received a copy of the GNU General Public License
 
20
#   along with this program; if not, write to the Free Software
 
21
#   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 
22
 
23
23
#FindReplace Dialog
24
24
 
25
25
import wx
28
28
import re
29
29
 
30
30
class drFinder:
31
 
        #copy old finder limodou 2004/04/19
32
 
        def __init__(self, parent, stc, oldfinder=None):
33
 
        #end limodou
34
 
                self.parent = parent
35
 
                self.stc = stc
36
 
                self.reset()
37
 
                #copy old finder limodou 2004/04/19
38
 
                self.Copy(oldfinder)
39
 
                #end limodou
40
 
 
41
 
        #copy old finder limodou 2004/04/19
42
 
        def Copy(self, finder):
43
 
                if finder:
44
 
                        self.findtext = finder.findtext
45
 
                        self.findflags = finder.findflags
46
 
                        self.backwards = finder.backwards
47
 
                        #Franz:  Bug Report with Fix
48
 
                        self.RE = finder.RE
49
 
                        #Moved here by Dan.
50
 
                        #Edited by Dan
51
 
                        #(Bug Report, Franz.)
52
 
                        #copy old finder limodou 2004/04/19
53
 
                        self.docEnd = self.stc.GetTextLength()
54
 
                        self.SetTargetRange(0, self.docEnd)
55
 
                        #end limodou
56
 
        #end limodou
57
 
                
58
 
        def DoFind(self, findtext, findflags, backwards=False):
59
 
                self.RE = 0
60
 
                self.rectanglefind = 0
61
 
                doclength = self.stc.GetLength()
62
 
                                                
63
 
                self.findtext = findtext
64
 
                self.findflags = findflags
65
 
                        
66
 
                prev = self.findpos
67
 
                
68
 
                if self.backwards != backwards:
69
 
                        self.backwards = backwards
70
 
                
71
 
                if (backwards):
72
 
                        endpos = self.targetStart
73
 
                else:
74
 
                        endpos = self.targetEnd
75
 
                                                                                        
76
 
                self.findpos = self.stc.FindText(self.findpos, endpos, findtext, findflags)
77
 
                
78
 
                if (self.findpos == -1):
79
 
                        if self.stc.FindText(self.targetStart, self.targetEnd, findtext, findflags) == -1:
80
 
                                drScrolledMessageDialog.ShowMessage(self.parent, ('Search string "' + findtext + '" not found.'), "DrPython Find")
81
 
                                return
82
 
                        if ((self.findpos >= doclength) or (self.findpos < 0)) and (doclength > 0):
83
 
                                self.lastposition = -1
84
 
                                if self.backwards:
85
 
                                        msg = 'Start of document reached: "' + findtext + '".\nStart again from the end?'
86
 
                                        self.findpos = self.targetEnd
87
 
                                else:
88
 
                                        msg = 'End of document reached: "' + findtext + '".\nStart again from the beginning?'
89
 
                                        self.findpos = self.targetStart
90
 
                                if self.parent.prefs.findreplaceautowrap:
91
 
                                        answer = wx.ID_OK
92
 
                                else:
93
 
                                        d = wx.MessageDialog(self.parent, msg, "DrPython Find", wx.OK | wx.CANCEL | wx.ICON_QUESTION)
94
 
                                        answer = d.ShowModal()
95
 
                                        d.Destroy()
96
 
                                if (answer == wx.ID_OK):
97
 
                                        self.stc.GotoPos(self.findpos)
98
 
                                        if self.backwards:
99
 
                                                self.DoFindPrevious()
100
 
                                        else:
101
 
                                                self.DoFindNext()
102
 
                                else:
103
 
                                        self.stc.GotoPos(prev)
104
 
                                return
105
 
                
106
 
                if self.parent.prefs.docfolding:
107
 
                        self.stc.EnsureVisible(self.stc.LineFromPosition(self.findpos))
108
 
 
109
 
                endpos = self.findpos + len(findtext)
110
 
 
111
 
                self.stc.EnsurePositionIsVisible(endpos)
112
 
 
113
 
                self.stc.GotoPos(self.findpos)
114
 
                self.stc.SetSelectionStart(self.findpos)
115
 
                self.stc.SetSelectionEnd(endpos)
116
 
                self.lastposition = self.findpos + len(findtext)
117
 
                
118
 
                if (backwards):
119
 
                        self.findpos = self.findpos - 1
120
 
                else:
121
 
                        self.findpos = self.findpos + 1
122
 
                                
123
 
        def DoREFind(self, findtext, matchcase):
124
 
                self.RE = 1
125
 
                self.rectanglefind = 0
126
 
                
127
 
                self.findtext = findtext
128
 
                self.findflags = matchcase
129
 
                
130
 
                prev = self.findpos
131
 
                
132
 
                case = 0
133
 
                if (not matchcase):
134
 
                        case = re.IGNORECASE
135
 
                
136
 
                try:
137
 
                        regularexpression = re.compile(findtext, case | re.MULTILINE)
138
 
                except:
139
 
                        drScrolledMessageDialog.ShowMessage(self.parent, 'Regular Expression Error', "DrPython Find")
140
 
                        return
141
 
                                
142
 
                endpos = self.targetEnd
143
 
                                                
144
 
                matchedtext = regularexpression.search(self.stc.GetText()[self.findpos:endpos])
145
 
                                
146
 
                if matchedtext is None:
147
 
                        testforexist = regularexpression.search(self.stc.GetText())
148
 
                        if testforexist is None:
149
 
                                drScrolledMessageDialog.ShowMessage(self.parent, ('Regular expression "' + findtext + '" not found.'), "DrPython Find")
150
 
                                return
151
 
                        self.lastposition = -1
152
 
                        if (prev > self.targetStart):
153
 
                                self.findpos = self.targetStart
154
 
                                if self.parent.prefs.findreplaceautowrap:
155
 
                                        answer = wx.ID_OK
156
 
                                else:
157
 
                                        d = wx.MessageDialog(self.parent, 'End of document reached: "' + findtext + '".\nStart again from the beginning?', "DrPython Find", wx.OK | wx.CANCEL | wx.ICON_QUESTION)
158
 
                                        answer = d.ShowModal()
159
 
                                        d.Destroy()
160
 
                                if (answer == wx.ID_OK):
161
 
                                        self.stc.GotoPos(self.findpos)
162
 
                                        self.DoFindNext()
163
 
                                else:
164
 
                                        self.stc.GotoPos(prev)
165
 
                        return
166
 
 
167
 
                oldpos = self.findpos
168
 
                self.findpos = oldpos + matchedtext.start()
169
 
                endpos = oldpos + matchedtext.end()
170
 
                                
171
 
                if self.parent.prefs.docfolding:
172
 
                        self.stc.EnsureVisible(self.stc.LineFromPosition(self.findpos))
173
 
 
174
 
                self.stc.EnsurePositionIsVisible(endpos)
175
 
                        
176
 
                self.stc.GotoPos(self.findpos)
177
 
                self.stc.SetSelectionStart(self.findpos)
178
 
                self.stc.SetSelectionEnd(endpos)
179
 
                self.lastposition = endpos
180
 
                
181
 
                self.findpos = endpos
182
 
        
183
 
        def DoFindNext(self):
184
 
                if len(self.findtext) < 1:
185
 
                        return
186
 
                if not self.inselection:
187
 
                        textlength = self.stc.GetTextLength()
188
 
                        if textlength != self.docEnd:
189
 
                                self.docEnd = textlength
190
 
                                self.SetTargetRange(0, self.docEnd)
191
 
                self.findpos = self.stc.GetCurrentPos()
192
 
                if (not self.RE):
193
 
                        if self.rectanglefind:
194
 
                                self.DoRectangleFind(self.findtext, self.findflags)
195
 
                        else:
196
 
                                self.DoFind(self.findtext, self.findflags)
197
 
                        return
198
 
                if self.rectanglefind:
199
 
                        self.DoRERectangleFind(self.findtext, self.findflags)
200
 
                        return
201
 
                self.DoREFind(self.findtext, self.findflags)
202
 
                
203
 
        def DoFindPrevious(self):
204
 
                if len(self.findtext) < 1:
205
 
                        return
206
 
                if not self.inselection:
207
 
                        textlength = self.stc.GetTextLength()
208
 
                        if textlength != self.docEnd:
209
 
                                self.docEnd = textlength
210
 
                                self.SetTargetRange(self.docEnd, 0)
211
 
                self.findpos = self.stc.GetCurrentPos()
212
 
                if (not self.RE):
213
 
                        if (self.findpos == self.lastposition) and not self.rectanglefind:
214
 
                                self.findpos = self.findpos - len(self.findtext) - 1
215
 
                                self.stc.GotoPos(self.findpos)
216
 
                        elif self.rectanglefind and (self.lastposition == -1) and (not self.backwards):
217
 
                                self.stc.GotoPos(self.findpos)
218
 
                        
219
 
                        if self.rectanglefind:
220
 
                                self.DoRectangleFind(self.findtext, self.findflags, True)
221
 
                        else:
222
 
                                self.DoFind(self.findtext, self.findflags, True)
223
 
                else:
224
 
                        drScrolledMessageDialog.ShowMessage(self.parent, 'Find Previous Not Possible:\nRegular Expressions Are On.', 'DrPython Find')
225
 
 
226
 
        def DoRectangleFind(self, findtext, matchcase, backwards=False):
227
 
                self.RE = 0
228
 
                self.rectanglefind = 1
229
 
                doclength = self.stc.GetLength()
230
 
                lenlines = len(self.Lines)
231
 
                
232
 
                if matchcase:
233
 
                        self.findtext = findtext
234
 
                else:
235
 
                        self.findtext = findtext.lower()
236
 
                        
237
 
                prev = self.findpos
238
 
                                
239
 
                if self.backwards != backwards:
240
 
                        self.backwards = backwards
241
 
                        self.findpos = self.stc.GetCurrentPos()
242
 
                                
243
 
                endpos = self.targetEnd
244
 
                
245
 
                lineArrayPosition = self.getArrayPosition(self.findpos)
246
 
                if lineArrayPosition == -1:
247
 
                        self.findpos = self.findpos - 1
248
 
                        lineArrayPosition = self.getArrayPosition(self.findpos - 1)
249
 
                        if lineArrayPosition == -1:
250
 
                                self.findpos = -1
251
 
                        else:
252
 
                                relative_findpos = self.positions[lineArrayPosition].index(self.findpos) + 1
253
 
                else:
254
 
                        relative_findpos = self.positions[lineArrayPosition].index(self.findpos)
255
 
 
256
 
                if self.findpos > -1:
257
 
                        self.findpos = self.findInArray(lineArrayPosition, relative_findpos)
258
 
                                                                                        
259
 
                if (self.findpos == -1):
260
 
                        if self.backwards:
261
 
                                notFound = self.findInArray(0, self.positions[lenlines-1][len(self.positions[lenlines-1])-1]) == -1
262
 
                        else:
263
 
                                notFound = self.findInArray(0, 0) == -1
264
 
                        if notFound:
265
 
                                drScrolledMessageDialog.ShowMessage(self.parent, ('Search string "' + findtext + '" not found.'), "DrPython Find")
266
 
                                return
267
 
                        if ((self.findpos >= doclength) or (self.findpos < 0)) and (doclength > 0):
268
 
                                self.lastposition = -1
269
 
                                if self.backwards:
270
 
                                        msg = 'Start of document reached: "' + findtext + '".\nStart again from the end?'
271
 
                                        self.findpos = self.targetEnd
272
 
                                else:
273
 
                                        msg = 'End of document reached: "' + findtext + '".\nStart again from the beginning?'
274
 
                                        self.findpos = self.targetStart
275
 
                                if self.parent.prefs.findreplaceautowrap:
276
 
                                        answer = wx.ID_OK
277
 
                                else:
278
 
                                        d = wx.MessageDialog(self.parent, msg, "DrPython Find", wx.OK | wx.CANCEL | wx.ICON_QUESTION)
279
 
                                        answer = d.ShowModal()
280
 
                                        d.Destroy()
281
 
                                if (answer == wx.ID_OK):
282
 
                                        self.stc.GotoPos(self.findpos)
283
 
                                        if self.backwards:
284
 
                                                self.DoFindPrevious()
285
 
                                        else:
286
 
                                                self.DoFindNext()
287
 
                                else:
288
 
                                        self.stc.GotoPos(prev)
289
 
                                return
290
 
                                
291
 
                if self.parent.prefs.docfolding:
292
 
                        self.stc.EnsureVisible(self.stc.LineFromPosition(self.findpos))
293
 
                
294
 
                endpos = self.findpos + len(findtext)
295
 
                
296
 
                self.stc.EnsurePositionIsVisible(endpos)
297
 
                self.stc.GotoPos(self.findpos)
298
 
                self.stc.SetSelectionStart(self.findpos)
299
 
                self.stc.SetSelectionEnd(endpos)
300
 
                self.lastposition = self.findpos + len(findtext)
301
 
                
302
 
        def DoRERectangleFind(self, findtext, matchcase):
303
 
                self.RE = 1
304
 
                self.rectanglefind = 1
305
 
                doclength = self.stc.GetLength()
306
 
                                
307
 
                self.findtext = findtext
308
 
                self.findflags = matchcase
309
 
                
310
 
                prev = self.findpos
311
 
                
312
 
                case = 0
313
 
                if (not matchcase):
314
 
                        case = re.IGNORECASE
315
 
                
316
 
                try:
317
 
                        regularexpression = re.compile(findtext, case | re.MULTILINE)
318
 
                except:
319
 
                        drScrolledMessageDialog.ShowMessage(self.parent, 'Regular Expression Error', "DrPython Find")
320
 
                        return
321
 
                                
322
 
                endpos = self.targetEnd
323
 
                if (self.findpos >= doclength) or (self.findpos < 0):
324
 
                        self.findpos = 0
325
 
 
326
 
                lineArrayPosition = self.getArrayPosition(self.findpos)
327
 
                if lineArrayPosition == -1:
328
 
                        self.findpos = self.findpos - 1
329
 
                        lineArrayPosition = self.getArrayPosition(self.findpos - 1)
330
 
                        if lineArrayPosition == -1:
331
 
                                self.findpos = -1
332
 
                        else:
333
 
                                relative_findpos = self.positions[lineArrayPosition].index(self.findpos) + 1
334
 
                else:
335
 
                        relative_findpos = self.positions[lineArrayPosition].index(self.findpos)
336
 
                
337
 
                if self.findpos > -1:
338
 
                        matchedtext, newArrayPosition = self.searchInArray(regularexpression, lineArrayPosition, relative_findpos)
339
 
                else:
340
 
                        matchedtext = None
341
 
                                
342
 
                if matchedtext is None:
343
 
                        testforexist, nap = self.searchInArray(regularexpression, 0, 0)
344
 
                        if testforexist is None:
345
 
                                drScrolledMessageDialog.ShowMessage(self.parent, ('Regular expression "' + findtext + '" not found.'), "DrPython Find")
346
 
                                return
347
 
                        self.lastposition = -1
348
 
                        if (prev > self.targetStart):
349
 
                                self.findpos = self.targetStart
350
 
                                if self.parent.prefs.findreplaceautowrap:
351
 
                                        answer = wx.ID_OK
352
 
                                else:
353
 
                                        d = wx.MessageDialog(self.parent, 'End of document reached: "' + findtext + '".\nStart again from the beginning?', "DrPython Find", wx.OK | wx.CANCEL | wx.ICON_QUESTION)
354
 
                                        answer = d.ShowModal()
355
 
                                        d.Destroy()
356
 
                                if (answer == wx.ID_OK):
357
 
                                        self.stc.GotoPos(self.findpos)
358
 
                                        self.DoFindNext()
359
 
                                else:
360
 
                                        self.stc.GotoPos(prev)
361
 
                                return
362
 
 
363
 
                relative_findpos = matchedtext.start()
364
 
 
365
 
                self.findpos = self.positions[newArrayPosition][relative_findpos]
366
 
                
367
 
                endpos = self.findpos + (matchedtext.end() - matchedtext.start())
368
 
                                
369
 
                if self.parent.prefs.docfolding:
370
 
                        self.stc.EnsureVisible(self.stc.LineFromPosition(self.findpos))
371
 
 
372
 
                self.stc.EnsurePositionIsVisible(endpos)
373
 
                        
374
 
                self.stc.GotoPos(self.findpos)
375
 
                self.stc.SetSelectionStart(self.findpos)
376
 
                self.stc.SetSelectionEnd(endpos)
377
 
                self.lastposition = endpos
378
 
                
379
 
                self.findpos = endpos
380
 
        
381
 
        def findInArray(self, arrayposition, position):
382
 
                if self.backwards:
383
 
                        r = self.Lines[arrayposition][:position].rfind(self.findtext)
384
 
                        if r == -1:
385
 
                                arrayposition -= 1
386
 
                                while arrayposition > -1:
387
 
                                        r = self.Lines[arrayposition].rfind(self.findtext)
388
 
                                        if r == -1:
389
 
                                                arrayposition -= 1
390
 
                                        else:
391
 
                                                return self.positions[arrayposition][r]
392
 
                        else:
393
 
                                return self.positions[arrayposition][r]
394
 
                else:
395
 
                        l = len(self.Lines)
396
 
                        r = self.Lines[arrayposition][position:].find(self.findtext)
397
 
                        if r == -1:
398
 
                                arrayposition += 1
399
 
                                while arrayposition < l:
400
 
                                        r = self.Lines[arrayposition].find(self.findtext)
401
 
                                        if r == -1:
402
 
                                                arrayposition += 1
403
 
                                        else:
404
 
                                                return self.positions[arrayposition][r]
405
 
                        else:
406
 
                                return self.positions[arrayposition][r]
407
 
                return -1
408
 
        
409
 
        def getArrayPosition(self, position):
410
 
                x = 0
411
 
                for posArray in self.positions:
412
 
                        if position in posArray:
413
 
                                return x
414
 
                        x += 1
415
 
                return -1
416
 
                
417
 
        def GetFindPos(self):
418
 
                return self.findpos
419
 
        
420
 
        def GetFindText(self):
421
 
                return self.findtext
422
 
 
423
 
        def RectangleReplaceAll(self, findtext, replacetext, matchcase):
424
 
                targetText = self.stc.GetSelectedText()
425
 
 
426
 
                if not matchcase:
427
 
                        targetText = targetText.lower()
428
 
                
429
 
                eolchar = self.stc.GetEndOfLineCharacter()
430
 
                                
431
 
                lines = targetText.strip().split(eolchar)
432
 
                
433
 
                c = self.stc.GetColumn(self.targetStart)
434
 
                
435
 
                linenumber = self.stc.LineFromPosition(self.targetStart)
436
 
                                
437
 
                lenline = len(lines[0])
438
 
                                
439
 
                x = 0
440
 
                                
441
 
                for line in lines:
442
 
                        position_of_first_character = c + self.stc.PositionFromLine(linenumber)
443
 
                        p = line.find(findtext)
444
 
                        if p > -1:
445
 
                                line = line.replace(findtext, replacetext)
446
 
                                self.stc.SetTargetStart(position_of_first_character)
447
 
                                self.stc.SetTargetEnd(position_of_first_character+lenline)
448
 
                                self.stc.ReplaceTarget(line)
449
 
                                x = x + 1
450
 
                        linenumber = linenumber + 1
451
 
                                        
452
 
                return x
453
 
 
454
 
        def RectangleREReplaceAll(self, findtext, replacetext, matchcase):
455
 
                case = 0
456
 
                if (not matchcase):
457
 
                        case = re.IGNORECASE
458
 
                
459
 
                try:
460
 
                        regularexpression = re.compile(findtext, case | re.MULTILINE)
461
 
                except:
462
 
                        drScrolledMessageDialog.ShowMessage(self.parent, 'Regular Expression Error', "DrPython Replace")
463
 
                        return
464
 
                                
465
 
                targetText = self.stc.GetSelectedText()
466
 
 
467
 
                if not matchcase:
468
 
                        targetText = targetText.lower()
469
 
                
470
 
                eolchar = self.stc.GetEndOfLineCharacter()
471
 
                                
472
 
                lines = targetText.strip().split(eolchar)
473
 
                
474
 
                c = self.stc.GetColumn(self.targetStart)
475
 
                
476
 
                linenumber = self.stc.LineFromPosition(self.targetStart)
477
 
                                
478
 
                lenline = len(lines[0])
479
 
                                
480
 
                y = 0
481
 
                                
482
 
                for line in lines:
483
 
                        #You need to update the position(do the replace) during the loop.
484
 
                        position_of_first_character = c + self.stc.PositionFromLine(linenumber)
485
 
                        line, x = regularexpression.subn(replacetext, line)
486
 
                        y = y + x
487
 
                        self.stc.SetTargetStart(position_of_first_character)
488
 
                        self.stc.SetTargetEnd(position_of_first_character+lenline)
489
 
                        self.stc.ReplaceTarget(line)
490
 
                        linenumber = linenumber + 1
491
 
                
492
 
                return y
493
 
 
494
 
        def ReplaceAll(self, findtext, replacetext, flags, prompt = 0):
495
 
                p = self.stc.FindText(self.targetStart, self.targetEnd, findtext, flags)
496
 
                diff = len(replacetext) - len(findtext)
497
 
                x = 0
498
 
                notfirst = 0
499
 
                favpos = wx.Point(5, 5)
500
 
                while (p is not -1):
501
 
                        if self.parent.prefs.docfolding:
502
 
                                self.stc.EnsureVisible(self.stc.LineFromPosition(p))
503
 
                        self.stc.GotoPos(p)
504
 
                        self.stc.EnsureCaretVisible()
505
 
                        self.stc.SetTargetStart(p)
506
 
                        self.stc.SetTargetEnd(p + len(findtext))
507
 
                        if prompt:
508
 
                                self.stc.SetSelection(p, (p + len(findtext)))
509
 
                                d = wx.SingleChoiceDialog(self.parent, ("Found \"" + findtext + "\" at Line: " \
510
 
                                + str(self.stc.LineFromPosition(p)+1) + \
511
 
                                " Col: " + str(self.stc.GetColumn(p))
512
 
                                + "\n(Hit Cancel to Stop)"), "Replace", ["Replace", "Skip"], wx.CHOICEDLG_STYLE)
513
 
                                if notfirst:
514
 
                                        d.Move(favpos)
515
 
                                else:
516
 
                                        notfirst = 1
517
 
                                answer = d.ShowModal()
518
 
                                favpos = d.GetPosition()
519
 
                                d.Destroy()
520
 
                                if (answer == wx.ID_OK):
521
 
                                        if (d.GetStringSelection() == "Replace"):
522
 
                                                self.stc.ReplaceTarget(replacetext)
523
 
                                                self.targetEnd = self.targetEnd + diff
524
 
                                        else:
525
 
                                                x = x - 1
526
 
                                                p = p + 1
527
 
                                        p = self.stc.FindText((p + len(replacetext)), self.targetEnd, findtext, flags)
528
 
                                else:
529
 
                                        p = -1
530
 
                                        x = x - 1
531
 
                        else:
532
 
                                self.stc.ReplaceTarget(replacetext)
533
 
                                self.targetEnd = self.targetEnd + diff
534
 
                                p = self.stc.FindText((p + len(replacetext)), self.targetEnd, findtext, flags)
535
 
                        x = x + 1
536
 
                return x
537
 
        
538
 
        def REReplaceAll(self, findtext, replacetext, matchcase, prompt = 0):
539
 
                case = 0
540
 
                if (not matchcase):
541
 
                        case = re.IGNORECASE
542
 
                
543
 
                try:
544
 
                        regularexpression = re.compile(findtext, case | re.MULTILINE)
545
 
                except:
546
 
                        drScrolledMessageDialog.ShowMessage(self.parent, 'Regular Expression Error', "DrPython Replace")
547
 
                        return
548
 
                
549
 
                oldtext = self.stc.GetText()
550
 
                if not prompt:
551
 
                        newtext, x = regularexpression.subn(replacetext, oldtext[self.targetStart:self.targetEnd])
552
 
                
553
 
                        self.stc.SetText(oldtext[0:self.targetStart] + newtext + oldtext[self.targetEnd:])
554
 
                else:
555
 
                        matchedtext = regularexpression.search(self.stc.GetText()[self.findpos:self.targetEnd])
556
 
                        
557
 
                        diff = len(replacetext) - len(findtext)
558
 
                        
559
 
                        x = 0
560
 
                        notfirst = 0
561
 
                        
562
 
                        favpos = wx.Point(5, 5)
563
 
                        while matchedtext is not None:
564
 
                        
565
 
                                oldpos = self.findpos
566
 
                                self.findpos = oldpos + matchedtext.start()
567
 
                                endpos = oldpos + matchedtext.end()
568
 
                                
569
 
                                if self.parent.prefs.docfolding:
570
 
                                        self.stc.EnsureVisible(self.stc.LineFromPosition(self.findpos))
571
 
                                self.stc.GotoPos(self.findpos)
572
 
                                self.stc.EnsureCaretVisible()
573
 
                                self.stc.SetSelectionStart(self.findpos)
574
 
                                self.stc.SetSelectionEnd(endpos)
575
 
                                self.stc.SetTargetStart(self.findpos)
576
 
                                self.stc.SetTargetEnd(endpos)
577
 
                                
578
 
                                d = wx.SingleChoiceDialog(self.parent, ("Found \"" + findtext + "\" at Line: " \
579
 
                                + str(self.stc.LineFromPosition(self.findpos)+1) + \
580
 
                                " Col: " + str(self.stc.GetColumn(self.findpos)) + \
581
 
                                "\n(Hit Cancel to Stop)"), "Replace", ["Replace", "Skip"], wx.CHOICEDLG_STYLE)
582
 
                                
583
 
                                if notfirst:
584
 
                                        d.Move(favpos)
585
 
                                else:
586
 
                                        notfirst = 1
587
 
                                answer = d.ShowModal()
588
 
                                favpos = d.GetPosition()
589
 
                                d.Destroy()
590
 
                                if (answer == wx.ID_OK):
591
 
                                        if (d.GetStringSelection() == "Replace"):
592
 
                                                self.stc.ReplaceTarget(replacetext)
593
 
                                                self.findpos = self.findpos + len(replacetext)
594
 
                                                self.targetEnd = self.targetEnd + diff
595
 
                                        else:
596
 
                                                self.findpos = endpos
597
 
                                                x = x - 1
598
 
                                        x = x + 1
599
 
                                
600
 
                                        matchedtext = regularexpression.search(self.stc.GetText()[self.findpos:self.targetEnd])
601
 
                                else:
602
 
                                        matchedtext = None
603
 
                                        
604
 
                return x
605
 
        
606
 
        def reset(self):
607
 
                self.inselection = 0
608
 
                self.findflags = 0
609
 
                self.findpos = 0
610
 
                self.lastposition = 0
611
 
                self.backwards = 0
612
 
                self.findtext = ""
613
 
                self.targetStart = 0
614
 
                self.targetEnd = 0
615
 
                self.docEnd = 0
616
 
                self.RE = 0
617
 
                self.rectanglefind = 0
618
 
 
619
 
        def searchInArray(self, regularexpression, arrayposition, position):
620
 
                l = len(self.Lines)
621
 
                match = regularexpression.search(self.Lines[arrayposition][position:])
622
 
                if match == None:
623
 
                        arrayposition += 1
624
 
                        while arrayposition < l:
625
 
                                match = regularexpression.search(self.Lines[arrayposition])
626
 
                                if match == None:
627
 
                                        arrayposition += 1
628
 
                                else:
629
 
                                        return match, arrayposition
630
 
                return match, arrayposition
631
 
                        
632
 
        def SetFindPos(self, findpos):
633
 
                self.findpos = findpos
634
 
        
635
 
        def SetFindText(self, findtext):
636
 
                self.findtext = findtext
637
 
 
638
 
        def SetTargetPositions(self, matchcase):
639
 
                self.targetText = self.stc.GetSelectedText()
640
 
 
641
 
                self.findflags = matchcase
642
 
                
643
 
                if not matchcase:
644
 
                        self.targetText = self.targetText.lower()
645
 
                
646
 
                eolchar = self.stc.GetEndOfLineCharacter()
647
 
                                
648
 
                self.Lines = self.targetText.strip().split(eolchar)
649
 
                
650
 
                self.targetText = self.targetText.replace(eolchar, '')
651
 
                
652
 
                c = self.stc.GetColumn(self.targetStart)
653
 
                
654
 
                linenumber = self.stc.LineFromPosition(self.targetStart)
655
 
                                
656
 
                lenline = len(self.Lines[0])
657
 
                                
658
 
                self.positions = []
659
 
                                
660
 
                for line in self.Lines:
661
 
                        position_of_first_character = c + self.stc.PositionFromLine(linenumber)
662
 
                        self.positions.append(range(position_of_first_character, position_of_first_character+lenline))
663
 
                        linenumber = linenumber + 1
664
 
                
665
 
        def SetTargetRange(self, start, end, backwards = 0):
666
 
                self.docEnd = self.stc.GetTextLength()
667
 
                self.inselection = (start > 0) | (end < self.docEnd)
668
 
                
669
 
                self.findpos = start
670
 
                if (backwards):
671
 
                        self.findpos = end
672
 
                self.targetStart = start
673
 
                self.targetEnd = end
 
31
    #copy old finder limodou 2004/04/19
 
32
    def __init__(self, parent, stc, oldfinder=None):
 
33
    #end limodou
 
34
        self.parent = parent
 
35
        self.stc = stc
 
36
        self.reset()
 
37
        #copy old finder limodou 2004/04/19
 
38
        self.Copy(oldfinder)
 
39
        #end limodou
 
40
 
 
41
    #copy old finder limodou 2004/04/19
 
42
    def Copy(self, finder):
 
43
        if finder:
 
44
            self.findtext = finder.findtext
 
45
            self.findflags = finder.findflags
 
46
            self.backwards = finder.backwards
 
47
            #Franz:  Bug Report with Fix
 
48
            self.RE = finder.RE
 
49
            #Moved here by Dan.
 
50
            #Edited by Dan
 
51
            #(Bug Report, Franz.)
 
52
            #copy old finder limodou 2004/04/19
 
53
            self.docEnd = self.stc.GetTextLength()
 
54
            self.SetTargetRange(0, self.docEnd)
 
55
            #end limodou
 
56
    #end limodou
 
57
 
 
58
    def DoFind(self, findtext, findflags, backwards=False):
 
59
        self.parent.SetStatusText(findtext, 2)
 
60
        self.RE = 0
 
61
        self.rectanglefind = 0
 
62
        doclength = self.stc.GetLength()
 
63
 
 
64
        self.findtext = findtext
 
65
        self.findflags = findflags
 
66
 
 
67
        prev = self.findpos
 
68
 
 
69
        if self.backwards != backwards:
 
70
            self.backwards = backwards
 
71
 
 
72
        if backwards:
 
73
            endpos = self.targetStart
 
74
        else:
 
75
            endpos = self.targetEnd
 
76
 
 
77
        self.findpos = self.stc.FindText(self.findpos, endpos, findtext, findflags)
 
78
 
 
79
        if self.findpos == -1:
 
80
            if self.stc.FindText(self.targetStart, self.targetEnd, findtext, findflags) == -1:
 
81
                if self.parent.prefs.enablefeedback:
 
82
                    drScrolledMessageDialog.ShowMessage(self.parent, ('Search string "' + findtext + '" not found.'), "DrPython Find")
 
83
                else:
 
84
                    self.parent.SetStatusText('NOT FOUND: ' + findtext, 2)
 
85
                return
 
86
            if ((self.findpos >= doclength) or (self.findpos < 0)) and (doclength > 0):
 
87
                self.lastposition = -1
 
88
                if self.backwards:
 
89
                    msg = 'Start of document reached: "' + findtext + '".\nStart again from the end?'
 
90
                    self.findpos = self.targetEnd
 
91
                else:
 
92
                    msg = 'End of document reached: "' + findtext + '".\nStart again from the beginning?'
 
93
                    self.findpos = self.targetStart
 
94
                if self.parent.prefs.findreplaceautowrap:
 
95
                    answer = wx.OK
 
96
                else:
 
97
                    answer = wx.MessageBox(msg, "DrPython Find", wx.OK | wx.CANCEL | wx.ICON_QUESTION)
 
98
                if answer == wx.OK:
 
99
                    self.stc.GotoPos(self.findpos)
 
100
                    if self.backwards:
 
101
                        self.DoFindPrevious()
 
102
                    else:
 
103
                        self.DoFindNext()
 
104
                else:
 
105
                    self.stc.GotoPos(prev)
 
106
                return
 
107
            
 
108
        if self.parent.prefs.docfolding:
 
109
            self.stc.EnsureVisible(self.stc.LineFromPosition(self.findpos))
 
110
 
 
111
        endpos = self.findpos + len(findtext)
 
112
 
 
113
        self.stc.EnsurePositionIsVisible(endpos)
 
114
 
 
115
        self.stc.GotoPos(self.findpos)
 
116
        self.stc.SetSelectionStart(self.findpos)
 
117
        self.stc.SetSelectionEnd(endpos)
 
118
        self.lastposition = self.findpos + len(findtext)
 
119
 
 
120
        if backwards:
 
121
            self.findpos = self.findpos - 1
 
122
        else:
 
123
            self.findpos = self.findpos + 1
 
124
 
 
125
    def DoREFind(self, findtext, matchcase):
 
126
        self.RE = 1
 
127
        self.rectanglefind = 0
 
128
 
 
129
        self.findtext = findtext
 
130
        self.findflags = matchcase
 
131
 
 
132
        prev = self.findpos
 
133
 
 
134
        case = 0
 
135
        if not matchcase:
 
136
            case = re.IGNORECASE
 
137
 
 
138
        try:
 
139
            regularexpression = re.compile(findtext, case | re.MULTILINE)
 
140
        except:
 
141
            drScrolledMessageDialog.ShowMessage(self.parent, 'Regular Expression Error', "DrPython Find")
 
142
            return
 
143
 
 
144
        endpos = self.targetEnd
 
145
 
 
146
        matchedtext = regularexpression.search(self.stc.GetText()[self.findpos:endpos])
 
147
 
 
148
        if matchedtext is None:
 
149
            testforexist = regularexpression.search(self.stc.GetText())
 
150
            if testforexist is None:
 
151
                drScrolledMessageDialog.ShowMessage(self.parent, ('Regular expression "' + findtext + '" not found.'), "DrPython Find")
 
152
                return
 
153
            self.lastposition = -1
 
154
            if prev > self.targetStart:
 
155
                self.findpos = self.targetStart
 
156
                if self.parent.prefs.findreplaceautowrap:
 
157
                    answer = wx.OK
 
158
                else:
 
159
                    answer = wx.MessageBox('End of document reached: "' + findtext + '".\nStart again from the beginning?', "DrPython Find", wx.OK | wx.CANCEL | wx.ICON_QUESTION)
 
160
                if answer == wx.OK:
 
161
                    self.stc.GotoPos(self.findpos)
 
162
                    self.DoFindNext()
 
163
                else:
 
164
                    self.stc.GotoPos(prev)
 
165
            return
 
166
 
 
167
        oldpos = self.findpos
 
168
        self.findpos = oldpos + matchedtext.start()
 
169
        endpos = oldpos + matchedtext.end()
 
170
 
 
171
        if self.parent.prefs.docfolding:
 
172
            self.stc.EnsureVisible(self.stc.LineFromPosition(self.findpos))
 
173
 
 
174
        self.stc.EnsurePositionIsVisible(endpos)
 
175
 
 
176
        self.stc.GotoPos(self.findpos)
 
177
        self.stc.SetSelectionStart(self.findpos)
 
178
        self.stc.SetSelectionEnd(endpos)
 
179
        self.lastposition = endpos
 
180
 
 
181
        self.findpos = endpos
 
182
 
 
183
    def DoFindNext(self):
 
184
        if not self.findtext:
 
185
            return
 
186
        if not self.inselection:
 
187
            textlength = self.stc.GetTextLength()
 
188
            if textlength != self.docEnd:
 
189
                self.docEnd = textlength
 
190
                self.SetTargetRange(0, self.docEnd)
 
191
        self.findpos = self.stc.GetCurrentPos()
 
192
        if not self.RE:
 
193
            if self.rectanglefind:
 
194
                self.DoRectangleFind(self.findtext, self.findflags)
 
195
            else:
 
196
                self.DoFind(self.findtext, self.findflags)
 
197
        else:
 
198
            if self.rectanglefind:
 
199
                self.DoRERectangleFind(self.findtext, self.findflags)
 
200
            else:
 
201
                self.DoREFind(self.findtext, self.findflags)
 
202
        self.ScrollFewLinesAbove()
 
203
 
 
204
    def ScrollFewLinesAbove(self):
 
205
        top = self.parent.txtDocument.GetCurrentLine() - (self.parent.txtDocument.LinesOnScreen() - 5)
 
206
        lastline = self.parent.txtDocument.GetFirstVisibleLine() + self.parent.txtDocument.LinesOnScreen()
 
207
        if self.parent.txtDocument.GetCurrentLine() > (lastline - 5):
 
208
            self.parent.txtDocument.ScrollToLine(top)
 
209
 
 
210
    def ScrollFewLinesBelow(self):
 
211
        top = self.parent.txtDocument.GetCurrentLine() - 5
 
212
        firstline = self.parent.txtDocument.GetFirstVisibleLine()
 
213
        if self.parent.txtDocument.GetCurrentLine() < (firstline + 5):
 
214
            self.parent.txtDocument.ScrollToLine(top)
 
215
 
 
216
 
 
217
    def DoFindPrevious(self):
 
218
        if not self.findtext:
 
219
            return
 
220
        if not self.inselection:
 
221
            textlength = self.stc.GetTextLength()
 
222
            if textlength != self.docEnd:
 
223
                self.docEnd = textlength
 
224
                self.SetTargetRange(0, self.docEnd)
 
225
        self.findpos = self.stc.GetCurrentPos()
 
226
        if not self.RE:
 
227
            if (self.findpos == self.lastposition) and not self.rectanglefind:
 
228
                self.findpos = self.findpos - len(self.findtext) - 1
 
229
                self.stc.GotoPos(self.findpos)
 
230
            elif self.rectanglefind and (self.lastposition == -1) and (not self.backwards):
 
231
                self.stc.GotoPos(self.findpos)
 
232
            if self.rectanglefind:
 
233
                self.DoRectangleFind(self.findtext, self.findflags, True)
 
234
            else:
 
235
                self.DoFind(self.findtext, self.findflags, True)
 
236
            self.ScrollFewLinesBelow()
 
237
        else:
 
238
            drScrolledMessageDialog.ShowMessage(self.parent, 'Find Previous Not Possible:\nRegular Expressions Are On.', 'DrPython Find')
 
239
 
 
240
    def DoRectangleFind(self, findtext, matchcase, backwards=False):
 
241
        self.RE = 0
 
242
        self.rectanglefind = 1
 
243
        doclength = self.stc.GetLength()
 
244
        lenlines = len(self.Lines)
 
245
 
 
246
        if matchcase:
 
247
            self.findtext = findtext
 
248
        else:
 
249
            self.findtext = findtext.lower()
 
250
 
 
251
        prev = self.findpos
 
252
 
 
253
        if self.backwards != backwards:
 
254
            self.backwards = backwards
 
255
            self.findpos = self.stc.GetCurrentPos()
 
256
 
 
257
        endpos = self.targetEnd
 
258
 
 
259
        lineArrayPosition = self.getArrayPosition(self.findpos)
 
260
        if lineArrayPosition == -1:
 
261
            self.findpos = self.findpos - 1
 
262
            lineArrayPosition = self.getArrayPosition(self.findpos - 1)
 
263
            if lineArrayPosition == -1:
 
264
                self.findpos = -1
 
265
            else:
 
266
                relative_findpos = self.positions[lineArrayPosition].index(self.findpos) + 1
 
267
        else:
 
268
            relative_findpos = self.positions[lineArrayPosition].index(self.findpos)
 
269
 
 
270
        if self.findpos > -1:
 
271
            self.findpos = self.findInArray(lineArrayPosition, relative_findpos)
 
272
 
 
273
        if self.findpos == -1:
 
274
            if self.backwards:
 
275
                notFound = self.findInArray(0, self.positions[lenlines-1][len(self.positions[lenlines-1])-1]) == -1
 
276
            else:
 
277
                notFound = self.findInArray(0, 0) == -1
 
278
            if notFound:
 
279
                drScrolledMessageDialog.ShowMessage(self.parent, ('Search string "' + findtext + '" not found.'), "DrPython Find")
 
280
                return
 
281
            if ((self.findpos >= doclength) or (self.findpos < 0)) and (doclength > 0):
 
282
                self.lastposition = -1
 
283
                if self.backwards:
 
284
                    msg = 'Start of document reached: "' + findtext + '".\nStart again from the end?'
 
285
                    self.findpos = self.targetEnd
 
286
                else:
 
287
                    msg = 'End of document reached: "' + findtext + '".\nStart again from the beginning?'
 
288
                    self.findpos = self.targetStart
 
289
                if self.parent.prefs.findreplaceautowrap:
 
290
                    answer = wx.OK
 
291
                else:
 
292
                    answer = wx.MessageBox(msg, "DrPython Find", wx.OK | wx.CANCEL | wx.ICON_QUESTION)
 
293
                if answer == wx.OK:
 
294
                    self.stc.GotoPos(self.findpos)
 
295
                    if self.backwards:
 
296
                        self.DoFindPrevious()
 
297
                    else:
 
298
                        self.DoFindNext()
 
299
                else:
 
300
                    self.stc.GotoPos(prev)
 
301
                return
 
302
 
 
303
        if self.parent.prefs.docfolding:
 
304
            self.stc.EnsureVisible(self.stc.LineFromPosition(self.findpos))
 
305
 
 
306
        endpos = self.findpos + len(findtext)
 
307
 
 
308
        self.stc.EnsurePositionIsVisible(endpos)
 
309
        self.stc.GotoPos(self.findpos)
 
310
        self.stc.SetSelectionStart(self.findpos)
 
311
        self.stc.SetSelectionEnd(endpos)
 
312
        self.lastposition = self.findpos + len(findtext)
 
313
 
 
314
    def DoRERectangleFind(self, findtext, matchcase):
 
315
        self.RE = 1
 
316
        self.rectanglefind = 1
 
317
        doclength = self.stc.GetLength()
 
318
 
 
319
        self.findtext = findtext
 
320
        self.findflags = matchcase
 
321
 
 
322
        prev = self.findpos
 
323
 
 
324
        case = 0
 
325
        if not matchcase:
 
326
            case = re.IGNORECASE
 
327
 
 
328
        try:
 
329
            regularexpression = re.compile(findtext, case | re.MULTILINE)
 
330
        except:
 
331
            drScrolledMessageDialog.ShowMessage(self.parent, 'Regular Expression Error', "DrPython Find")
 
332
            return
 
333
 
 
334
        endpos = self.targetEnd
 
335
        if (self.findpos >= doclength) or (self.findpos < 0):
 
336
            self.findpos = 0
 
337
 
 
338
        lineArrayPosition = self.getArrayPosition(self.findpos)
 
339
        if lineArrayPosition == -1:
 
340
            self.findpos = self.findpos - 1
 
341
            lineArrayPosition = self.getArrayPosition(self.findpos - 1)
 
342
            if lineArrayPosition == -1:
 
343
                self.findpos = -1
 
344
            else:
 
345
                relative_findpos = self.positions[lineArrayPosition].index(self.findpos) + 1
 
346
        else:
 
347
            relative_findpos = self.positions[lineArrayPosition].index(self.findpos)
 
348
 
 
349
        if self.findpos > -1:
 
350
            matchedtext, newArrayPosition = self.searchInArray(regularexpression, lineArrayPosition, relative_findpos)
 
351
        else:
 
352
            matchedtext = None
 
353
 
 
354
        if matchedtext is None:
 
355
            testforexist, nap = self.searchInArray(regularexpression, 0, 0)
 
356
            if testforexist is None:
 
357
                drScrolledMessageDialog.ShowMessage(self.parent, ('Regular expression "' + findtext + '" not found.'), "DrPython Find")
 
358
                return
 
359
            self.lastposition = -1
 
360
            if prev > self.targetStart:
 
361
                self.findpos = self.targetStart
 
362
                if self.parent.prefs.findreplaceautowrap:
 
363
                    answer = wx.OK
 
364
                else:
 
365
                    answer = wx.MessageBox('End of document reached: "' + findtext + '".\nStart again from the beginning?', "DrPython Find", wx.OK | wx.CANCEL | wx.ICON_QUESTION)
 
366
                if answer == wx.OK:
 
367
                    self.stc.GotoPos(self.findpos)
 
368
                    self.DoFindNext()
 
369
                else:
 
370
                    self.stc.GotoPos(prev)
 
371
                return
 
372
 
 
373
        relative_findpos = matchedtext.start()
 
374
 
 
375
        self.findpos = self.positions[newArrayPosition][relative_findpos]
 
376
 
 
377
        endpos = self.findpos + (matchedtext.end() - matchedtext.start())
 
378
 
 
379
        if self.parent.prefs.docfolding:
 
380
            self.stc.EnsureVisible(self.stc.LineFromPosition(self.findpos))
 
381
 
 
382
        self.stc.EnsurePositionIsVisible(endpos)
 
383
 
 
384
        self.stc.GotoPos(self.findpos)
 
385
        self.stc.SetSelectionStart(self.findpos)
 
386
        self.stc.SetSelectionEnd(endpos)
 
387
        self.lastposition = endpos
 
388
 
 
389
        self.findpos = endpos
 
390
 
 
391
    def findInArray(self, arrayposition, position):
 
392
        if self.backwards:
 
393
            r = self.Lines[arrayposition][:position].rfind(self.findtext)
 
394
            if r == -1:
 
395
                arrayposition -= 1
 
396
                while arrayposition > -1:
 
397
                    r = self.Lines[arrayposition].rfind(self.findtext)
 
398
                    if r == -1:
 
399
                        arrayposition -= 1
 
400
                    else:
 
401
                        return self.positions[arrayposition][r]
 
402
            else:
 
403
                return self.positions[arrayposition][r]
 
404
        else:
 
405
            l = len(self.Lines)
 
406
            r = self.Lines[arrayposition][position:].find(self.findtext)
 
407
            if r == -1:
 
408
                arrayposition += 1
 
409
                while arrayposition < l:
 
410
                    r = self.Lines[arrayposition].find(self.findtext)
 
411
                    if r == -1:
 
412
                        arrayposition += 1
 
413
                    else:
 
414
                        return self.positions[arrayposition][r]
 
415
            else:
 
416
                return self.positions[arrayposition][r]
 
417
        return -1
 
418
 
 
419
    def getArrayPosition(self, position):
 
420
        x = 0
 
421
        for posArray in self.positions:
 
422
            if position in posArray:
 
423
                return x
 
424
            x += 1
 
425
        return -1
 
426
 
 
427
    def GetFindPos(self):
 
428
        return self.findpos
 
429
 
 
430
    def GetFindText(self):
 
431
        return self.findtext
 
432
 
 
433
    def RectangleReplaceAll(self, findtext, replacetext, matchcase):
 
434
        targetText = self.stc.GetSelectedText()
 
435
 
 
436
        if not matchcase:
 
437
            targetText = targetText.lower()
 
438
 
 
439
        eolchar = self.stc.GetEndOfLineCharacter()
 
440
 
 
441
        lines = targetText.strip().split(eolchar)
 
442
 
 
443
        c = self.stc.GetColumn(self.targetStart)
 
444
 
 
445
        linenumber = self.stc.LineFromPosition(self.targetStart)
 
446
 
 
447
        lenline = len(lines[0])
 
448
 
 
449
        x = 0
 
450
 
 
451
        for line in lines:
 
452
            position_of_first_character = c + self.stc.PositionFromLine(linenumber)
 
453
            p = line.find(findtext)
 
454
            if p > -1:
 
455
                line = line.replace(findtext, replacetext)
 
456
                self.stc.SetTargetStart(position_of_first_character)
 
457
                self.stc.SetTargetEnd(position_of_first_character+lenline)
 
458
                self.stc.ReplaceTarget(line)
 
459
                x = x + 1
 
460
            linenumber = linenumber + 1
 
461
 
 
462
        return x
 
463
 
 
464
    def RectangleREReplaceAll(self, findtext, replacetext, matchcase):
 
465
        case = 0
 
466
        if not matchcase:
 
467
            case = re.IGNORECASE
 
468
 
 
469
        try:
 
470
            regularexpression = re.compile(findtext, case | re.MULTILINE)
 
471
        except:
 
472
            drScrolledMessageDialog.ShowMessage(self.parent, 'Regular Expression Error', "DrPython Replace")
 
473
            return
 
474
 
 
475
        targetText = self.stc.GetSelectedText()
 
476
 
 
477
        if not matchcase:
 
478
            targetText = targetText.lower()
 
479
 
 
480
        eolchar = self.stc.GetEndOfLineCharacter()
 
481
 
 
482
        lines = targetText.strip().split(eolchar)
 
483
 
 
484
        c = self.stc.GetColumn(self.targetStart)
 
485
 
 
486
        linenumber = self.stc.LineFromPosition(self.targetStart)
 
487
 
 
488
        lenline = len(lines[0])
 
489
 
 
490
        y = 0
 
491
 
 
492
        for line in lines:
 
493
            #You need to update the position(do the replace) during the loop.
 
494
            position_of_first_character = c + self.stc.PositionFromLine(linenumber)
 
495
            line, x = regularexpression.subn(replacetext, line)
 
496
            y = y + x
 
497
            self.stc.SetTargetStart(position_of_first_character)
 
498
            self.stc.SetTargetEnd(position_of_first_character+lenline)
 
499
            self.stc.ReplaceTarget(line)
 
500
            linenumber = linenumber + 1
 
501
 
 
502
        return y
 
503
 
 
504
    def ReplaceAll(self, findtext, replacetext, flags, prompt = 0):
 
505
        p = self.stc.FindText(self.findpos, self.targetEnd, findtext, flags)
 
506
        diff = len(replacetext) - len(findtext)
 
507
        x = 0
 
508
        notfirst = 0
 
509
        favpos = wx.Point(5, 5)
 
510
        while p != -1:
 
511
            if self.parent.prefs.docfolding:
 
512
                self.stc.EnsureVisible(self.stc.LineFromPosition(p))
 
513
            self.stc.GotoPos(p)
 
514
            self.stc.EnsureCaretVisible()
 
515
            self.stc.SetTargetStart(p)
 
516
            self.stc.SetTargetEnd(p + len(findtext))
 
517
            if prompt:
 
518
                self.stc.SetSelection(p, (p + len(findtext)))
 
519
                d = wx.SingleChoiceDialog(self.parent, ("Found \"" + findtext + "\" at Line: " \
 
520
                + str(self.stc.LineFromPosition(p)+1) + \
 
521
                " Col: " + str(self.stc.GetColumn(p))
 
522
                + "\n(Hit Cancel to Stop)"), "Replace", ["Replace", "Skip"], wx.CHOICEDLG_STYLE)
 
523
                if notfirst:
 
524
                    d.Move(favpos)
 
525
                else:
 
526
                    notfirst = 1
 
527
                answer = d.ShowModal()
 
528
                favpos = d.GetPosition()
 
529
                d.Destroy()
 
530
                if answer == wx.ID_OK:
 
531
                    if d.GetStringSelection() == "Replace":
 
532
                        self.stc.ReplaceTarget(replacetext)
 
533
                        self.targetEnd = self.targetEnd + diff
 
534
                    else:
 
535
                        x = x - 1
 
536
                        p = p + 1
 
537
                    p = self.stc.FindText((p + len(replacetext)), self.targetEnd, findtext, flags)
 
538
                else:
 
539
                    p = -1
 
540
                    x = x - 1
 
541
            else:
 
542
                self.stc.ReplaceTarget(replacetext)
 
543
                self.targetEnd = self.targetEnd + diff
 
544
                p = self.stc.FindText((p + len(replacetext)), self.targetEnd, findtext, flags)
 
545
            x = x + 1
 
546
        return x
 
547
 
 
548
    def REReplaceAll(self, findtext, replacetext, matchcase, prompt = 0):
 
549
        case = 0
 
550
        if not matchcase:
 
551
            case = re.IGNORECASE
 
552
 
 
553
        try:
 
554
            regularexpression = re.compile(findtext, case | re.MULTILINE)
 
555
        except:
 
556
            drScrolledMessageDialog.ShowMessage(self.parent, 'Regular Expression Error', "DrPython Replace")
 
557
            return
 
558
 
 
559
        oldtext = self.stc.GetText()
 
560
        if not prompt:
 
561
            newtext, x = regularexpression.subn(replacetext, oldtext[self.targetStart:self.targetEnd])
 
562
 
 
563
            self.stc.SetText(oldtext[0:self.targetStart] + newtext + oldtext[self.targetEnd:])
 
564
        else:
 
565
            matchedtext = regularexpression.search(self.stc.GetText()[self.findpos:self.targetEnd])
 
566
 
 
567
            diff = len(replacetext) - len(findtext)
 
568
 
 
569
            x = 0
 
570
            notfirst = 0
 
571
 
 
572
            favpos = wx.Point(5, 5)
 
573
            while matchedtext is not None:
 
574
 
 
575
                oldpos = self.findpos
 
576
                self.findpos = oldpos + matchedtext.start()
 
577
                endpos = oldpos + matchedtext.end()
 
578
 
 
579
                if self.parent.prefs.docfolding:
 
580
                    self.stc.EnsureVisible(self.stc.LineFromPosition(self.findpos))
 
581
                self.stc.GotoPos(self.findpos)
 
582
                self.stc.EnsureCaretVisible()
 
583
                self.stc.SetSelectionStart(self.findpos)
 
584
                self.stc.SetSelectionEnd(endpos)
 
585
                self.stc.SetTargetStart(self.findpos)
 
586
                self.stc.SetTargetEnd(endpos)
 
587
 
 
588
                d = wx.SingleChoiceDialog(self.parent, ("Found \"" + findtext + "\" at Line: " \
 
589
                + str(self.stc.LineFromPosition(self.findpos)+1) + \
 
590
                " Col: " + str(self.stc.GetColumn(self.findpos)) + \
 
591
                "\n(Hit Cancel to Stop)"), "Replace", ["Replace", "Skip"], wx.CHOICEDLG_STYLE)
 
592
 
 
593
                if notfirst:
 
594
                    d.Move(favpos)
 
595
                else:
 
596
                    notfirst = 1
 
597
                answer = d.ShowModal()
 
598
                favpos = d.GetPosition()
 
599
                d.Destroy()
 
600
                if answer == wx.ID_OK:
 
601
                    if d.GetStringSelection() == "Replace":
 
602
                        self.stc.ReplaceTarget(replacetext)
 
603
                        self.findpos = self.findpos + len(replacetext)
 
604
                        self.targetEnd = self.targetEnd + diff
 
605
                    else:
 
606
                        self.findpos = endpos
 
607
                        x = x - 1
 
608
                    x = x + 1
 
609
 
 
610
                    matchedtext = regularexpression.search(self.stc.GetText()[self.findpos:self.targetEnd])
 
611
                else:
 
612
                    matchedtext = None
 
613
 
 
614
        return x
 
615
 
 
616
    def reset(self):
 
617
        self.inselection = 0
 
618
        self.findflags = 0
 
619
        self.findpos = 0
 
620
        self.lastposition = 0
 
621
        self.backwards = 0
 
622
        self.findtext = ""
 
623
        self.targetStart = 0
 
624
        self.targetEnd = 0
 
625
        self.docEnd = 0
 
626
        self.RE = 0
 
627
        self.rectanglefind = 0
 
628
 
 
629
    def searchInArray(self, regularexpression, arrayposition, position):
 
630
        l = len(self.Lines)
 
631
        match = regularexpression.search(self.Lines[arrayposition][position:])
 
632
        if match is None:
 
633
            arrayposition += 1
 
634
            while arrayposition < l:
 
635
                match = regularexpression.search(self.Lines[arrayposition])
 
636
                if match is None:
 
637
                    arrayposition += 1
 
638
                else:
 
639
                    return match, arrayposition
 
640
        return match, arrayposition
 
641
 
 
642
    def SetFindPos(self, findpos):
 
643
        self.findpos = findpos
 
644
 
 
645
    def SetFindText(self, findtext):
 
646
        self.findtext = findtext
 
647
 
 
648
    def SetTargetPositions(self, matchcase):
 
649
        self.targetText = self.stc.GetSelectedText()
 
650
 
 
651
        self.findflags = matchcase
 
652
 
 
653
        if not matchcase:
 
654
            self.targetText = self.targetText.lower()
 
655
 
 
656
        eolchar = self.stc.GetEndOfLineCharacter()
 
657
 
 
658
        self.Lines = self.targetText.strip().split(eolchar)
 
659
 
 
660
        self.targetText = self.targetText.replace(eolchar, '')
 
661
 
 
662
        c = self.stc.GetColumn(self.targetStart)
 
663
 
 
664
        linenumber = self.stc.LineFromPosition(self.targetStart)
 
665
 
 
666
        lenline = len(self.Lines[0])
 
667
 
 
668
        self.positions = []
 
669
 
 
670
        for line in self.Lines:
 
671
            position_of_first_character = c + self.stc.PositionFromLine(linenumber)
 
672
            self.positions.append(range(position_of_first_character, position_of_first_character+lenline))
 
673
            linenumber = linenumber + 1
 
674
 
 
675
    def SetTargetRange(self, start, end, backwards = 0):
 
676
        self.docEnd = self.stc.GetTextLength()
 
677
        self.inselection = (start > 0) | (end < self.docEnd)
 
678
 
 
679
        self.findpos = start
 
680
        if backwards:
 
681
            self.findpos = end
 
682
        self.targetStart = start
 
683
        self.targetEnd = end
674
684
 
675
685
class drFindTextCtrl(wx.ComboBox):
676
 
        def __init__(self, parent, id, value, pos, size, returnfunction = None, InFiles = False):
677
 
                wx.ComboBox.__init__(self, parent, id, value, pos, size)
678
 
                
679
 
                #This is a workaround for a bug in how wx.TextCtrl handles
680
 
                #carriage returns on windows.
681
 
                self.parent = parent
682
 
                if InFiles:
683
 
                        self.ancestor = parent.parent.parent
684
 
                else:
685
 
                        self.ancestor = parent.parent
686
 
                if self.ancestor.prefs.platform_is_windows:
687
 
                        self.doReplace = True
688
 
                        self.cr = chr(5)
689
 
                else:
690
 
                        self.doReplace = False
691
 
                        self.cr = '\r'
692
 
                                                                
693
 
                self.ID_CHAR_BASE = 20
694
 
                
695
 
                self.ID_MENU_BASE = 50
696
 
                
697
 
                self.ID_HISTORY_BASE = 420
698
 
                
699
 
                self.returnfunc = returnfunction
700
 
                if self.returnfunc is None:
701
 
                        self.returnfunc = self.parent.OnbtnFind
702
 
                                
703
 
                self.Bind(wx.EVT_CHAR, self.OnChar)
704
 
                                
705
 
                self.Bind(wx.EVT_RIGHT_DOWN, self.OnPopUp)
706
 
                
707
 
                #wxPython Bug Work-Around
708
 
                if self.ancestor.prefs.platform_is_windows:
709
 
                        self.insertionpoint = -1
710
 
                        self.Bind(wx.EVT_SET_FOCUS, self.OnFocus)
711
 
                        #franz07/19: catch kill focus
712
 
                        self.Bind(wx.EVT_KILL_FOCUS, self.OnKillFocus)
713
 
                        #endfranz07/19
714
 
                
715
 
        def AppendToHistory(self, targetList):
716
 
                text = self.GetText()
717
 
                try:
718
 
                        i = targetList.index(text)
719
 
                        targetList.pop(i)
720
 
                except:
721
 
                        pass
722
 
                
723
 
                targetList.append(text)
724
 
        
725
 
        def GetText(self):
726
 
                text = self.GetValue()
727
 
                if self.doReplace:
728
 
                        return text.replace(chr(5), '\r')
729
 
                else:
730
 
                        return text
731
 
                
732
 
        def OnChar(self, event):
733
 
                if (event.GetKeyCode() == wx.WXK_ESCAPE):
734
 
                        self.parent.OnbtnCancel(event)
735
 
                elif (event.GetKeyCode() == wx.WXK_RETURN):
736
 
                        self.returnfunc(event)
737
 
                else:
738
 
                        event.Skip()
739
 
 
740
 
        def OnFocus(self, event):
741
 
                self.insertionpoint = -1
742
 
                event.Skip()
743
 
 
744
 
        #franz07/19: do not steal focus
745
 
        #drpython: removed "pass", replaced with function code below.
746
 
        def OnKillFocus(self, event):
747
 
                self.insertionpoint = self.GetInsertionPoint()
748
 
                event.Skip()
749
 
        
750
 
        #franz07/19
751
 
                        
752
 
        def OnPopUp(self, event):
753
 
                self.PopUp(event.GetPosition())
754
 
                
755
 
        def OnPopUpMenu(self, event):
756
 
                eid = event.GetId()
757
 
                                
758
 
                pos = self.GetInsertionPoint()
759
 
                #wxPython Bug Work-Around
760
 
                if self.ancestor.prefs.platform_is_windows:
761
 
                        if self.insertionpoint > -1:
762
 
                                pos = self.insertionpoint
763
 
                text = self.GetValue()
764
 
                
765
 
                if eid == self.ID_CHAR_BASE:
766
 
                        self.SetValue(text[:pos] + '\t' + text[pos:])
767
 
                        self.SetInsertionPoint(pos+1)
768
 
                elif eid == self.ID_CHAR_BASE+1:
769
 
                        self.SetValue(text[:pos] + '\n' + text[pos:])
770
 
                        self.SetInsertionPoint(pos+1)
771
 
                elif eid == self.ID_CHAR_BASE+2:
772
 
                        self.SetValue(text[:pos] + self.cr + text[pos:])
773
 
                        self.SetInsertionPoint(pos+1)
774
 
                elif eid == self.ID_MENU_BASE+1:
775
 
                        self.Cut()
776
 
                elif eid == self.ID_MENU_BASE+2:
777
 
                        self.Copy()
778
 
                elif eid == self.ID_MENU_BASE+3:
779
 
                        self.Paste()
780
 
                elif eid == self.ID_MENU_BASE+4:
781
 
                        f, to = self.GetSelection()
782
 
                        self.Remove(f, to)
783
 
                elif eid == self.ID_MENU_BASE+5:
784
 
                        self.SetValue("")
785
 
                        
786
 
                self.SetFocus()
787
 
        
788
 
        def PopUp(self, pos):
789
 
                self.PopUpMenu = wx.Menu()
790
 
                
791
 
                self.CharMenu = wx.Menu()
792
 
                
793
 
                self.CharMenu.Append(self.ID_CHAR_BASE, "Tab (\\t)")
794
 
                self.CharMenu.Append(self.ID_CHAR_BASE+1, "Newline (\\n)")
795
 
                self.CharMenu.Append(self.ID_CHAR_BASE+2, "Carraige Return (\\r)")
796
 
                
797
 
                self.PopUpMenu.Append(self.ID_MENU_BASE+5, "Clear Text")
798
 
                                
799
 
                self.PopUpMenu.AppendSeparator()
800
 
                
801
 
                self.PopUpMenu.AppendMenu(self.ID_MENU_BASE, "Insert Special Character", self.CharMenu)
802
 
                
803
 
                self.PopUpMenu.AppendSeparator()
804
 
                
805
 
                self.PopUpMenu.Append(self.ID_MENU_BASE+1, "Cut")
806
 
                self.PopUpMenu.Append(self.ID_MENU_BASE+2, "Copy")
807
 
                self.PopUpMenu.Append(self.ID_MENU_BASE+3, "Paste")
808
 
                self.PopUpMenu.Append(self.ID_MENU_BASE+4, "Delete")
809
 
                
810
 
                x = 0
811
 
                y = 0
812
 
                while x < 6:
813
 
                        if y < 3:
814
 
                                self.Bind(wx.EVT_MENU, self.OnPopUpMenu, id=self.ID_CHAR_BASE+y)
815
 
                                y = y + 1
816
 
                        self.Bind(wx.EVT_MENU, self.OnPopUpMenu, id=self.ID_MENU_BASE+x)
817
 
                        x = x + 1
818
 
                
819
 
                self.PopupMenu(self.PopUpMenu, pos)
820
 
                
821
 
                self.PopUpMenu.Destroy()
822
 
                        
823
 
        def SetHistory(self, history):
824
 
                if self.GetCount() > 0:
825
 
                        self.Clear()
826
 
                l = len(history)
827
 
                self.Append('')
828
 
                x = l - 1
829
 
                while x > -1:
830
 
                        self.Append(history[x])
831
 
                        x = x - 1
832
 
                if l > 0:
833
 
                        self.SetMark(0, len(history[l-1]))
834
 
                
 
686
    def __init__(self, parent, id, value, pos, size, returnfunction = None, InFiles = False):
 
687
        wx.ComboBox.__init__(self, parent, id, value, pos, size)
 
688
 
 
689
        #This is a workaround for a bug in how wx.TextCtrl handles
 
690
        #carriage returns on windows.
 
691
        self.parent = parent
 
692
        if InFiles:
 
693
            self.ancestor = parent.parent.parent
 
694
        else:
 
695
            self.ancestor = parent.parent
 
696
        if self.ancestor.PLATFORM_IS_WIN:
 
697
            self.doReplace = True
 
698
            self.cr = chr(5)
 
699
        else:
 
700
            self.doReplace = False
 
701
            self.cr = '\r'
 
702
 
 
703
        self.ID_CHAR_BASE = 20
 
704
 
 
705
        self.ID_MENU_BASE = 50
 
706
 
 
707
        self.ID_HISTORY_BASE = 420
 
708
 
 
709
        self.returnfunc = returnfunction
 
710
        if self.returnfunc is None:
 
711
            self.returnfunc = self.parent.OnbtnFind
 
712
 
 
713
        self.Bind(wx.EVT_CHAR, self.OnChar)
 
714
 
 
715
        self.Bind(wx.EVT_RIGHT_DOWN, self.OnPopUp)
 
716
 
 
717
        #wxPython Bug Work-Around
 
718
        if self.ancestor.PLATFORM_IS_WIN:
 
719
            self.insertionpoint = -1
 
720
            self.Bind(wx.EVT_SET_FOCUS, self.OnFocus)
 
721
            #franz07/19: catch kill focus
 
722
            self.Bind(wx.EVT_KILL_FOCUS, self.OnKillFocus)
 
723
            #endfranz07/19
 
724
 
 
725
    def AppendToHistory(self, targetList):
 
726
        text = self.GetText()
 
727
        try:
 
728
            i = targetList.index(text)
 
729
            targetList.pop(i)
 
730
        except:
 
731
            pass
 
732
 
 
733
        targetList.append(text)
 
734
 
 
735
    def GetText(self):
 
736
        text = self.GetValue()
 
737
        if self.doReplace:
 
738
            return text.replace(chr(5), '\r')
 
739
        else:
 
740
            return text
 
741
 
 
742
    def OnChar(self, event):
 
743
        if event.GetKeyCode() == wx.WXK_ESCAPE:
 
744
            self.parent.OnbtnCancel(event)
 
745
        elif event.GetKeyCode() == wx.WXK_RETURN:
 
746
            self.returnfunc(event)
 
747
        else:
 
748
            event.Skip()
 
749
 
 
750
    def OnFocus(self, event):
 
751
        self.insertionpoint = -1
 
752
        event.Skip()
 
753
 
 
754
    #franz07/19: do not steal focus
 
755
    #drpython: removed "pass", replaced with function code below.
 
756
    def OnKillFocus(self, event):
 
757
        self.insertionpoint = self.GetInsertionPoint()
 
758
        event.Skip()
 
759
 
 
760
    #franz07/19
 
761
 
 
762
    def OnPopUp(self, event):
 
763
        self.PopUp(event.GetPosition())
 
764
 
 
765
    def OnPopUpMenu(self, event):
 
766
        eid = event.GetId()
 
767
 
 
768
        pos = self.GetInsertionPoint()
 
769
        #wxPython Bug Work-Around
 
770
        if self.ancestor.PLATFORM_IS_WIN:
 
771
            if self.insertionpoint > -1:
 
772
                pos = self.insertionpoint
 
773
        text = self.GetValue()
 
774
 
 
775
        if eid == self.ID_CHAR_BASE:
 
776
            self.SetValue(text[:pos] + '\t' + text[pos:])
 
777
            self.SetInsertionPoint(pos+1)
 
778
        elif eid == self.ID_CHAR_BASE+1:
 
779
            self.SetValue(text[:pos] + '\n' + text[pos:])
 
780
            self.SetInsertionPoint(pos+1)
 
781
        elif eid == self.ID_CHAR_BASE+2:
 
782
            self.SetValue(text[:pos] + self.cr + text[pos:])
 
783
            self.SetInsertionPoint(pos+1)
 
784
        elif eid == self.ID_MENU_BASE+1:
 
785
            self.Cut()
 
786
        elif eid == self.ID_MENU_BASE+2:
 
787
            self.Copy()
 
788
        elif eid == self.ID_MENU_BASE+3:
 
789
            self.Paste()
 
790
        elif eid == self.ID_MENU_BASE+4:
 
791
            f, to = self.GetSelection()
 
792
            self.Remove(f, to)
 
793
        elif eid == self.ID_MENU_BASE+5:
 
794
            self.SetValue("")
 
795
 
 
796
        self.SetFocus()
 
797
 
 
798
    def PopUp(self, pos):
 
799
        self.PopUpMenu = wx.Menu()
 
800
 
 
801
        self.CharMenu = wx.Menu()
 
802
 
 
803
        self.CharMenu.Append(self.ID_CHAR_BASE, "Tab (\\t)")
 
804
        self.CharMenu.Append(self.ID_CHAR_BASE+1, "Newline (\\n)")
 
805
        self.CharMenu.Append(self.ID_CHAR_BASE+2, "Carraige Return (\\r)")
 
806
 
 
807
        self.PopUpMenu.Append(self.ID_MENU_BASE+5, "Clear Text")
 
808
 
 
809
        self.PopUpMenu.AppendSeparator()
 
810
 
 
811
        self.PopUpMenu.AppendMenu(self.ID_MENU_BASE, "Insert Special Character", self.CharMenu)
 
812
 
 
813
        self.PopUpMenu.AppendSeparator()
 
814
 
 
815
        self.PopUpMenu.Append(self.ID_MENU_BASE+1, "Cut")
 
816
        self.PopUpMenu.Append(self.ID_MENU_BASE+2, "Copy")
 
817
        self.PopUpMenu.Append(self.ID_MENU_BASE+3, "Paste")
 
818
        self.PopUpMenu.Append(self.ID_MENU_BASE+4, "Delete")
 
819
 
 
820
        x = 0
 
821
        y = 0
 
822
        while x < 6:
 
823
            if y < 3:
 
824
                self.Bind(wx.EVT_MENU, self.OnPopUpMenu, id=self.ID_CHAR_BASE+y)
 
825
                y = y + 1
 
826
            self.Bind(wx.EVT_MENU, self.OnPopUpMenu, id=self.ID_MENU_BASE+x)
 
827
            x = x + 1
 
828
 
 
829
        self.PopupMenu(self.PopUpMenu, pos)
 
830
 
 
831
        self.PopUpMenu.Destroy()
 
832
 
 
833
    def SetHistory(self, history):
 
834
        if self.GetCount() > 0:
 
835
            self.Clear()
 
836
        l = len(history)
 
837
        self.Append('')
 
838
        x = l - 1
 
839
        while x > -1:
 
840
            self.Append(history[x])
 
841
            x = x - 1
 
842
        if l > 0:
 
843
            self.SetMark(0, len(history[l-1]))
 
844
 
835
845
class drFindReplaceDialog(wx.Dialog):
836
 
        def __init__(self, parent, id, title, stc, IsReplace = 0):
837
 
                wx.Dialog.__init__(self, parent, id, title, wx.DefaultPosition, wx.Size(-1, -1), wx.DEFAULT_DIALOG_STYLE | wx.MAXIMIZE_BOX | wx.THICK_FRAME | wx.RESIZE_BORDER)
838
 
                
839
 
                self.ID_FIND = 1001
840
 
                self.ID_CANCEL = 1002
841
 
                
842
 
                self.ID_CHK_REGEX = 1010
843
 
                self.ID_CREATERE = 1011
844
 
                
845
 
                self.ID_SEARCH_TXT = 1012
846
 
                
847
 
                self.ID_BTNSF = 98
848
 
                self.ID_BTNRW = 99
849
 
                
850
 
                self.parent = parent
851
 
                
852
 
                self.stc = stc
853
 
                                
854
 
                self.theSizer = wx.FlexGridSizer(8, 3, 5, 10)
855
 
 
856
 
                self.IsReplace = IsReplace
857
 
 
858
 
                #Size Buffer
859
 
                self.theSizer.Add(wx.StaticText(self, -1, "    "), 1, wx.SHAPED)
860
 
                self.theSizer.Add(wx.StaticText(self, -1, "    "), 1, wx.SHAPED)
861
 
                self.theSizer.Add(wx.StaticText(self, -1, "    "), 1, wx.SHAPED)
862
 
 
863
 
                self.theSizer.Add(wx.StaticText(self, -1, "    "), 1, wx.SHAPED)
864
 
                self.theSizer.Add(wx.StaticText(self, -1, "Search For: "), 1, wx.SHAPED)
865
 
                self.theSizer.Add(wx.StaticText(self, -1, "    "), 1, wx.SHAPED)
866
 
                                
867
 
                self.txtSearchFor = drFindTextCtrl(self, self.ID_SEARCH_TXT, "", wx.DefaultPosition, wx.Size(250, -1))
868
 
                self.btnPopUpSearchFor = wx.Button(self, self.ID_BTNSF, " Menu ")
869
 
                self.theSizer.Add(wx.StaticText(self, -1, "    "), 1, wx.SHAPED)
870
 
                self.theSizer.Add(self.txtSearchFor, 1, wx.SHAPED)
871
 
                self.theSizer.Add(self.btnPopUpSearchFor, 1, wx.SHAPED)
872
 
                
873
 
                self.txtSearchFor.SetHistory(parent.FindHistory)
874
 
                                
875
 
                if (IsReplace):
876
 
                        #self.SetSize(wx.Size(400, 345))
877
 
                        self.txtReplaceWith = drFindTextCtrl(self, -1, "", wx.DefaultPosition, wx.Size(250, -1))
878
 
                        self.btnPopUpReplaceWith = wx.Button(self, self.ID_BTNRW, " Menu ")
879
 
                        self.txtReplaceWith.SetHistory(parent.ReplaceHistory)
880
 
                
881
 
                self.chkRegularExpression = wx.CheckBox(self, self.ID_CHK_REGEX, "RegularExpression")
882
 
                self.btnCreateRE = wx.Button(self, self.ID_CREATERE, " &Create ")
883
 
                self.chkMatchCase = wx.CheckBox(self, -1, "Match Case")
884
 
                self.chkFindBackwards = wx.CheckBox(self, -1, "Find Backwards")
885
 
                self.chkWholeWord = wx.CheckBox(self, -1, "Whole Word")
886
 
                self.chkInSelection = wx.CheckBox(self, -1, "In Selection")
887
 
                self.chkFromCursor = wx.CheckBox(self, -1, "From Cursor")
888
 
                
889
 
                #Prefs
890
 
                self.chkRegularExpression.SetValue(parent.prefs.findreplaceregularexpression)
891
 
                self.btnCreateRE.Enable(parent.prefs.findreplaceregularexpression)
892
 
                self.chkMatchCase.SetValue(parent.prefs.findreplacematchcase)
893
 
                self.chkFindBackwards.SetValue(parent.prefs.findreplacefindbackwards)
894
 
                self.chkWholeWord.SetValue(parent.prefs.findreplacewholeword)
895
 
                self.chkInSelection.SetValue(parent.prefs.findreplaceinselection)
896
 
                self.chkFromCursor.SetValue(parent.prefs.findreplacefromcursor)
897
 
                
898
 
                self.chkInSelection.Enable(len(parent.txtDocument.GetSelectedText()) > 0)
899
 
                
900
 
                if (IsReplace):
901
 
                        self.chkPromptOnReplace  = wx.CheckBox(self, -1, "Prompt on Replace")
902
 
                        self.theSizer.Add(wx.StaticText(self, -1, "    "), 1, wx.SHAPED)
903
 
                        self.theSizer.Add(wx.StaticText(self, -1, "Replace With: "), 1, wx.SHAPED)
904
 
                        self.theSizer.Add(wx.StaticText(self, -1, "    "), 1, wx.SHAPED)
905
 
                        
906
 
                        self.theSizer.Add(wx.StaticText(self, -1, "    "), 1, wx.SHAPED)
907
 
                        self.theSizer.Add(self.txtReplaceWith, 1 ,wx.SHAPED)
908
 
                        self.theSizer.Add(self.btnPopUpReplaceWith, 1, wx.SHAPED)
909
 
                                                
910
 
                        self.chkFromCursor.Disable()
911
 
                        self.chkFindBackwards.Disable()
912
 
                                                
913
 
                        #Prefs
914
 
                        self.chkPromptOnReplace.SetValue(parent.prefs.findreplacepromptonreplace)
915
 
                        
916
 
                        self.Bind(wx.EVT_BUTTON,  self.OnbtnPopUp, id=self.ID_BTNRW)
917
 
                
918
 
                #Size Buffer
919
 
                self.theSizer.Add(wx.StaticText(self, -1, "    "), 1, wx.SHAPED)
920
 
                self.theSizer.Add(wx.StaticText(self, -1, "    "), 1, wx.SHAPED)
921
 
                self.theSizer.Add(wx.StaticText(self, -1, "    "), 1, wx.SHAPED)
922
 
                                
923
 
                self.theSizer.Add(wx.StaticText(self, -1, "    "), 1, wx.SHAPED)
924
 
                self.theSizer.Add(self.chkRegularExpression, 1, wx.SHAPED)
925
 
                self.theSizer.Add(self.btnCreateRE, 1, wx.SHAPED)
926
 
                
927
 
                self.theSizer.Add(wx.StaticText(self, -1, "    "), 1, wx.SHAPED)
928
 
                self.theSizer.Add(self.chkMatchCase, 1, wx.SHAPED)
929
 
                self.theSizer.Add(self.chkFindBackwards, 1, wx.SHAPED)
930
 
                self.theSizer.Add(wx.StaticText(self, -1, "    "), 1, wx.SHAPED)
931
 
                self.theSizer.Add(self.chkWholeWord, 1, wx.SHAPED)
932
 
                self.theSizer.Add(self.chkInSelection, 1, wx.SHAPED)
933
 
                self.theSizer.Add(wx.StaticText(self, -1, "    "), 1, wx.SHAPED)
934
 
                self.theSizer.Add(self.chkFromCursor, 1, wx.SHAPED)
935
 
                if (IsReplace):
936
 
                        self.theSizer.Add(self.chkPromptOnReplace, 1, wx.SHAPED)
937
 
                else:
938
 
                        self.theSizer.Add(wx.StaticText(self, -1, "    "), 1, wx.SHAPED)
939
 
                self.theSizer.Add(wx.StaticText(self, -1, "    "), 1, wx.SHAPED)
940
 
                self.theSizer.Add(wx.StaticText(self, -1, "    "), 1, wx.SHAPED)
941
 
                self.theSizer.Add(wx.StaticText(self, -1, "    "), 1, wx.SHAPED)
942
 
                
943
 
                self.btnCancel = wx.Button(self, self.ID_CANCEL, "&Cancel")
944
 
                self.btnFind = wx.Button(self, self.ID_FIND, "&Ok")
945
 
                self.btnFind.Enable(False)
946
 
                
947
 
                self.theSizer.Add(wx.StaticText(self, -1, "    "), 1, wx.SHAPED)
948
 
                self.theSizer.Add(self.btnCancel, 1, wx.SHAPED)
949
 
                self.theSizer.Add(self.btnFind, 1, wx.SHAPED)
950
 
                                
951
 
                self.SetAutoLayout(True)
952
 
                self.SetSizerAndFit(self.theSizer)
953
 
                                
954
 
                self.btnFind.SetDefault()
955
 
                self.txtSearchFor.SetFocus()
956
 
                                
957
 
                self.Bind(wx.EVT_BUTTON,  self.OnbtnCancel, id=self.ID_CANCEL)
958
 
                self.Bind(wx.EVT_BUTTON,  self.OnbtnFind, id=self.ID_FIND)
959
 
                self.Bind(wx.EVT_BUTTON,  self.OnbtnCreateRE, id=self.ID_CREATERE)
960
 
                self.Bind(wx.EVT_BUTTON,  self.OnbtnPopUp, id=self.ID_BTNSF)
961
 
        
962
 
                self.Bind(wx.EVT_CHECKBOX,  self.OnCheckRegularExpression, id=self.ID_CHK_REGEX)
963
 
                
964
 
                self.Bind(wx.EVT_TEXT, self.OnTextChanged, id=self.ID_SEARCH_TXT)
965
 
 
966
 
                self.parent.LoadDialogSizeAndPosition(self, 'findreplacedialog.sizeandposition.dat')
967
 
 
968
 
        def OnCloseW(self, event):
969
 
                self.parent.SaveDialogSizeAndPosition(self, 'findreplacedialog.sizeandposition.dat')
970
 
                if event is not None:
971
 
                        event.Skip()
972
 
                                
973
 
        def GetOptions(self):
974
 
                rarray = [self.chkRegularExpression.GetValue(), self.chkMatchCase.GetValue(), \
975
 
                self.chkFindBackwards.GetValue(), self.chkWholeWord.GetValue(), \
976
 
                self.chkInSelection.GetValue(), self.chkFromCursor.GetValue()]
977
 
                                
978
 
                if (self.IsReplace):
979
 
                        rarray.append(self.chkPromptOnReplace.GetValue())
980
 
                        
981
 
                return rarray
982
 
        
983
 
        def OnbtnCancel(self, event):
984
 
                self.Close(1)
985
 
        
986
 
        def OnbtnCreateRE(self, event):
987
 
                from drRegularExpressionDialog import drRegularExpressionDialog
988
 
                d = drRegularExpressionDialog(self, -1, "Create Regular Expression")
989
 
                d.Show()
990
 
                                                
991
 
        def OnbtnFind(self, event):
992
 
                if not self.btnFind.IsEnabled():
993
 
                        return
994
 
                self.Show(0)
995
 
                findflags = 0
996
 
                findbackwards = self.chkFindBackwards.GetValue()
997
 
                
998
 
                isRegularExpression = self.chkRegularExpression.GetValue()
999
 
                isMatchCase = self.chkMatchCase.GetValue()
1000
 
                
1001
 
                self.txtSearchFor.AppendToHistory(self.parent.FindHistory)
1002
 
                if self.IsReplace:
1003
 
                        self.txtReplaceWith.AppendToHistory(self.parent.ReplaceHistory)
1004
 
                                
1005
 
                #Set Target Range
1006
 
                if (self.chkInSelection.GetValue()):
1007
 
                        selstart = self.stc.GetSelectionStart()
1008
 
                        selend = self.stc.GetSelectionEnd()
1009
 
                        if (selend - selstart) < 1:
1010
 
                                selstart = 0
1011
 
                                selend = self.stc.GetTextLength()
1012
 
                        self.stc.Finder.SetTargetRange(selstart, selend, findbackwards)
1013
 
                        #Do the Search if it's a rectangle:
1014
 
                        if self.stc.SelectionIsRectangle():
1015
 
                                if self.IsReplace:
1016
 
                                        if isRegularExpression:
1017
 
                                                x = self.stc.Finder.RectangleREReplaceAll(self.txtSearchFor.GetText(), self.txtReplaceWith.GetText(), isMatchCase)
1018
 
                                                if self.parent.prefs.enablefeedback:
1019
 
                                                        drScrolledMessageDialog.ShowMessage(self, (str(x) + " occurances of \"" + self.txtSearchFor.GetText() + "\" replaced with \"" + self.txtReplaceWith.GetText() + "\""), "Replace")
1020
 
                                        else:
1021
 
                                                x = self.stc.Finder.RectangleReplaceAll(self.txtSearchFor.GetText(), self.txtReplaceWith.GetText(), isMatchCase)
1022
 
                                                if self.parent.prefs.enablefeedback:
1023
 
                                                        drScrolledMessageDialog.ShowMessage(self, (str(x) + " occurances of \"" + self.txtSearchFor.GetText() + "\" replaced with \"" + self.txtReplaceWith.GetText() + "\""), "Replace")
1024
 
                                else:
1025
 
                                        self.stc.Finder.SetTargetPositions(isMatchCase)
1026
 
                                        if isRegularExpression:
1027
 
                                                self.stc.Finder.DoRERectangleFind(self.txtSearchFor.GetText(), isMatchCase)
1028
 
                                        else:
1029
 
                                                self.stc.Finder.DoRectangleFind(self.txtSearchFor.GetText(), isMatchCase, findbackwards)
1030
 
                                self.Close(1)
1031
 
                                return
1032
 
                else:
1033
 
                        self.stc.Finder.SetTargetRange(0, self.stc.GetTextLength(), findbackwards)
1034
 
                        
1035
 
 
1036
 
                if (self.chkFromCursor.GetValue()) and (not self.IsReplace):
1037
 
                        self.stc.Finder.SetFindPos(self.stc.GetCurrentPos())
1038
 
                
1039
 
                #Do Search
1040
 
                if (isRegularExpression):
1041
 
                        if (self.IsReplace):
1042
 
                                x = self.stc.Finder.REReplaceAll(self.txtSearchFor.GetText(), self.txtReplaceWith.GetText(), isMatchCase, self.chkPromptOnReplace.GetValue())
1043
 
                                if x == 0:
1044
 
                                        drScrolledMessageDialog.ShowMessage(self, 'Search string: "' + self.txtSearchFor.GetText() + '" not found.', 'DrPython Replace')
1045
 
                                elif self.parent.prefs.enablefeedback:
1046
 
                                        drScrolledMessageDialog.ShowMessage(self, (str(x) + " occurances of \"" + self.txtSearchFor.GetText() + "\" replaced with \"" + self.txtReplaceWith.GetText() + "\""), "Replace")
1047
 
                        else:
1048
 
                                self.stc.Finder.DoREFind(self.txtSearchFor.GetText(), isMatchCase)
1049
 
                else:
1050
 
                        #Set Flags
1051
 
                        if (self.chkWholeWord.GetValue()):
1052
 
                                findflags = findflags | wx.stc.STC_FIND_WHOLEWORD
1053
 
                        if (isMatchCase):
1054
 
                                findflags = findflags | wx.stc.STC_FIND_MATCHCASE
1055
 
                                
1056
 
                        if (self.IsReplace):
1057
 
                                x = self.stc.Finder.ReplaceAll(self.txtSearchFor.GetText(), self.txtReplaceWith.GetText(), findflags, self.chkPromptOnReplace.GetValue())
1058
 
                                if x == 0:
1059
 
                                        drScrolledMessageDialog.ShowMessage(self, 'Search string: "' + self.txtSearchFor.GetText() + '" not found.', 'DrPython Replace')
1060
 
                                elif self.parent.prefs.enablefeedback:
1061
 
                                        drScrolledMessageDialog.ShowMessage(self, (str(x) + " occurances of \"" + self.txtSearchFor.GetText() + "\" replaced with \"" + self.txtReplaceWith.GetText() + "\""), "Replace")
1062
 
                        else:
1063
 
                                self.stc.Finder.DoFind(self.txtSearchFor.GetText(), findflags, findbackwards)
1064
 
                
1065
 
                self.Close(1)
1066
 
                
1067
 
                if (self.IsReplace):
1068
 
                        self.parent.ReplaceOptions = self.GetOptions()
1069
 
                else:
1070
 
                        self.parent.FindOptions = self.GetOptions()
1071
 
                        
1072
 
        def OnbtnPopUp(self, event):
1073
 
                eid = event.GetId()
1074
 
                if eid == self.ID_BTNSF:
1075
 
                        s = self.txtSearchFor.GetPosition()[0]
1076
 
                        x = self.btnPopUpSearchFor.GetPosition()[0]
1077
 
                        self.txtSearchFor.PopUp((x-s, 0))
1078
 
                elif eid == self.ID_BTNRW:
1079
 
                        s = self.txtReplaceWith.GetPosition()[0]
1080
 
                        x = self.btnPopUpReplaceWith.GetPosition()[0]
1081
 
                        self.txtReplaceWith.PopUp((x-s, 0))
1082
 
        
1083
 
        def OnCheckRegularExpression(self, event):
1084
 
                usingRegularExpressions = self.chkRegularExpression.GetValue()
1085
 
                self.btnCreateRE.Enable(usingRegularExpressions)
1086
 
                self.chkWholeWord.Enable(not usingRegularExpressions)
1087
 
                if not self.IsReplace:
1088
 
                        self.chkFindBackwards.Enable(not usingRegularExpressions)
1089
 
        
1090
 
        def OnTextChanged(self, event):
1091
 
                self.btnFind.Enable(len(self.txtSearchFor.GetText()) > 0)
1092
 
        
1093
 
        def SetFindString(self, findstring):
1094
 
                self.txtSearchFor.SetValue(findstring)
1095
 
                self.txtSearchFor.SetMark(0, len(findstring))
1096
 
                self.OnTextChanged(None)
1097
 
 
1098
 
        def SetOptions(self, OptionsArray):
1099
 
                if len(OptionsArray) > 0:
1100
 
                        self.chkRegularExpression.SetValue(OptionsArray[0])
1101
 
                        self.btnCreateRE.Enable(OptionsArray[0])
1102
 
                        self.chkMatchCase.SetValue(OptionsArray[1])
1103
 
                        self.chkFindBackwards.SetValue(OptionsArray[2])
1104
 
                        self.chkWholeWord.SetValue(OptionsArray[3])
1105
 
                        self.chkInSelection.SetValue(OptionsArray[4])
1106
 
                        self.chkFromCursor.SetValue(OptionsArray[5])
1107
 
                                        
1108
 
                        if (self.IsReplace):
1109
 
                                self.chkPromptOnReplace.SetValue(OptionsArray[6])
 
 
b'\\ No newline at end of file'
 
846
    def __init__(self, parent, id, title, stc, IsReplace = 0):
 
847
        wx.Dialog.__init__(self, parent, id, title, wx.DefaultPosition, wx.Size(-1, -1), wx.DEFAULT_DIALOG_STYLE | wx.MAXIMIZE_BOX | wx.THICK_FRAME | wx.RESIZE_BORDER)
 
848
 
 
849
        self.ID_FIND = 1001
 
850
        self.ID_CANCEL = 1002
 
851
 
 
852
        self.ID_CHK_REGEX = 1010
 
853
        self.ID_CREATERE = 1011
 
854
 
 
855
        self.ID_SEARCH_TXT = 1012
 
856
 
 
857
        self.ID_BTNSF = 98
 
858
        self.ID_BTNRW = 99
 
859
 
 
860
        self.parent = parent
 
861
 
 
862
        self.stc = stc
 
863
 
 
864
        self.theSizer = wx.FlexGridSizer(8, 3, 5, 10)
 
865
 
 
866
        self.IsReplace = IsReplace
 
867
 
 
868
        #Size Buffer
 
869
        self.theSizer.Add(wx.StaticText(self, -1, "    "), 1, wx.SHAPED)
 
870
        self.theSizer.Add(wx.StaticText(self, -1, "    "), 1, wx.SHAPED)
 
871
        self.theSizer.Add(wx.StaticText(self, -1, "    "), 1, wx.SHAPED)
 
872
 
 
873
        self.theSizer.Add(wx.StaticText(self, -1, "    "), 1, wx.SHAPED)
 
874
        self.theSizer.Add(wx.StaticText(self, -1, "Search For: "), 1, wx.SHAPED)
 
875
        self.theSizer.Add(wx.StaticText(self, -1, "    "), 1, wx.SHAPED)
 
876
 
 
877
        self.txtSearchFor = drFindTextCtrl(self, self.ID_SEARCH_TXT, "", wx.DefaultPosition, wx.Size(250, -1))
 
878
        self.btnPopUpSearchFor = wx.Button(self, self.ID_BTNSF, " Menu ")
 
879
        self.theSizer.Add(wx.StaticText(self, -1, "    "), 1, wx.SHAPED)
 
880
        self.theSizer.Add(self.txtSearchFor, 1, wx.SHAPED)
 
881
        self.theSizer.Add(self.btnPopUpSearchFor, 1, wx.SHAPED)
 
882
 
 
883
        self.txtSearchFor.SetHistory(parent.FindHistory)
 
884
 
 
885
        if IsReplace:
 
886
            #self.SetSize(wx.Size(400, 345))
 
887
            self.txtReplaceWith = drFindTextCtrl(self, -1, "", wx.DefaultPosition, wx.Size(250, -1))
 
888
            self.btnPopUpReplaceWith = wx.Button(self, self.ID_BTNRW, " Menu ")
 
889
            self.txtReplaceWith.SetHistory(parent.ReplaceHistory)
 
890
 
 
891
        self.chkRegularExpression = wx.CheckBox(self, self.ID_CHK_REGEX, "RegularExpression")
 
892
        self.btnCreateRE = wx.Button(self, self.ID_CREATERE, " &Create ")
 
893
        self.chkMatchCase = wx.CheckBox(self, -1, "Match Case")
 
894
        self.chkFindBackwards = wx.CheckBox(self, -1, "Find Backwards")
 
895
        self.chkWholeWord = wx.CheckBox(self, -1, "Whole Word")
 
896
        self.chkInSelection = wx.CheckBox(self, -1, "In Selection")
 
897
        self.chkFromCursor = wx.CheckBox(self, -1, "From Cursor")
 
898
 
 
899
        #Prefs
 
900
        self.chkRegularExpression.SetValue(parent.prefs.findreplaceregularexpression)
 
901
        self.btnCreateRE.Enable(parent.prefs.findreplaceregularexpression)
 
902
        self.chkMatchCase.SetValue(parent.prefs.findreplacematchcase)
 
903
        self.chkFindBackwards.SetValue(parent.prefs.findreplacefindbackwards)
 
904
        self.chkWholeWord.SetValue(parent.prefs.findreplacewholeword)
 
905
        self.chkInSelection.SetValue(parent.prefs.findreplaceinselection)
 
906
        self.chkFromCursor.SetValue(parent.prefs.findreplacefromcursor)
 
907
 
 
908
        self.chkInSelection.Enable(len(parent.txtDocument.GetSelectedText()) > 0)
 
909
 
 
910
        if IsReplace:
 
911
            self.chkPromptOnReplace  = wx.CheckBox(self, -1, "Prompt on Replace")
 
912
            self.theSizer.Add(wx.StaticText(self, -1, "    "), 1, wx.SHAPED)
 
913
            self.theSizer.Add(wx.StaticText(self, -1, "Replace With: "), 1, wx.SHAPED)
 
914
            self.theSizer.Add(wx.StaticText(self, -1, "    "), 1, wx.SHAPED)
 
915
 
 
916
            self.theSizer.Add(wx.StaticText(self, -1, "    "), 1, wx.SHAPED)
 
917
            self.theSizer.Add(self.txtReplaceWith, 1 ,wx.SHAPED)
 
918
            self.theSizer.Add(self.btnPopUpReplaceWith, 1, wx.SHAPED)
 
919
 
 
920
            self.chkFromCursor.Disable()
 
921
            self.chkFindBackwards.Disable()
 
922
 
 
923
            #Prefs
 
924
            self.chkPromptOnReplace.SetValue(parent.prefs.findreplacepromptonreplace)
 
925
 
 
926
            self.Bind(wx.EVT_BUTTON,  self.OnbtnPopUp, id=self.ID_BTNRW)
 
927
 
 
928
        #Size Buffer
 
929
        self.theSizer.Add(wx.StaticText(self, -1, "    "), 1, wx.SHAPED)
 
930
        self.theSizer.Add(wx.StaticText(self, -1, "    "), 1, wx.SHAPED)
 
931
        self.theSizer.Add(wx.StaticText(self, -1, "    "), 1, wx.SHAPED)
 
932
 
 
933
        self.theSizer.Add(wx.StaticText(self, -1, "    "), 1, wx.SHAPED)
 
934
        self.theSizer.Add(self.chkRegularExpression, 1, wx.SHAPED)
 
935
        self.theSizer.Add(self.btnCreateRE, 1, wx.SHAPED)
 
936
 
 
937
        self.theSizer.Add(wx.StaticText(self, -1, "    "), 1, wx.SHAPED)
 
938
        self.theSizer.Add(self.chkMatchCase, 1, wx.SHAPED)
 
939
        self.theSizer.Add(self.chkFindBackwards, 1, wx.SHAPED)
 
940
        self.theSizer.Add(wx.StaticText(self, -1, "    "), 1, wx.SHAPED)
 
941
        self.theSizer.Add(self.chkWholeWord, 1, wx.SHAPED)
 
942
        self.theSizer.Add(self.chkInSelection, 1, wx.SHAPED)
 
943
        self.theSizer.Add(wx.StaticText(self, -1, "    "), 1, wx.SHAPED)
 
944
        self.theSizer.Add(self.chkFromCursor, 1, wx.SHAPED)
 
945
        if IsReplace:
 
946
            self.theSizer.Add(self.chkPromptOnReplace, 1, wx.SHAPED)
 
947
        else:
 
948
            self.theSizer.Add(wx.StaticText(self, -1, "    "), 1, wx.SHAPED)
 
949
        self.theSizer.Add(wx.StaticText(self, -1, "    "), 1, wx.SHAPED)
 
950
        self.theSizer.Add(wx.StaticText(self, -1, "    "), 1, wx.SHAPED)
 
951
        self.theSizer.Add(wx.StaticText(self, -1, "    "), 1, wx.SHAPED)
 
952
 
 
953
        self.btnCancel = wx.Button(self, self.ID_CANCEL, "&Cancel")
 
954
        self.btnFind = wx.Button(self, self.ID_FIND, "&Ok")
 
955
        self.btnFind.Enable(False)
 
956
 
 
957
        self.theSizer.Add(wx.StaticText(self, -1, "    "), 1, wx.SHAPED)
 
958
        self.theSizer.Add(self.btnCancel, 1, wx.SHAPED)
 
959
        self.theSizer.Add(self.btnFind, 1, wx.SHAPED)
 
960
 
 
961
        self.SetAutoLayout(True)
 
962
        self.SetSizerAndFit(self.theSizer)
 
963
 
 
964
        self.btnFind.SetDefault()
 
965
        self.txtSearchFor.SetFocus()
 
966
 
 
967
        self.Bind(wx.EVT_BUTTON,  self.OnbtnCancel, id=self.ID_CANCEL)
 
968
        self.Bind(wx.EVT_BUTTON,  self.OnbtnFind, id=self.ID_FIND)
 
969
        self.Bind(wx.EVT_BUTTON,  self.OnbtnCreateRE, id=self.ID_CREATERE)
 
970
        self.Bind(wx.EVT_BUTTON,  self.OnbtnPopUp, id=self.ID_BTNSF)
 
971
 
 
972
        self.Bind(wx.EVT_CHECKBOX,  self.OnCheckRegularExpression, id=self.ID_CHK_REGEX)
 
973
 
 
974
        self.Bind(wx.EVT_TEXT, self.OnTextChanged, id=self.ID_SEARCH_TXT)
 
975
 
 
976
        self.parent.LoadDialogSizeAndPosition(self, 'findreplacedialog.sizeandposition.dat')
 
977
 
 
978
    def OnCloseW(self, event):
 
979
        self.parent.SaveDialogSizeAndPosition(self, 'findreplacedialog.sizeandposition.dat')
 
980
        if event is not None:
 
981
            event.Skip()
 
982
 
 
983
    def GetOptions(self):
 
984
        rarray = [self.chkRegularExpression.GetValue(), self.chkMatchCase.GetValue(), \
 
985
        self.chkFindBackwards.GetValue(), self.chkWholeWord.GetValue(), \
 
986
        self.chkInSelection.GetValue(), self.chkFromCursor.GetValue()]
 
987
 
 
988
        if self.IsReplace:
 
989
            rarray.append(self.chkPromptOnReplace.GetValue())
 
990
 
 
991
        return rarray
 
992
 
 
993
    def OnbtnCancel(self, event):
 
994
        self.Close(1)
 
995
 
 
996
    def OnbtnCreateRE(self, event):
 
997
        from drRegularExpressionDialog import drRegularExpressionDialog
 
998
        d = drRegularExpressionDialog(self, -1, "Create Regular Expression")
 
999
        d.Show()
 
1000
 
 
1001
    def OnbtnFind(self, event):
 
1002
        if not self.btnFind.IsEnabled():
 
1003
            return
 
1004
        self.Show(0)
 
1005
        findflags = 0
 
1006
        findbackwards = self.chkFindBackwards.GetValue()
 
1007
 
 
1008
        isRegularExpression = self.chkRegularExpression.GetValue()
 
1009
        isMatchCase = self.chkMatchCase.GetValue()
 
1010
 
 
1011
        self.txtSearchFor.AppendToHistory(self.parent.FindHistory)
 
1012
        if self.IsReplace:
 
1013
            self.txtReplaceWith.AppendToHistory(self.parent.ReplaceHistory)
 
1014
 
 
1015
        #Set Target Range
 
1016
        if self.chkInSelection.GetValue():
 
1017
            selstart = self.stc.GetSelectionStart()
 
1018
            selend = self.stc.GetSelectionEnd()
 
1019
            if (selend - selstart) < 1:
 
1020
                selstart = 0
 
1021
                selend = self.stc.GetTextLength()
 
1022
            self.stc.Finder.SetTargetRange(selstart, selend, findbackwards)
 
1023
            #Do the Search if it's a rectangle:
 
1024
            if self.stc.SelectionIsRectangle():
 
1025
                if self.IsReplace:
 
1026
                    if isRegularExpression:
 
1027
                        x = self.stc.Finder.RectangleREReplaceAll(self.txtSearchFor.GetText(), self.txtReplaceWith.GetText(), isMatchCase)
 
1028
                        if self.parent.prefs.enablefeedback:
 
1029
                            drScrolledMessageDialog.ShowMessage(self, (str(x) + " occurances of \"" + self.txtSearchFor.GetText() + "\" replaced with \"" + self.txtReplaceWith.GetText() + "\""), "Replace")
 
1030
                    else:
 
1031
                        x = self.stc.Finder.RectangleReplaceAll(self.txtSearchFor.GetText(), self.txtReplaceWith.GetText(), isMatchCase)
 
1032
                        if self.parent.prefs.enablefeedback:
 
1033
                            drScrolledMessageDialog.ShowMessage(self, (str(x) + " occurances of \"" + self.txtSearchFor.GetText() + "\" replaced with \"" + self.txtReplaceWith.GetText() + "\""), "Replace")
 
1034
                else:
 
1035
                    self.stc.Finder.SetTargetPositions(isMatchCase)
 
1036
                    if isRegularExpression:
 
1037
                        self.stc.Finder.DoRERectangleFind(self.txtSearchFor.GetText(), isMatchCase)
 
1038
                    else:
 
1039
                        self.stc.Finder.DoRectangleFind(self.txtSearchFor.GetText(), isMatchCase, findbackwards)
 
1040
                self.Close(1)
 
1041
                return
 
1042
        else:
 
1043
            self.stc.Finder.SetTargetRange(0, self.stc.GetTextLength(), findbackwards)
 
1044
 
 
1045
 
 
1046
        if self.chkFromCursor.GetValue(): #) and (not self.IsReplace):
 
1047
            self.stc.Finder.SetFindPos(self.stc.GetCurrentPos())
 
1048
 
 
1049
        #Do Search
 
1050
        if isRegularExpression:
 
1051
            if self.IsReplace:
 
1052
                x = self.stc.Finder.REReplaceAll(self.txtSearchFor.GetText(), self.txtReplaceWith.GetText(), isMatchCase, self.chkPromptOnReplace.GetValue())
 
1053
                if x == 0:
 
1054
                    if self.parent.prefs.enablefeedback:
 
1055
                        drScrolledMessageDialog.ShowMessage(self, 'Search string: "' + self.txtSearchFor.GetText() + '" not found.', 'DrPython Replace')
 
1056
                    else:
 
1057
                        self.parent.SetStatusText( '"'+self.txtSearchFor.GetText() + '" NOT FOUND', 2)
 
1058
                else:
 
1059
                    if self.parent.prefs.enablefeedback:
 
1060
                        drScrolledMessageDialog.ShowMessage(self, (str(x) + " occurances of \"" + self.txtSearchFor.GetText() + "\" replaced with \"" + self.txtReplaceWith.GetText() + "\""), "Replace")
 
1061
                    else:
 
1062
                        self.parent.SetStatusText(str(x) + ' occurances of "' + self.txtSearchFor.GetText() + '" replaced with "' + self.txtReplaceWith.GetText() + '"', 2)
 
1063
            else:
 
1064
                self.stc.Finder.DoREFind(self.txtSearchFor.GetText(), isMatchCase)
 
1065
        else:
 
1066
            #Set Flags
 
1067
            if self.chkWholeWord.GetValue():
 
1068
                findflags = findflags | wx.stc.STC_FIND_WHOLEWORD
 
1069
            if isMatchCase:
 
1070
                findflags = findflags | wx.stc.STC_FIND_MATCHCASE
 
1071
 
 
1072
            if self.IsReplace:
 
1073
                x = self.stc.Finder.ReplaceAll(self.txtSearchFor.GetText(), self.txtReplaceWith.GetText(), findflags, self.chkPromptOnReplace.GetValue())
 
1074
                if x == 0:
 
1075
                    if self.parent.prefs.enablefeedback:
 
1076
                        drScrolledMessageDialog.ShowMessage(self, 'Search string: "' + self.txtSearchFor.GetText() + '" not found.', 'DrPython Replace')
 
1077
                    else:
 
1078
                        self.parent.SetStatusText( '"'+self.txtSearchFor.GetText() + '" NOT FOUND', 2)
 
1079
                else:
 
1080
                    if self.parent.prefs.enablefeedback:
 
1081
                        drScrolledMessageDialog.ShowMessage(self, (str(x) + " occurances of \"" + self.txtSearchFor.GetText() + "\" replaced with \"" + self.txtReplaceWith.GetText() + "\""), "Replace")
 
1082
                    else:
 
1083
                        self.parent.SetStatusText(str(x) + ' occurances of "' + self.txtSearchFor.GetText() + '" replaced with "' + self.txtReplaceWith.GetText() + '"', 2)
 
1084
            else:
 
1085
                self.stc.Finder.DoFind(self.txtSearchFor.GetText(), findflags, findbackwards)
 
1086
 
 
1087
        self.Close(1)
 
1088
 
 
1089
        if self.IsReplace:
 
1090
            self.parent.ReplaceOptions = self.GetOptions()
 
1091
        else:
 
1092
            self.parent.FindOptions = self.GetOptions()
 
1093
        if findbackwards:
 
1094
            self.stc.Finder.ScrollFewLinesBelow()
 
1095
        else:
 
1096
            self.stc.Finder.ScrollFewLinesAbove()
 
1097
#        top = self.parent.txtDocument.GetCurrentLine() - self.parent.txtDocument.LinesOnScreen()/2
 
1098
#        if top < 0:
 
1099
#            top = 0
 
1100
#        self.parent.txtDocument.ScrollToLine(top)
 
1101
 
 
1102
    def OnbtnPopUp(self, event):
 
1103
        eid = event.GetId()
 
1104
        if eid == self.ID_BTNSF:
 
1105
            s = self.txtSearchFor.GetPosition()[0]
 
1106
            x = self.btnPopUpSearchFor.GetPosition()[0]
 
1107
            self.txtSearchFor.PopUp((x-s, 0))
 
1108
        elif eid == self.ID_BTNRW:
 
1109
            s = self.txtReplaceWith.GetPosition()[0]
 
1110
            x = self.btnPopUpReplaceWith.GetPosition()[0]
 
1111
            self.txtReplaceWith.PopUp((x-s, 0))
 
1112
 
 
1113
    def OnCheckRegularExpression(self, event):
 
1114
        usingRegularExpressions = self.chkRegularExpression.GetValue()
 
1115
        self.btnCreateRE.Enable(usingRegularExpressions)
 
1116
        self.chkWholeWord.Enable(not usingRegularExpressions)
 
1117
        if not self.IsReplace:
 
1118
            self.chkFindBackwards.Enable(not usingRegularExpressions)
 
1119
 
 
1120
    def OnTextChanged(self, event):
 
1121
        self.btnFind.Enable(len(self.txtSearchFor.GetText()) > 0)
 
1122
 
 
1123
    def SetFindString(self, findstring):
 
1124
        self.txtSearchFor.SetValue(findstring)
 
1125
        self.txtSearchFor.SetMark(0, len(findstring))
 
1126
        self.OnTextChanged(None)
 
1127
 
 
1128
    def SetOptions(self, OptionsArray):
 
1129
        if OptionsArray:
 
1130
            self.chkRegularExpression.SetValue(OptionsArray[0])
 
1131
            self.btnCreateRE.Enable(OptionsArray[0])
 
1132
            self.chkMatchCase.SetValue(OptionsArray[1])
 
1133
            self.chkFindBackwards.SetValue(OptionsArray[2])
 
1134
            self.chkWholeWord.SetValue(OptionsArray[3])
 
1135
            self.chkInSelection.SetValue(OptionsArray[4])
 
1136
            self.chkFromCursor.SetValue(OptionsArray[5])
 
1137
 
 
1138
            if self.IsReplace:
 
1139
                self.chkPromptOnReplace.SetValue(OptionsArray[6])