/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 revisionview.py

  • Committer: Jelmer Vernooij
  • Date: 2011-12-11 17:14:12 UTC
  • Revision ID: jelmer@samba.org-20111211171412-cgcn0yas3zlcahzg
StartĀ onĀ 0.104.0.

Show diffs side-by-side

added added

removed removed

Lines of Context:
15
15
# along with this program; if not, write to the Free Software
16
16
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
17
17
 
18
 
import pygtk
19
 
pygtk.require("2.0")
20
 
import gtk
21
 
import pango
22
 
import gobject
 
18
from gi.repository import Gtk
 
19
from gi.repository import Pango
 
20
from gi.repository import GObject
23
21
import webbrowser
24
22
 
 
23
from bzrlib import trace
25
24
from bzrlib.osutils import format_date
26
 
from bzrlib.util.bencode import bdecode
 
25
try:
 
26
    from bzrlib.bencode import bdecode
 
27
except ImportError:
 
28
    from bzrlib.util.bencode import bdecode
27
29
from bzrlib.testament import Testament
28
30
 
29
31
from bzrlib.plugins.gtk import icon_path
30
32
 
 
33
from bzrlib.plugins.gtk.avatarsbox import AvatarsBox
 
34
 
31
35
try:
32
36
    from bzrlib.plugins.gtk import seahorse
33
37
except ImportError:
47
51
            webbrowser._tryorder.insert(0, '%s "%%s"' % cmd)
48
52
    webbrowser.open(uri)
49
53
 
50
 
gtk.link_button_set_uri_hook(_open_link)
51
54
 
52
 
class BugsTab(gtk.VBox):
 
55
class BugsTab(Gtk.VBox):
53
56
 
54
57
    def __init__(self):
55
 
        super(BugsTab, self).__init__(False, 6)
56
 
    
57
 
        table = gtk.Table(rows=2, columns=2)
 
58
        super(BugsTab, self).__init__(homogeneous=False, spacing=6)
 
59
 
 
60
        table = Gtk.Table(rows=2, columns=2)
58
61
 
59
62
        table.set_row_spacings(6)
60
63
        table.set_col_spacing(0, 16)
61
64
 
62
 
        image = gtk.Image()
 
65
        image = Gtk.Image()
63
66
        image.set_from_file(icon_path("bug.png"))
64
 
        table.attach(image, 0, 1, 0, 1, gtk.FILL)
 
67
        table.attach(image, 0, 1, 0, 1, Gtk.AttachOptions.FILL)
65
68
 
66
 
        align = gtk.Alignment(0.0, 0.1)
67
 
        self.label = gtk.Label()
 
69
        align = Gtk.Alignment.new(0.0, 0.1, 0, 0)
 
70
        self.label = Gtk.Label()
68
71
        align.add(self.label)
69
 
        table.attach(align, 1, 2, 0, 1, gtk.FILL)
 
72
        table.attach(align, 1, 2, 0, 1, Gtk.AttachOptions.FILL)
70
73
 
71
74
        treeview = self.construct_treeview()
72
 
        table.attach(treeview, 1, 2, 1, 2, gtk.FILL | gtk.EXPAND)
 
75
        table.attach(treeview, 1, 2, 1, 2, Gtk.AttachOptions.FILL | Gtk.AttachOptions.EXPAND)
73
76
 
74
77
        self.set_border_width(6)
75
 
        self.pack_start(table, expand=False)
 
78
        self.pack_start(table, False, True, 0)
76
79
 
77
80
        self.clear()
78
81
        self.show_all()
87
90
                (url, status) = bugline.split(" ")
88
91
                if status == "fixed":
89
92
                    self.add_bug(url, status)
90
 
        
 
93
 
91
94
        if self.num_bugs == 0:
92
95
            return
93
96
        elif self.num_bugs == 1:
100
103
                              "%d %s." % (self.num_bugs, label))
101
104
 
102
105
    def construct_treeview(self):
103
 
        self.bugs = gtk.ListStore(gobject.TYPE_STRING, gobject.TYPE_STRING)
104
 
        self.treeview = gtk.TreeView(self.bugs)
 
106
        self.bugs = Gtk.ListStore(GObject.TYPE_STRING, GObject.TYPE_STRING)
 
107
        self.treeview = Gtk.TreeView(model=self.bugs)
105
108
        self.treeview.set_headers_visible(False)
106
109
 
