/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: Markus Korn
  • Date: 2009-03-05 16:50:39 UTC
  • mto: (635.2.4 trunk)
  • mto: This revision was merged to the branch mainline in revision 639.
  • Revision ID: thekorn@gmx.de-20090305165039-h6xh48wr9lwe1661
* register BranchSelectionBox() as a gobject type to fix (LP: #294396)

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