/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: 2008-06-29 18:12:29 UTC
  • mto: This revision was merged to the branch mainline in revision 519.
  • Revision ID: jelmer@samba.org-20080629181229-1l2m4cf7vvbyh8qg
Simplify progress bar code, use embedded progress bar inside viz window.

Show diffs side-by-side

added added

removed removed

Lines of Context:
23
23
import pango
24
24
import re
25
25
 
26
 
from bzrlib import patiencediff
 
26
from bzrlib import patiencediff, tsort
27
27
from bzrlib.errors import NoSuchRevision
28
28
from bzrlib.revision import NULL_REVISION, CURRENT_REVISION
29
29
 
30
 
from bzrlib.plugins.gtk.annotate.colormap import AnnotateColorSaturation
 
30
from colormap import AnnotateColorMap, AnnotateColorSaturation
31
31
from bzrlib.plugins.gtk.revisionview import RevisionView
32
32
from bzrlib.plugins.gtk.window import Window
33
33
 
49
49
        self.all = all
50
50
        self.plain = plain
51
51
        self._branch = branch
52
 
 
 
52
        
53
53
        Window.__init__(self, parent)
54
 
 
 
54
        
55
55
        self.set_icon(self.render_icon(gtk.STOCK_FIND, gtk.ICON_SIZE_BUTTON))
56
56
        self.annotate_colormap = AnnotateColorSaturation()
57
57
 
68
68
        self.revisionview.set_file_id(file_id)
69
69
        self.revision_id = getattr(tree, 'get_revision_id', 
70
70
                                   lambda: CURRENT_REVISION)()
71
 
 
 
71
        
72
72
        # [revision id, line number, author, revno, highlight color, line]
73
73
        self.annomodel = gtk.ListStore(gobject.TYPE_STRING,
74
 
                                       gobject.TYPE_INT,
 
74
                                       gobject.TYPE_STRING,
75
75
                                       gobject.TYPE_STRING,
76
76
                                       gobject.TYPE_STRING,
77
77
                                       gobject.TYPE_STRING,
78
78
                                       gobject.TYPE_STRING)
79
 
 
 
79
        
80
80
        last_seen = None
81
81
        try:
82
82
            branch.lock_read()
86
86
            for revision_id, revno in revno_map.iteritems():
87
87
                self.dotted[revision_id] = '.'.join(str(num) for num in revno)
88
88
            for line_no, (revision, revno, line)\
89
 
                in enumerate(self._annotate(tree, file_id)):
 
89
                    in enumerate(self._annotate(tree, file_id)):
90
90
                if revision.revision_id == last_seen and not self.all:
91
91
                    revno = author = ""
92
92
                else:
93
93
                    last_seen = revision.revision_id
94
 
                    author = ", ".join(revision.get_apparent_authors())
 
94
                    author = revision.get_apparent_author()
95
95
 
96
96
                if revision.revision_id not in self.revisions:
97
97
                    self.revisions[revision.revision_id] = revision
102
102
                                       revno,
103
103
                                       None,
104
104
                                       line.rstrip("\r\n")
105
 
                                       ])
 
105
                                      ])
106
106
                self.annotations.append(revision)
107
107
 
108
108
            if not self.plain:
125
125
            # bar?
126
126
            print("gannotate: Line number %d does't exist. Defaulting to "
127
127
                  "line 1." % lineno)
128
 
            return
 
128
            return
129
129
        else:
130
130
            row = lineno - 1
131
131
 
139
139
        current_revision.timestamp = time.time()
140
140
        current_revision.message = '[Not yet committed]'
141
141
        current_revision.parent_ids = tree.get_parent_ids()
142
 
        current_revision.properties['branch-nick'] = self.branch._get_nick(local=True)
 
142
        current_revision.properties['branch-nick'] = self.branch.nick
143
143
        current_revno = '%d?' % (self.branch.revno() + 1)
144
144
        repository = self.branch.repository
145
145
        if self.revision_id == CURRENT_REVISION:
212
212
        hbox.pack_start(self.back_button, expand=False, fill=True)
213
213
        self.forward_button = self._create_forward_button()
214
214
        hbox.pack_start(self.forward_button, expand=False, fill=True)
215
 
        self.find_button = self._create_find_button()
216
 
        hbox.pack_start(self.find_button, expand=False, fill=True)
217
 
        self.goto_button = self._create_goto_button()
218
 
        hbox.pack_start(self.goto_button, expand=False, fill=True)
219
215
        hbox.show()
220
216
        vbox.pack_start(hbox, expand=False, fill=True)
221
 
 
 
217
        
222
218
        self.pane = pane = gtk.VPaned()
223
219
        pane.add1(swbox)
224
220
        pane.add2(self.revisionview)
238
234
 
239
235
        self.add(vbox)
