/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-11-03 17:32:31 UTC
  • Revision ID: jelmer@samba.org-20111103173231-eipeyfj1udc17gkv
Remove keyring support.

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)
 
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(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)
536
561
            button.connect("clicked",
537
 
                    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)
538
564
            button.set_use_underline(False)
539
 
            hbox.pack_start(button, expand=False, fill=True)
540
 
            button.show()
 
565
            hbox.pack_start(button, True, True, 0)
 
566
            button.show_all()
541
567
 
542
568
    def _create_general(self):
543
 
        vbox = gtk.VBox(False, 6)
 
569
        vbox = Gtk.VBox(homogeneous=False, spacing=6)
544
570
        vbox.set_border_width(6)
545
 
        vbox.pack_start(self._create_headers(), expand=False, fill=True)
546
 
        vbox.pack_start(self._create_message_view())
547
 
        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"))
548
574
        vbox.show()
549
575
 
550
576
    def _create_relations(self):
551
 
        vbox = gtk.VBox(False, 6)
 
577
        vbox = Gtk.VBox(homogeneous=False, spacing=6)
552
578
        vbox.set_border_width(6)
553
 
        vbox.pack_start(self._create_parents(), expand=False, fill=True)
554
 
        vbox.pack_start(self._create_children(), expand=False, fill=True)
555
 
        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"))
556
582
        vbox.show()
557
583
 
558
584
    def _create_signature(self):
559
585
        self.signature_table = SignatureTab(self._repository)
560
 
        self.append_page(self.signature_table, tab_label=gtk.Label('Signature'))
 
586
        self.append_page(
 
587
            self.signature_table, Gtk.Label(label='Signature'))
561
588
        self.connect_after('notify::revision', self._update_signature)
562
589
 
563
590
    def _create_headers(self):
564
 
        self.table = gtk.Table(rows=5, columns=2)
 
591
        self.avatarsbox = AvatarsBox()
 
592
        
 
593
        self.table = Gtk.Table(rows=5, columns=2)
565
594
        self.table.set_row_spacings(6)
566
595
        self.table.set_col_spacings(6)
567
596
        self.table.show()
568
 
 
569
 
        align = gtk.Alignment(1.0, 0.5)
570
 
        label = gtk.Label()
 
597
        
 
598
        self.avatarsbox.pack_start(self.table, True, True, 0)
 
599
        self.avatarsbox.show()
 
600
 
 
601
        row = 0
 
602
 
 
603
        label = Gtk.Label()
 
604
        label.set_alignment(1.0, 0.5)
571
605
        label.set_markup("<b>Revision Id:</b>")
572
 
        align.add(label)
573
 
        self.table.attach(align, 0, 1, 0, 1, gtk.FILL, gtk.FILL)
574
 
        align.show()
 
606
        self.table.attach(label, 0, 1, row, row+1, Gtk.AttachOptions.FILL, Gtk.AttachOptions.FILL)
575
607
        label.show()
576
608
 
577
 
        align = gtk.Alignment(0.0, 0.5)
578
 
        revision_id = gtk.Label()
 
609
        revision_id = Gtk.Label()
 
610
        revision_id.set_ellipsize(Pango.EllipsizeMode.MIDDLE)
 
611
        revision_id.set_alignment(0.0, 0.5)
579
612
        revision_id.set_selectable(True)
580
613
        self.connect('notify::revision', 
581
614
                lambda w, p: revision_id.set_text(self._revision.revision_id))
582
 
        align.add(revision_id)
583
 
        self.table.attach(align, 1, 2, 0, 1, gtk.EXPAND | gtk.FILL, gtk.FILL)
584
 
        align.show()
 
615
        self.table.attach(revision_id, 1, 2, row, row+1, Gtk.AttachOptions.EXPAND | Gtk.AttachOptions.FILL, Gtk.AttachOptions.FILL)
585
616
        revision_id.show()
586
617
 
587
 
        align = gtk.Alignment(1.0, 0.5)
588
 
        self.author_label = gtk.Label()
 
618
        row += 1
 
619
        self.author_label = Gtk.Label()
 
620
        self.author_label.set_alignment(1.0, 0.5)
589
621
        self.author_label.set_markup("<b>Author:</b>")
590
 
        align.add(self.author_label)
591
 
        self.table.attach(align, 0, 1, 1, 2, gtk.FILL, gtk.FILL)
592
 
        align.show()
 
622
        self.table.attach(self.author_label, 0, 1, row, row+1, Gtk.AttachOptions.FILL, Gtk.AttachOptions.FILL)
593
623
        self.author_label.show()
594
624
 
595
 
        align = gtk.Alignment(0.0, 0.5)
596
 
        self.author = gtk.Label()
 
625
        self.author = Gtk.Label()
 
626
        self.author.set_ellipsize(Pango.EllipsizeMode.END)
 
627
        self.author.set_alignment(0.0, 0.5)
597
628
        self.author.set_selectable(True)
598
 
        align.add(self.author)
599
 
        self.table.attach(align, 1, 2, 1, 2, gtk.EXPAND | gtk.FILL, gtk.FILL)
