blob: 6abe5e0217a3323cd0a278212d206c4254c76926 [file] [log] [blame]
Guido van Rossum3b4ca0d1998-10-10 18:48:31 +00001import re
2import tkSimpleDialog
3import tkMessageBox
4
5class SearchBinding:
6
7 def __init__(self, text):
8 self.text = text
9 self.pat = ""
10 self.prog = None
11 self.text.bind("<<find>>", self.find_event)
12 self.text.bind("<<find-next>>", self.find_next_event)
13 self.text.bind("<<find-same>>", self.find_same_event)
14 self.text.bind("<<goto-line>>", self.goto_line_event)
15
16 def find_event(self, event):
17 default = self.text.get("self.first", "sel.last") or self.pat
18 new = tkSimpleDialog.askstring("Find",
19 "Regular Expression:",
20 initialvalue=default,
21 parent=self.text)
22 if not new:
23 return "break"
24 self.pat = new
25 try:
26 self.prog = re.compile(self.pat)
27 except re.error, msg:
28 tkMessageBox.showerror("RE error", str(msg),
29 master=self.text)
30 return "break"
31 return self.find_next_event(event)
32
33 def find_same_event(self, event):
34 pat = self.text.get("sel.first", "sel.last")
35 if not pat:
36 return self.find_event(event)
37 self.pat = re.escape(pat)
38 self.prog = None
39 try:
40 self.prog = re.compile(self.pat)
41 except re.error, msg:
42 tkMessageBox.showerror("RE error", str(message),
43 master=self.text)
44 return "break"
45 self.text.mark_set("insert", "sel.last")
46 return self.find_next_event(event)
47
48 def find_next_event(self, event):
49 if not self.pat:
50 return self.find_event(event)
51 if not self.prog:
52 self.text.bell()
53 ##print "No program"
54 return "break"
55 self.text.mark_set("find", "insert")
56 while 1:
57 chars = self.text.get("find", "find lineend +1c")
58 ##print "Searching", `chars`
59 if not chars:
60 self.text.bell()
61 ##print "end of buffer"
62 break
63 m = self.prog.search(chars)
64 if m:
65 i, j = m.span()
66 self.text.mark_set("insert", "find +%dc" % j)
67 self.text.mark_set("find", "find +%dc" % i)
68 self.text.tag_remove("sel", "1.0", "end")
69 self.text.tag_add("sel", "find", "insert")
70 self.text.see("insert")
71 break
72 self.text.mark_set("find", "find lineend +1c")
73 return "break"
74
75 def goto_line_event(self, event):
76 lineno = tkSimpleDialog.askinteger("Goto",
77 "Go to line number:")
78 if lineno is None:
79 return "break"
80 if lineno <= 0:
81 self.text.bell()
82 return "break"
83 self.text.mark_set("insert", "%d.0" % lineno)
84 self.text.see("insert")