/b-gtk/fix-viz

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/b-gtk/fix-viz

« back to all changes in this revision

Viewing changes to annotate/gannotate.py

  • Committer: Jelmer Vernooij
  • Date: 2012-07-09 15:23:26 UTC
  • mto: This revision was merged to the branch mainline in revision 794.
  • Revision ID: jelmer@samba.org-20120709152326-dzxb8zoz0btull7n
Remove bzr-notify.

Show diffs side-by-side

added added

removed removed

Lines of Context:
16
16
 
17
17
import time
18
18
 
19
 
import pygtk
20
 
pygtk.require("2.0")
21
 
import gobject
22
 
import gtk
23
 
import pango
 
19
from gi.repository import GObject
 
20
from gi.repository import Gdk
 
21
from gi.repository import Gtk
 
22
from gi.repository import Pango
24
23
import re
25
24
 
26
 
from bzrlib import patiencediff, tsort
 
25
from bzrlib import patiencediff
27
26
from bzrlib.errors import NoSuchRevision
28
27
from bzrlib.revision import NULL_REVISION, CURRENT_REVISION
29
28
 
30
 
from colormap import AnnotateColorMap, AnnotateColorSaturation
 
29
from bzrlib.plugins.gtk.annotate.colormap import AnnotateColorSaturation
 
30
from bzrlib.plugins.gtk.i18n import _i18n
31
31
from bzrlib.plugins.gtk.revisionview import RevisionView
32
32
from bzrlib.plugins.gtk.window import Window
33
33
 
45
45
class GAnnotateWindow(Window):
46
46
    """Annotate window."""
47
47
 
48
 
    def __init__(self, all=False, plain=False, parent=None):
 
48
    def __init__(self, all=False, plain=False, parent=None, branch=None):
49
49
        self.all = all
50
50
        self.plain = plain
51
 
        
52
 
        Window.__init__(self, parent)
53
 
        
54
 
        self.set_icon(self.render_icon(gtk.STOCK_FIND, gtk.ICON_SIZE_BUTTON))
 
51
        self._branch = branch
 
52
 
 
53
        super(GAnnotateWindow, self).__init__(parent=parent)
 
54
 
 
55
        self.set_icon(
 
56
            self.render_icon_pixbuf(Gtk.STOCK_FIND, Gtk.IconSize.BUTTON))
55
57
        self.annotate_colormap = AnnotateColorSaturation()
56
58
 
57
59
        self._create()
67
69
        self.revisionview.set_file_id(file_id)
68
70
        self.revision_id = getattr(tree, 'get_revision_id', 
69
71
                                   lambda: CURRENT_REVISION)()
70
 
        
 
72
 
71
73
        # [revision id, line number, author, revno, highlight color, line]
72
 
        self.annomodel = gtk.ListStore(gobject.TYPE_STRING,
73
 
                                       gobject.TYPE_STRING,
74
 
                                       gobject.TYPE_STRING,
75
 
                                       gobject.TYPE_STRING,
76
 
                                       gobject.TYPE_STRING,
77
 
                                       gobject.TYPE_STRING)
78
 
        
 
74
        self.annomodel = Gtk.ListStore(GObject.TYPE_STRING,
 
75
                                       GObject.TYPE_INT,
 
76
                                       GObject.TYPE_STRING,
 
77
                                       GObject.TYPE_STRING,
 
78
                                       GObject.TYPE_STRING,
 
79
                                       GObject.TYPE_STRING)
 
80
 
79
81
        last_seen = None
80
82
        try:
81
83
            branch.lock_read()
85
87
            for revision_id, revno in revno_map.iteritems():
86
88
                self.dotted[revision_id] = '.'.join(str(num) for num in revno)
87
89
            for line_no, (revision, revno, line)\
88
 
                    in enumerate(self._annotate(tree, file_id)):
 
90
                in enumerate(self._annotate(tree, file_id)):
89
91
                if revision.revision_id == last_seen and not self.all:
90
92
                    revno = author = ""
91
93
                else:
92
94
                    last_seen = revision.revision_id
93
 
                    author = revision.get_apparent_author()
 
95
                    author = ", ".join(revision.get_apparent_authors())
94
96
 
95
97
                if revision.revision_id not in self.revisions:
96
98
                    self.revisions[revision.revision_id] = revision
101
103
                                       revno,
102
104
                                       None,
103
105
                                       line.rstrip("\r\n")
104
 
                                      ])
 
