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