/b-gtk/fix-viz

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/b-gtk/fix-viz
0.1.1 by Dan Loda
First working version of xannotate.
1
# Copyright (C) 2005 Dan Loda <danloda@gmail.com>
175 by Jelmer Vernooij
Add very simple gmissing command.
2
# Copyright (C) 2007 Jelmer Vernooij <jelmer@samba.org>
0.1.1 by Dan Loda
First working version of xannotate.
3
4
# This program is free software; you can redistribute it and/or modify
5
# it under the terms of the GNU General Public License as published by
6
# the Free Software Foundation; either version 2 of the License, or
7
# (at your option) any later version.
8
9
# This program is distributed in the hope that it will be useful,
10
# but WITHOUT ANY WARRANTY; without even the implied warranty of
11
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12
# GNU General Public License for more details.
13
14
# You should have received a copy of the GNU General Public License
15
# along with this program; if not, write to the Free Software
16
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
17
734.1.1 by Curtis Hovey
Mechanical changes made by pygi.convert.sh.
18
from gi.repository import Gtk
19
from gi.repository import Pango
20
from gi.repository import GObject
496.1.1 by Sabin Iacob (m0n5t3r)
use webbrowser.open instead of the debian-specific sensible-browser
21
import webbrowser
0.1.1 by Dan Loda
First working version of xannotate.
22
622.1.2 by John Arbash Meinel
Add tests of RevisionView that it can handle broken file-info properties.
23
from bzrlib import trace
0.1.1 by Dan Loda
First working version of xannotate.
24
from bzrlib.osutils import format_date
645 by Jelmer Vernooij
Fix more bencode imports.
25
try:
646 by Jelmer Vernooij
Reorder bencode imports, prefer the new location to prevent deprecation warnings.
26
    from bzrlib.bencode import bdecode
27
except ImportError:
645 by Jelmer Vernooij
Fix more bencode imports.
28
    from bzrlib.util.bencode import bdecode
511.1.3 by Jelmer Vernooij
Make sure signed testament matches repository data.
29
from bzrlib.testament import Testament
30
31
from bzrlib.plugins.gtk import icon_path
0.1.1 by Dan Loda
First working version of xannotate.
32
719.2.1 by zedtux
Added committers and authors avatars from Gravatar (urllib2 version)
33
from bzrlib.plugins.gtk.avatarsbox import AvatarsBox
34
399.3.27 by Daniel Schierbeck
Only show Signature tab if DBus and Seahorse are installed.
35
try:
399.3.29 by Daniel Schierbeck
Renamed the crypt module to seahorse.
36
    from bzrlib.plugins.gtk import seahorse
498.1.2 by Elliot Murphy
Trying to fix bug 107169 so that visualize can be used even if there are DBus problems which prevent seahorse from being loaded
37
except ImportError:
399.3.29 by Daniel Schierbeck
Renamed the crypt module to seahorse.
38
    has_seahorse = False
399.3.27 by Daniel Schierbeck
Only show Signature tab if DBus and Seahorse are installed.
39
else:
399.3.29 by Daniel Schierbeck
Renamed the crypt module to seahorse.
40
    has_seahorse = True
399.3.27 by Daniel Schierbeck
Only show Signature tab if DBus and Seahorse are installed.
41
450.1.19 by Daniel Schierbeck
Made sure the Signature page only gets updated when it is selected.
42
PAGE_GENERAL = 0
43
PAGE_RELATIONS = 1
44
PAGE_SIGNATURE = 2
45
PAGE_BUGS = 3
46
496.1.2 by Sabin Iacob (m0n5t3r)
also try xdg-open and sensible-browser
47
423.14.2 by Jelmer Vernooij
Move bugs tab to separate widget.
48
def _open_link(widget, uri):
498.2.1 by Sabin Iacob (m0n5t3r)
fix the browser opening code to work with python 2.4
49
    for cmd in ['sensible-browser', 'xdg-open']:
50
        if webbrowser._iscommand(cmd):
498.2.3 by Sabin Iacob (m0n5t3r)
fix typo, it actually works now
51
            webbrowser._tryorder.insert(0, '%s "%%s"' % cmd)
496.1.1 by Sabin Iacob (m0n5t3r)
use webbrowser.open instead of the debian-specific sensible-browser
52
    webbrowser.open(uri)
423.14.2 by Jelmer Vernooij
Move bugs tab to separate widget.
53
734.1.6 by Curtis Hovey
Added a very rough fix to see gannontation.
54
if getattr(Gtk, 'link_button_set_uri_hook', None) is not None:
734.1.1 by Curtis Hovey
Mechanical changes made by pygi.convert.sh.
55
    Gtk.link_button_set_uri_hook(_open_link)
423.14.2 by Jelmer Vernooij
Move bugs tab to separate widget.
56
734.1.1 by Curtis Hovey
Mechanical changes made by pygi.convert.sh.
57
class BugsTab(Gtk.VBox):
399.3.1 by Daniel Schierbeck
Made the key id label disappear when the revision is not signed.
58
423.14.2 by Jelmer Vernooij
Move bugs tab to separate widget.
59
    def __init__(self):
734.1.6 by Curtis Hovey
Added a very rough fix to see gannontation.
60
        super(BugsTab, self).__init__(homogeneous=False, spacing=6)
671.2.1 by Vincent Ladeuil
Ensure compatibility with PyGtk-2.8.
61
734.1.1 by Curtis Hovey
Mechanical changes made by pygi.convert.sh.
62
        table = Gtk.Table(rows=2, columns=2)
450.6.1 by Daniel Schierbeck
Made bug tab prettier.
63
64
        table.set_row_spacings(6)
450.6.7 by Daniel Schierbeck
Improved spacing in the bugs page.
65
        table.set_col_spacing(0, 16)
450.6.1 by Daniel Schierbeck
Made bug tab prettier.
66
734.1.1 by Curtis Hovey
Mechanical changes made by pygi.convert.sh.
67
        image = Gtk.Image()
450.6.1 by Daniel Schierbeck
Made bug tab prettier.
68
        image.set_from_file(icon_path("bug.png"))
734.1.1 by Curtis Hovey
Mechanical changes made by pygi.convert.sh.
69
        table.attach(image, 0, 1, 0, 1, Gtk.AttachOptions.FILL)
450.6.1 by Daniel Schierbeck
Made bug tab prettier.
70
734.1.6 by Curtis Hovey
Added a very rough fix to see gannontation.
71
        align = Gtk.Alignment.new(0.0, 0.1, 0, 0)
734.1.1 by Curtis Hovey
Mechanical changes made by pygi.convert.sh.
72
        self.label = Gtk.Label()
450.6.12 by Daniel Schierbeck
Changed Bugs page labels.
73
        align.add(self.label)
734.1.1 by Curtis Hovey
Mechanical changes made by pygi.convert.sh.
74
        table.attach(align, 1, 2, 0, 1, Gtk.AttachOptions.FILL)
450.6.1 by Daniel Schierbeck
Made bug tab prettier.
75
76
        treeview = self.construct_treeview()
734.1.1 by Curtis Hovey
Mechanical changes made by pygi.convert.sh.
77
        table.attach(treeview, 1, 2, 1, 2, Gtk.AttachOptions.FILL | Gtk.AttachOptions.EXPAND)
450.6.1 by Daniel Schierbeck
Made bug tab prettier.
78
79
        self.set_border_width(6)
734.1.1 by Curtis Hovey
Mechanical changes made by pygi.convert.sh.
80
        self.pack_start(table, False, True, 0)
450.6.1 by Daniel Schierbeck
Made bug tab prettier.
81
450.6.12 by Daniel Schierbeck
Changed Bugs page labels.
82
        self.clear()
450.6.11 by Daniel Schierbeck
Made Bugs page always visible, but only sensitive when the revision has bug associations.
83
        self.show_all()
450.6.1 by Daniel Schierbeck
Made bug tab prettier.
84
450.6.4 by Daniel Schierbeck
Moved bug parsing code into the bug page itself.
85
    def set_revision(self, revision):
86
        if revision is None:
87
            return
88
89
        self.clear()
450.6.5 by Daniel Schierbeck
Simplified bug parsing.
90
        bugs_text = revision.properties.get('bugs', '')
91
        for bugline in bugs_text.splitlines():
450.6.4 by Daniel Schierbeck
Moved bug parsing code into the bug page itself.
92
                (url, status) = bugline.split(" ")
450.6.10 by Daniel Schierbeck
Only show fixed bugs in Bugs page.
93
                if status == "fixed":
94
                    self.add_bug(url, status)
