Fix warning message when opening minibuffer (reported by joehill).
[rox-edit/bju.git] / buffer.py
blob51dc040c65f5d1a41d6115990f98a9097d8eddc0
1 import rox
2 from rox import g
4 DELETE = 1
5 INSERT = 2
7 class Buffer(g.TextBuffer):
8 "A buffer that deals with undo/redo."
10 def __init__(self):
11 g.TextBuffer.__init__(self, None)
12 self.undo_buffer = []
13 self.redo_buffer = [] # Will be None during undo or redo
15 def start_undo_history(self):
16 self.connect('delete-range', self.delete_range)
17 self.connect('insert-text', self.insert_text)
19 def delete_range(self, buffer, start, end):
20 self.undo_buffer.append((INSERT,
21 start.get_offset(),
22 buffer.get_slice(start, end, g.TRUE)))
23 if self.redo_buffer:
24 self.redo_buffer = []
26 def insert_text(self, buffer, where, text, len):
27 text = text[:len] # PyGtk bug?
28 start = where.get_offset()
29 self.undo_buffer.append((DELETE, start, start + len, text))
30 if self.redo_buffer:
31 self.redo_buffer = []
33 def do_action(self, op):
34 if op[0] == DELETE:
35 start = self.get_iter_at_offset(op[1])
36 end = self.get_iter_at_offset(op[2])
37 self.delete(start, end)
38 elif op[0] == INSERT:
39 start = self.get_iter_at_offset(op[1])
40 self.insert(start, op[2], -1)
41 else:
42 rox.alert('Unknown entry in undo buffer!\n' + `op`)
44 def undo(self):
45 if not self.undo_buffer:
46 g.gdk.beep()
47 return
48 op = self.undo_buffer.pop()
50 old_undo = self.undo_buffer
51 self.undo_buffer = self.redo_buffer # Put undos in redo buffer
52 self.redo_buffer = None # Don't clear redo buffer
54 try:
55 self.do_action(op)
56 finally:
57 self.redo_buffer = self.undo_buffer
58 self.undo_buffer = old_undo
60 def redo(self):
61 if not self.redo_buffer:
62 g.gdk.beep()
63 return
64 op = self.redo_buffer.pop()
66 old_redo = self.redo_buffer
67 self.redo_buffer = None # Don't clear redo buffer
69 try:
70 self.do_action(op)
71 finally:
72 self.redo_buffer = old_redo