blob: 392d2055716865884503f5f6a1d887e6ac27ee7e [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",
Guido van Rossum69ef7d61998-10-12 16:07:27 +000077 "Go to line number:",
78 parent=self.text)
Guido van Rossum3b4ca0d1998-10-10 18:48:31 +000079 if lineno is None:
80 return "break"
81 if lineno <= 0:
82 self.text.bell()
83 return "break"
84 self.text.mark_set("insert", "%d.0" % lineno)
85 self.text.see("insert")