724 by Jelmer Vernooij
Fix formatting, imports.
95
450.6.12 by Daniel Schierbeck
Changed Bugs page labels.
96
        if self.num_bugs == 0:
97
            return
98
        elif self.num_bugs == 1:
99
            label = "bug"
100
        else:
101
            label = "bugs"
102
103
        self.label.set_markup("<b>Bugs fixed</b>\n" +
104
                              "This revision claims to fix " +
105
                              "%d %s." % (self.num_bugs, label))
450.6.4 by Daniel Schierbeck
Moved bug parsing code into the bug page itself.
106
450.6.1 by Daniel Schierbeck
Made bug tab prettier.
107
    def construct_treeview(self):
734.1.1 by Curtis Hovey
Mechanical changes made by pygi.convert.sh.
108
        self.bugs = Gtk.ListStore(GObject.TYPE_STRING, GObject.TYPE_STRING)
734.1.6 by Curtis Hovey
Added a very rough fix to see gannontation.
109
        self.treeview = Gtk.TreeView(model=self.bugs)
450.6.8 by Daniel Schierbeck
Removed status column from bug table.
110
        self.treeview.set_headers_visible(False)
450.6.1 by Daniel Schierbeck
Made bug tab prettier.
111
734.1.1 by Curtis Hovey
Mechanical changes made by pygi.convert.sh.
112
        uri_column = Gtk.TreeViewColumn('Bug URI', Gtk.CellRendererText(), text=0)
450.6.1 by Daniel Schierbeck
Made bug tab prettier.
113
        self.treeview.append_column(uri_column)
114
450.6.9 by Daniel Schierbeck
Made it possible to open bugs in the browser.
115
        self.treeview.connect('row-activated', self.on_row_activated)
116
734.1.1 by Curtis Hovey
Mechanical changes made by pygi.convert.sh.
117
        win = Gtk.ScrolledWindow()
118
        win.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC)
119
        win.set_shadow_type(Gtk.ShadowType.IN)
450.6.1 by Daniel Schierbeck
Made bug tab prettier.
120
        win.add(self.treeview)
121
122
        return win
423.14.2 by Jelmer Vernooij
Move bugs tab to separate widget.
123
124
    def clear(self):
450.6.11 by Daniel Schierbeck
Made Bugs page always visible, but only sensitive when the revision has bug associations.
125
        self.num_bugs = 0
450.6.1 by Daniel Schierbeck
Made bug tab prettier.
126
        self.bugs.clear()
450.6.11 by Daniel Schierbeck
Made Bugs page always visible, but only sensitive when the revision has bug associations.
127
        self.set_sensitive(False)
450.6.12 by Daniel Schierbeck
Changed Bugs page labels.
128
        self.label.set_markup("<b>No bugs fixed</b>\n" +
129
                              "This revision does not claim to fix any bugs.")
423.14.2 by Jelmer Vernooij
Move bugs tab to separate widget.
130
131
    def add_bug(self, url, status):
450.6.11 by Daniel Schierbeck
Made Bugs page always visible, but only sensitive when the revision has bug associations.
132
        self.num_bugs += 1
450.6.1 by Daniel Schierbeck
Made bug tab prettier.
133
        self.bugs.append([url, status])
450.6.11 by Daniel Schierbeck
Made Bugs page always visible, but only sensitive when the revision has bug associations.
134
        self.set_sensitive(True)
135
136
    def get_num_bugs(self):
137
        return self.num_bugs
423.14.2 by Jelmer Vernooij
Move bugs tab to separate widget.
138
450.6.9 by Daniel Schierbeck
Made it possible to open bugs in the browser.
139
    def on_row_activated(self, treeview, path, column):
140
        uri = self.bugs.get_value(self.bugs.get_iter(path), 0)
141
        _open_link(self, uri)
142
423.14.2 by Jelmer Vernooij
Move bugs tab to separate widget.
143
734.1.1 by Curtis Hovey
Mechanical changes made by pygi.convert.sh.
144
class SignatureTab(Gtk.VBox):
399.3.1 by Daniel Schierbeck
Made the key id label disappear when the revision is not signed.
145
399.3.17 by Daniel Schierbeck
Moved signature handling into signature widget.
146
    def __init__(self, repository):
399.3.8 by Daniel Schierbeck
Moved crypt code into a Key class.
147
        self.key = None
399.3.23 by Daniel Schierbeck
Added comparison with revision committer.
148
        self.revision = None
399.3.17 by Daniel Schierbeck
Moved signature handling into signature widget.
149
        self.repository = repository
399.3.8 by Daniel Schierbeck
Moved crypt code into a Key class.
150
734.1.17 by Curtis Hovey
Updated gmissing to gtk3.
151
        super(SignatureTab, self).__init__(homogeneous=False, spacing=6)
734.1.1 by Curtis Hovey
Mechanical changes made by pygi.convert.sh.
152
        signature_box = Gtk.Table(rows=3, columns=3)
399.3.21 by Daniel Schierbeck
Played a bit with the spacings.
153
        signature_box.set_col_spacing(0, 16)
154
        signature_box.set_col_spacing(1, 12)
399.3.19 by Daniel Schierbeck
Increased row spacing in signature tab.
155
        signature_box.set_row_spacings(6)
399.1.15 by Jelmer Vernooij
Move signature tab to a separate class.
156
734.1.1 by Curtis Hovey
Mechanical changes made by pygi.convert.sh.
157
        self.signature_image = Gtk.Image()
158
        signature_box.attach(self.signature_image, 0, 1, 0, 1, Gtk.AttachOptions.FILL)
399.1.15 by Jelmer Vernooij
Move signature tab to a separate class.
159
734.1.17 by Curtis Hovey
Updated gmissing to gtk3.
160
        align = Gtk.Alignment.new(0.0, 0.1, 0.0, 0.0)
734.1.1 by Curtis Hovey
Mechanical changes made by pygi.convert.sh.
161
        self.signature_label = Gtk.Label()
399.3.2 by Daniel Schierbeck
Moved key id label to the right.
162
        align.add(self.signature_label)
734.1.1 by Curtis Hovey
Mechanical changes made by pygi.convert.sh.
163
        signature_box.attach(align, 1, 3, 0, 1, Gtk.AttachOptions.FILL)
399.1.15 by Jelmer Vernooij
Move signature tab to a separate class.
164
734.1.17 by Curtis Hovey
Updated gmissing to gtk3.
165
        align = Gtk.Alignment.new(0.0, 0.5, 0.0, 0.0)
734.1.1 by Curtis Hovey
Mechanical changes made by pygi.convert.sh.
166
        self.signature_key_id_label = Gtk.Label()
399.3.1 by Daniel Schierbeck
Made the key id label disappear when the revision is not signed.
167
        self.signature_key_id_label.set_markup("<b>Key Id:</b>")
168
        align.add(self.signature_key_id_label)
734.1.1 by Curtis Hovey
Mechanical changes made by pygi.convert.sh.
169
        signature_box.attach(align, 1, 2, 1, 2, Gtk.AttachOptions.FILL, Gtk.AttachOptions.FILL)
399.1.15 by Jelmer Vernooij
Move signature tab to a separate class.
170
734.1.17 by Curtis Hovey
Updated gmissing to gtk3.
171
        align = Gtk.Alignment.new(0.0, 0.5, 0.0, 0.0)
734.1.1 by Curtis Hovey
Mechanical changes made by pygi.convert.sh.
172
        self.signature_key_id = Gtk.Label()
399.1.15 by Jelmer Vernooij
Move signature tab to a separate class.
173
        self.signature_key_id.set_selectable(True)
174
        align.add(self.signature_key_id)
734.1.1 by Curtis Hovey
Mechanical changes made by pygi.convert.sh.
175
        signature_box.attach(align, 2, 3, 1, 2, Gtk.AttachOptions.EXPAND | Gtk.AttachOptions.FILL, Gtk.AttachOptions.FILL)
399.1.15 by Jelmer Vernooij
Move signature tab to a separate class.
176
734.1.17 by Curtis Hovey
Updated gmissing to gtk3.
177
        align = Gtk.Alignment.new(0.0, 0.5, 0.0, 0.0)
734.1.1 by Curtis Hovey
Mechanical changes made by pygi.convert.sh.
178
        self.signature_fingerprint_label = Gtk.Label()
399.3.5 by Daniel Schierbeck
Added support for key fingerprints.
179
        self.signature_fingerprint_label.set_markup("<b>Fingerprint:</b>")
180
        align.add(self.signature_fingerprint_label)
734.1.1 by Curtis Hovey
Mechanical changes made by pygi.convert.sh.
181
        signature_box.attach(align, 1, 2, 2, 3, Gtk.AttachOptions.FILL, Gtk.AttachOptions.FILL)