106
                                       ])
105
107
                self.annotations.append(revision)
106
108
 
107
109
            if not self.plain:
113
115
 
114
116
        self.annoview.set_model(self.annomodel)
115
117
        self.annoview.grab_focus()
 
118
        my_revno = self.dotted.get(self.revision_id, 'current')
 
119
        title = '%s (%s) - gannotate' % (self.tree.id2path(file_id), my_revno)
 
120
        self.set_title(title)
116
121
 
117
122
    def jump_to_line(self, lineno):
118
123
        if lineno > len(self.annomodel) or lineno < 1:
121
126
            # bar?
122
127
            print("gannotate: Line number %d does't exist. Defaulting to "
123
128
                  "line 1." % lineno)
124
 
            return
 
129
            return
125
130
        else:
126
131
            row = lineno - 1
127
132
 
128
 
        self.annoview.set_cursor(row)
129
 
        self.annoview.scroll_to_cell(row, use_align=True)
130
 
 
 
133
        tree_path = Gtk.TreePath(path=row)
 
134
        self.annoview.set_cursor(tree_path, None, False)
 
135
        self.annoview.scroll_to_cell(tree_path, use_align=True)
131
136
 
132
137
    def _annotate(self, tree, file_id):
133
138
        current_revision = FakeRevision(CURRENT_REVISION)
135
140
        current_revision.timestamp = time.time()
136
141
        current_revision.message = '[Not yet committed]'
137
142
        current_revision.parent_ids = tree.get_parent_ids()
138
 
        current_revision.properties['branch-nick'] = self.branch.nick
 
143
        current_revision.properties['branch-nick'] = self.branch._get_nick(local=True)
139
144
        current_revno = '%d?' % (self.branch.revno() + 1)
140
145
        repository = self.branch.repository
141
146
        if self.revision_id == CURRENT_REVISION:
163
168
    def _highlight_annotation(self, model, path, iter, now):
164
169
        revision_id, = model.get(iter, REVISION_ID_COL)
165
170
        revision = self.revisions[revision_id]
166
 
        model.set(iter, HIGHLIGHT_COLOR_COL,
167
 
                  self.annotate_colormap.get_color(revision, now))
 
171
        # XXX sinzui 2011-08-12: What does get_color return?
 
172
        color = self.annotate_colormap.get_color(revision, now)
 
173
        model.set_value(iter, HIGHLIGHT_COLOR_COL, color)
168
174
 
169
175
    def _selected_revision(self):
170
176
        (path, col) = self.annoview.get_cursor()
174
180
 
175
181
    def _activate_selected_revision(self, w):
176
182
        rev_id = self._selected_revision()
177
 
        if rev_id is None:
 
183
        if not rev_id or rev_id == NULL_REVISION:
178
184
            return
179
185
        selected = self.revisions[rev_id]
180
186
        self.revisionview.set_revision(selected)
189
195
        self.revisionview = self._create_log_view()
190
196
        self.annoview = self._create_annotate_view()
191
197
 
192
 
        vbox = gtk.VBox(False)
 
198
        vbox = Gtk.VBox(homogeneous=False, spacing=0)
193
199
        vbox.show()
194
200
 
195
 
        sw = gtk.ScrolledWindow()
196
 
        sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
197
 
        sw.set_shadow_type(gtk.SHADOW_IN)
 
201
        sw = Gtk.ScrolledWindow()
 
202
        sw.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC)
 
203
        sw.set_shadow_type(Gtk.ShadowType.IN)
198
204
        sw.add(self.annoview)
199
205
        self.annoview.gwindow = self
200
206
        sw.show()
201
207
 
202
 
        swbox = gtk.VBox()
203
 
        swbox.pack_start(sw)
 
208
        swbox = Gtk.VBox()
 
209
        swbox.pack_start(sw, True, True, 0)
204
210
        swbox.show()
205
211
 
206
 
        hbox = gtk.HBox(False, 6)
 
212
        hbox = Gtk.HBox(homogeneous=False, spacing=6)
207
213
        self.back_button = self._create_back_button()
208
 
        hbox.pack_start(self.back_button, expand=False, fill=True)
 
214
        hbox.pack_start(self.back_button, False, True, 0)
209
215
        self.forward_button = self._create_forward_button()
210
 
        hbox.pack_start(self.forward_button, expand=False, fill=True)
 
216
        hbox.pack_start(self.forward_button, False, True, 0)
 
