44
45
class GAnnotateWindow(gtk.Window):
45
46
"""Annotate window."""
47
def __init__(self, all=False, plain=False, parent=None):
48
def __init__(self, all=False, plain=False):
52
52
gtk.Window.__init__(self, gtk.WINDOW_TOPLEVEL)
54
self.connect("key-press-event", self._on_key_pressed)
56
54
self.set_icon(self.render_icon(gtk.STOCK_FIND, gtk.ICON_SIZE_BUTTON))
57
55
self.annotate_colormap = AnnotateColorSaturation()
60
58
self.revisions = {}
64
60
def annotate(self, tree, branch, file_id):
65
61
self.annotations = []
69
65
self.revision_id = getattr(tree, 'get_revision_id',
70
66
lambda: CURRENT_REVISION)()
72
# [revision id, line number, author, revno, highlight color, line]
68
# [revision id, line number, committer, revno, highlight color, line]
73
69
self.annomodel = gtk.ListStore(gobject.TYPE_STRING,
74
70
gobject.TYPE_STRING,
75
71
gobject.TYPE_STRING,
84
80
for line_no, (revision, revno, line)\
85
81
in enumerate(self._annotate(tree, file_id)):
86
82
if revision.revision_id == last_seen and not self.all:
83
revno = committer = ""
89
85
last_seen = revision.revision_id
90
author = revision.get_apparent_author()
86
committer = revision.committer
92
88
if revision.revision_id not in self.revisions:
93
89
self.revisions[revision.revision_id] = revision
95
91
self.annomodel.append([revision.revision_id,
100
96
line.rstrip("\r\n")
144
140
current_revision.timestamp = time.time()
145
141
current_revision.message = '[Not yet committed]'
146
142
current_revision.parent_ids = tree.get_parent_ids()
147
current_revision.properties['branch-nick'] = self.branch.nick
148
143
current_revno = '%d?' % (self.branch.revno() + 1)
149
144
repository = self.branch.repository
150
145
if self.revision_id == CURRENT_REVISION:
183
178
return self.annomodel[path][REVISION_ID_COL]
185
def _activate_selected_revision(self, w):
180
def _show_log(self, w):
186
181
rev_id = self._selected_revision()
187
182
if rev_id is None:
189
selected = self.revisions[rev_id]
190
self.logview.set_revision(selected)
191
if (len(selected.parent_ids) != 0 and selected.parent_ids[0] not in
196
self.back_button.set_sensitive(enable_back)
184
self.logview.set_revision(self.revisions[rev_id])
198
186
def _create(self):
199
187
self.logview = self._create_log_view()
200
188
self.annoview = self._create_annotate_view()
202
vbox = gtk.VBox(False)
190
vbox = gtk.VBox(False, 12)
191
vbox.set_border_width(12)
205
194
sw = gtk.ScrolledWindow()
208
197
sw.add(self.annoview)
209
198
self.annoview.gwindow = self
216
hbox = gtk.HBox(False, 6)
217
self.back_button = self._create_back_button()
218
hbox.pack_start(self.back_button, expand=False, fill=True)
219
self.forward_button = self._create_forward_button()
220
hbox.pack_start(self.forward_button, expand=False, fill=True)
222
vbox.pack_start(hbox, expand=False, fill=True)
224
201
self.pane = pane = gtk.VPaned()
226
203
pane.add2(self.logview)
228
205
vbox.pack_start(pane, expand=True, fill=True)
230
207
self._search = SearchBox()
231
swbox.pack_start(self._search, expand=False, fill=True)
208
vbox.pack_start(self._search, expand=False, fill=True)
232
209
accels = gtk.AccelGroup()
233
210
accels.connect_group(gtk.keysyms.f, gtk.gdk.CONTROL_MASK,
234
211
gtk.ACCEL_LOCKED,
238
215
self._search_by_line)
239
216
self.add_accel_group(accels)
218
hbox = gtk.HBox(True, 6)
219
hbox.pack_start(self._create_prev_button(), expand=False, fill=True)
220
hbox.pack_end(self._create_button_box(), expand=False, fill=True)
222
vbox.pack_start(hbox, expand=False, fill=True)
243
226
def _search_by_text(self, accel_group, window, key, modifiers):
261
244
tree2 = repository.revision_tree(revision.parent_ids[0])
263
246
tree2 = repository.revision_tree(NULL_REVISION)
264
from bzrlib.plugins.gtk.diff import DiffWindow
247
from bzrlib.plugins.gtk.viz.diffwin import DiffWindow
265
248
window = DiffWindow()
266
249
window.set_diff("Diff for row %d" % (row+1), tree1, tree2)
267
250
window.set_file(tree1.id2path(self.file_id))
329
312
def _create_log_view(self):
334
def _create_back_button(self):
318
def _create_button_box(self):
319
box = gtk.HButtonBox()
320
box.set_layout(gtk.BUTTONBOX_END)
323
button = gtk.Button()
324
button.set_use_stock(True)
325
button.set_label("gtk-close")
326
button.connect("clicked", lambda w: self.destroy())
329
box.pack_start(button, expand=False, fill=False)
333
def _create_prev_button(self):
334
box = gtk.HButtonBox()
335
box.set_layout(gtk.BUTTONBOX_START)
335
338
button = gtk.Button()
336
339
button.set_use_stock(True)
337
340
button.set_label("gtk-go-back")
338
341
button.connect("clicked", lambda w: self.go_back())
339
button.set_relief(gtk.RELIEF_NONE)
343
def _create_forward_button(self):
344
button = gtk.Button()
345
button.set_use_stock(True)
346
button.set_label("gtk-go-forward")
347
button.connect("clicked", lambda w: self.go_forward())
348
button.set_relief(gtk.RELIEF_NONE)
350
button.set_sensitive(False)
343
box.pack_start(button, expand=False, fill=False)
353
346
def go_back(self):
354
last_tree = self.tree
355
347
rev_id = self._selected_revision()
356
348
parent_id = self.revisions[rev_id].parent_ids[0]
357
target_tree = self.branch.repository.revision_tree(parent_id)
358
if self._go(target_tree):
359
self.history.append(last_tree)
360
self.forward_button.set_sensitive(True)
362
self._no_back.add(parent_id)
363
self.back_button.set_sensitive(False)
365
def go_forward(self):
366
if len(self.history) == 0:
368
target_tree = self.history.pop()
369
if len(self.history) == 0:
370
self.forward_button.set_sensitive(False)
371
self._go(target_tree)
373
def _go(self, target_tree):
374
rev_id = self._selected_revision()
375
if self.file_id in target_tree:
376
offset = self.get_scroll_offset(target_tree)
349
tree = self.branch.repository.revision_tree(parent_id)
350
if self.file_id in tree:
351
offset = self.get_scroll_offset(tree)
377
352
(row,), col = self.annoview.get_cursor()
378
self.annotate(target_tree, self.branch, self.file_id)
382
self.annoview.set_cursor(new_row)
353
self.annotate(tree, self.branch, self.file_id)
354
self.annoview.set_cursor(row+offset)
387
356
def get_scroll_offset(self, tree):
388
357
old = self.tree.get_file(self.file_id)
397
def _on_key_pressed(self, widget, event):
398
""" Key press event handler. """
399
keyname = gtk.gdk.keyval_name(event.keyval)
400
func = getattr(self, '_on_key_press_' + keyname, None)
404
def _on_key_press_w(self, event):
405
if event.state & gtk.gdk.CONTROL_MASK:
407
if self._parent is None:
410
def _on_key_press_q(self, event):
411
if event.state & gtk.gdk.CONTROL_MASK:
417
368
class FakeRevision:
420
371
For when a revision is referenced but not present.
423
def __init__(self, revision_id, committer='?', nick=None):
374
def __init__(self, revision_id, committer='?'):
424
375
self.revision_id = revision_id
425
376
self.parent_ids = []
426
377
self.committer = committer
427
378
self.message = "?"
428
379
self.timestamp = 0.0
429
380
self.timezone = 0
432
def get_apparent_author(self):
433
return self.committer
436
383
class RevisionCache(object):