- Got rid of newmodule.c
[python/dscho.git] / Lib / idlelib / IdleHistory.py
blobb882c92c152a1ce44d969004b25141ff017c6131
1 import string
3 class History:
5 def __init__(self, text, output_sep = "\n"):
6 self.text = text
7 self.history = []
8 self.history_prefix = None
9 self.history_pointer = None
10 self.output_sep = output_sep
11 text.bind("<<history-previous>>", self.history_prev)
12 text.bind("<<history-next>>", self.history_next)
14 def history_next(self, event):
15 self.history_do(0)
16 return "break"
18 def history_prev(self, event):
19 self.history_do(1)
20 return "break"
22 def _get_source(self, start, end):
23 # Get source code from start index to end index. Lines in the
24 # text control may be separated by sys.ps2 .
25 lines = string.split(self.text.get(start, end), self.output_sep)
26 return string.join(lines, "\n")
28 def _put_source(self, where, source):
29 output = string.join(string.split(source, "\n"), self.output_sep)
30 self.text.insert(where, output)
32 def history_do(self, reverse):
33 nhist = len(self.history)
34 pointer = self.history_pointer
35 prefix = self.history_prefix
36 if pointer is not None and prefix is not None:
37 if self.text.compare("insert", "!=", "end-1c") or \
38 self._get_source("iomark", "end-1c") != self.history[pointer]:
39 pointer = prefix = None
40 if pointer is None or prefix is None:
41 prefix = self._get_source("iomark", "end-1c")
42 if reverse:
43 pointer = nhist
44 else:
45 pointer = -1
46 nprefix = len(prefix)
47 while 1:
48 if reverse:
49 pointer = pointer - 1
50 else:
51 pointer = pointer + 1
52 if pointer < 0 or pointer >= nhist:
53 self.text.bell()
54 if self._get_source("iomark", "end-1c") != prefix:
55 self.text.delete("iomark", "end-1c")
56 self._put_source("iomark", prefix)
57 pointer = prefix = None
58 break
59 item = self.history[pointer]
60 if item[:nprefix] == prefix and len(item) > nprefix:
61 self.text.delete("iomark", "end-1c")
62 self._put_source("iomark", item)
63 break
64 self.text.mark_set("insert", "end-1c")
65 self.text.see("insert")
66 self.text.tag_remove("sel", "1.0", "end")
67 self.history_pointer = pointer
68 self.history_prefix = prefix
70 def history_store(self, source):
71 source = string.strip(source)
72 if len(source) > 2:
73 # avoid duplicates
74 try:
75 self.history.remove(source)
76 except ValueError:
77 pass
78 self.history.append(source)
79 self.history_pointer = None
80 self.history_prefix = None
82 def recall(self, s):
83 s = string.strip(s)
84 self.text.tag_remove("sel", "1.0", "end")
85 self.text.delete("iomark", "end-1c")
86 self.text.mark_set("insert", "end-1c")
87 self.text.insert("insert", s)
88 self.text.see("insert")