399.3.5 by Daniel Schierbeck
Added support for key fingerprints.
182
734.1.17 by Curtis Hovey
Updated gmissing to gtk3.
183
        align = Gtk.Alignment.new(0.0, 0.5, 0.0, 0.0)
734.1.1 by Curtis Hovey
Mechanical changes made by pygi.convert.sh.
184
        self.signature_fingerprint = Gtk.Label()
399.3.5 by Daniel Schierbeck
Added support for key fingerprints.
185
        self.signature_fingerprint.set_selectable(True)
186
        align.add(self.signature_fingerprint)
734.1.1 by Curtis Hovey
Mechanical changes made by pygi.convert.sh.
187
        signature_box.attach(align, 2, 3, 2, 3, Gtk.AttachOptions.EXPAND | Gtk.AttachOptions.FILL, Gtk.AttachOptions.FILL)
399.3.5 by Daniel Schierbeck
Added support for key fingerprints.
188
734.1.17 by Curtis Hovey
Updated gmissing to gtk3.
189
        align = Gtk.Alignment.new(0.0, 0.5, 0.0, 0.0)
734.1.1 by Curtis Hovey
Mechanical changes made by pygi.convert.sh.
190
        self.signature_trust_label = Gtk.Label()
399.3.21 by Daniel Schierbeck
Played a bit with the spacings.
191
        self.signature_trust_label.set_markup("<b>Trust:</b>")
192
        align.add(self.signature_trust_label)
734.1.1 by Curtis Hovey
Mechanical changes made by pygi.convert.sh.
193
        signature_box.attach(align, 1, 2, 3, 4, Gtk.AttachOptions.FILL, Gtk.AttachOptions.FILL)
399.3.21 by Daniel Schierbeck
Played a bit with the spacings.
194
734.1.17 by Curtis Hovey
Updated gmissing to gtk3.
195
        align = Gtk.Alignment.new(0.0, 0.5, 0.0, 0.0)
734.1.1 by Curtis Hovey
Mechanical changes made by pygi.convert.sh.
196
        self.signature_trust = Gtk.Label()
399.3.6 by Daniel Schierbeck
Added support for key trust.
197
        self.signature_trust.set_selectable(True)
198
        align.add(self.signature_trust)
734.1.1 by Curtis Hovey
Mechanical changes made by pygi.convert.sh.
199
        signature_box.attach(align, 2, 3, 3, 4, Gtk.AttachOptions.EXPAND | Gtk.AttachOptions.FILL, Gtk.AttachOptions.FILL)
399.3.6 by Daniel Schierbeck
Added support for key trust.
200
399.1.15 by Jelmer Vernooij
Move signature tab to a separate class.
201
        self.set_border_width(6)
734.1.1 by Curtis Hovey
Mechanical changes made by pygi.convert.sh.
202
        self.pack_start(signature_box, False, True, 0)
399.1.15 by Jelmer Vernooij
Move signature tab to a separate class.
203
        self.show_all()
204
399.3.17 by Daniel Schierbeck
Moved signature handling into signature widget.
205
    def set_revision(self, revision):
206
        self.revision = revision
207
        revid = revision.revision_id
208
209
        if self.repository.has_signature_for_revision_id(revid):
399.3.30 by Daniel Schierbeck
Fixed some naming issues.
210
            crypttext = self.repository.get_signature_text(revid)
211
            self.show_signature(crypttext)
399.3.17 by Daniel Schierbeck
Moved signature handling into signature widget.
212
        else:
213
            self.show_no_signature()
214
399.1.16 by Jelmer Vernooij
Move logic showing images to the SignatureTab widget.
215
    def show_no_signature(self):
399.3.1 by Daniel Schierbeck
Made the key id label disappear when the revision is not signed.
216
        self.signature_key_id_label.hide()
399.1.16 by Jelmer Vernooij
Move logic showing images to the SignatureTab widget.
217
        self.signature_key_id.set_text("")
399.3.6 by Daniel Schierbeck
Added support for key trust.
218
399.3.5 by Daniel Schierbeck
Added support for key fingerprints.
219
        self.signature_fingerprint_label.hide()
220
        self.signature_fingerprint.set_text("")
399.3.6 by Daniel Schierbeck
Added support for key trust.
221
222
        self.signature_trust_label.hide()
223
        self.signature_trust.set_text("")
224
399.1.19 by Jelmer Vernooij
Add utility function for finding icon paths.
225
        self.signature_image.set_from_file(icon_path("sign-unknown.png"))
399.3.9 by Daniel Schierbeck
Added headings.
226
        self.signature_label.set_markup("<b>Authenticity unknown</b>\n" +
227
                                        "This revision has not been signed.")
399.1.16 by Jelmer Vernooij
Move logic showing images to the SignatureTab widget.
228
399.3.30 by Daniel Schierbeck
Fixed some naming issues.
229
    def show_signature(self, crypttext):
511.1.2 by Jelmer Vernooij
Return cleartext from seahorse module
230
        (cleartext, key) = seahorse.verify(crypttext)
399.3.3 by Daniel Schierbeck
Made the signature code use the Seahorse D-Bus service.
231
511.1.3 by Jelmer Vernooij
Make sure signed testament matches repository data.
232
        assert cleartext is not None
233
234
        inv = self.repository.get_inventory(self.revision.revision_id)
235
        expected_testament = Testament(self.revision, inv).as_short_text()
236
        if expected_testament != cleartext:
237
            self.signature_image.set_from_file(icon_path("sign-bad.png"))
238
            self.signature_label.set_markup("<b>Signature does not match repository data</b>\n" +
239
                        "The signature plaintext is different from the expected testament plaintext.")
240
            return
241
450.5.3 by Daniel Schierbeck
Made the signature checking code not try to discover the signature key.
242
        if key and key.is_available():
399.3.23 by Daniel Schierbeck
Added comparison with revision committer.
243
            if key.is_trusted():
244
                if key.get_display_name() == self.revision.committer:
245
                    self.signature_image.set_from_file(icon_path("sign-ok.png"))
246
                    self.signature_label.set_markup("<b>Authenticity confirmed</b>\n" +
247
                                                    "This revision has been signed with " +
248
                                                    "a trusted key.")
249
                else:
250
                    self.signature_image.set_from_file(icon_path("sign-bad.png"))
251
                    self.signature_label.set_markup("<b>Authenticity cannot be confirmed</b>\n" +
252
                                                    "Revision committer is not the same as signer.")
253
            else:
254
                self.signature_image.set_from_file(icon_path("sign-bad.png"))
255
                self.signature_label.set_markup("<b>Authenticity cannot be confirmed</b>\n" +
256
                                                "This revision has been signed, but the " +
257
                                                "key is not trusted.")
258
        else:
399.3.11 by Daniel Schierbeck
Fixed error with unavailable keys.
259
            self.show_no_signature()
260
            self.signature_image.set_from_file(icon_path("sign-bad.png"))
399.3.13 by Daniel Schierbeck
Changed wording of authenticity heading.
261
            self.signature_label.set_markup("<b>Authenticity cannot be confirmed</b>\n" +
399.3.12 by Daniel Schierbeck
Fixed typo.
262
                                            "Signature key not available.")
399.3.11 by Daniel Schierbeck
Fixed error with unavailable keys.
263
            return
264
399.3.8 by Daniel Schierbeck
Moved crypt code into a Key class.
265
        trust = key.get_trust()
399.3.6 by Daniel Schierbeck
Added support for key trust.
266
399.3.29 by Daniel Schierbeck
Renamed the crypt module to seahorse.
267
        if trust <= seahorse.TRUST_NEVER:
399.3.6 by Daniel Schierbeck
Added support for key trust.
268
            trust_text = 'never trusted'
399.3.29 by Daniel Schierbeck
Renamed the crypt module to seahorse.
269
        elif trust == seahorse.TRUST_UNKNOWN:
399.3.6 by Daniel Schierbeck
Added support for key trust.
270
            trust_text = 'not trusted'
399.3.29 by Daniel Schierbeck
Renamed the crypt module to seahorse.
271
        elif trust == seahorse.TRUST_MARGINAL:
399.3.6 by Daniel Schierbeck
Added support for key trust.
272
            trust_text = 'marginally trusted'
399.3.29 by Daniel Schierbeck
Renamed the crypt module to seahorse.
273
        elif trust == seahorse.TRUST_FULL:
399.3.6 by Daniel Schierbeck
Added support for key trust.
274
            trust_text = 'fully trusted'
399.3.29 by Daniel Schierbeck
Renamed the crypt module to seahorse.
275
        elif trust == seahorse.TRUST_ULTIMATE:
399.3.6 by Daniel Schierbeck
Added support for key trust.
276
            trust_text = 'ultimately trusted'
399.3.5 by Daniel Schierbeck
Added support for key fingerprints.
277
399.3.1 by Daniel Schierbeck
Made the key id label disappear when the revision is not signed.
278
        self.signature_key_id_label.show()
399.3.8 by Daniel Schierbeck
Moved crypt code into a Key class.
279
        self.signature_key_id.set_text(key.get_id())
399.3.5 by Daniel Schierbeck
Added support for key fingerprints.
280
399.3.15 by Daniel Schierbeck
Made the fingerprint label read N/A when no fingerprint is available.
281
        fingerprint = key.get_fingerprint()
282
        if fingerprint == "":
399.3.18 by Daniel Schierbeck
Made empty fingerprint text grey.
283
            fingerprint = '<span foreground="dim grey">N/A</span>'
399.3.15 by Daniel Schierbeck
Made the fingerprint label read N/A when no fingerprint is available.
284
399.3.5 by Daniel Schierbeck
Added support for key fingerprints.
285
        self.signature_fingerprint_label.show()
399.3.18 by Daniel Schierbeck
Made empty fingerprint text grey.
286
        self.signature_fingerprint.set_markup(fingerprint)
399.3.3 by Daniel Schierbeck
Made the signature code use the Seahorse D-Bus service.
287
399.3.6 by Daniel Schierbeck
Added support for key trust.
288
        self.signature_trust_label.show()
289
        self.signature_trust.set_text('This key is ' + trust_text)
399.3.17 by Daniel Schierbeck
Moved signature handling into signature widget.
290
399.1.15 by Jelmer Vernooij
Move signature tab to a separate class.
291
734.1.1 by Curtis Hovey
Mechanical changes made by pygi.convert.sh.
292
class RevisionView(Gtk.Notebook):
0.1.1 by Dan Loda
First working version of xannotate.
293
    """ Custom widget for commit log details.
294
295
    A variety of bzr tools may need to implement such a thing. This is a
296
    start.
297
    """
298
412.1.1 by Daniel Schierbeck
Added branch and revision properties to the revisionview widget.
299
    __gproperties__ = {
300
        'branch': (
734.1.1 by Curtis Hovey
Mechanical changes made by pygi.convert.sh.
301
            GObject.TYPE_PYOBJECT,
412.1.1 by Daniel Schierbeck
Added branch and revision properties to the revisionview widget.
302
            'Branch',
303
            'The branch holding the revision being displayed',
734.1.1 by Curtis Hovey
Mechanical changes made by pygi.convert.sh.
304
            GObject.PARAM_CONSTRUCT_ONLY | GObject.PARAM_WRITABLE
412.1.1 by Daniel Schierbeck
Added branch and revision properties to the revisionview widget.
305
        ),
306
307
        'revision': (
734.1.1 by Curtis Hovey
Mechanical changes made by pygi.convert.sh.
308
            GObject.TYPE_PYOBJECT,
412.1.1 by Daniel Schierbeck
Added branch and revision properties to the revisionview widget.
309
            'Revision',
310
            'The revision being displayed',
734.1.1 by Curtis Hovey
Mechanical changes made by pygi.convert.sh.
311
            GObject.PARAM_READWRITE
412.1.7 by Daniel Schierbeck
Added file-id property to the revisionview.
312
        ),
313
412.1.13 by Daniel Schierbeck
Re-added support for displaying the children of a revision.
314
        'children': (
734.1.1 by Curtis Hovey
Mechanical changes made by pygi.convert.sh.
315
            GObject.TYPE_PYOBJECT,
412.1.13 by Daniel Schierbeck
Re-added support for displaying the children of a revision.
316
            'Children',
317
            'Child revisions',
734.1.1 by Curtis Hovey
Mechanical changes made by pygi.convert.sh.
318
            GObject.PARAM_READWRITE
412.1.13 by Daniel Schierbeck
Re-added support for displaying the children of a revision.
319
        ),
320
412.1.7 by Daniel Schierbeck
Added file-id property to the revisionview.
321
        'file-id': (
734.1.1 by Curtis Hovey
Mechanical changes made by pygi.convert.sh.
322
            GObject.TYPE_PYOBJECT,
412.1.7 by Daniel Schierbeck
Added file-id property to the revisionview.
323
            'File Id',
324
            'The file id',
734.1.1 by Curtis Hovey
Mechanical changes made by pygi.convert.sh.
325
            GObject.PARAM_READWRITE
412.1.1 by Daniel Schierbeck
Added branch and revision properties to the revisionview widget.
326
        )
327
    }
328
471.2.1 by Jelmer Vernooij
Fix gannotate.
329
    def __init__(self, branch=None, repository=None):
734.1.17 by Curtis Hovey
Updated gmissing to gtk3.
330
        Gtk.Notebook.__init__(self)
324.2.4 by Daniel Schierbeck
Added 'Changes' page to logview.
331
399.3.17 by Daniel Schierbeck
Moved signature handling into signature widget.
332
        self._revision = None
333
        self._branch = branch
471.2.1 by Jelmer Vernooij
Fix gannotate.
334
        if branch is not None:
335
            self._repository = branch.repository
336
        else:
337
            self._repository = repository
734.1.17 by Curtis Hovey
Updated gmissing to gtk3.
338
        self.signature_table = None
399.3.17 by Daniel Schierbeck
Moved signature handling into signature widget.
339
324.2.1 by Daniel Schierbeck
Turned the logview into a notebook.
340
        self._create_general()
341
        self._create_relations()
485 by Jelmer Vernooij
Disable signature tab until we actually start verifying the testament.
342
        # Disabled because testaments aren't verified yet:
511.1.1 by Jelmer Vernooij
Re-enable signature showing.
343
        if has_seahorse:
344
            self._create_signature()
278.1.45 by John Arbash Meinel
Switch to a new tab for per-file messages.
345
        self._create_file_info_view()
423.14.1 by Jelmer Vernooij
Add bugs tab to display bug status change metadata.
346
        self._create_bugs()
324.2.9 by Daniel Schierbeck
Made 'General' the default page of the logview.
347
450.1.19 by Daniel Schierbeck
Made sure the Signature page only gets updated when it is selected.
348
        self.set_current_page(PAGE_GENERAL)
450.1.20 by Daniel Schierbeck
Removed usage of lambda expressions as callbacks.
349
        self.connect_after('switch-page', self._switch_page_cb)
324.2.4 by Daniel Schierbeck
Added 'Changes' page to logview.
350
        
147 by Jelmer Vernooij
Remove a bunch of duplicate functionality.
351
        self._show_callback = None
352
        self._clicked_callback = None
0.1.1 by Dan Loda
First working version of xannotate.
353
412.1.9 by Daniel Schierbeck
Removed the use of RevisionView.set_go_callback().
354
        self._revision = None
324.2.4 by Daniel Schierbeck
Added 'Changes' page to logview.
355
        self._branch = branch
356
423.7.4 by Daniel Schierbeck
Made revisionview and branchview update when a tag is added.
357
        self.update_tags()
412.1.2 by Daniel Schierbeck
Moved retrieval of tags into the revisionview itself.
358
278.1.3 by John Arbash Meinel
Have the ability to tell the log view that we only care about a specific file_id.
359
        self.set_file_id(None)
0.1.1 by Dan Loda
First working version of xannotate.
360
412.1.1 by Daniel Schierbeck
Added branch and revision properties to the revisionview widget.
361
    def do_get_property(self, property):
362
        if property.name == 'branch':
363
            return self._branch
364
        elif property.name == 'revision':
365
            return self._revision
412.1.13 by Daniel Schierbeck
Re-added support for displaying the children of a revision.
366
        elif property.name == 'children':
367
            return self._children
412.1.7 by Daniel Schierbeck
Added file-id property to the revisionview.
368
        elif property.name == 'file-id':
369
            return self._file_id
412.1.1 by Daniel Schierbeck
Added branch and revision properties to the revisionview widget.
370
        else:
371
            raise AttributeError, 'unknown property %s' % property.name
372
373
    def do_set_property(self, property, value):
374
        if property.name == 'branch':
375
            self._branch = value
376
        elif property.name == 'revision':
377
            self._set_revision(value)
412.1.13 by Daniel Schierbeck
Re-added support for displaying the children of a revision.
378
        elif property.name == 'children':
379
            self.set_children(value)
412.1.7 by Daniel Schierbeck
Added file-id property to the revisionview.
380
        elif property.name == 'file-id':
381
            self._file_id = value