600
 
        align.show()
 
629
        self.table.attach(self.author, 1, 2, row, row+1, Gtk.AttachOptions.EXPAND | Gtk.AttachOptions.FILL, Gtk.AttachOptions.FILL)
601
630
        self.author.show()
602
631
        self.author.hide()
603
632
 
604
 
        align = gtk.Alignment(1.0, 0.5)
605
 
        label = gtk.Label()
 
633
        row += 1
 
634
        label = Gtk.Label()
 
635
        label.set_alignment(1.0, 0.5)
606
636
        label.set_markup("<b>Committer:</b>")
607
 
        align.add(label)
608
 
        self.table.attach(align, 0, 1, 2, 3, gtk.FILL, gtk.FILL)
609
 
        align.show()
 
637
        self.table.attach(label, 0, 1, row, row+1, Gtk.AttachOptions.FILL, Gtk.AttachOptions.FILL)
610
638
        label.show()
611
639
 
612
 
        align = gtk.Alignment(0.0, 0.5)
613
 
        self.committer = gtk.Label()
 
640
        self.committer = Gtk.Label()
 
641
        self.committer.set_ellipsize(Pango.EllipsizeMode.END)
 
642
        self.committer.set_alignment(0.0, 0.5)
614
643
        self.committer.set_selectable(True)
615
 
        align.add(self.committer)
616
 
        self.table.attach(align, 1, 2, 2, 3, gtk.EXPAND | gtk.FILL, gtk.FILL)
617
 
        align.show()
 
644
        self.table.attach(self.committer, 1, 2, row, row+1, Gtk.AttachOptions.EXPAND | Gtk.AttachOptions.FILL, Gtk.AttachOptions.FILL)
618
645
        self.committer.show()
619
646
 
620
 
        align = gtk.Alignment(0.0, 0.5)
621
 
        label = gtk.Label()
622
 
        label.set_markup("<b>Branch nick:</b>")
623
 
        align.add(label)
624
 
        self.table.attach(align, 0, 1, 3, 4, gtk.FILL, gtk.FILL)
625
 
        label.show()
626
 
        align.show()
627
 
 
628
 
        align = gtk.Alignment(0.0, 0.5)
629
 
        self.branchnick_label = gtk.Label()
630
 
        self.branchnick_label.set_selectable(True)
631
 
        align.add(self.branchnick_label)
632
 
        self.table.attach(align, 1, 2, 3, 4, gtk.EXPAND | gtk.FILL, gtk.FILL)
 
647
        row += 1
 
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)
633
652
        self.branchnick_label.show()
634
 
        align.show()
635
 
 
636
 
        align = gtk.Alignment(1.0, 0.5)
637
 
        label = gtk.Label()
 
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
 
 
661
        row += 1
 
662
        label = Gtk.Label()
 
663
        label.set_alignment(1.0, 0.5)
638
664
        label.set_markup("<b>Timestamp:</b>")
639
 
        align.add(label)
640
 
        self.table.attach(align, 0, 1, 4, 5, gtk.FILL, gtk.FILL)
641
 
        align.show()
 
665
        self.table.attach(label, 0, 1, row, row+1, Gtk.AttachOptions.FILL, Gtk.AttachOptions.FILL)
642
666
        label.show()
643
667
 
644
 
        align = gtk.Alignment(0.0, 0.5)
645
 
        self.timestamp = gtk.Label()
 
668
        self.timestamp = Gtk.Label()
 
669
        self.timestamp.set_ellipsize(Pango.EllipsizeMode.END)
 
670
        self.timestamp.set_alignment(0.0, 0.5)
646
671
        self.timestamp.set_selectable(True)
647
 
        align.add(self.timestamp)
648
 
        self.table.attach(align, 1, 2, 4, 5, gtk.EXPAND | gtk.FILL, gtk.FILL)
649
 
        align.show()
 
672
        self.table.attach(self.timestamp, 1, 2, row, row+1, Gtk.AttachOptions.EXPAND | Gtk.AttachOptions.FILL, Gtk.AttachOptions.FILL)
650
673
        self.timestamp.show()
651
674
 
652
 
        align = gtk.Alignment(1.0, 0.5)
653
 
        self.tags_label = gtk.Label()
 
675
        row += 1
 
676
        self.tags_label = Gtk.Label()
 
677
        self.tags_label.set_alignment(1.0, 0.5)
654
678
        self.tags_label.set_markup("<b>Tags:</b>")
655
 
        align.add(self.tags_label)
656
 
        align.show()
657
 
        self.table.attach(align, 0, 1, 5, 6, gtk.FILL, gtk.FILL)
 
679
        self.table.attach(self.tags_label, 0, 1, row, row+1, Gtk.AttachOptions.FILL, Gtk.AttachOptions.FILL)
658
680
        self.tags_label.show()
659
681
 
660
 
        align = gtk.Alignment(0.0, 0.5)
661
 
        self.tags_list = gtk.Label()
662
 
        align.add(self.tags_list)
