blob: ccbdc6c39cfb08329d7c0310817e7a6d0d4a5279 [file] [log] [blame]
Guido van Rossum7b9bb051998-10-19 03:33:40 +00001import string
Guido van Rossum3b4ca0d1998-10-10 18:48:31 +00002import re
3import tkSimpleDialog
4import tkMessageBox
5
6class SearchBinding:
7
8 def __init__(self, text):
9 self.text = text
10 self.pat = ""
11 self.prog = None
12 self.text.bind("<<find>>", self.find_event)
13 self.text.bind("<<find-next>>", self.find_next_event)
14 self.text.bind("<<find-same>>", self.find_same_event)
15 self.text.bind("<<goto-line>>", self.goto_line_event)
16
17 def find_event(self, event):
18 default = self.text.get("self.first", "sel.last") or self.pat
19 new = tkSimpleDialog.askstring("Find",
20 "Regular Expression:",
21 initialvalue=default,
22 parent=self.text)
23 if not new:
24 return "break"
25 self.pat = new
26 try:
27 self.prog = re.compile(self.pat)
28 except re.error, msg:
29 tkMessageBox.showerror("RE error", str(msg),
30 master=self.text)
31 return "break"
32 return self.find_next_event(event)
33
34 def find_same_event(self, event):
35 pat = self.text.get("sel.first", "sel.last")
36 if not pat:
37 return self.find_event(event)
38 self.pat = re.escape(pat)
39 self.prog = None
40 try:
41 self.prog = re.compile(self.pat)
42 except re.error, msg:
43 tkMessageBox.showerror("RE error", str(message),
44 master=self.text)
45 return "break"
46 self.text.mark_set("insert", "sel.last")
47 return self.find_next_event(event)
48
49 def find_next_event(self, event):
50 if not self.pat:
51 return self.find_event(event)
52 if not self.prog:
53 self.text.bell()
54 ##print "No program"
55 return "break"
Guido van Rossum7b9bb051998-10-19 03:33:40 +000056 line, col = map(int,
57 string.split(self.text.index("insert"), "."))
58 chars = self.text.get("%d.0" % line, "%d.0" % (line+1))
59 while chars:
60 m = self.prog.search(chars, col)
Guido van Rossum3b4ca0d1998-10-10 18:48:31 +000061 if m:
62 i, j = m.span()
Guido van Rossum7b9bb051998-10-19 03:33:40 +000063 self.text.mark_set("insert",
64 "%d.%d" % (line, j))
Guido van Rossum3b4ca0d1998-10-10 18:48:31 +000065 self.text.tag_remove("sel", "1.0", "end")
Guido van Rossum7b9bb051998-10-19 03:33:40 +000066 self.text.tag_add("sel",
67 "%d.%d" % (line, i),
68 "%d.%d" % (line, j))
Guido van Rossum3b4ca0d1998-10-10 18:48:31 +000069 self.text.see("insert")
70 break
Guido van Rossum7b9bb051998-10-19 03:33:40 +000071 line = line + 1
72 col = 0
73 chars = self.text.get("%d.0" % line, "%d.0" % (line+1))
74 else:
75 # Not found
76 self.text.bell()
Guido van Rossum3b4ca0d1998-10-10 18:48:31 +000077 return "break"
78
79 def goto_line_event(self, event):
80 lineno = tkSimpleDialog.askinteger("Goto",
Guido van Rossum69ef7d61998-10-12 16:07:27 +000081 "Go to line number:",
82 parent=self.text)
Guido van Rossum3b4ca0d1998-10-10 18:48:31 +000083 if lineno is None:
84 return "break"
85 if lineno <= 0:
86 self.text.bell()
87 return "break"
88 self.text.mark_set("insert", "%d.0" % lineno)
89 self.text.see("insert")