217
        self.find_button = self._create_find_button()
 
218
        hbox.pack_start(self.find_button, False, True, 0)
 
219
        self.goto_button = self._create_goto_button()
 
220
        hbox.pack_start(self.goto_button, False, True, 0)
211
221
        hbox.show()
212
 
        vbox.pack_start(hbox, expand=False, fill=True)
213
 
        
214
 
        self.pane = pane = gtk.VPaned()
 
222
        vbox.pack_start(hbox, False, True, 0)
 
223
 
 
224
        self.pane = pane = Gtk.Paned.new(Gtk.Orientation.VERTICAL)
215
225
        pane.add1(swbox)
216
226
        pane.add2(self.revisionview)
217
227
        pane.show()
218
 
        vbox.pack_start(pane, expand=True, fill=True)
 
228
        vbox.pack_start(pane, True, True, 0)
219
229
 
220
230
        self._search = SearchBox()
221
 
        swbox.pack_start(self._search, expand=False, fill=True)
222
 
        accels = gtk.AccelGroup()
223
 
        accels.connect_group(gtk.keysyms.f, gtk.gdk.CONTROL_MASK,
224
 
                             gtk.ACCEL_LOCKED,
 
231
        swbox.pack_start(self._search, False, True, 0)
 
232
        accels = Gtk.AccelGroup()
 
233
        accels.connect(Gdk.KEY_f, Gdk.ModifierType.CONTROL_MASK,
 
234
                             Gtk.AccelFlags.LOCKED,
225
235
                             self._search_by_text)
226
 
        accels.connect_group(gtk.keysyms.g, gtk.gdk.CONTROL_MASK,
227
 
                             gtk.ACCEL_LOCKED,
 
236
        accels.connect(Gdk.KEY_g, Gdk.ModifierType.CONTROL_MASK,
 
237
                             Gtk.AccelFlags.LOCKED,
228
238
                             self._search_by_line)
229
239
        self.add_accel_group(accels)
230
240
 
231
241
        self.add(vbox)
232
242
 
233
 
    def _search_by_text(self, accel_group, window, key, modifiers):
 
243
    def _search_by_text(self, *ignored): # (accel_group, window, key, modifiers):
234
244
        self._search.show_for('text')
235
245
        self._search.set_target(self.annoview, TEXT_LINE_COL)
236
246
 
237
 
    def _search_by_line(self, accel_group, window, key, modifiers):
 
247
    def _search_by_line(self, *ignored): # accel_group, window, key, modifiers):
238
248
        self._search.show_for('line')
239
249
        self._search.set_target(self.annoview, LINE_NUM_COL)
240
250
 
241
 
    def row_diff(self, tv, path, tvc):
242
 
        row = path[0]
 
251
    def line_diff(self, tv, path, tvc):
 
252
        row = path.get_indices()[0]
243
253
        revision = self.annotations[row]
244
254
        repository = self.branch.repository
245
255
        if revision.revision_id == CURRENT_REVISION:
252
262
            else:
253
263
                tree2 = repository.revision_tree(NULL_REVISION)
254
264
        from bzrlib.plugins.gtk.diff import DiffWindow
255
 
        window = DiffWindow()
256
 
        window.set_diff("Diff for row %d" % (row+1), tree1, tree2)
 
265
        window = DiffWindow(self)
 
266
        window.set_diff("Diff for line %d" % (row+1), tree1, tree2)
257
267
        window.set_file(tree1.id2path(self.file_id))
258
268
        window.show()
259
269
 
260
270
 
261
271
    def _create_annotate_view(self):
262
 
        tv = gtk.TreeView()
 
272
        tv = Gtk.TreeView()
263
273
        tv.set_rules_hint(False)
264
274
        tv.connect("cursor-changed", self._activate_selected_revision)
265
275
        tv.show()
266
 
        tv.connect("row-activated", self.row_diff)
 
276
        tv.connect("row-activated", self.line_diff)
267
277
 
268
 
        cell = gtk.CellRendererText()
 
278
        cell = Gtk.CellRendererText()
269
279
        cell.set_property("xalign", 1.0)
270
280
        cell.set_property("ypad", 0)
271
281
        cell.set_property("family", "Monospace")
272
282
        cell.set_property("cell-background-gdk",
273
 
                          tv.get_style().bg[gtk.STATE_NORMAL])
274
 
        col = gtk.TreeViewColumn()
 
283
                          tv.get_style().bg[Gtk.StateType.NORMAL])
 
284
        col = Gtk.TreeViewColumn()
275
285
        col.set_resizable(False)
276
 
        col.pack_start(cell, expand=True)
 
286
        col.pack_start(cell, True)
277
287
        col.add_attribute(cell, "text", LINE_NUM_COL)
278
288
        tv.append_column(col)
279
289
 
280
 
        cell = gtk.CellRendererText()
 
290
        cell = Gtk.CellRendererText()
281
291
        cell.set_property("ypad", 0)
282
 
        cell.set_property("ellipsize", pango.ELLIPSIZE_END)
 
292
        cell.set_property("ellipsize", Pango.EllipsizeMode.END)
283
293
        cell.set_property("cell-background-gdk",
284
 
                          self.get_style().bg[gtk.STATE_NORMAL])
285
 
        col = gtk.TreeViewColumn("Committer")
 
294
                          self.get_style().bg[Gtk.StateType.NORMAL])
 
