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