726
733
[ 'Integer', 'display_tab_width', 8, _('Tab width'), 1, 1024 ],
727
734
[ 'Boolean', 'display_ignore_whitespace', False, _('Ignore white space differences') ],
728
735
[ 'Boolean', 'display_ignore_whitespace_changes', False, _('Ignore changes to white space') ],
729
[ 'Boolean', 'display_ignore_blanklines', False, _('Ignore blank lines') ],
730
[ 'Boolean', 'display_ignore_case', False, _('Ignore case') ],
736
[ 'Boolean', 'display_ignore_blanklines', False, _('Ignore blank line differences') ],
737
[ 'Boolean', 'display_ignore_case', False, _('Ignore case differences') ],
731
738
[ 'Boolean', 'display_ignore_endofline', False, _('Ignore end of line differences') ],
732
739
[ 'Boolean', 'display_hide_endofline', True, _('Hide end of line characters') ]
2044
2054
self._line_mode_actions = {
2045
'enter_align_mode': self._line_mode_enter_align_mode,
2046
'enter_character_mode': self.setCharMode,
2047
'first_line': self._first_line,
2048
'extend_first_line': self._extend_first_line,
2049
'last_line': self._last_line,
2050
'extend_last_line': self._extend_last_line,
2051
'up': self._line_mode_up,
2052
'extend_up': self._line_mode_extend_up,
2053
'down': self._line_mode_down,
2054
'extend_down': self._line_mode_extend_down,
2055
'left': self._line_mode_left,
2056
'extend_left': self._line_mode_extend_left,
2057
'right': self._line_mode_right,
2058
'extend_right': self._line_mode_extend_right,
2059
'page_up': self._line_mode_page_up,
2060
'extend_page_up': self._line_mode_extend_page_up,
2061
'page_down': self._line_mode_page_down,
2062
'extend_page_down': self._line_mode_extend_page_down,
2063
'delete_text': self._delete_text,
2064
'clear_edits': self._clear_edits,
2065
'isolate': self._isolate,
2066
'first_difference': self._first_difference,
2067
'previous_difference': self._previous_difference,
2068
'next_difference': self._next_difference,
2069
'last_difference': self._last_difference,
2070
'merge_from_left': self._merge_from_left,
2071
'merge_from_right': self._merge_from_right,
2072
'merge_from_left_then_right': self._merge_from_left_then_right,
2073
'merge_from_right_then_left': self._merge_from_right_then_left }
2055
'enter_align_mode': self._line_mode_enter_align_mode,
2056
'enter_character_mode': self.setCharMode,
2057
'first_line': self._first_line,
2058
'extend_first_line': self._extend_first_line,
2059
'last_line': self._last_line,
2060
'extend_last_line': self._extend_last_line,
2061
'up': self._line_mode_up,
2062
'extend_up': self._line_mode_extend_up,
2063
'down': self._line_mode_down,
2064
'extend_down': self._line_mode_extend_down,
2065
'left': self._line_mode_left,
2066
'extend_left': self._line_mode_extend_left,
2067
'right': self._line_mode_right,
2068
'extend_right': self._line_mode_extend_right,
2069
'page_up': self._line_mode_page_up,
2070
'extend_page_up': self._line_mode_extend_page_up,
2071
'page_down': self._line_mode_page_down,
2072
'extend_page_down': self._line_mode_extend_page_down,
2073
'delete_text': self._delete_text,
2074
'clear_edits': self.clear_edits,
2075
'isolate': self.isolate,
2076
'first_difference': self.first_difference,
2077
'previous_difference': self.previous_difference,
2078
'next_difference': self.next_difference,
2079
'last_difference': self.last_difference,
2080
'merge_from_left': self.merge_from_left,
2081
'merge_from_right': self.merge_from_right,
2082
'merge_from_left_then_right': self.merge_from_left_then_right,
2083
'merge_from_right_then_left': self.merge_from_right_then_left }
2074
2084
self._align_mode_actions = {
2075
'enter_line_mode': self._align_mode_enter_line_mode,
2076
'enter_character_mode': self.setCharMode,
2077
'first_line': self._first_line,
2078
'last_line': self._last_line,
2079
'up': self._line_mode_up,
2080
'down': self._line_mode_down,
2081
'left': self._line_mode_left,
2082
'right': self._line_mode_right,
2083
'page_up': self._line_mode_page_up,
2084
'page_down': self._line_mode_page_down,
2085
'align': self._align_text }
2085
'enter_line_mode': self._align_mode_enter_line_mode,
2086
'enter_character_mode': self.setCharMode,
2087
'first_line': self._first_line,
2088
'last_line': self._last_line,
2089
'up': self._line_mode_up,
2090
'down': self._line_mode_down,
2091
'left': self._line_mode_left,
2092
'right': self._line_mode_right,
2093
'page_up': self._line_mode_page_up,
2094
'page_down': self._line_mode_page_down,
2095
'align': self._align_text }
2086
2096
self._character_mode_actions = {
2087
'enter_line_mode': self.setLineMode }
2097
'enter_line_mode': self.setLineMode }
2098
self._button_actions = {
2103
'paste': self.paste,
2104
'select_all': self.select_all,
2105
'clear_edits': self.clear_edits,
2106
'decrease_indenting': self.decrease_indenting,
2107
'increase_indenting': self.increase_indenting,
2108
'convert_to_dos': self.convert_to_dos,
2109
'convert_to_mac': self.convert_to_mac,
2110
'convert_to_unix': self.convert_to_unix,
2111
'realign_all': self.realign_all,
2112
'isolate': self.isolate,
2113
'first_difference': self.first_difference,
2114
'previous_difference': self.previous_difference,
2115
'next_difference': self.next_difference,
2116
'last_difference': self.last_difference,
2117
'shift_pane_left': self.shift_pane_left,
2118
'shift_pane_right': self.shift_pane_right,
2119
'merge_from_left': self.merge_from_left,
2120
'merge_from_right': self.merge_from_right,
2121
'merge_from_left_then_right': self.merge_from_left_then_right,
2122
'merge_from_right_then_left': self.merge_from_right_then_left }
2090
2125
self.dareas = []
2233
2278
# changes the viewer's mode to LINE_MODE
2234
2279
def setLineMode(self):
2235
if self.mode == CHAR_MODE:
2236
self.dareas[self.current_pane].queue_draw()
2237
self.current_char = 0
2238
self.selection_char = 0
2239
elif self.mode == ALIGN_MODE:
2240
self.dareas[self.align_pane].queue_draw()
2241
self.dareas[self.current_pane].queue_draw()
2244
self.mode = LINE_MODE
2280
if self.mode != LINE_MODE:
2281
if self.mode == CHAR_MODE:
2282
self.dareas[self.current_pane].queue_draw()
2283
self.current_char = 0
2284
self.selection_char = 0
2285
elif self.mode == ALIGN_MODE:
2286
self.dareas[self.align_pane].queue_draw()
2287
self.dareas[self.current_pane].queue_draw()
2290
self.mode = LINE_MODE
2291
self.emit('cursor_changed')
2292
self.emit('mode_changed')
2247
2294
# changes the viewer's mode to CHAR_MODE
2248
2295
def setCharMode(self):
2249
if self.mode == LINE_MODE:
2250
self.cursor_column = -1
2251
self.setCurrentChar(self.current_line, 0)
2252
elif self.mode == ALIGN_MODE:
2253
self.dareas[self.align_pane].queue_draw()
2254
self.cursor_column = -1
2257
self.setCurrentChar(self.current_line, 0)
2258
self.mode = CHAR_MODE
2296
if self.mode != CHAR_MODE:
2297
if self.mode == LINE_MODE:
2298
self.cursor_column = -1
2299
self.setCurrentChar(self.current_line, 0)
2300
elif self.mode == ALIGN_MODE:
2301
self.dareas[self.align_pane].queue_draw()
2302
self.cursor_column = -1
2305
self.setCurrentChar(self.current_line, 0)
2306
self.mode = CHAR_MODE
2307
self.emit('cursor_changed')
2308
self.emit('mode_changed')
2261
2310
# sets the syntax hightlighting rules
2262
def setSyntax(self, syntax):
2263
if self.syntax is not syntax:
2264
self.syntax = syntax
2311
def setSyntax(self, s):
2312
if self.syntax is not s:
2265
2314
# invalidate the syntax caches
2266
2315
for pane in self.panes:
2267
2316
pane.syntax_cache = []
2317
self.emit('syntax_changed', s)
2268
2318
# force all panes to redraw
2269
2319
for darea in self.dareas:
2270
2320
darea.queue_draw()
2323
def getSyntax(self):
2272
2326
# returns True if any pane contains edits
2273
2327
def hasEdits(self):
2274
2328
for pane in self.panes:
3326
3380
menu = createMenu(
3327
3381
[ [_('Align to Selection'), self.align_to_selection_cb, [f, i], gtk.STOCK_EXECUTE, None, can_align],
3328
[_('Isolate'), self.isolate_cb, None, None, None, can_isolate ],
3382
[_('Isolate'), self.button_cb, 'isolate', None, None, can_isolate ],
3329
3383
[_('Merge'), self.merge_lines_cb, f, None, None, can_merge],
3331
[_('Cut'), self.cut_cb, None, gtk.STOCK_CUT, None, can_select],
3332
[_('Copy'), self.copy_cb, None, gtk.STOCK_COPY, None, can_select],
3333
[_('Paste'), self.paste_cb, None, gtk.STOCK_PASTE, None, can_select],
3385
[_('Cut'), self.button_cb, 'cut', gtk.STOCK_CUT, None, can_select],
3386
[_('Copy'), self.button_cb, 'copy', gtk.STOCK_COPY, None, can_select],
3387
[_('Paste'), self.button_cb, 'paste', gtk.STOCK_PASTE, None, can_select],
3335
[_('Select All'), self.select_all_cb, None, None, None, can_select],
3336
[_('Clear Edits'), self.clear_edits_cb, None, gtk.STOCK_CLEAR, None, can_isolate],
3389
[_('Select All'), self.button_cb, 'select_all', None, None, can_select],
3390
[_('Clear Edits'), self.button_cb, 'clear_edits', gtk.STOCK_CLEAR, None, can_isolate],
3338
3392
[_('Swap with Selected Pane'), self.swap_panes_cb, f, None, None, can_swap] ])
3339
3393
menu.popup(None, None, None, event.button, event.time)
4581
4610
self.selection_line = i
4582
4611
self.setCurrentLine(f, start, True)
4584
# 'first_difference' keybinding action
4585
def _first_difference(self):
4613
# 'first_difference' action
4614
def first_difference(self):
4586
4615
self.setLineMode()
4587
4616
self.goto_difference(0, 1)
4589
# callback for the first difference menu item
4590
def first_difference_cb(self, widget, data):
4591
self._first_difference()
4593
# 'previous_difference' keybinding action
4594
def _previous_difference(self):
4618
# 'previous_difference' action
4619
def previous_difference(self):
4595
4620
self.setLineMode()
4596
4621
i = min(self.current_line, self.selection_line) - 1
4597
4622
self.goto_difference(i, -1)
4599
# callback for the previous difference menu item
4600
def previous_difference_cb(self, widget, data):
4601
self._previous_difference()
4603
# 'next_difference' keybinding action
4604
def _next_difference(self):
4624
# 'next_difference' action
4625
def next_difference(self):
4605
4626
self.setLineMode()
4606
4627
i = max(self.current_line, self.selection_line) + 1
4607
4628
self.goto_difference(i, 1)
4609
# callback for the next difference menu item
4610
def next_difference_cb(self, widget, data):
4611
self._next_difference()
4613
# 'last_difference' keybinding action
4614
def _last_difference(self):
4630
# 'last_difference' action
4631
def last_difference(self):
4615
4632
self.setLineMode()
4616
f = self.current_pane
4617
i = len(self.panes[f].lines)
4633
i = len(self.panes[self.current_pane].lines)
4618
4634
self.goto_difference(i, -1)
4620
# callback for the last difference menu item
4621
def last_difference_cb(self, widget, data):
4622
self._last_difference()
4624
4636
# Undo for changes to the pane ordering
4625
4637
class SwapPanesUndo:
4626
4638
def __init__(self, f_dst, f_src):
4695
4708
self.setFormat(f_dst, getFormat(ss))
4696
4709
for i, s in enumerate(ss):
4697
4710
self.updateText(f_dst, start + i, convert_to_format(s, pane.format))
4711
self.recordEditMode()
4699
4713
# callback for merge lines menu item
4700
4714
def merge_lines_cb(self, widget, data):
4701
4715
self.openUndoBlock()
4702
self.recordEditMode()
4703
4716
self.merge_lines(data, self.current_pane)
4704
self.recordEditMode()
4705
4717
self.closeUndoBlock()
4707
# 'merge_from_left' keybinding action
4708
def _merge_from_left(self):
4719
# 'merge_from_left' action
4720
def merge_from_left(self):
4709
4721
f = self.current_pane
4711
4723
self.merge_lines(f, f - 1)
4713
# callback for merge from left menu item
4714
def merge_from_left_cb(self, widget, data):
4715
self.openUndoBlock()
4716
self.recordEditMode()
4717
self._merge_from_left()
4718
self.recordEditMode()
4719
self.closeUndoBlock()
4721
# 'merge_from_right' keybinding action
4722
def _merge_from_right(self):
4725
# 'merge_from_right' action
4726
def merge_from_right(self):
4723
4727
f = self.current_pane
4724
4728
if f + 1 < len(self.panes):
4725
4729
self.merge_lines(f, f + 1)
4727
# callback for merge from right menu item
4728
def merge_from_right_cb(self, widget, data):
4729
self.openUndoBlock()
4730
self.recordEditMode()
4731
self._merge_from_right()
4732
self.recordEditMode()
4733
self.closeUndoBlock()
4735
4731
# merge from both left and right into the current pane
4736
4732
def _mergeBoth(self, right_first):
4733
self.recordEditMode()
4737
4734
self.setLineMode()
4738
4735
f = self.current_pane
4739
4736
start, end = self.selection_line, self.current_line
4813
4810
self.selection_line = start
4814
4811
self.setCurrentLine(f, end, True)
4812
self.recordEditMode()
4816
4814
# 'merge_from_left_then_right' keybinding action
4817
def _merge_from_left_then_right(self):
4815
def merge_from_left_then_right(self):
4818
4816
self._mergeBoth(False)
4820
4818
# 'merge_from_right_then_left' keybinding action
4821
def _merge_from_right_then_left(self):
4819
def merge_from_right_then_left(self):
4822
4820
self._mergeBoth(True)
4824
# callback for merge from left then right menu item
4825
def merge_from_left_then_right_cb(self, widget, data):
4826
self.openUndoBlock()
4827
self.recordEditMode()
4828
self._merge_from_left_then_right()
4829
self.recordEditMode()
4830
self.closeUndoBlock()
4832
# callback for merge from right then left menu item
4833
def merge_from_right_then_left_cb(self, widget, data):
4834
self.openUndoBlock()
4835
self.recordEditMode()
4836
self._merge_from_right_then_left()
4837
self.recordEditMode()
4838
self.closeUndoBlock()
4840
4822
# create 'title_changed' signal for FileDiffViewer
4841
4823
gobject.signal_new('swapped_panes', FileDiffViewer, gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, (int, int))
4842
4824
gobject.signal_new('num_edits_changed', FileDiffViewer, gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, (int, ))
4843
gobject.signal_new('status_changed', FileDiffViewer, gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, (str, ))
4825
gobject.signal_new('mode_changed', FileDiffViewer, gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, ())
4826
gobject.signal_new('cursor_changed', FileDiffViewer, gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, ())
4827
gobject.signal_new('syntax_changed', FileDiffViewer, gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, (str, ))
4828
gobject.signal_new('format_changed', FileDiffViewer, gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, (int, int))
4845
4830
# dialogue used to search for text
4846
4831
class SearchDialog(gtk.Dialog):
5102
5122
self.has_edits = has_edits
5103
5123
self.updateTitle()
5126
class PaneFooter(gtk.HBox):
5128
gtk.HBox.__init__(self)
5130
self.cursor = label = gtk.Label()
5131
self.pack_start(label, False, False, 0)
5134
separator = gtk.VSeparator()
5135
self.pack_end(separator, False, False, 10)
5138
self.encoding = label = gtk.Label()
5139
self.pack_end(label, False, False, 0)
5142
separator = gtk.VSeparator()
5143
self.pack_end(separator, False, False, 10)
5146
self.format = label = gtk.Label()
5147
self.pack_end(label, False, False, 0)
5150
separator = gtk.VSeparator()
5151
self.pack_end(separator, False, False, 10)
5154
self.set_size_request(0, self.get_size_request()[1])
5156
# set the cursor label
5157
def updateCursor(self, viewer, f):
5158
if viewer.mode == CHAR_MODE and viewer.current_pane == f:
5159
j = viewer.current_char
5161
text = viewer.getLineText(viewer.current_pane, viewer.current_line)[:j]
5162
j = viewer.stringWidth(viewer.current_pane, text)
5163
s = _('Column %d') % (j, )
5166
self.cursor.set_text(s)
5168
# set the format label
5169
def setFormat(self, s):
5177
self.format.set_text('/'.join(v))
5179
# set the format label
5180
def setEncoding(self, s):
5183
self.encoding.set_text(s)
5105
5185
def __init__(self, n, prefs, title):
5106
5186
self.headers = headers = [ Diffuse.FileDiffViewer.PaneHeader() for i in range(n) ]
5107
FileDiffViewer.__init__(self, headers, prefs)
5187
self.footers = footers = [ Diffuse.FileDiffViewer.PaneFooter() for i in range(n) ]
5188
FileDiffViewer.__init__(self, headers, footers, prefs)
5108
5189
self.title = title
5109
5190
self.status = ''
5111
5192
self.connect('swapped_panes', self.swapped_panes_cb)
5112
5193
self.connect('num_edits_changed', self.num_edits_changed_cb)
5113
self.connect('status_changed', self.status_changed_cb)
5194
self.connect('mode_changed', self.mode_changed_cb)
5114
5195
for i, h in enumerate(headers):
5115
5196
h.connect('title_changed', self.title_changed_cb)
5116
5197
h.connect('open', self.open_file_button_cb, i)
5426
5521
# callback to receive notification when the name of a file changes
5427
5522
def swapped_panes_cb(self, widget, f_dst, f_src):
5428
5523
f0, f1 = self.headers[f_dst], self.headers[f_src]
5429
f0.info, f1.info = f1.info, f0.info
5430
5524
f0.has_edits, f1.has_edits = f1.has_edits, f0.has_edits
5525
info0, info1 = f1.info, f0.info
5526
self.setFileInfo(f_dst, info0)
5527
self.setFileInfo(f_src, info1)
5434
5529
# callback to receive notification when the name of a file changes
5435
5530
def num_edits_changed_cb(self, widget, f):
5436
5531
self.headers[f].setEdits(self.panes[f].num_edits > 0)
5438
# callback to record the viewer's current status message
5439
def status_changed_cb(self, widget, s):
5533
# callback to record changes to the viewer's mode
5534
def mode_changed_cb(self, widget):
5537
# update the viewer's current status message
5538
def updateStatus(self):
5539
if self.mode == LINE_MODE:
5540
s = _('Press the enter key or double click to edit. Press the space bar or use the RMB menu to manually align.')
5541
elif self.mode == CHAR_MODE:
5542
s = _('Press the escape key to finish editing.')
5543
elif self.mode == ALIGN_MODE:
5544
s = _('Select target line and press the space bar to align. Press the escape key to cancel.')
5440
5547
self.status = s
5548
self.emit('status_changed', s)
5442
5550
# gets the status bar text
5443
5551
def getStatus(self):
5444
5552
return self.status
5554
# callback to display the cursor in a pane
5555
def cursor_changed_cb(self, widget):
5556
for f, footer in enumerate(self.footers):
5557
footer.updateCursor(self, f)
5559
# callback to display the format of a pane
5560
def format_changed_cb(self, widget, f, format):
5561
self.footers[f].setFormat(format)
5446
5563
def __init__(self, rc_dir):
5447
5564
gtk.Window.__init__(self, gtk.WINDOW_TOPLEVEL)
5513
5630
[_('_Quit'), self.quit_cb, None, gtk.STOCK_QUIT, 'quit'] ] ])
5515
5632
menuspecs.append([ _('_Edit'), [
5516
[_('_Undo'), self.undo_cb, None, gtk.STOCK_UNDO, 'undo'],
5517
[_('_Redo'), self.redo_cb, None, gtk.STOCK_REDO, 'redo'],
5519
[_('Cu_t'), self.cut_cb, None, gtk.STOCK_CUT, 'cut'],
5520
[_('_Copy'), self.copy_cb, None, gtk.STOCK_COPY, 'copy'],
5521
[_('_Paste'), self.paste_cb, None, gtk.STOCK_PASTE, 'paste'],
5523
[_('Select _All'), self.select_all_cb, None, None, 'select_all'],
5524
[_('C_lear Edits'), self.clear_edits_cb, None, gtk.STOCK_CLEAR, 'clear_edits'],
5633
[_('_Undo'), self.button_cb, 'undo', gtk.STOCK_UNDO, 'undo'],
5634
[_('_Redo'), self.button_cb, 'redo', gtk.STOCK_REDO, 'redo'],
5636
[_('Cu_t'), self.button_cb, 'cut', gtk.STOCK_CUT, 'cut'],
5637
[_('_Copy'), self.button_cb, 'copy', gtk.STOCK_COPY, 'copy'],
5638
[_('_Paste'), self.button_cb, 'paste', gtk.STOCK_PASTE, 'paste'],
5640
[_('Select _All'), self.button_cb, 'select_all', None, 'select_all'],
5641
[_('C_lear Edits'), self.button_cb, 'clear_edits', gtk.STOCK_CLEAR, 'clear_edits'],
5526
5643
[_('_Find...'), self.find_cb, None, gtk.STOCK_FIND, 'find'],
5527
5644
[_('Find _Next'), self.find_next_cb, None, None, 'find_next'],
5528
5645
[_('Find Pre_vious'), self.find_previous_cb, None, None, 'find_previous'],
5529
5646
[_('_Go To Line...'), self.go_to_line_cb, None, gtk.STOCK_JUMP_TO, 'go_to_line'],
5531
[_('Decrea_se Indenting'), self.decrease_indenting_cb, None, gtk.STOCK_UNINDENT, 'decrease_indenting'],
5532
[_('_Increase Indenting'), self.increase_indenting_cb, None, gtk.STOCK_INDENT, 'increase_indenting'],
5648
[_('Decrea_se Indenting'), self.button_cb, 'decrease_indenting', gtk.STOCK_UNINDENT, 'decrease_indenting'],
5649
[_('_Increase Indenting'), self.button_cb, 'increase_indenting', gtk.STOCK_INDENT, 'increase_indenting'],
5534
[_('Convert to _DOS Format'), self.convert_to_dos_cb, None, None, 'convert_to_dos'],
5535
[_('Convert to _Mac Format'), self.convert_to_mac_cb, None, None, 'convert_to_mac'],
5536
[_('Convert to Uni_x Format'), self.convert_to_unix_cb, None, None, 'convert_to_unix'],
5651
[_('Convert to _DOS Format'), self.button_cb, 'convert_to_dos', None, 'convert_to_dos'],
5652
[_('Convert to _Mac Format'), self.button_cb, 'convert_to_mac', None, 'convert_to_mac'],
5653
[_('Convert to Uni_x Format'), self.button_cb, 'convert_to_unix', None, 'convert_to_unix'],
5538
5655
[_('Pr_eferences...'), self.preferences_cb, None, gtk.STOCK_PREFERENCES, 'preferences'] ] ])
5548
5665
menuspecs.append([ _('_View'), [
5549
5666
[_('_Syntax Highlighting'), None, None, None, None, True, submenudef],
5551
[_('Re_align All'), self.realign_all_cb, None, gtk.STOCK_EXECUTE, 'realign_all'],
5552
[_('_Isolate'), self.isolate_cb, None, None, 'isolate'],
5668
[_('Re_align All'), self.button_cb, 'realign_all', gtk.STOCK_EXECUTE, 'realign_all'],
5669
[_('_Isolate'), self.button_cb, 'isolate', None, 'isolate'],
5554
[_('_First Difference'), self.first_difference_cb, None, gtk.STOCK_GOTO_TOP, 'first_difference'],
5555
[_('_Previous Difference'), self.previous_difference_cb, None, gtk.STOCK_GO_UP, 'previous_difference'],
5556
[_('_Next Difference'), self.next_difference_cb, None, gtk.STOCK_GO_DOWN, 'next_difference'],
5557
[_('_Last Difference'), self.last_difference_cb, None, gtk.STOCK_GOTO_BOTTOM, 'last_difference'],
5671
[_('_First Difference'), self.button_cb, 'first_difference', gtk.STOCK_GOTO_TOP, 'first_difference'],
5672
[_('_Previous Difference'), self.button_cb, 'previous_difference', gtk.STOCK_GO_UP, 'previous_difference'],
5673
[_('_Next Difference'), self.button_cb, 'next_difference', gtk.STOCK_GO_DOWN, 'next_difference'],
5674
[_('_Last Difference'), self.button_cb, 'last_difference', gtk.STOCK_GOTO_BOTTOM, 'last_difference'],
5559
5676
[_('Pre_vious Tab'), self.previous_tab_cb, None, None, 'previous_tab'],
5560
5677
[_('Next _Tab'), self.next_tab_cb, None, None, 'next_tab'],
5562
[_('Shift Pane _Left'), self.shift_pane_left_cb, None, None, 'shift_pane_left'],
5563
[_('Shift Pane _Right'), self.shift_pane_right_cb, None, None, 'shift_pane_right'] ] ])
5679
[_('Shift Pane _Left'), self.button_cb, 'shift_pane_left', None, 'shift_pane_left'],
5680
[_('Shift Pane _Right'), self.button_cb, 'shift_pane_right', None, 'shift_pane_right'] ] ])
5565
5682
menuspecs.append([ _('_Merge'), [
5566
[_('Merge From _Left'), self.merge_from_left_cb, None, gtk.STOCK_GO_FORWARD, 'merge_from_left'],
5567
[_('Merge From _Right'), self.merge_from_right_cb, None, gtk.STOCK_GO_BACK, 'merge_from_right'],
5568
[_('Merge From Left _Then Right'), self.merge_from_left_then_right_cb, None, DIFFUSE_STOCK_LEFT_RIGHT, 'merge_from_left_then_right'],
5569
[_('Merge From Right T_hen Left'), self.merge_from_right_then_left_cb, None, DIFFUSE_STOCK_RIGHT_LEFT, 'merge_from_right_then_left'] ] ])
5683
[_('Merge From _Left'), self.button_cb, 'merge_from_left', gtk.STOCK_GO_FORWARD, 'merge_from_left'],
5684
[_('Merge From _Right'), self.button_cb, 'merge_from_right', gtk.STOCK_GO_BACK, 'merge_from_right'],
5685
[_('Merge From Left _Then Right'), self.button_cb, 'merge_from_left_then_right', DIFFUSE_STOCK_LEFT_RIGHT, 'merge_from_left_then_right'],
5686
[_('Merge From Right T_hen Left'), self.button_cb, 'merge_from_right_then_left', DIFFUSE_STOCK_RIGHT_LEFT, 'merge_from_right_then_left'] ] ])
5571
5688
menuspecs.append([ _('_Help'), [
5572
5689
[_('_Help Contents...'), self.help_contents_cb, None, gtk.STOCK_HELP, 'help_contents'],
5580
5697
# create button bar
5581
5698
hbox = gtk.HBox()
5582
5699
appendButtons(hbox, gtk.ICON_SIZE_LARGE_TOOLBAR, [
5583
[ gtk.STOCK_EXECUTE, self.realign_all_cb, None, _('Realign All') ],
5585
[ gtk.STOCK_GOTO_TOP, self.first_difference_cb, None, _('First Difference') ],
5586
[ gtk.STOCK_GO_UP, self.previous_difference_cb, None, _('Previous Difference') ],
5587
[ gtk.STOCK_GO_DOWN, self.next_difference_cb, None, _('Next Difference') ],
5588
[ gtk.STOCK_GOTO_BOTTOM, self.last_difference_cb, None, _('Last Difference') ],
5590
[ gtk.STOCK_GO_FORWARD, self.merge_from_left_cb, None, _('Merge From Left') ],
5591
[ gtk.STOCK_GO_BACK, self.merge_from_right_cb, None, _('Merge From Right') ],
5592
[ DIFFUSE_STOCK_LEFT_RIGHT, self.merge_from_left_then_right_cb, None, _('Merge From Left Then Right') ],
5593
[ DIFFUSE_STOCK_RIGHT_LEFT, self.merge_from_right_then_left_cb, None, _('Merge From Right Then Left') ],
5595
[ gtk.STOCK_CUT, self.cut_cb, None, _('Cut') ],
5596
[ gtk.STOCK_COPY, self.copy_cb, None, _('Copy') ],
5597
[ gtk.STOCK_PASTE, self.paste_cb, None, _('Paste') ],
5598
[ gtk.STOCK_CLEAR, self.clear_edits_cb, None, _('Clear Edits') ] ])
5700
[ gtk.STOCK_EXECUTE, self.button_cb, 'realign_all', _('Realign All') ],
5702
[ gtk.STOCK_GOTO_TOP, self.button_cb, 'first_difference', _('First Difference') ],
5703
[ gtk.STOCK_GO_UP, self.button_cb, 'previous_difference', _('Previous Difference') ],
5704
[ gtk.STOCK_GO_DOWN, self.button_cb, 'next_difference', _('Next Difference') ],
5705
[ gtk.STOCK_GOTO_BOTTOM, self.button_cb, 'last_difference', _('Last Difference') ],
5707
[ gtk.STOCK_GO_FORWARD, self.button_cb, 'merge_from_left', _('Merge From Left') ],
5708
[ gtk.STOCK_GO_BACK, self.button_cb, 'merge_from_right', _('Merge From Right') ],
5709
[ DIFFUSE_STOCK_LEFT_RIGHT, self.button_cb, 'merge_from_left_then_right', _('Merge From Left Then Right') ],
5710
[ DIFFUSE_STOCK_RIGHT_LEFT, self.button_cb, 'merge_from_right_then_left', _('Merge From Right Then Left') ],
5712
[ gtk.STOCK_UNDO, self.button_cb, 'undo', _('Undo') ],
5713
[ gtk.STOCK_REDO, self.button_cb, 'redo', _('Redo') ],
5714
[ gtk.STOCK_CUT, self.button_cb, 'cut', _('Cut') ],
5715
[ gtk.STOCK_COPY, self.button_cb, 'copy', _('Copy') ],
5716
[ gtk.STOCK_PASTE, self.button_cb, 'paste', _('Paste') ],
5717
[ gtk.STOCK_CLEAR, self.button_cb, 'clear_edits', _('Clear Edits') ] ])
5599
5718
vbox.pack_start(hbox, False, False, 0)
5910
6039
if self.confirmQuit():
5911
6040
gtk.main_quit()
5913
# callback for the undo menu item
5914
def undo_cb(self, widget, data):
5915
self.getCurrentViewer().undo()
5917
# callback for the redo menu item
5918
def redo_cb(self, widget, data):
5919
self.getCurrentViewer().redo()
5921
# callback for the cut menu item
5922
def cut_cb(self, widget, data):
5923
self.getCurrentViewer().cut_cb(widget, data)
5925
# callback for the copy menu item
5926
def copy_cb(self, widget, data):
5927
self.getCurrentViewer().copy_cb(widget, data)
5929
# callback for the paste menu item
5930
def paste_cb(self, widget, data):
5931
self.getCurrentViewer().paste_cb(widget, data)
5933
# callback for the select all menu item
5934
def select_all_cb(self, widget, data):
5935
self.getCurrentViewer().select_all_cb(widget, data)
5937
# callback for the clear edits menu item
5938
def clear_edits_cb(self, widget, data):
5939
self.getCurrentViewer().clear_edits_cb(widget, data)
5941
6042
# request search parameters if force=True and then perform a search in the
5942
6043
# current viewer pane
5943
6044
def find(self, force, reverse):
5997
6098
def go_to_line_cb(self, widget, data):
5998
6099
self.getCurrentViewer().go_to_line_cb(widget, data)
6000
# callback for the decrease indenting menu item
6001
def decrease_indenting_cb(self, widget, data):
6002
self.getCurrentViewer().decrease_indenting_cb(widget, data)
6004
# callback for the increase indenting menu item
6005
def increase_indenting_cb(self, widget, data):
6006
self.getCurrentViewer().increase_indenting_cb(widget, data)
6008
# callback for the convert to DOS menu item
6009
def convert_to_dos_cb(self, widget, data):
6010
self.getCurrentViewer().convert_to_dos_cb(widget, data)
6012
# callback for the convert to Unix menu item
6013
def convert_to_mac_cb(self, widget, data):
6014
self.getCurrentViewer().convert_to_mac_cb(widget, data)
6016
# callback for the convert to Unix menu item
6017
def convert_to_unix_cb(self, widget, data):
6018
self.getCurrentViewer().convert_to_unix_cb(widget, data)
6020
6101
# notify all viewers of changes to the preferences
6021
6102
def preferences_updated(self):
6022
6103
n = self.notebook.get_n_pages()
6032
6113
# callback for all of the syntax highlighting menu items
6033
6114
def syntax_cb(self, widget, data):
6034
self.getCurrentViewer().setSyntax(theResources.getSyntax(data))
6036
# callback for the realign all menu item
6037
def realign_all_cb(self, widget, data):
6038
self.getCurrentViewer().realign_all_cb(widget, data)
6040
# callback for the isolate menu item
6041
def isolate_cb(self, widget, data):
6042
self.getCurrentViewer().isolate_cb(widget, data)
6044
# callback for the first difference menu item
6045
def first_difference_cb(self, widget, data):
6046
self.getCurrentViewer().first_difference_cb(widget, data)
6048
# callback for the previous difference menu item
6049
def previous_difference_cb(self, widget, data):
6050
self.getCurrentViewer().previous_difference_cb(widget, data)
6052
# callback for the next difference menu item
6053
def next_difference_cb(self, widget, data):
6054
self.getCurrentViewer().next_difference_cb(widget, data)
6056
# callback for the last difference menu item
6057
def last_difference_cb(self, widget, data):
6058
self.getCurrentViewer().last_difference_cb(widget, data)
6115
self.getCurrentViewer().setSyntax(data)
6060
6117
# callback for the previous tab menu item
6061
6118
def previous_tab_cb(self, widget, data):
6071
6128
self.notebook.set_current_page(i)
6073
# callback for the shift pane left menu item
6074
def shift_pane_left_cb(self, widget, data):
6075
self.getCurrentViewer().shift_pane_left_cb(widget, data)
6077
# callback for the shift pane right menu item
6078
def shift_pane_right_cb(self, widget, data):
6079
self.getCurrentViewer().shift_pane_right_cb(widget, data)
6081
# callback for the merge from left menu item
6082
def merge_from_left_cb(self, widget, data):
6083
self.getCurrentViewer().merge_from_left_cb(widget, data)
6085
# callback for the merge from right menu item
6086
def merge_from_right_cb(self, widget, data):
6087
self.getCurrentViewer().merge_from_right_cb(widget, data)
6089
# callback for the merge from left then right menu item
6090
def merge_from_left_then_right_cb(self, widget, data):
6091
self.getCurrentViewer().merge_from_left_then_right_cb(widget, data)
6093
# callback for the merge from right then left menu item
6094
def merge_from_right_then_left_cb(self, widget, data):
6095
self.getCurrentViewer().merge_from_right_then_left_cb(widget, data)
6130
# callback for most menu items and buttons
6131
def button_cb(self, widget, data):
6132
self.getCurrentViewer().button_cb(widget, data)
6097
6134
# display help documenation
6098
6135
def help_contents_cb(self, widget, data):