295
        col = Gtk.TreeViewColumn("Committer")
286
296
        col.set_resizable(True)
287
 
        col.pack_start(cell, expand=True)
 
297
        col.pack_start(cell, True)
288
298
        col.add_attribute(cell, "text", COMMITTER_COL)
289
299
        tv.append_column(col)
290
300
 
291
 
        cell = gtk.CellRendererText()
 
301
        cell = Gtk.CellRendererText()
292
302
        cell.set_property("xalign", 1.0)
293
303
        cell.set_property("ypad", 0)
294
304
        cell.set_property("cell-background-gdk",
295
 
                          self.get_style().bg[gtk.STATE_NORMAL])
296
 
        col = gtk.TreeViewColumn("Revno")
 
305
                          self.get_style().bg[Gtk.StateType.NORMAL])
 
306
        col = Gtk.TreeViewColumn("Revno")
297
307
        col.set_resizable(False)
298
 
        col.pack_start(cell, expand=True)
 
308
        col.pack_start(cell, True)
299
309
        col.add_attribute(cell, "markup", REVNO_COL)
300
310
        tv.append_column(col)
301
311
 
302
 
        cell = gtk.CellRendererText()
 
312
        cell = Gtk.CellRendererText()
303
313
        cell.set_property("ypad", 0)
304
314
        cell.set_property("family", "Monospace")
305
 
        col = gtk.TreeViewColumn()
 
315
        col = Gtk.TreeViewColumn()
306
316
        col.set_resizable(False)
307
 
        col.pack_start(cell, expand=True)
 
317
        col.pack_start(cell, True)
308
318
#        col.add_attribute(cell, "foreground", HIGHLIGHT_COLOR_COL)
309
319
        col.add_attribute(cell, "background", HIGHLIGHT_COLOR_COL)
310
320
        col.add_attribute(cell, "text", TEXT_LINE_COL)
311
321
        tv.append_column(col)
312
322
 
313
 
        # FIXME: Now that C-f is now used for search by text we
314
 
        # may as well disable the auto search.
315
 
        tv.set_search_column(LINE_NUM_COL)
 
323
        # interactive substring search
 
324
        def search_equal_func(model, column, key, iter):
 
325
            return model.get_value(iter, TEXT_LINE_COL).lower().find(key.lower()) == -1
 
326
 
 
327
        tv.set_enable_search(True)
 
328
        tv.set_search_equal_func(search_equal_func, None)
316
329
 
317
330
        return tv
318
331
 
319
332
    def _create_log_view(self):
320
 
        lv = RevisionView()
 
333
        lv = RevisionView(self._branch)
321
334
        lv.show()
322
335
        return lv
323
336
 
324
337
    def _create_back_button(self):
325
 
        button = gtk.Button()
 
338
        button = Gtk.Button()
326
339
        button.set_use_stock(True)
327
340
        button.set_label("gtk-go-back")
328
341
        button.connect("clicked", lambda w: self.go_back())
329
 
        button.set_relief(gtk.RELIEF_NONE)
 
342
        button.set_relief(Gtk.ReliefStyle.NONE)
330
343
        button.show()
331
344
        return button
332
345
 
333
346
    def _create_forward_button(self):
334
 
        button = gtk.Button()
 
347
        button = Gtk.Button()
335
348
        button.set_use_stock(True)
336
349
        button.set_label("gtk-go-forward")
337
350
        button.connect("clicked", lambda w: self.go_forward())
