annotate Lib/idlelib/ReplaceDialog.py @ 54294:dba767bc3155 legacy-trunk

remove mention of old ctypes version
author Benjamin Peterson <benjamin@python.org>
date Sat, 23 May 2009 20:59:09 +0000
parents b53604fad54b
children eab361617f6a
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
47183
b53604fad54b Tkinter rename reversal: remove tkinter package, adapt imports and docs.
Georg Brandl <georg@python.org>
parents: 47101
diff changeset
1 from Tkinter import *
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
2 import SearchEngine
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
3 from SearchDialogBase import SearchDialogBase
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
4
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
5 def replace(text):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
6 root = text._root()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
7 engine = SearchEngine.get(root)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
8 if not hasattr(engine, "_replacedialog"):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
9 engine._replacedialog = ReplaceDialog(root, engine)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
10 dialog = engine._replacedialog
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
11 dialog.open(text)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
12
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
13 class ReplaceDialog(SearchDialogBase):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
14
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
15 title = "Replace Dialog"
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
16 icon = "Replace"
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
17
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
18 def __init__(self, root, engine):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
19 SearchDialogBase.__init__(self, root, engine)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
20 self.replvar = StringVar(root)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
21
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
22 def open(self, text):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
23 SearchDialogBase.open(self, text)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
24 try:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
25 first = text.index("sel.first")
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
26 except TclError:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
27 first = None
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
28 try:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
29 last = text.index("sel.last")
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
30 except TclError:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
31 last = None
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
32 first = first or text.index("insert")
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
33 last = last or first
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
34 self.show_hit(first, last)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
35 self.ok = 1
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
36
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
37 def create_entries(self):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
38 SearchDialogBase.create_entries(self)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
39 self.replent = self.make_entry("Replace with:", self.replvar)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
40
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
41 def create_command_buttons(self):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
42 SearchDialogBase.create_command_buttons(self)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
43 self.make_button("Find", self.find_it)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
44 self.make_button("Replace", self.replace_it)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
45 self.make_button("Replace+Find", self.default_command, 1)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
46 self.make_button("Replace All", self.replace_all)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
47
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
48 def find_it(self, event=None):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
49 self.do_find(0)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
50
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
51 def replace_it(self, event=None):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
52 if self.do_find(self.ok):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
53 self.do_replace()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
54
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
55 def default_command(self, event=None):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
56 if self.do_find(self.ok):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
57 self.do_replace()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
58 self.do_find(0)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
59
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
60 def replace_all(self, event=None):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
61 prog = self.engine.getprog()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
62 if not prog:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
63 return
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
64 repl = self.replvar.get()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
65 text = self.text
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
66 res = self.engine.search_text(text, prog)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
67 if not res:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
68 text.bell()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
69 return
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
70 text.tag_remove("sel", "1.0", "end")
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
71 text.tag_remove("hit", "1.0", "end")
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
72 line = res[0]
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
73 col = res[1].start()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
74 if self.engine.iswrap():
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
75 line = 1
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
76 col = 0
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
77 ok = 1
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
78 first = last = None
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
79 # XXX ought to replace circular instead of top-to-bottom when wrapping
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
80 text.undo_block_start()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
81 while 1:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
82 res = self.engine.search_forward(text, prog, line, col, 0, ok)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
83 if not res:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
84 break
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
85 line, m = res
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
86 chars = text.get("%d.0" % line, "%d.0" % (line+1))
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
87 orig = m.group()
25262
fda48dd94b07 MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 18498
diff changeset
88 new = m.expand(repl)
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
89 i, j = m.span()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
90 first = "%d.%d" % (line, i)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
91 last = "%d.%d" % (line, j)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
92 if new == orig:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
93 text.mark_set("insert", last)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
94 else:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
95 text.mark_set("insert", first)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
96 if first != last:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
97 text.delete(first, last)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
98 if new:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
99 text.insert(first, new)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
100 col = i + len(new)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
101 ok = 0
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
102 text.undo_block_stop()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
103 if first and last:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
104 self.show_hit(first, last)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
105 self.close()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
106
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
107 def do_find(self, ok=0):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
108 if not self.engine.getprog():
25311
bd3b92dc940a Merge Py Idle changes:
Kurt B. Kaiser <kbk@shore.net>
parents: 25262
diff changeset
109 return False
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
110 text = self.text
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
111 res = self.engine.search_text(text, None, ok)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
112 if not res:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
113 text.bell()
25311
bd3b92dc940a Merge Py Idle changes:
Kurt B. Kaiser <kbk@shore.net>
parents: 25262
diff changeset
114 return False
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
115 line, m = res
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
116 i, j = m.span()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
117 first = "%d.%d" % (line, i)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
118 last = "%d.%d" % (line, j)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
119 self.show_hit(first, last)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
120 self.ok = 1
25311
bd3b92dc940a Merge Py Idle changes:
Kurt B. Kaiser <kbk@shore.net>
parents: 25262
diff changeset
121 return True
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
122
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
123 def do_replace(self):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
124 prog = self.engine.getprog()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
125 if not prog:
25311
bd3b92dc940a Merge Py Idle changes:
Kurt B. Kaiser <kbk@shore.net>
parents: 25262
diff changeset
126 return False
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
127 text = self.text
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
128 try:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
129 first = pos = text.index("sel.first")
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
130 last = text.index("sel.last")
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
131 except TclError:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
132 pos = None
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
133 if not pos:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
134 first = last = pos = text.index("insert")
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
135 line, col = SearchEngine.get_line_col(pos)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
136 chars = text.get("%d.0" % line, "%d.0" % (line+1))
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
137 m = prog.match(chars, col)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
138 if not prog:
25311
bd3b92dc940a Merge Py Idle changes:
Kurt B. Kaiser <kbk@shore.net>
parents: 25262
diff changeset
139 return False
25262
fda48dd94b07 MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 18498
diff changeset
140 new = m.expand(self.replvar.get())
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
141 text.mark_set("insert", first)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
142 text.undo_block_start()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
143 if m.group():
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
144 text.delete(first, last)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
145 if new:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
146 text.insert(first, new)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
147 text.undo_block_stop()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
148 self.show_hit(first, text.index("insert"))
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
149 self.ok = 0
25311
bd3b92dc940a Merge Py Idle changes:
Kurt B. Kaiser <kbk@shore.net>
parents: 25262
diff changeset
150 return True
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
151
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
152 def show_hit(self, first, last):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
153 text = self.text
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
154 text.mark_set("insert", first)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
155 text.tag_remove("sel", "1.0", "end")
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
156 text.tag_add("sel", first, last)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
157 text.tag_remove("hit", "1.0", "end")
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
158 if first == last:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
159 text.tag_add("hit", first)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
160 else:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
161 text.tag_add("hit", first, last)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
162 text.see("insert")
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
163 text.update_idletasks()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
164
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
165 def close(self, event=None):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
166 SearchDialogBase.close(self, event)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
167 self.text.tag_remove("hit", "1.0", "end")