107
 
        uri_column = gtk.TreeViewColumn('Bug URI', gtk.CellRendererText(), text=0)
 
110
        uri_column = Gtk.TreeViewColumn('Bug URI', Gtk.CellRendererText(), text=0)
108
111
        self.treeview.append_column(uri_column)
109
112
 
110
113
        self.treeview.connect('row-activated', self.on_row_activated)
111
114
 
112
 
        win = gtk.ScrolledWindow()
113
 
        win.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
114
 
        win.set_shadow_type(gtk.SHADOW_IN)
 
115
        win = Gtk.ScrolledWindow()
 
116
        win.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC)
 
117
        win.set_shadow_type(Gtk.ShadowType.IN)
115
118
        win.add(self.treeview)
116
119
 
117
120
        return win
136
139
        _open_link(self, uri)
137
140
 
138
141
 
139
 
class SignatureTab(gtk.VBox):
 
142
class SignatureTab(Gtk.VBox):
140
143
 
141
144
    def __init__(self, repository):
142
145
        self.key = None
143
146
        self.revision = None
144
147
        self.repository = repository
145
148
 
146
 
        super(SignatureTab, self).__init__(False, 6)
147
 
        signature_box = gtk.Table(rows=3, columns=3)
 
149
        super(SignatureTab, self).__init__(homogeneous=False, spacing=6)
 
150
        signature_box = Gtk.Table(rows=3, columns=3)
148
151
        signature_box.set_col_spacing(0, 16)
149
152
        signature_box.set_col_spacing(1, 12)
150
153
        signature_box.set_row_spacings(6)
151
154
 
152
 
        self.signature_image = gtk.Image()
153
 
        signature_box.attach(self.signature_image, 0, 1, 0, 1, gtk.FILL)
 
155
        self.signature_image = Gtk.Image()
 
156
        signature_box.attach(self.signature_image, 0, 1, 0, 1, Gtk.AttachOptions.FILL)
154
157
 
155
 
        align = gtk.Alignment(0.0, 0.1)
156
 
        self.signature_label = gtk.Label()
 
158
        align = Gtk.Alignment.new(0.0, 0.1, 0.0, 0.0)
 
159
        self.signature_label = Gtk.Label()
157
160
        align.add(self.signature_label)
158
 
        signature_box.attach(align, 1, 3, 0, 1, gtk.FILL)
 
161
        signature_box.attach(align, 1, 3, 0, 1, Gtk.AttachOptions.FILL)
159
162
 
160
 
        align = gtk.Alignment(0.0, 0.5)
161
 
        self.signature_key_id_label = gtk.Label()
 
163
        align = Gtk.Alignment.new(0.0, 0.5, 0.0, 0.0)
 
164
        self.signature_key_id_label = Gtk.Label()
162
165
        self.signature_key_id_label.set_markup("<b>Key Id:</b>")
163
166
        align.add(self.signature_key_id_label)
164
 
        signature_box.attach(align, 1, 2, 1, 2, gtk.FILL, gtk.FILL)
 
167
        signature_box.attach(align, 1, 2, 1, 2, Gtk.AttachOptions.FILL, Gtk.AttachOptions.FILL)
165
168
 
166
 
        align = gtk.Alignment(0.0, 0.5)
167
 
        self.signature_key_id = gtk.Label()
 
169
        align = Gtk.Alignment.new(0.0, 0.5, 0.0, 0.0)
 
170
        self.signature_key_id = Gtk.Label()
168
171
        self.signature_key_id.set_selectable(True)
169
172
        align.add(self.signature_key_id)
170
 
        signature_box.attach(align, 2, 3, 1, 2, gtk.EXPAND | gtk.FILL, gtk.FILL)
 
173
        signature_box.attach(align, 2, 3, 1, 2, Gtk.AttachOptions.EXPAND | Gtk.AttachOptions.FILL, Gtk.AttachOptions.FILL)
171
174
 
172
 
        align = gtk.Alignment(0.0, 0.5)
173
 
        self.signature_fingerprint_label = gtk.Label()
 
175
        align = Gtk.Alignment.new(0.0, 0.5, 0.0, 0.0)
 
176
        self.signature_fingerprint_label = Gtk.Label()
174
177
        self.signature_fingerprint_label.set_markup("<b>Fingerprint:</b>")
175
178
        align.add(self.signature_fingerprint_label)
176
 
        signature_box.attach(align, 1, 2, 2, 3, gtk.FILL, gtk.FILL)
 