412.1.1 by Daniel Schierbeck
Added branch and revision properties to the revisionview widget.
382
        else:
383
            raise AttributeError, 'unknown property %s' % property.name
384
147 by Jelmer Vernooij
Remove a bunch of duplicate functionality.
385
    def set_show_callback(self, callback):
386
        self._show_callback = callback
387
278.1.3 by John Arbash Meinel
Have the ability to tell the log view that we only care about a specific file_id.
388
    def set_file_id(self, file_id):
389
        """Set a specific file id that we want to track.
390
391
        This just effects the display of a per-file commit message.
392
        If it is set to None, then all commit messages will be shown.
393
        """
412.1.7 by Daniel Schierbeck
Added file-id property to the revisionview.
394
        self.set_property('file-id', file_id)
278.1.3 by John Arbash Meinel
Have the ability to tell the log view that we only care about a specific file_id.
395
412.1.13 by Daniel Schierbeck
Re-added support for displaying the children of a revision.
396
    def set_revision(self, revision):
412.1.9 by Daniel Schierbeck
Removed the use of RevisionView.set_go_callback().
397
        if revision != self._revision:
398
            self.set_property('revision', revision)
399
400
    def get_revision(self):
401
        return self.get_property('revision')
412.1.1 by Daniel Schierbeck
Added branch and revision properties to the revisionview widget.
402
412.1.15 by Daniel Schierbeck
Removed redundant method argument.
403
    def _set_revision(self, revision):
412.1.1 by Daniel Schierbeck
Added branch and revision properties to the revisionview widget.
404
        if revision is None: return
719.2.1 by zedtux
Added committers and authors avatars from Gravatar (urllib2 version)
405
        
406
        self.avatarsbox.reset()
407
        
147 by Jelmer Vernooij
Remove a bunch of duplicate functionality.
408
        self._revision = revision
192 by Jelmer Vernooij
Allow committer to be None.
409
        if revision.committer is not None:
410
            self.committer.set_text(revision.committer)
719.2.1 by zedtux
Added committers and authors avatars from Gravatar (urllib2 version)
411
            self.avatarsbox.add(revision.committer, "committer")
192 by Jelmer Vernooij
Allow committer to be None.
412
        else:
413
            self.committer.set_text("")
719.2.1 by zedtux
Added committers and authors avatars from Gravatar (urllib2 version)
414
            self.avatarsbox.hide()
259 by Aaron Bentley
Add author support to gannotate and log viewer
415
        author = revision.properties.get('author', '')
719.2.1 by zedtux
Added committers and authors avatars from Gravatar (urllib2 version)
416
        self.avatarsbox.merge(revision.get_apparent_authors(), "author")
259 by Aaron Bentley
Add author support to gannotate and log viewer
417
        if author != '':
418
            self.author.set_text(author)
419
            self.author.show()
420
            self.author_label.show()
421
        else:
422
            self.author.hide()
423
            self.author_label.hide()
424
197 by Jelmer Vernooij
Fix some warnings when displaying ghost revisions. Reported by John.
425
        if revision.timestamp is not None:
426
            self.timestamp.set_text(format_date(revision.timestamp,
427
                                                revision.timezone))
147 by Jelmer Vernooij
Remove a bunch of duplicate functionality.
428
        try:
626 by Jelmer Vernooij
Hide branch nick field rather if there is no branch nick property
429
            self.branchnick.show()
430
            self.branchnick_label.show()
431
            self.branchnick.set_text(revision.properties['branch-nick'])
147 by Jelmer Vernooij
Remove a bunch of duplicate functionality.
432
        except KeyError:
626 by Jelmer Vernooij
Hide branch nick field rather if there is no branch nick property
433
            self.branchnick.hide()
434
            self.branchnick_label.hide()
147 by Jelmer Vernooij
Remove a bunch of duplicate functionality.
435
256.2.23 by Gary van der Merwe
Show Children
436
        self._add_parents_or_children(revision.parent_ids,
437
                                      self.parents_widgets,
438
                                      self.parents_table)
622.1.2 by John Arbash Meinel
Add tests of RevisionView that it can handle broken file-info properties.
439
278.1.3 by John Arbash Meinel
Have the ability to tell the log view that we only care about a specific file_id.
440
        file_info = revision.properties.get('file-info', None)
278.1.2 by John Arbash Meinel
Add an extra box that pops up when we have per-file information.
441
        if file_info is not None:
622.1.2 by John Arbash Meinel
Add tests of RevisionView that it can handle broken file-info properties.
442
            try:
443
                file_info = bdecode(file_info.encode('UTF-8'))
444
            except ValueError:
445
                trace.note('Invalid per-file info for revision:%s, value: %r',
446
                           revision.revision_id, file_info)
447
                file_info = None
278.1.2 by John Arbash Meinel
Add an extra box that pops up when we have per-file information.
448
449
        if file_info:
278.1.3 by John Arbash Meinel
Have the ability to tell the log view that we only care about a specific file_id.
450
            if self._file_id is None:
451
                text = []
452
                for fi in file_info:
453
                    text.append('%(path)s\n%(message)s' % fi)
454
                self.file_info_buffer.set_text('\n'.join(text))
455
                self.file_info_box.show()
456
            else:
457
                text = []
458
                for fi in file_info:
459
                    if fi['file_id'] == self._file_id:
460
                        text.append(fi['message'])
461
                if text:
462
                    self.file_info_buffer.set_text('\n'.join(text))
463
                    self.file_info_box.show()
464
                else:
465
                    self.file_info_box.hide()
278.1.2 by John Arbash Meinel
Add an extra box that pops up when we have per-file information.
466
        else:
467
            self.file_info_box.hide()
468
423.7.4 by Daniel Schierbeck
Made revisionview and branchview update when a tag is added.
469
    def update_tags(self):
470
        if self._branch is not None and self._branch.supports_tags():
471
            self._tagdict = self._branch.tags.get_reverse_tag_dict()
472
        else:
473
            self._tagdict = {}
474
475
        self._add_tags()
476
450.1.20 by Daniel Schierbeck
Removed usage of lambda expressions as callbacks.
477
    def _update_signature(self, widget, param):
734.1.17 by Curtis Hovey
Updated gmissing to gtk3.
478
        if not has_seahorse:
479
            return
450.1.19 by Daniel Schierbeck
Made sure the Signature page only gets updated when it is selected.
480
        if self.get_current_page() == PAGE_SIGNATURE:
481
            self.signature_table.set_revision(self._revision)
399.1.13 by Daniel Schierbeck
Merged with mainline.
482
450.6.4 by Daniel Schierbeck
Moved bug parsing code into the bug page itself.
483
    def _update_bugs(self, widget, param):
484
        self.bugs_page.set_revision(self._revision)
450.6.11 by Daniel Schierbeck
Made Bugs page always visible, but only sensitive when the revision has bug associations.
485
        label = self.get_tab_label(self.bugs_page)
461.1.1 by Daniel Schierbeck
Merged bug page improvements.
486
        label.set_sensitive(self.bugs_page.get_num_bugs() != 0)
450.6.4 by Daniel Schierbeck
Moved bug parsing code into the bug page itself.
487
412.1.13 by Daniel Schierbeck
Re-added support for displaying the children of a revision.
488
    def set_children(self, children):
489
        self._add_parents_or_children(children,
490
                                      self.children_widgets,
491
                                      self.children_table)
492
450.1.20 by Daniel Schierbeck
Removed usage of lambda expressions as callbacks.
493
    def _switch_page_cb(self, notebook, page, page_num):
734.1.17 by Curtis Hovey
Updated gmissing to gtk3.
494
        if not has_seahorse:
495
            return
450.1.20 by Daniel Schierbeck
Removed usage of lambda expressions as callbacks.
496
        if page_num == PAGE_SIGNATURE:
497
            self.signature_table.set_revision(self._revision)
498
499
500
147 by Jelmer Vernooij
Remove a bunch of duplicate functionality.
501
    def _show_clicked_cb(self, widget, revid, parentid):
502
        """Callback for when the show button for a parent is clicked."""
503
        self._show_callback(revid, parentid)
504
505
    def _go_clicked_cb(self, widget, revid):
506
        """Callback for when the go button for a parent is clicked."""
507
412.1.4 by Daniel Schierbeck
Made tag list smarter.
508
    def _add_tags(self, *args):
399.1.13 by Daniel Schierbeck
Merged with mainline.
509
        if self._revision is None:
510
            return
423.7.4 by Daniel Schierbeck
Made revisionview and branchview update when a tag is added.
511
412.1.4 by Daniel Schierbeck
Made tag list smarter.
512
        if self._tagdict.has_key(self._revision.revision_id):