338
 
        button.set_relief(gtk.RELIEF_NONE)
 
351
        button.set_relief(Gtk.ReliefStyle.NONE)
339
352
        button.show()
340
353
        button.set_sensitive(False)
341
354
        return button
342
355
 
 
356
    def _create_find_button(self):
 
357
        button = Gtk.Button()
 
358
        button.set_use_stock(True)
 
359
        button.set_label("gtk-find")
 
360
        button.set_tooltip_text("Search for text (Ctrl+F)")
 
361
        button.connect("clicked", self._search_by_text)
 
362
        button.set_relief(Gtk.ReliefStyle.NONE)
 
363
        button.show()
 
364
        button.set_sensitive(True)
 
365
        return button
 
366
 
 
367
    def _create_goto_button(self):
 
368
        button = Gtk.Button()
 
369
        button.set_label("Goto Line")
 
370
        button.set_tooltip_text("Scroll to a line by entering its number (Ctrl+G)")
 
371
        button.connect("clicked", self._search_by_line)
 
372
        button.set_relief(Gtk.ReliefStyle.NONE)
 
373
        button.show()
 
374
        button.set_sensitive(True)
 
375
        return button
 
376
 
343
377
    def go_back(self):
344
378
        last_tree = self.tree
345
379
        rev_id = self._selected_revision()
364
398
        rev_id = self._selected_revision()
365
399
        if self.file_id in target_tree:
366
400
            offset = self.get_scroll_offset(target_tree)
367
 
            (row,), col = self.annoview.get_cursor()
 
401
            path, col = self.annoview.get_cursor()
 
402
            (row,) = path.get_indices()
368
403
            self.annotate(target_tree, self.branch, self.file_id)
369
404
            new_row = row+offset
370
405
            if new_row < 0:
371
406
                new_row = 0
372
 
            self.annoview.set_cursor(new_row)
 
407
            new_path = Gtk.TreePath(path=new_row)
 
408
            self.annoview.set_cursor(new_path, None, False)
373
409
            return True
374
410
        else:
375
411
            return False
377
413
    def get_scroll_offset(self, tree):
378
414
        old = self.tree.get_file(self.file_id)
379
415
        new = tree.get_file(self.file_id)
380
 
        (row,), col = self.annoview.get_cursor()
 
416
        path, col = self.annoview.get_cursor()
 
417
        (row,) = path.get_indices()
381
418
        matcher = patiencediff.PatienceSequenceMatcher(None, old.readlines(),
382
419
                                                       new.readlines())
383
420
        for i, j, n in matcher.get_matching_blocks():
385
422
                return j - i
386
423
 
387
424
 
388
 
class FakeRevision:
 