179
        signature_box.attach(align, 1, 2, 2, 3, Gtk.AttachOptions.FILL, Gtk.AttachOptions.FILL)
177
180
 
178
 
        align = gtk.Alignment(0.0, 0.5)
179
 
        self.signature_fingerprint = gtk.Label()
 
181
        align = Gtk.Alignment.new(0.0, 0.5, 0.0, 0.0)
 
182
        self.signature_fingerprint = Gtk.Label()
180
183
        self.signature_fingerprint.set_selectable(True)
181
184
        align.add(self.signature_fingerprint)
182
 
        signature_box.attach(align, 2, 3, 2, 3, gtk.EXPAND | gtk.FILL, gtk.FILL)
 
185
        signature_box.attach(align, 2, 3, 2, 3, Gtk.AttachOptions.EXPAND | Gtk.AttachOptions.FILL, Gtk.AttachOptions.FILL)
183
186
 
184
 
        align = gtk.Alignment(0.0, 0.5)
185
 
        self.signature_trust_label = gtk.Label()
 
187
        align = Gtk.Alignment.new(0.0, 0.5, 0.0, 0.0)
 
188
        self.signature_trust_label = Gtk.Label()
186
189
        self.signature_trust_label.set_markup("<b>Trust:</b>")
187
190
        align.add(self.signature_trust_label)
188
 
        signature_box.attach(align, 1, 2, 3, 4, gtk.FILL, gtk.FILL)
 
191
        signature_box.attach(align, 1, 2, 3, 4, Gtk.AttachOptions.FILL, Gtk.AttachOptions.FILL)
189
192
 
190
 
        align = gtk.Alignment(0.0, 0.5)
191
 
        self.signature_trust = gtk.Label()
 
193
        align = Gtk.Alignment.new(0.0, 0.5, 0.0, 0.0)
 
194
        self.signature_trust = Gtk.Label()
192
195
        self.signature_trust.set_selectable(True)
193
196
        align.add(self.signature_trust)
194
 
        signature_box.attach(align, 2, 3, 3, 4, gtk.EXPAND | gtk.FILL, gtk.FILL)
 
197
        signature_box.attach(align, 2, 3, 3, 4, Gtk.AttachOptions.EXPAND | Gtk.AttachOptions.FILL, Gtk.AttachOptions.FILL)
195
198
 
196
199
        self.set_border_width(6)
197
 
        self.pack_start(signature_box, expand=False)
 
200
        self.pack_start(signature_box, False, True, 0)
198
201
        self.show_all()
199
202
 
200
203
    def set_revision(self, revision):
284
287
        self.signature_trust.set_text('This key is ' + trust_text)
285
288
 
286
289
 
287
 
class RevisionView(gtk.Notebook):
 
