2
# -*- coding: UTF-8 -*-
5
This module contains the code to manage the diff window which shows
6
the changes made between two revisions on a branch.
9
__copyright__ = "Copyright © 2005 Canonical Ltd."
10
__author__ = "Scott James Remnant <scott@ubuntu.com>"
15
from cStringIO import StringIO
23
have_gtksourceview = True
25
have_gtksourceview = False
27
from bzrlib.delta import compare_trees
28
from bzrlib.diff import show_diff_trees
31
class DiffWindow(gtk.Window):
34
This object represents and manages a single window containing the
35
differences between two revisions on a branch.
38
def __init__(self, app=None):
39
gtk.Window.__init__(self, gtk.WINDOW_TOPLEVEL)
40
self.set_border_width(0)
41
self.set_title("bzrk diff")
45
# Use two thirds of the screen by default
46
screen = self.get_screen()
47
monitor = screen.get_monitor_geometry(0)
48
width = int(monitor.width * 0.66)
49
height = int(monitor.height * 0.66)
50
self.set_default_size(width, height)
55
"""Construct the window contents."""
56
hbox = gtk.HBox(spacing=6)
57
hbox.set_border_width(12)
61
scrollwin = gtk.ScrolledWindow()
62
scrollwin.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC)
63
scrollwin.set_shadow_type(gtk.SHADOW_IN)
64
hbox.pack_start(scrollwin, expand=False, fill=True)
67
self.model = gtk.TreeStore(str, str)
68
self.treeview = gtk.TreeView(self.model)
69
self.treeview.set_headers_visible(False)
70
self.treeview.set_search_column(1)
71
self.treeview.connect("cursor-changed", self._treeview_cursor_cb)
72
scrollwin.add(self.treeview)
75
cell = gtk.CellRendererText()
76
cell.set_property("width-chars", 20)
77
column = gtk.TreeViewColumn()
78
column.pack_start(cell, expand=True)
79
column.add_attribute(cell, "text", 0)
80
self.treeview.append_column(column)
83
scrollwin = gtk.ScrolledWindow()
84
scrollwin.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
85
scrollwin.set_shadow_type(gtk.SHADOW_IN)
86
hbox.pack_start(scrollwin, expand=True, fill=True)
89
if have_gtksourceview:
90
self.buffer = gtksourceview.SourceBuffer()
91
slm = gtksourceview.SourceLanguagesManager()
92
gsl = slm.get_language_from_mime_type("text/x-patch")
93
self.buffer.set_language(gsl)
94
self.buffer.set_highlight(True)
96
sourceview = gtksourceview.SourceView(self.buffer)
98
self.buffer = gtk.TextBuffer()
99
sourceview = gtk.TextView(self.buffer)
101
sourceview.set_editable(False)
102
sourceview.set_wrap_mode(gtk.WRAP_CHAR)
103
sourceview.modify_font(pango.FontDescription("Monospace"))
104
scrollwin.add(sourceview)
107
def set_diff(self, branch, revid, parentid):
108
"""Set the differences showed by this window.
110
Compares the two trees and populates the window with the
113
self.rev_tree = branch.revision_tree(revid)
114
self.parent_tree = branch.revision_tree(parentid)
117
delta = compare_trees(self.parent_tree, self.rev_tree)
120
titer = self.model.append(None, [ "Added", None ])
121
for path, id, kind in delta.added:
122
self.model.append(titer, [ path, path ])
124
if len(delta.removed):
125
titer = self.model.append(None, [ "Removed", None ])
126
for path, id, kind in delta.removed:
127
self.model.append(titer, [ path, path ])
129
if len(delta.renamed):
130
titer = self.model.append(None, [ "Renamed", None ])
131
for oldpath, newpath, id, kind, text_modified, meta_modified \
133
self.model.append(titer, [ oldpath, oldpath ])
135
if len(delta.modified):
136
titer = self.model.append(None, [ "Modified", None ])
137
for path, id, kind, text_modified, meta_modified in delta.modified:
138
self.model.append(titer, [ path, path ])
140
self.treeview.expand_all()
141
self.set_title(os.path.basename(branch.base) + " - bzrk diff")
143
def _treeview_cursor_cb(self, *args):
144
"""Callback for when the treeview cursor changes."""
145
(path, col) = self.treeview.get_cursor()
146
path = self.model[path][1]
151
show_diff_trees(self.parent_tree, self.rev_tree, s, [ path ])
152
self.buffer.set_text(s.getvalue())