513
            tags = self._tagdict[self._revision.revision_id]
514
        else:
515
            tags = []
516
            
241 by Jelmer Vernooij
Show tags in bzr viz.
517
        if tags == []:
518
            self.tags_list.hide()
519
            self.tags_label.hide()
520
            return
521
423.3.1 by Daniel Schierbeck
Made the tag list be a comma-separated line instead of a vertically stacked box.
522
        self.tags_list.set_text(", ".join(tags))
523
241 by Jelmer Vernooij
Show tags in bzr viz.
524
        self.tags_list.show_all()
525
        self.tags_label.show_all()
526
        
256.2.23 by Gary van der Merwe
Show Children
527
    def _add_parents_or_children(self, revids, widgets, table):
528
        while len(widgets) > 0:
529
            widget = widgets.pop()
530
            table.remove(widget)
531
        
532
        table.resize(max(len(revids), 1), 2)
147 by Jelmer Vernooij
Remove a bunch of duplicate functionality.
533
256.2.23 by Gary van der Merwe
Show Children
534
        for idx, revid in enumerate(revids):
734.1.1 by Curtis Hovey
Mechanical changes made by pygi.convert.sh.
535
            align = Gtk.Alignment.new(0.0, 0.0, 1, 1)
256.2.23 by Gary van der Merwe
Show Children
536
            widgets.append(align)
537
            table.attach(align, 1, 2, idx, idx + 1,
734.1.1 by Curtis Hovey
Mechanical changes made by pygi.convert.sh.
538
                                      Gtk.AttachOptions.EXPAND | Gtk.AttachOptions.FILL, Gtk.AttachOptions.FILL)
0.1.1 by Dan Loda
First working version of xannotate.
539
            align.show()
147 by Jelmer Vernooij
Remove a bunch of duplicate functionality.
540
734.1.6 by Curtis Hovey
Added a very rough fix to see gannontation.
541
            hbox = Gtk.HBox(homogeneous=False, spacing=6)
147 by Jelmer Vernooij
Remove a bunch of duplicate functionality.
542
            align.add(hbox)
543
            hbox.show()
544
734.1.1 by Curtis Hovey
Mechanical changes made by pygi.convert.sh.
545
            image = Gtk.Image()
147 by Jelmer Vernooij
Remove a bunch of duplicate functionality.
546
            image.set_from_stock(
734.1.1 by Curtis Hovey
Mechanical changes made by pygi.convert.sh.
547
                Gtk.STOCK_FIND, Gtk.IconSize.SMALL_TOOLBAR)
147 by Jelmer Vernooij
Remove a bunch of duplicate functionality.
548
            image.show()
549
148 by Jelmer Vernooij
Clean up interface a bit: don't show diff button when no diff can be accessed, use label instead of button when there is no callback set.
550
            if self._show_callback is not None:
734.1.1 by Curtis Hovey
Mechanical changes made by pygi.convert.sh.
551
                button = Gtk.Button()
148 by Jelmer Vernooij
Clean up interface a bit: don't show diff button when no diff can be accessed, use label instead of button when there is no callback set.
552
                button.add(image)
553
                button.connect("clicked", self._show_clicked_cb,
256.2.23 by Gary van der Merwe
Show Children
554
                               self._revision.revision_id, revid)
734.1.8 by Curtis Hovey
pass all the required args to pack_start().
555
                hbox.pack_start(button, False, True, True, 0)
148 by Jelmer Vernooij
Clean up interface a bit: don't show diff button when no diff can be accessed, use label instead of button when there is no callback set.
556
                button.show()
147 by Jelmer Vernooij
Remove a bunch of duplicate functionality.
557
734.1.1 by Curtis Hovey
Mechanical changes made by pygi.convert.sh.
558
            button = Gtk.Button()
559
            revid_label = Gtk.Label(label=str(revid))
560
            revid_label.set_ellipsize(Pango.EllipsizeMode.MIDDLE)
531.7.7 by Scott Scriven
Fixed labels/buttons overflowing their parent widgets.
561
            revid_label.set_alignment(0.0, 0.5)
562
            button.add(revid_label)
412.1.9 by Daniel Schierbeck
Removed the use of RevisionView.set_go_callback().
563
            button.connect("clicked",
734.1.6 by Curtis Hovey
Added a very rough fix to see gannontation.
564
                    lambda w, r: self.set_revision(
565
                        self._repository.get_revision(r)), revid)
147 by Jelmer Vernooij
Remove a bunch of duplicate functionality.
566
            button.set_use_underline(False)
734.1.11 by Curtis Hovey
Updated gtags to gtk3.
567
            hbox.pack_start(button, True, True, 0)
531.7.7 by Scott Scriven
Fixed labels/buttons overflowing their parent widgets.
568
            button.show_all()
0.1.1 by Dan Loda
First working version of xannotate.
569
324.2.1 by Daniel Schierbeck
Turned the logview into a notebook.
570
    def _create_general(self):
734.1.6 by Curtis Hovey
Added a very rough fix to see gannontation.
571
        vbox = Gtk.VBox(homogeneous=False, spacing=6)
0.1.1 by Dan Loda
First working version of xannotate.
572
        vbox.set_border_width(6)
734.1.6 by Curtis Hovey
Added a very rough fix to see gannontation.
573
        vbox.pack_start(self._create_headers(), False, True, 0)
574
        vbox.pack_start(self._create_message_view(), True, True, 0)
575
        self.append_page(vbox, Gtk.Label(label="General"))
324.2.1 by Daniel Schierbeck
Turned the logview into a notebook.
576
        vbox.show()
577
578
    def _create_relations(self):
734.1.6 by Curtis Hovey
Added a very rough fix to see gannontation.
579
        vbox = Gtk.VBox(homogeneous=False, spacing=6)
324.2.1 by Daniel Schierbeck
Turned the logview into a notebook.
580
        vbox.set_border_width(6)
734.1.6 by Curtis Hovey
Added a very rough fix to see gannontation.
581
        vbox.pack_start(self._create_parents(), False, True, 0)
582
        vbox.pack_start(self._create_children(), False, True, 0)
583
        self.append_page(vbox, Gtk.Label(label="Relations"))
0.1.1 by Dan Loda
First working version of xannotate.
584
        vbox.show()
324.2.4 by Daniel Schierbeck
Added 'Changes' page to logview.
585
399.1.10 by Daniel Schierbeck
Improved implementation of the Signature page.
586
    def _create_signature(self):
471.2.1 by Jelmer Vernooij
Fix gannotate.
587
        self.signature_table = SignatureTab(self._repository)
734.1.6 by Curtis Hovey
Added a very rough fix to see gannontation.
588
        self.append_page(
734.1.17 by Curtis Hovey
Updated gmissing to gtk3.
589
            self.signature_table, Gtk.Label(label='Signature'))
450.1.20 by Daniel Schierbeck
Removed usage of lambda expressions as callbacks.
590
        self.connect_after('notify::revision', self._update_signature)
399.1.10 by Daniel Schierbeck
Improved implementation of the Signature page.
591
0.1.1 by Dan Loda
First working version of xannotate.
592
    def _create_headers(self):
719.2.1 by zedtux
Added committers and authors avatars from Gravatar (urllib2 version)
593
        self.avatarsbox = AvatarsBox()
594
        
734.1.1 by Curtis Hovey
Mechanical changes made by pygi.convert.sh.
595
        self.table = Gtk.Table(rows=5, columns=2)
0.1.1 by Dan Loda
First working version of xannotate.
596
        self.table.set_row_spacings(6)
597
        self.table.set_col_spacings(6)
598
        self.table.show()
719.2.1 by zedtux
Added committers and authors avatars from Gravatar (urllib2 version)
599
        
734.1.1 by Curtis Hovey
Mechanical changes made by pygi.convert.sh.
600
        self.avatarsbox.pack_start(self.table, True, True, 0)
719.2.1 by zedtux
Added committers and authors avatars from Gravatar (urllib2 version)
601
        self.avatarsbox.show()
147 by Jelmer Vernooij
Remove a bunch of duplicate functionality.
602
531.7.7 by Scott Scriven
Fixed labels/buttons overflowing their parent widgets.
603
        row = 0
604
734.1.1 by Curtis Hovey
Mechanical changes made by pygi.convert.sh.
605
        label = Gtk.Label()
531.7.7 by Scott Scriven
Fixed labels/buttons overflowing their parent widgets.
606
        label.set_alignment(1.0, 0.5)
147 by Jelmer Vernooij
Remove a bunch of duplicate functionality.
607
        label.set_markup("<b>Revision Id:</b>")
