14
14
# along with this program; if not, write to the Free Software
15
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19
from gi.repository import Gtk
20
from gi.repository import GObject
22
28
from bzrlib.config import GlobalConfig
23
from bzrlib.plugins.gtk import _i18n
24
from bzrlib.plugins.gtk.dialog import (
30
class ConflictsDialog(Gtk.Dialog):
30
from dialog import error_dialog, warning_dialog
31
from errors import show_bzr_error
33
class ConflictsDialog(gtk.Dialog):
31
34
""" This dialog displays the list of conflicts. """
33
35
def __init__(self, wt, parent=None):
34
36
""" Initialize the Conflicts dialog. """
35
GObject.GObject.__init__(self, title="Conflicts - Olive",
37
gtk.Dialog.__init__(self, title="Conflicts - Olive",
38
buttons=(Gtk.STOCK_CLOSE, Gtk.ResponseType.CANCEL))
40
buttons=(gtk.STOCK_CLOSE, gtk.RESPONSE_CANCEL))
43
45
# Create the widgets
44
self._scrolledwindow = Gtk.ScrolledWindow()
45
self._treeview = Gtk.TreeView()
46
self._label_diff3 = Gtk.Label(label=_i18n("External utility:"))
47
self._entry_diff3 = Gtk.Entry()
48
self._image_diff3 = Gtk.Image()
49
self._button_diff3 = Gtk.Button()
50
self._hbox_diff3 = Gtk.HBox()
46
self._scrolledwindow = gtk.ScrolledWindow()
47
self._treeview = gtk.TreeView()
48
self._label_diff3 = gtk.Label(_("External utility:"))
49
self._entry_diff3 = gtk.Entry()
50
self._image_diff3 = gtk.Image()
51
self._button_diff3 = gtk.Button()
52
self._hbox_diff3 = gtk.HBox()
53
55
self._button_diff3.connect('clicked', self._on_diff3_clicked)
56
self._scrolledwindow.set_policy(Gtk.PolicyType.AUTOMATIC,
57
Gtk.PolicyType.AUTOMATIC)
58
self._image_diff3.set_from_stock(Gtk.STOCK_APPLY, Gtk.IconSize.BUTTON)
58
self._scrolledwindow.set_policy(gtk.POLICY_AUTOMATIC,
60
self._image_diff3.set_from_stock(gtk.STOCK_APPLY, gtk.ICON_SIZE_BUTTON)
59
61
self._button_diff3.set_image(self._image_diff3)
60
62
self._entry_diff3.set_text(self._get_diff3())
61
63
self._hbox_diff3.set_spacing(3)
62
64
self.vbox.set_spacing(3)
63
65
self.set_default_size(400, 300)
66
68
self._hbox_diff3.pack_start(self._label_diff3, False, False)
67
69
self._hbox_diff3.pack_start(self._entry_diff3, True, True)
87
89
def _set_diff3(self, cmd):
88
90
""" Set the default diff3 utility to cmd. """
89
91
config = GlobalConfig()
90
92
config.set_user_option('gconflicts_diff3', cmd)
92
94
def _create_conflicts(self):
93
95
""" Construct the list of conflicts. """
94
96
if len(self.wt.conflicts()) == 0:
95
self.model = Gtk.ListStore(GObject.TYPE_STRING)
97
self.model = gtk.ListStore(gobject.TYPE_STRING)
96
98
self._treeview.set_model(self.model)
97
self._treeview.append_column(Gtk.TreeViewColumn(_i18n('Conflicts'),
98
Gtk.CellRendererText(), text=0))
99
self._treeview.set_headers_visible(False)
100
self.model.append([ _i18n("No conflicts in working tree.") ])
99
self._treeview.append_column(gtk.TreeViewColumn(_('Conflicts'),
100
gtk.CellRendererText(), text=0))
101
self._treeview.set_headers_visible(False)
102
self.model.append([ _("No conflicts in working tree.") ])
101
103
self._button_diff3.set_sensitive(False)
103
self.model = Gtk.ListStore(GObject.TYPE_STRING,
105
self.model = gtk.ListStore(gobject.TYPE_STRING,
106
108
self._treeview.set_model(self.model)
107
self._treeview.append_column(Gtk.TreeViewColumn(_i18n('Path'),
108
Gtk.CellRendererText(), text=0))
109
self._treeview.append_column(Gtk.TreeViewColumn(_i18n('Type'),
110
Gtk.CellRendererText(), text=1))
109
self._treeview.append_column(gtk.TreeViewColumn(_('Path'),
110
gtk.CellRendererText(), text=0))
111
self._treeview.append_column(gtk.TreeViewColumn(_('Type'),
112
gtk.CellRendererText(), text=1))
111
113
self._treeview.set_search_column(0)
112
114
for conflict in self.wt.conflicts():
113
115
if conflict.typestring == 'path conflict':
114
t = _i18n("path conflict")
116
t = _("path conflict")
115
117
elif conflict.typestring == 'contents conflict':
116
t = _i18n("contents conflict")
118
t = _("contents conflict")
117
119
elif conflict.typestring == 'text conflict':
118
t = _i18n("text conflict")
120
t = _("text conflict")
119
121
elif conflict.typestring == 'duplicate id':
120
t = _i18n("duplicate id")
122
t = _("duplicate id")
121
123
elif conflict.typestring == 'duplicate':
122
t = _i18n("duplicate")
123
125
elif conflict.typestring == 'parent loop':
124
t = _i18n("parent loop")
125
127
elif conflict.typestring == 'unversioned parent':
126
t = _i18n("unversioned parent")
128
t = _("unversioned parent")
127
129
elif conflict.typestring == 'missing parent':
128
t = _i18n("missing parent")
130
t = _("missing parent")
129
131
elif conflict.typestring == 'deleting parent':
130
t = _i18n("deleting parent")
132
t = _("deleting parent")
132
t = _i18n("unknown type of conflict")
134
self.model.append([ conflict.path, t, conflict.typestring ])
134
t = _("unknown type of conflict")
136
self.model.append([ conflict.path, t, conflict.typestring ])
136
138
def _get_selected_file(self):
137
139
""" Return the selected conflict's filename. """
138
140
treeselection = self._treeview.get_selection()
139
141
(model, iter) = treeselection.get_selected()
144
146
return model.get_value(iter, 0)
146
148
def _get_selected_type(self):
147
149
""" Return the type of the selected conflict. """
148
150
treeselection = self._treeview.get_selection()
149
151
(model, iter) = treeselection.get_selected()
154
156
return model.get_value(iter, 2)
156
158
def _on_diff3_clicked(self, widget):
157
159
""" Launch external utility to resolve conflicts. """
158
160
self._set_diff3(self._entry_diff3.get_text())
159
161
selected = self._get_selected_file()
160
162
if selected is None:
161
error_dialog(_i18n('No file was selected'),
162
_i18n('Please select a file from the list.'))
163
error_dialog(_('No file was selected'),
164
_('Please select a file from the list.'))
164
166
elif self._get_selected_type() == 'text conflict':
165
167
base = self.wt.abspath(selected) + '.BASE'