290
class RevisionView(Gtk.Notebook):
288
291
    """ Custom widget for commit log details.
289
292
 
290
293
    A variety of bzr tools may need to implement such a thing. This is a
293
296
 
294
297
    __gproperties__ = {
295
298
        'branch': (
296
 
            gobject.TYPE_PYOBJECT,
 
299
            GObject.TYPE_PYOBJECT,
297
300
            'Branch',
298
301
            'The branch holding the revision being displayed',
299
 
            gobject.PARAM_CONSTRUCT_ONLY | gobject.PARAM_WRITABLE
 
302
            GObject.PARAM_CONSTRUCT_ONLY | GObject.PARAM_WRITABLE
300
303
        ),
301
304
 
302
305
        'revision': (
303
 
            gobject.TYPE_PYOBJECT,
 
306
            GObject.TYPE_PYOBJECT,
304
307
            'Revision',
305
308
            'The revision being displayed',
306
 
            gobject.PARAM_READWRITE
 
309
            GObject.PARAM_READWRITE
307
310
        ),
308
311
 
309
312
        'children': (
310
 
            gobject.TYPE_PYOBJECT,
 
313
            GObject.TYPE_PYOBJECT,
311
314
            'Children',
312
315
            'Child revisions',
313
 
            gobject.PARAM_READWRITE
 
316
            GObject.PARAM_READWRITE
314
317
        ),
315
318
 
316
319
        'file-id': (
317
 
            gobject.TYPE_PYOBJECT,
 
320
            GObject.TYPE_PYOBJECT,
318
321
            'File Id',
319
322
            'The file id',
320
 
            gobject.PARAM_READWRITE
 
323
            GObject.PARAM_READWRITE
321
324
        )
322
325
    }
323
326
 
324
327
    def __init__(self, branch=None, repository=None):
325
 
        gtk.Notebook.__init__(self)
 
328
        super(RevisionView, self).__init__()
326
329
 
327
330
        self._revision = None
328
331
        self._branch = branch
330
333
            self._repository = branch.repository
331
334
        else:
332
335
            self._repository = repository
 
336
        self.signature_table = None
333
337
 
334
338
        self._create_general()
335
339
        self._create_relations()
396
400
 
397
401
    def _set_revision(self, revision):
398
402
        if revision is None: return
399
 
 
 
403
        
 
404
        self.avatarsbox.reset()
 
405
        
400
406
        self._revision = revision
401
407
        if revision.committer is not None:
402
408
            self.committer.set_text(revision.committer)
 
409
            self.avatarsbox.add(revision.committer, "committer")
403
410
        else:
404
411
            self.committer.set_text("")
 
412
            self.avatarsbox.hide()
405
413
        author = revision.properties.get('author', '')
 
414
        self.avatarsbox.merge(revision.get_apparent_authors(), "author")
406
415
        if author != '':
407
416
            self.author.set_text(author)
408
417
            self.author.show()
415
424
            self.timestamp.set_text(format_date(revision.timestamp,
416
425
                                                revision.timezone))
417
426
        try:
418
 
            self.branchnick_label.set_text(revision.properties['branch-nick'])
 
427
            self.branchnick.show()
 
428
            self.branchnick_label.show()
 
429
            self.branchnick.set_text(revision.properties['branch-nick'])
419
430
        except KeyError:
420
 
            self.branchnick_label.set_text("")
 
431
            self.branchnick.hide()
 
432
            self.branchnick_label.hide()
421
433
 
422
434
        self._add_parents_or_children(revision.parent_ids,
423
435
                                      self.parents_widgets,
424
436
                                      self.parents_table)
425
 
        
 
437
 
426
438
        file_info = revision.properties.get('file-info', None)
427
439
        if file_info is not None:
428
 
            file_info = bdecode(file_info.encode('UTF-8'))
 
440
            try:
 
441
                file_info = bdecode(file_info.encode('UTF-8'))
 
442
            except ValueError:
 
443
                trace.note('Invalid per-file info for revision:%s, value: %r',
 
444
                           revision.revision_id, file_info)
 
445
                file_info = None
429
446
 
430
447
        if file_info:
431
448
            if self._file_id is None:
456
473
        self._add_tags()
457
474
 
458
475
    def _update_signature(self, widget, param):
 
476
        if not has_seahorse:
 
477
            return
459
478
        if self.get_current_page() == PAGE_SIGNATURE:
460
479
            self.signature_table.set_revision(self._revision)
461
480
 
470
489
                                      self.children_table)
471
490
 
472
491
    def _switch_page_cb(self, notebook, page, page_num):
 
492
        if not has_seahorse:
 
493
            return
473
494
        if page_num == PAGE_SIGNATURE:
474
495
            self.signature_table.set_revision(self._revision)
475
496
 
509
530
        table.resize(max(len(revids), 1), 2)
510
531
 
511
532
        for idx, revid in enumerate(revids):
512
 
            align = gtk.Alignment(0.0, 0.0, 1, 1)
 
533
            align = Gtk.Alignment.new(0.0, 0.0, 1, 1)
513
534
            widgets.append(align)
514
535
            table.attach(align, 1, 2, idx, idx + 1,
515
 
                                      gtk.EXPAND | gtk.FILL, gtk.FILL)
 
536
                                      Gtk.AttachOptions.EXPAND | Gtk.AttachOptions.FILL, Gtk.AttachOptions.FILL)
516
537
            align.show()
517
538
 
518
 
            hbox = gtk.HBox(False, spacing=6)
 
539
            hbox = Gtk.HBox(homogeneous=False, spacing=6)
519
540
            align.add(hbox)
520
541
            hbox.show()
521
542
 
522
 
            image = gtk.Image()
 
543
            image = Gtk.Image()
523
544
            image.set_from_stock(
524
 
                gtk.STOCK_FIND, gtk.ICON_SIZE_SMALL_TOOLBAR)
 
545
                Gtk.STOCK_FIND, Gtk.IconSize.SMALL_TOOLBAR)
525
546
            image.show()
526
547
 
527
548
            if self._show_callback is not None:
528
 
                button = gtk.Button()
 
549
                button = Gtk.Button()
529
550
                button.add(image)
530
551
                button.connect("clicked", self._show_clicked_cb,
531
552
                               self._revision.revision_id, revid)
532
 
                hbox.pack_start(button, expand=False, fill=True)
 
553
                hbox.pack_start(button, False, True, 0)
533
554
                button.show()
534
555
 
535
 
            button = gtk.Button()
536
 
            revid_label = gtk.Label(str(revid))
537
 
            revid_label.set_ellipsize(pango.ELLIPSIZE_MIDDLE)
 
556
            button = Gtk.Button()
 
557
            revid_label = Gtk.Label(label=str(revid))
 
558
            revid_label.set_ellipsize(Pango.EllipsizeMode.MIDDLE)
538
559
            revid_label.set_alignment(0.0, 0.5)
539
560
            button.add(revid_label)
540
561
            button.connect("clicked",
541
 
                    lambda w, r: self.set_revision(self._repository.get_revision(r)), revid)
 
562
                    lambda w, r: self.set_revision(
 
563
                        self._repository.get_revision(r)), revid)
542
564
            button.set_use_underline(False)
543
 
            hbox.pack_start(button, expand=True, fill=True)
 
565
            hbox.pack_start(button, True, True, 0)
544
566
            button.show_all()
545
567
 
546
568
    def _create_general(self):
547
 
        vbox = gtk.VBox(False, 6)
 
569
        vbox = Gtk.VBox(homogeneous=False, spacing=6)
548
570
        vbox.set_border_width(6)
549
 
        vbox.pack_start(self._create_headers(), expand=False, fill=True)
550
 
        vbox.pack_start(self._create_message_view())
551
 
        self.append_page(vbox, tab_label=gtk.Label("General"))
 
571
        vbox.pack_start(self._create_headers(), False, True, 0)
 
572
        vbox.pack_start(self._create_message_view(), True, True, 0)
 
573
        self.append_page(vbox, Gtk.Label(label="General"))
552
574
        vbox.show()
553
575
 
554
576
    def _create_relations(self):
555
 
        vbox = gtk.VBox(False, 6)
 
577
        vbox = Gtk.VBox(homogeneous=False, spacing=6)
556
578
        vbox.set_border_width(6)
557
 
        vbox.pack_start(self._create_parents(), expand=False, fill=True)
558
 
        vbox.pack_start(self._create_children(), expand=False, fill=True)
559
 
        self.append_page(vbox, tab_label=gtk.Label("Relations"))
 
579
        vbox.pack_start(self._create_parents(), False, True, 0)
 
580
        vbox.pack_start(self._create_children(), False, True, 0)
 
581
        self.append_page(vbox, Gtk.Label(label="Relations"))
560
582
        vbox.show()
561
583
 
562
584
    def _create_signature(self):
563
585
        self.signature_table = SignatureTab(self._repository)
564
 
        self.append_page(self.signature_table, tab_label=gtk.Label('Signature'))
 
586
        self.append_page(
 
587
            self.signature_table, Gtk.Label(label='Signature'))
565
588
        self.connect_after('notify::revision', self._update_signature)
566
589
 
567
590
    def _create_headers(self):
568
 
        self.table = gtk.Table(rows=5, columns=2)
 
591
        self.avatarsbox = AvatarsBox()
 
592
        
 
593
        self.table = Gtk.Table(rows=5, columns=2)
569
594
        self.table.set_row_spacings(6)
570
595
        self.table.set_col_spacings(6)
571
596
        self.table.show()
 
597
        
 
598
        self.avatarsbox.pack_start(self.table, True, True, 0)
 
599
        self.avatarsbox.show()
572
600
 
573
601
        row = 0
574
602
 
575
 
        label = gtk.Label()
 
603
        label = Gtk.Label()
576
604
        label.set_alignment(1.0, 0.5)
577
605
        label.set_markup("<b>Revision Id:</b>")
578
 
        self.table.attach(label, 0, 1, row, row+1, gtk.FILL, gtk.FILL)
 
606
        self.table.attach(label, 0, 1, row, row+1, Gtk.AttachOptions.FILL, Gtk.AttachOptions.FILL)
579
607
        label.show()
580
608
 
581
 
        revision_id = gtk.Label()
582
 
        revision_id.set_ellipsize(pango.ELLIPSIZE_MIDDLE)
 
609
        revision_id = Gtk.Label()
 
610
        revision_id.set_ellipsize(Pango.EllipsizeMode.MIDDLE)
583
611
        revision_id.set_alignment(0.0, 0.5)
584
612
        revision_id.set_selectable(True)
585
613
        self.connect('notify::revision', 
586
614
                lambda w, p: revision_id.set_text(self._revision.revision_id))
587
 
        self.table.attach(revision_id, 1, 2, row, row+1, gtk.EXPAND | gtk.FILL, gtk.FILL)
 
615
        self.table.attach(revision_id, 1, 2, row, row+1, Gtk.AttachOptions.EXPAND | Gtk.AttachOptions.FILL, Gtk.AttachOptions.FILL)
588
616
        revision_id.show()
589
617
 
590
618
        row += 1
591
 
        self.author_label = gtk.Label()
 
619
        self.author_label = Gtk.Label()
592
620
        self.author_label.set_alignment(1.0, 0.5)
593
621
        self.author_label.set_markup("<b>Author:</b>")
594
 
        self.table.attach(self.author_label, 0, 1, row, row+1, gtk.FILL, gtk.FILL)
 
622
        self.table.attach(self.author_label, 0, 1, row, row+1, Gtk.AttachOptions.FILL, Gtk.AttachOptions.FILL)
595
623
        self.author_label.show()
596
624
 
597
 
        self.author = gtk.Label()
598
 
        self.author.set_ellipsize(pango.ELLIPSIZE_END)
 
625
        self.author = Gtk.Label()
 
626
        self.author.set_ellipsize(Pango.EllipsizeMode.END)
599
627
        self.author.set_alignment(0.0, 0.5)
600
628
        self.author.set_selectable(True)
601
 
        self.table.attach(self.author, 1, 2, row, row+1, gtk.EXPAND | gtk.FILL, gtk.FILL)
 
629
        self.table.attach(self.author, 1, 2, row, row+1, Gtk.AttachOptions.EXPAND | Gtk.AttachOptions.FILL, Gtk.AttachOptions.FILL)
602
630
        self.author.show()
603
631
        self.author.hide()
604
632
 
605
633
        row += 1
606
 
        label = gtk.Label()
 
634
        label = Gtk.Label()
607
635
        label.set_alignment(1.0, 0.5)
608
636
        label.set_markup("<b>Committer:</b>")
609
 
        self.table.attach(label, 0, 1, row, row+1, gtk.FILL, gtk.FILL)
 
637
        self.table.attach(label, 0, 1, row, row+1, Gtk.AttachOptions.FILL, Gtk.AttachOptions.FILL)
610
638
        label.show()
611
639
 
612
 
        self.committer = gtk.Label()
613
 
        self.committer.set_ellipsize(pango.ELLIPSIZE_END)
 
640
        self.committer = Gtk.Label()
 
641
        self.committer.set_ellipsize(Pango.EllipsizeMode.END)
614
642
        self.committer.set_alignment(0.0, 0.5)
615
643
        self.committer.set_selectable(True)
616
 
        self.table.attach(self.committer, 1, 2, row, row+1, gtk.EXPAND | gtk.FILL, gtk.FILL)
 
644
        self.table.attach(self.committer, 1, 2, row, row+1, Gtk.AttachOptions.EXPAND | Gtk.AttachOptions.FILL, Gtk.AttachOptions.FILL)
617
645
        self.committer.show()
618
646
 
619
647
        row += 1
620
 
        label = gtk.Label()
621
 
        label.set_alignment(1.0, 0.5)
622
 
        label.set_markup("<b>Branch nick:</b>")
623
 
        self.table.attach(label, 0, 1, row, row+1, gtk.FILL, gtk.FILL)
624
 
        label.show()
625
 
 
626
 
        self.branchnick_label = gtk.Label()
627
 
        self.branchnick_label.set_ellipsize(pango.ELLIPSIZE_MIDDLE)
628
 
        self.branchnick_label.set_alignment(0.0, 0.5)
629
 
        self.branchnick_label.set_selectable(True)
630
 
        self.table.attach(self.branchnick_label, 1, 2, row, row+1, gtk.EXPAND | gtk.FILL, gtk.FILL)
 
648
        self.branchnick_label = Gtk.Label()
 
649
        self.branchnick_label.set_alignment(1.0, 0.5)
 
650
        self.branchnick_label.set_markup("<b>Branch nick:</b>")
 
651
        self.table.attach(self.branchnick_label, 0, 1, row, row+1, Gtk.AttachOptions.FILL, Gtk.AttachOptions.FILL)
631
652
        self.branchnick_label.show()
632
653
 
 
654
        self.branchnick = Gtk.Label()
 
655
        self.branchnick.set_ellipsize(Pango.EllipsizeMode.MIDDLE)
 
656
        self.branchnick.set_alignment(0.0, 0.5)
 
657
        self.branchnick.set_selectable(True)
 
658
        self.table.attach(self.branchnick, 1, 2, row, row+1, Gtk.AttachOptions.EXPAND | Gtk.AttachOptions.FILL, Gtk.AttachOptions.FILL)
 
659
        self.branchnick.show()
 
660
 
633
661
        row += 1
634
 
        label = gtk.Label()
 
662
        label = Gtk.Label()
635
663
        label.set_alignment(1.0, 0.5)
636
664
        label.set_markup("<b>Timestamp:</b>")
637
 
        self.table.attach(label, 0, 1, row, row+1, gtk.FILL, gtk.FILL)
 
665
        self.table.attach(label, 0, 1, row, row+1, Gtk.AttachOptions.FILL, Gtk.AttachOptions.FILL)
638
666
        label.show()
639
667
 
640
 
        self.timestamp = gtk.Label()
641
 
        self.timestamp.set_ellipsize(pango.ELLIPSIZE_END)
 
668
        self.timestamp = Gtk.Label()
 
669
        self.timestamp.set_ellipsize(Pango.EllipsizeMode.END)
642
670
        self.timestamp.set_alignment(0.0, 0.5)
643
671
        self.timestamp.set_selectable(True)
644
 
        self.table.attach(self.timestamp, 1, 2, row, row+1, gtk.EXPAND | gtk.FILL, gtk.FILL)
 
672
        self.table.attach(self.timestamp, 1, 2, row, row+1, Gtk.AttachOptions.EXPAND | Gtk.AttachOptions.FILL, Gtk.AttachOptions.FILL)
645
673
        self.timestamp.show()
646
674
 
647
675
        row += 1
648
 
        self.tags_label = gtk.Label()
 
676
        self.tags_label = Gtk.Label()
649
677
        self.tags_label.set_alignment(1.0, 0.5)
650
678
        self.tags_label.set_markup("<b>Tags:</b>")
651
 
        self.table.attach(self.tags_label, 0, 1, row, row+1, gtk.FILL, gtk.FILL)
 
679
        self.table.attach(self.tags_label, 0, 1, row, row+1, Gtk.AttachOptions.FILL, Gtk.AttachOptions.FILL)
652
680
        self.tags_label.show()
653
681
 
654
 
        self.tags_list = gtk.Label()
655
 
        self.tags_list.set_ellipsize(pango.ELLIPSIZE_MIDDLE)
 
682
        self.tags_list = Gtk.Label()
 
683
        self.tags_list.set_ellipsize(Pango.EllipsizeMode.MIDDLE)
656
684
        self.tags_list.set_alignment(0.0, 0.5)
657
 
        self.table.attach(self.tags_list, 1, 2, row, row+1, gtk.EXPAND | gtk.FILL, gtk.FILL)
 
685
        self.table.attach(self.tags_list, 1, 2, row, row+1, Gtk.AttachOptions.EXPAND | Gtk.AttachOptions.FILL, Gtk.AttachOptions.FILL)
658
686
        self.tags_list.show()
659
687
 
660
688
        self.connect('notify::revision', self._add_tags)
661
689
 
662
 
        return self.table
 
690
        return self.avatarsbox
663
691
    
664
692
    def _create_parents(self):
665
 
        hbox = gtk.HBox(True, 3)
 
693
        hbox = Gtk.HBox(homogeneous=True, spacing=3)
666
694
        
667
695
        self.parents_table = self._create_parents_or_children_table(
668
696
            "<b>Parents:</b>")
669
697
        self.parents_widgets = []
670
 
        hbox.pack_start(self.parents_table)
 
698
        hbox.pack_start(self.parents_table, True, True, 0)
671
699
 
672
700
        hbox.show()
673
701
        return hbox
674
702
 
675
703
    def _create_children(self):
676
 
        hbox = gtk.HBox(True, 3)
 
704
        hbox = Gtk.HBox(homogeneous=True, spacing=3)
677
705
        self.children_table = self._create_parents_or_children_table(
678
706
            "<b>Children:</b>")
679
707
        self.children_widgets = []
680
 
        hbox.pack_start(self.children_table)
 
708
        hbox.pack_start(self.children_table, True, True, 0)
681
709
        hbox.show()
682
710
        return hbox
683
711
        
684
712
    def _create_parents_or_children_table(self, text):
685
 
        table = gtk.Table(rows=1, columns=2)
 
713
        table = Gtk.Table(rows=1, columns=2)
686
714
        table.set_row_spacings(3)
687
715
        table.set_col_spacings(6)
688
716
        table.show()
689
717
 
690
 
        label = gtk.Label()
 
718
        label = Gtk.Label()
691
719
        label.set_markup(text)
692
 
        align = gtk.Alignment(0.0, 0.5)
 
720
        align = Gtk.Alignment.new(0.0, 0.5, 0, 0)
693
721
        align.add(label)
694
 
        table.attach(align, 0, 1, 0, 1, gtk.FILL, gtk.FILL)
 
722
        table.attach(align, 0, 1, 0, 1, Gtk.AttachOptions.FILL, Gtk.AttachOptions.FILL)
695
723
        label.show()
696
724
        align.show()
697
725
 
698
726
        return table
699
727
 
700
728
    def _create_message_view(self):
701
 
        msg_buffer = gtk.TextBuffer()
 
729
        msg_buffer = Gtk.TextBuffer()
702
730
        self.connect('notify::revision',
703
731
                lambda w, p: msg_buffer.set_text(self._revision.message))
704
 
        window = gtk.ScrolledWindow()
705
 
        window.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC)
706
 
        window.set_shadow_type(gtk.SHADOW_IN)
707
 
        tv = gtk.TextView(msg_buffer)
 
732
        window = Gtk.ScrolledWindow()
 
733
        window.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC)
 
734
        window.set_shadow_type(Gtk.ShadowType.IN)
 
735
        tv = Gtk.TextView(buffer=msg_buffer)
708
736
        tv.set_editable(False)
709
 
        tv.set_wrap_mode(gtk.WRAP_WORD)
 
737
        tv.set_wrap_mode(Gtk.WrapMode.WORD)
710
738
 
711
 
        tv.modify_font(pango.FontDescription("Monospace"))
 
739
        tv.modify_font(Pango.FontDescription("Monospace"))
712
740
        tv.show()
713
741
        window.add(tv)
714
742
        window.show()
717
745
    def _create_bugs(self):
718
746
        self.bugs_page = BugsTab()
719
747
        self.connect_after('notify::revision', self._update_bugs) 
720
 
        self.append_page(self.bugs_page, tab_label=gtk.Label('Bugs'))
 
748
        self.append_page(self.bugs_page, Gtk.Label(label='Bugs'))
721
749
 
722
750
    def _create_file_info_view(self):
723
 
        self.file_info_box = gtk.VBox(False, 6)
 
751
        self.file_info_box = Gtk.VBox(homogeneous=False, spacing=6)
724
752
        self.file_info_box.set_border_width(6)
725
 
        self.file_info_buffer = gtk.TextBuffer()
726
 
        window = gtk.ScrolledWindow()
727
 
        window.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC)
728
 
        window.set_shadow_type(gtk.SHADOW_IN)
729
 
        tv = gtk.TextView(self.file_info_buffer)
 
753
        self.file_info_buffer = Gtk.TextBuffer()
 
754
        window = Gtk.ScrolledWindow()
 
755
        window.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC)
 
756
        window.set_shadow_type(Gtk.ShadowType.IN)
 
757
        tv = Gtk.TextView(buffer=self.file_info_buffer)
730
758
        tv.set_editable(False)
731
 
        tv.set_wrap_mode(gtk.WRAP_WORD)
732
 
        tv.modify_font(pango.FontDescription("Monospace"))
 
759
        tv.set_wrap_mode(Gtk.WrapMode.WORD)
 
760
        tv.modify_font(Pango.FontDescription("Monospace"))
733
761
        tv.show()
734
762
        window.add(tv)
735
763
        window.show()
736
 
        self.file_info_box.pack_start(window)
 
764
        self.file_info_box.pack_start(window, True, True, 0)
737
765
        self.file_info_box.hide() # Only shown when there are per-file messages
738
 
        self.append_page(self.file_info_box, tab_label=gtk.Label('Per-file'))
 
766
        self.append_page(self.file_info_box, Gtk.Label(label='Per-file'))
739
767