734.1.1 by Curtis Hovey
Mechanical changes made by pygi.convert.sh.
608
        self.table.attach(label, 0, 1, row, row+1, Gtk.AttachOptions.FILL, Gtk.AttachOptions.FILL)
147 by Jelmer Vernooij
Remove a bunch of duplicate functionality.
609
        label.show()
610
734.1.1 by Curtis Hovey
Mechanical changes made by pygi.convert.sh.
611
        revision_id = Gtk.Label()
612
        revision_id.set_ellipsize(Pango.EllipsizeMode.MIDDLE)
531.7.7 by Scott Scriven
Fixed labels/buttons overflowing their parent widgets.
613
        revision_id.set_alignment(0.0, 0.5)
412.1.5 by Daniel Schierbeck
Made the revision id label use signals when updating.
614
        revision_id.set_selectable(True)
615
        self.connect('notify::revision', 
616
                lambda w, p: revision_id.set_text(self._revision.revision_id))
734.1.1 by Curtis Hovey
Mechanical changes made by pygi.convert.sh.
617
        self.table.attach(revision_id, 1, 2, row, row+1, Gtk.AttachOptions.EXPAND | Gtk.AttachOptions.FILL, Gtk.AttachOptions.FILL)
412.1.5 by Daniel Schierbeck
Made the revision id label use signals when updating.
618
        revision_id.show()
147 by Jelmer Vernooij
Remove a bunch of duplicate functionality.
619
531.7.7 by Scott Scriven
Fixed labels/buttons overflowing their parent widgets.
620
        row += 1
734.1.1 by Curtis Hovey
Mechanical changes made by pygi.convert.sh.
621
        self.author_label = Gtk.Label()
531.7.7 by Scott Scriven
Fixed labels/buttons overflowing their parent widgets.
622
        self.author_label.set_alignment(1.0, 0.5)
259 by Aaron Bentley
Add author support to gannotate and log viewer
623
        self.author_label.set_markup("<b>Author:</b>")
734.1.1 by Curtis Hovey
Mechanical changes made by pygi.convert.sh.
624
        self.table.attach(self.author_label, 0, 1, row, row+1, Gtk.AttachOptions.FILL, Gtk.AttachOptions.FILL)
259 by Aaron Bentley
Add author support to gannotate and log viewer
625
        self.author_label.show()
626
734.1.1 by Curtis Hovey
Mechanical changes made by pygi.convert.sh.
627
        self.author = Gtk.Label()
628
        self.author.set_ellipsize(Pango.EllipsizeMode.END)
531.7.7 by Scott Scriven
Fixed labels/buttons overflowing their parent widgets.
629
        self.author.set_alignment(0.0, 0.5)
259 by Aaron Bentley
Add author support to gannotate and log viewer
630
        self.author.set_selectable(True)
734.1.1 by Curtis Hovey
Mechanical changes made by pygi.convert.sh.
631
        self.table.attach(self.author, 1, 2, row, row+1, Gtk.AttachOptions.EXPAND | Gtk.AttachOptions.FILL, Gtk.AttachOptions.FILL)
259 by Aaron Bentley
Add author support to gannotate and log viewer
632
        self.author.show()
633
        self.author.hide()
634
531.7.7 by Scott Scriven
Fixed labels/buttons overflowing their parent widgets.
635
        row += 1
734.1.1 by Curtis Hovey
Mechanical changes made by pygi.convert.sh.
636
        label = Gtk.Label()
531.7.7 by Scott Scriven
Fixed labels/buttons overflowing their parent widgets.
637
        label.set_alignment(1.0, 0.5)
0.1.1 by Dan Loda
First working version of xannotate.
638
        label.set_markup("<b>Committer:</b>")
734.1.1 by Curtis Hovey
Mechanical changes made by pygi.convert.sh.
639
        self.table.attach(label, 0, 1, row, row+1, Gtk.AttachOptions.FILL, Gtk.AttachOptions.FILL)
0.1.1 by Dan Loda
First working version of xannotate.
640
        label.show()
641
734.1.1 by Curtis Hovey
Mechanical changes made by pygi.convert.sh.
642
        self.committer = Gtk.Label()
643
        self.committer.set_ellipsize(Pango.EllipsizeMode.END)
531.7.7 by Scott Scriven
Fixed labels/buttons overflowing their parent widgets.
644
        self.committer.set_alignment(0.0, 0.5)
0.1.1 by Dan Loda
First working version of xannotate.
645
        self.committer.set_selectable(True)
734.1.1 by Curtis Hovey
Mechanical changes made by pygi.convert.sh.
646
        self.table.attach(self.committer, 1, 2, row, row+1, Gtk.AttachOptions.EXPAND | Gtk.AttachOptions.FILL, Gtk.AttachOptions.FILL)
0.1.1 by Dan Loda
First working version of xannotate.
647
        self.committer.show()
648
531.7.7 by Scott Scriven
Fixed labels/buttons overflowing their parent widgets.
649
        row += 1
734.1.1 by Curtis Hovey
Mechanical changes made by pygi.convert.sh.
650
        self.branchnick_label = Gtk.Label()
626 by Jelmer Vernooij
Hide branch nick field rather if there is no branch nick property
651
        self.branchnick_label.set_alignment(1.0, 0.5)
652
        self.branchnick_label.set_markup("<b>Branch nick:</b>")
734.1.1 by Curtis Hovey
Mechanical changes made by pygi.convert.sh.
653
        self.table.attach(self.branchnick_label, 0, 1, row, row+1, Gtk.AttachOptions.FILL, Gtk.AttachOptions.FILL)
147 by Jelmer Vernooij
Remove a bunch of duplicate functionality.
654
        self.branchnick_label.show()
655
734.1.1 by Curtis Hovey
Mechanical changes made by pygi.convert.sh.
656
        self.branchnick = Gtk.Label()
657
        self.branchnick.set_ellipsize(Pango.EllipsizeMode.MIDDLE)
626 by Jelmer Vernooij
Hide branch nick field rather if there is no branch nick property
658
        self.branchnick.set_alignment(0.0, 0.5)
659
        self.branchnick.set_selectable(True)
734.1.1 by Curtis Hovey
Mechanical changes made by pygi.convert.sh.
660
        self.table.attach(self.branchnick, 1, 2, row, row+1, Gtk.AttachOptions.EXPAND | Gtk.AttachOptions.FILL, Gtk.AttachOptions.FILL)
626 by Jelmer Vernooij
Hide branch nick field rather if there is no branch nick property
661
        self.branchnick.show()
662
531.7.7 by Scott Scriven
Fixed labels/buttons overflowing their parent widgets.
663
        row += 1
734.1.1 by Curtis Hovey
Mechanical changes made by pygi.convert.sh.
664
        label = Gtk.Label()
531.7.7 by Scott Scriven
Fixed labels/buttons overflowing their parent widgets.
665
        label.set_alignment(1.0, 0.5)
0.1.1 by Dan Loda
First working version of xannotate.
666
        label.set_markup("<b>Timestamp:</b>")
734.1.1 by Curtis Hovey
Mechanical changes made by pygi.convert.sh.
667
        self.table.attach(label, 0, 1, row, row+1, Gtk.AttachOptions.FILL, Gtk.AttachOptions.FILL)
0.1.1 by Dan Loda
First working version of xannotate.
668
        label.show()
669
734.1.1 by Curtis Hovey
Mechanical changes made by pygi.convert.sh.
670
        self.timestamp = Gtk.Label()
671
        self.timestamp.set_ellipsize(Pango.EllipsizeMode.END)
531.7.7 by Scott Scriven
Fixed labels/buttons overflowing their parent widgets.
672
        self.timestamp.set_alignment(0.0, 0.5)
0.1.1 by Dan Loda
First working version of xannotate.
673
        self.timestamp.set_selectable(True)
734.1.1 by Curtis Hovey
Mechanical changes made by pygi.convert.sh.
674
        self.table.attach(self.timestamp, 1, 2, row, row+1, Gtk.AttachOptions.EXPAND | Gtk.AttachOptions.FILL, Gtk.AttachOptions.FILL)
0.1.1 by Dan Loda
First working version of xannotate.
675
        self.timestamp.show()
676
531.7.7 by Scott Scriven
Fixed labels/buttons overflowing their parent widgets.
677
        row += 1
734.1.1 by Curtis Hovey
Mechanical changes made by pygi.convert.sh.
678
        self.tags_label = Gtk.Label()
531.7.7 by Scott Scriven
Fixed labels/buttons overflowing their parent widgets.
679
        self.tags_label.set_alignment(1.0, 0.5)
241 by Jelmer Vernooij
Show tags in bzr viz.
680
        self.tags_label.set_markup("<b>Tags:</b>")