663
 
        self.table.attach(align, 1, 2, 5, 6, gtk.EXPAND | gtk.FILL, gtk.FILL)
664
 
        align.show()
 
682
        self.tags_list = Gtk.Label()
 
683
        self.tags_list.set_ellipsize(Pango.EllipsizeMode.MIDDLE)
 
684
        self.tags_list.set_alignment(0.0, 0.5)
 
685
        self.table.attach(self.tags_list, 1, 2, row, row+1, Gtk.AttachOptions.EXPAND | Gtk.AttachOptions.FILL, Gtk.AttachOptions.FILL)
665
686
        self.tags_list.show()
666
687
 
667
688
        self.connect('notify::revision', self._add_tags)
668
689
 
669
 
        return self.table
 
690
        return self.avatarsbox
670
691
    
671
692
    def _create_parents(self):
672
 
        hbox = gtk.HBox(True, 3)
 
693
        hbox = Gtk.HBox(homogeneous=True, spacing=3)
673
694
        
674
695
        self.parents_table = self._create_parents_or_children_table(
675
696
            "<b>Parents:</b>")
676
697
        self.parents_widgets = []
677
 
        hbox.pack_start(self.parents_table)
 
698
        hbox.pack_start(self.parents_table, True, True, 0)
678
699
 
679
700
        hbox.show()
680
701
        return hbox
681
702
 
682
703
    def _create_children(self):
683
 
        hbox = gtk.HBox(True, 3)
 
704
        hbox = Gtk.HBox(homogeneous=True, spacing=3)
684
705
        self.children_table = self._create_parents_or_children_table(
685
706
            "<b>Children:</b>")
686
707
        self.children_widgets = []
687
 
        hbox.pack_start(self.children_table)
 
708
        hbox.pack_start(self.children_table, True, True, 0)
688
709
        hbox.show()
689
710
        return hbox
690
711
        
691
712
    def _create_parents_or_children_table(self, text):
692
 
        table = gtk.Table(rows=1, columns=2)
 
713
        table = Gtk.Table(rows=1, columns=2)
693
714
        table.set_row_spacings(3)
694
715
        table.set_col_spacings(6)
695
716
        table.show()
696
717
 
697
 
        label = gtk.Label()
 
718
        label = Gtk.Label()
698
719
        label.set_markup(text)
699
 
        align = gtk.Alignment(0.0, 0.5)
 
720
        align = Gtk.Alignment.new(0.0, 0.5, 0, 0)
700
721
        align.add(label)
701
 
        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)
702
723
        label.show()
703
724
        align.show()
704
725
 
705
726
        return table
706
727
 
707
728
    def _create_message_view(self):
708
 
        msg_buffer = gtk.TextBuffer()
 
729
        msg_buffer = Gtk.TextBuffer()
709
730
        self.connect('notify::revision',
710
731
                lambda w, p: msg_buffer.set_text(self._revision.message))
711
 
        window = gtk.ScrolledWindow()
712
 
        window.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC)
713
 
        window.set_shadow_type(gtk.SHADOW_IN)
714
 
        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)
715
736
        tv.set_editable(False)
716
 
        tv.set_wrap_mode(gtk.WRAP_WORD)
 
737
        tv.set_wrap_mode(Gtk.WrapMode.WORD)
717
738
 
718
 
        tv.modify_font(pango.FontDescription("Monospace"))
 
739
        tv.modify_font(Pango.FontDescription("Monospace"))
719
740
        tv.show()
720
741
        window.add(tv)
721
742
        window.show()
724
745
    def _create_bugs(self):
725
746
        self.bugs_page = BugsTab()
726
747
        self.connect_after('notify::revision', self._update_bugs) 
727
 
        self.append_page(self.bugs_page, tab_label=gtk.Label('Bugs'))
 
748
        self.append_page(self.bugs_page, Gtk.Label(label='Bugs'))
728
749
 
729
750
    def _create_file_info_view(self):
730
 
        self.file_info_box = gtk.VBox(False, 6)
 
751
        self.file_info_box = Gtk.VBox(homogeneous=False, spacing=6)
731
752
        self.file_info_box.set_border_width(6)
732
 
        self.file_info_buffer = gtk.TextBuffer()
733
 
        window = gtk.ScrolledWindow()
734
 
        window.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC)
735
 
        window.set_shadow_type(gtk.SHADOW_IN)
736
 
        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)
737
758
        tv.set_editable(False)
738
 
        tv.set_wrap_mode(gtk.WRAP_WORD)
739
 
        tv.modify_font(pango.FontDescription("Monospace"))
 
759
        tv.set_wrap_mode(Gtk.WrapMode.WORD)
 
760
        tv.modify_font(Pango.FontDescription("Monospace"))
740
761
        tv.show()
741
762
        window.add(tv)
742
763
        window.show()
743
 
        self.file_info_box.pack_start(window)
 
764
        self.file_info_box.pack_start(window, True, True, 0)
744
765
        self.file_info_box.hide() # Only shown when there are per-file messages
745
 
        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'))
746
767