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