734.1.1 by Curtis Hovey
Mechanical changes made by pygi.convert.sh.
681
        self.table.attach(self.tags_label, 0, 1, row, row+1, Gtk.AttachOptions.FILL, Gtk.AttachOptions.FILL)
241 by Jelmer Vernooij
Show tags in bzr viz.
682
        self.tags_label.show()
683
734.1.1 by Curtis Hovey
Mechanical changes made by pygi.convert.sh.
684
        self.tags_list = Gtk.Label()
685
        self.tags_list.set_ellipsize(Pango.EllipsizeMode.MIDDLE)
531.7.7 by Scott Scriven
Fixed labels/buttons overflowing their parent widgets.
686
        self.tags_list.set_alignment(0.0, 0.5)
734.1.1 by Curtis Hovey
Mechanical changes made by pygi.convert.sh.
687
        self.table.attach(self.tags_list, 1, 2, row, row+1, Gtk.AttachOptions.EXPAND | Gtk.AttachOptions.FILL, Gtk.AttachOptions.FILL)
241 by Jelmer Vernooij
Show tags in bzr viz.
688
        self.tags_list.show()
689
412.1.4 by Daniel Schierbeck
Made tag list smarter.
690
        self.connect('notify::revision', self._add_tags)
691
719.2.1 by zedtux
Added committers and authors avatars from Gravatar (urllib2 version)
692
        self.avatarsbox.show()
693
        return self.avatarsbox
256.2.23 by Gary van der Merwe
Show Children
694
    
291 by Jelmer Vernooij
Put children widget on a new line.
695
    def _create_parents(self):
734.1.6 by Curtis Hovey
Added a very rough fix to see gannontation.
696
        hbox = Gtk.HBox(homogeneous=True, spacing=3)
256.2.23 by Gary van der Merwe
Show Children
697
        
698
        self.parents_table = self._create_parents_or_children_table(
699
            "<b>Parents:</b>")
147 by Jelmer Vernooij
Remove a bunch of duplicate functionality.
700
        self.parents_widgets = []
734.1.1 by Curtis Hovey
Mechanical changes made by pygi.convert.sh.
701
        hbox.pack_start(self.parents_table, True, True, 0)
291 by Jelmer Vernooij
Put children widget on a new line.
702
703
        hbox.show()
704
        return hbox
705
706
    def _create_children(self):
734.1.6 by Curtis Hovey
Added a very rough fix to see gannontation.
707
        hbox = Gtk.HBox(homogeneous=True, spacing=3)
291 by Jelmer Vernooij
Put children widget on a new line.
708
        self.children_table = self._create_parents_or_children_table(
709
            "<b>Children:</b>")
710
        self.children_widgets = []
734.1.1 by Curtis Hovey
Mechanical changes made by pygi.convert.sh.
711
        hbox.pack_start(self.children_table, True, True, 0)
256.2.23 by Gary van der Merwe
Show Children
712
        hbox.show()
713
        return hbox
714
        
715
    def _create_parents_or_children_table(self, text):
734.1.1 by Curtis Hovey
Mechanical changes made by pygi.convert.sh.
716
        table = Gtk.Table(rows=1, columns=2)
256.2.23 by Gary van der Merwe
Show Children
717
        table.set_row_spacings(3)
718
        table.set_col_spacings(6)
719
        table.show()
147 by Jelmer Vernooij
Remove a bunch of duplicate functionality.
720
734.1.1 by Curtis Hovey
Mechanical changes made by pygi.convert.sh.
721
        label = Gtk.Label()
256.2.23 by Gary van der Merwe
Show Children
722
        label.set_markup(text)
734.1.6 by Curtis Hovey
Added a very rough fix to see gannontation.
723
        align = Gtk.Alignment.new(0.0, 0.5, 0, 0)
147 by Jelmer Vernooij
Remove a bunch of duplicate functionality.
724
        align.add(label)
734.1.1 by Curtis Hovey
Mechanical changes made by pygi.convert.sh.
725
        table.attach(align, 0, 1, 0, 1, Gtk.AttachOptions.FILL, Gtk.AttachOptions.FILL)
147 by Jelmer Vernooij
Remove a bunch of duplicate functionality.
726
        label.show()
727
        align.show()
728
256.2.23 by Gary van der Merwe
Show Children
729
        return table
147 by Jelmer Vernooij
Remove a bunch of duplicate functionality.
730
0.1.1 by Dan Loda
First working version of xannotate.
731
    def _create_message_view(self):
734.1.1 by Curtis Hovey
Mechanical changes made by pygi.convert.sh.
732
        msg_buffer = Gtk.TextBuffer()
412.1.6 by Daniel Schierbeck
Made the message buffer use signals when updating.
733
        self.connect('notify::revision',
734
                lambda w, p: msg_buffer.set_text(self._revision.message))
734.1.1 by Curtis Hovey
Mechanical changes made by pygi.convert.sh.
735
        window = Gtk.ScrolledWindow()
736
        window.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC)
737
        window.set_shadow_type(Gtk.ShadowType.IN)
734.1.6 by Curtis Hovey
Added a very rough fix to see gannontation.
738
        tv = Gtk.TextView(buffer=msg_buffer)
0.1.1 by Dan Loda
First working version of xannotate.
739
        tv.set_editable(False)
734.1.1 by Curtis Hovey
Mechanical changes made by pygi.convert.sh.
740
        tv.set_wrap_mode(Gtk.WrapMode.WORD)
399.1.13 by Daniel Schierbeck
Merged with mainline.
741
734.1.1 by Curtis Hovey
Mechanical changes made by pygi.convert.sh.
742
        tv.modify_font(Pango.FontDescription("Monospace"))
0.1.1 by Dan Loda
First working version of xannotate.
743
        tv.show()
324.2.2 by Daniel Schierbeck
Surrounded the commit message textview with a scrolled window and added a shadow.
744
        window.add(tv)
745
        window.show()
746
        return window
0.1.1 by Dan Loda
First working version of xannotate.
747
423.14.1 by Jelmer Vernooij
Add bugs tab to display bug status change metadata.
748
    def _create_bugs(self):
450.6.4 by Daniel Schierbeck
Moved bug parsing code into the bug page itself.
749
        self.bugs_page = BugsTab()
750
        self.connect_after('notify::revision', self._update_bugs) 
734.1.6 by Curtis Hovey
Added a very rough fix to see gannontation.
751
        self.append_page(self.bugs_page, Gtk.Label(label='Bugs'))
423.14.1 by Jelmer Vernooij
Add bugs tab to display bug status change metadata.
752
278.1.2 by John Arbash Meinel
Add an extra box that pops up when we have per-file information.
753
    def _create_file_info_view(self):
734.1.6 by Curtis Hovey
Added a very rough fix to see gannontation.
754
        self.file_info_box = Gtk.VBox(homogeneous=False, spacing=6)
278.1.45 by John Arbash Meinel
Switch to a new tab for per-file messages.
755
        self.file_info_box.set_border_width(6)
734.1.1 by Curtis Hovey
Mechanical changes made by pygi.convert.sh.
756
        self.file_info_buffer = Gtk.TextBuffer()
757
        window = Gtk.ScrolledWindow()
758
        window.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC)
759
        window.set_shadow_type(Gtk.ShadowType.IN)
734.1.6 by Curtis Hovey
Added a very rough fix to see gannontation.
760
        tv = Gtk.TextView(buffer=self.file_info_buffer)
278.1.2 by John Arbash Meinel
Add an extra box that pops up when we have per-file information.
761
        tv.set_editable(False)
734.1.1 by Curtis Hovey
Mechanical changes made by pygi.convert.sh.
762
        tv.set_wrap_mode(Gtk.WrapMode.WORD)
763
        tv.modify_font(Pango.FontDescription("Monospace"))
278.1.2 by John Arbash Meinel
Add an extra box that pops up when we have per-file information.
764
        tv.show()
278.1.44 by John Arbash Meinel
Merge in trunk, and update logview per-file commit messages.
765
        window.add(tv)
766
        window.show()
734.1.1 by Curtis Hovey
Mechanical changes made by pygi.convert.sh.
767
        self.file_info_box.pack_start(window, True, True, 0)
278.1.2 by John Arbash Meinel
Add an extra box that pops up when we have per-file information.
768
        self.file_info_box.hide() # Only shown when there are per-file messages
734.1.6 by Curtis Hovey
Added a very rough fix to see gannontation.
769
        self.append_page(self.file_info_box, Gtk.Label(label='Per-file'))
278.1.2 by John Arbash Meinel
Add an extra box that pops up when we have per-file information.
770