425
class FakeRevision(object):
389
426
    """ A fake revision.
390
427
 
391
428
    For when a revision is referenced but not present.
400
437
        self.timezone = 0
401
438
        self.properties = {}
402
439
 
403
 
    def get_apparent_author(self):
404
 
        return self.committer
 
440
    def get_apparent_authors(self):
 
441
        return [self.committer]
405
442
 
406
443
 
407
444
class RevisionCache(object):
408
445
    """A caching revision source"""
 
446
 
409
447
    def __init__(self, real_source, seed_cache=None):
410
448
        self.__real_source = real_source
411
449
        if seed_cache is None:
419
457
            self.__cache[revision_id] = revision
420
458
        return self.__cache[revision_id]
421
459
 
422
 
class SearchBox(gtk.HBox):
 
460
 
 
461
class SearchBox(Gtk.HBox):
423
462
    """A button box for searching in text or lines of annotations"""
424
463
    def __init__(self):
425
 
        gtk.HBox.__init__(self, False, 6)
 
464
        super(SearchBox, self).__init__(homogeneous=False, spacing=6)
426
465
 
427
466
        # Close button
428
 
        button = gtk.Button()
429
 
        image = gtk.Image()
430
 
        image.set_from_stock('gtk-stop', gtk.ICON_SIZE_BUTTON)
 
467
        button = Gtk.Button()
 
468
        image = Gtk.Image()
 
469
        image.set_from_stock('gtk-stop', Gtk.IconSize.BUTTON)
431
470
        button.set_image(image)
432
 
        button.set_relief(gtk.RELIEF_NONE)
433
 
        button.connect("clicked", lambda w: self.hide_all())
434
 
        self.pack_start(button, expand=False, fill=False)
 
471
        button.set_relief(Gtk.ReliefStyle.NONE)
 
472
        button.connect("clicked", lambda w: self.hide())
 
473
        self.pack_start(button, False, False, 0)
435
474
 
436
475
        # Search entry
437
 
        label = gtk.Label()
 
476
        label = Gtk.Label()
438
477
        self._label = label
439
 
        self.pack_start(label, expand=False, fill=False)
 
478
        self.pack_start(label, False, False, 0)
440
479
 
441
 
        entry = gtk.Entry()
 
480
        entry = Gtk.Entry()
442
481
        self._entry = entry
443
482
        entry.connect("activate", lambda w, d: self._do_search(d),
444
483
                      'forward')
445
 
        self.pack_start(entry, expand=False, fill=False)
 
484
        self.pack_start(entry, False, False, 0)
446
485
 
447
486
        # Next/previous buttons
448
 
        button = gtk.Button('_Next')
449
 
        image = gtk.Image()
450
 
        image.set_from_stock('gtk-go-forward', gtk.ICON_SIZE_BUTTON)
 
487
        button = Gtk.Button(_i18n('_Next'), use_underline=True)
 
488
        image = Gtk.Image()
 
489
        image.set_from_stock('gtk-go-forward', Gtk.IconSize.BUTTON)
451
490
        button.set_image(image)
452
491
        button.connect("clicked", lambda w, d: self._do_search(d),
453
492
                       'forward')
454
 
        self.pack_start(button, expand=False, fill=False)
 
493
        self.pack_start(button, False, False, 0)
455
494
 
456
 
        button = gtk.Button('_Previous')
457
 
        image = gtk.Image()
458
 
        image.set_from_stock('gtk-go-back', gtk.ICON_SIZE_BUTTON)
 
495
        button = Gtk.Button(_i18n('_Previous'), use_underline=True)
 
496
        image = Gtk.Image()
 
497
        image.set_from_stock('gtk-go-back', Gtk.IconSize.BUTTON)
459
498
        button.set_image(image)
460
499
        button.connect("clicked", lambda w, d: self._do_search(d),
461
500
                       'backward')
462
 
        self.pack_start(button, expand=False, fill=False)
 
501
        self.pack_start(button, False, False, 0)
463
502
 
464
503
        # Search options
465
 
        check = gtk.CheckButton('Match case')
 
504
        check = Gtk.CheckButton('Match case')
466
505
        self._match_case = check
467
 
        self.pack_start(check, expand=False, fill=False)
 
506
        self.pack_start(check, False, False, 0)
468
507
 
469
 
        check = gtk.CheckButton('Regexp')
 
508
        check = Gtk.CheckButton('Regexp')
470
509
        check.connect("toggled", lambda w: self._set_label())
471
510
        self._regexp = check
472
 
        self.pack_start(check, expand=False, fill=False)
 
511
        self.pack_start(check, False, False, 0)
473
512
 
474
513
        self._view = None
475
514
        self._column = None
502
541
 
503
542
    def _match(self, model, iterator, column):
504
543
        matching_case = self._match_case.get_active()
505
 
        string, = model.get(iterator, column)
 
544
        cell_value, = model.get(iterator, column)
506
545
        key = self._entry.get_text()
507
 
        if self._regexp.get_active():
 
546
        if column == LINE_NUM_COL:
 
547
            # FIXME: For goto-line there are faster algorithms than searching 
 
548
            # every line til we find the right one! -- mbp 2011-01-27
 
549
            return key.strip() == str(cell_value)
 
550
        elif self._regexp.get_active():
508
551
            if matching_case:
509
 
                match = re.compile(key).search(string, 1)
 
552
                match = re.compile(key).search(cell_value, 1)
510
553
            else:
511
 
                match = re.compile(key, re.I).search(string, 1)
 
554
                match = re.compile(key, re.I).search(cell_value, 1)
512
555
        else:
513
556
            if not matching_case:
514
 
                string = string.lower()
 
557
                cell_value = cell_value.lower()
515
558
                key = key.lower()
516
 
            match = string.find(key) != -1
 
559
            match = cell_value.find(key) != -1
517
560
 
518
561
        return match
519
562
 
551
594
        for row in iterate(model, start):
552
595
            if self._match(model, row, self._column):
553
596
                path = model.get_path(row)
554
 
                self._view.set_cursor(path)
 
597
                self._view.set_cursor(path, None, False)
555
598
                self._view.scroll_to_cell(path, use_align=True)
556
599
                break