240
236
 
241
 
    def _search_by_text(self, *ignored): # (accel_group, window, key, modifiers):
 
237
    def _search_by_text(self, accel_group, window, key, modifiers):
242
238
        self._search.show_for('text')
243
239
        self._search.set_target(self.annoview, TEXT_LINE_COL)
244
240
 
245
 
    def _search_by_line(self, *ignored): # accel_group, window, key, modifiers):
 
241
    def _search_by_line(self, accel_group, window, key, modifiers):
246
242
        self._search.show_for('line')
247
243
        self._search.set_target(self.annoview, LINE_NUM_COL)
248
244
 
260
256
            else:
261
257
                tree2 = repository.revision_tree(NULL_REVISION)
262
258
        from bzrlib.plugins.gtk.diff import DiffWindow
263
 
        window = DiffWindow(self)
 
259
        window = DiffWindow()
264
260
        window.set_diff("Diff for line %d" % (row+1), tree1, tree2)
265
261
        window.set_file(tree1.id2path(self.file_id))
266
262
        window.show()
318
314
        col.add_attribute(cell, "text", TEXT_LINE_COL)
319
315
        tv.append_column(col)
320
316
 
321
 
        # interactive substring search
322
 
        def search_equal_func(model, column, key, iter):
323
 
            return model.get_value(iter, TEXT_LINE_COL).lower().find(key.lower()) == -1
324
 
 
325
 
        tv.set_enable_search(True)
326
 
        tv.set_search_equal_func(search_equal_func)
 
317
        # FIXME: Now that C-f is now used for search by text we
 
318
        # may as well disable the auto search.
 
319
        tv.set_search_column(LINE_NUM_COL)
327
320
 
328
321
        return tv
329
322
 
351
344
        button.set_sensitive(False)
352
345
        return button
353
346
 
354
 
    def _create_find_button(self):
355
 
        button = gtk.Button()
356
 
        button.set_use_stock(True)
357
 
        button.set_label("gtk-find")
358
 
        button.set_tooltip_text("Search for text (Ctrl+F)")
359
 
        button.connect("clicked", self._search_by_text)
360
 
        button.set_relief(gtk.RELIEF_NONE)
361
 
        button.show()
362
 
        button.set_sensitive(True)
363
 
        return button
364
 
 
365
 
    def _create_goto_button(self):
366
 
        button = gtk.Button()
367
 
        button.set_label("Goto Line")
368
 
        button.set_tooltip_text("Scroll to a line by entering its number (Ctrl+G)")
369
 
        button.connect("clicked", self._search_by_line)
370
 
        button.set_relief(gtk.RELIEF_NONE)
371
 
        button.show()
372
 
        button.set_sensitive(True)
373
 
        return button
374
 
 
375
347
    def go_back(self):
376
348
        last_tree = self.tree
377
349
        rev_id = self._selected_revision()
417
389
                return j - i
418
390
 
419
391
 
420
 
class FakeRevision(object):
 
392
class FakeRevision:
421
393
    """ A fake revision.
422
394
 
423
395
    For when a revision is referenced but not present.
432
404
        self.timezone = 0
433
405
        self.properties = {}
434
406
 
435
 
    def get_apparent_authors(self):
436
 
        return [self.committer]
 
407
    def get_apparent_author(self):
 
408
        return self.committer
437
409
 
438
410
 
439
411
class RevisionCache(object):
440
412
    """A caching revision source"""
441
 
 
442
413
    def __init__(self, real_source, seed_cache=None):
443
414
        self.__real_source = real_source
444
415
        if seed_cache is None:
535
506
 
536
507
    def _match(self, model, iterator, column):
537
508
        matching_case = self._match_case.get_active()
538
 
        cell_value, = model.get(iterator, column)
 
509
        string, = model.get(iterator, column)
539
510
        key = self._entry.get_text()
540
 
        if column == LINE_NUM_COL:
541
 
            # FIXME: For goto-line there are faster algorithms than searching 
542
 
            # every line til we find the right one! -- mbp 2011-01-27
543
 
            return key.strip() == str(cell_value)
544
 
        elif self._regexp.get_active():
 
511
        if self._regexp.get_active():
545
512
            if matching_case:
546
 
                match = re.compile(key).search(cell_value, 1)
 
513
                match = re.compile(key).search(string, 1)
547
514
            else:
548
 
                match = re.compile(key, re.I).search(cell_value, 1)
 
515
                match = re.compile(key, re.I).search(string, 1)
549
516
        else:
550
517
            if not matching_case:
551
 
                cell_value = cell_value.lower()
 
518
                string = string.lower()
552
519
                key = key.lower()
553
 
            match = cell_value.find(key) != -1
 
520
            match = string.find(key) != -1
554
521
 
555
522
        return match
556
523