/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: Curtis Hovey
  • Date: 2011-07-31 15:52:43 UTC
  • mto: This revision was merged to the branch mainline in revision 741.
  • Revision ID: sinzui.is@verizon.net-20110731155243-ln8istmxbryhb4pz
Mechanical changes made by pygi.convert.sh.

Show diffs side-by-side

added added

removed removed

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