Mercurial > cpython-lru_cache-weakref
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 |
| 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 | 2 import SearchEngine |
| 3 from SearchDialogBase import SearchDialogBase | |
| 4 | |
| 5 def replace(text): | |
| 6 root = text._root() | |
| 7 engine = SearchEngine.get(root) | |
| 8 if not hasattr(engine, "_replacedialog"): | |
| 9 engine._replacedialog = ReplaceDialog(root, engine) | |
| 10 dialog = engine._replacedialog | |
| 11 dialog.open(text) | |
| 12 | |
| 13 class ReplaceDialog(SearchDialogBase): | |
| 14 | |
| 15 title = "Replace Dialog" | |
| 16 icon = "Replace" | |
| 17 | |
| 18 def __init__(self, root, engine): | |
| 19 SearchDialogBase.__init__(self, root, engine) | |
| 20 self.replvar = StringVar(root) | |
| 21 | |
| 22 def open(self, text): | |
| 23 SearchDialogBase.open(self, text) | |
| 24 try: | |
| 25 first = text.index("sel.first") | |
| 26 except TclError: | |
| 27 first = None | |
| 28 try: | |
| 29 last = text.index("sel.last") | |
| 30 except TclError: | |
| 31 last = None | |
| 32 first = first or text.index("insert") | |
| 33 last = last or first | |
| 34 self.show_hit(first, last) | |
| 35 self.ok = 1 | |
| 36 | |
| 37 def create_entries(self): | |
| 38 SearchDialogBase.create_entries(self) | |
| 39 self.replent = self.make_entry("Replace with:", self.replvar) | |
| 40 | |
| 41 def create_command_buttons(self): | |
| 42 SearchDialogBase.create_command_buttons(self) | |
| 43 self.make_button("Find", self.find_it) | |
| 44 self.make_button("Replace", self.replace_it) | |
| 45 self.make_button("Replace+Find", self.default_command, 1) | |
| 46 self.make_button("Replace All", self.replace_all) | |
| 47 | |
| 48 def find_it(self, event=None): | |
| 49 self.do_find(0) | |
| 50 | |
| 51 def replace_it(self, event=None): | |
| 52 if self.do_find(self.ok): | |
| 53 self.do_replace() | |
| 54 | |
| 55 def default_command(self, event=None): | |
| 56 if self.do_find(self.ok): | |
| 57 self.do_replace() | |
| 58 self.do_find(0) | |
| 59 | |
| 60 def replace_all(self, event=None): | |
| 61 prog = self.engine.getprog() | |
| 62 if not prog: | |
| 63 return | |
| 64 repl = self.replvar.get() | |
| 65 text = self.text | |
| 66 res = self.engine.search_text(text, prog) | |
| 67 if not res: | |
| 68 text.bell() | |
| 69 return | |
| 70 text.tag_remove("sel", "1.0", "end") | |
| 71 text.tag_remove("hit", "1.0", "end") | |
| 72 line = res[0] | |
| 73 col = res[1].start() | |
| 74 if self.engine.iswrap(): | |
| 75 line = 1 | |
| 76 col = 0 | |
| 77 ok = 1 | |
| 78 first = last = None | |
| 79 # XXX ought to replace circular instead of top-to-bottom when wrapping | |
| 80 text.undo_block_start() | |
| 81 while 1: | |
| 82 res = self.engine.search_forward(text, prog, line, col, 0, ok) | |
| 83 if not res: | |
| 84 break | |
| 85 line, m = res | |
| 86 chars = text.get("%d.0" % line, "%d.0" % (line+1)) | |
| 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 | 89 i, j = m.span() |
| 90 first = "%d.%d" % (line, i) | |
| 91 last = "%d.%d" % (line, j) | |
| 92 if new == orig: | |
| 93 text.mark_set("insert", last) | |
| 94 else: | |
| 95 text.mark_set("insert", first) | |
| 96 if first != last: | |
| 97 text.delete(first, last) | |
| 98 if new: | |
| 99 text.insert(first, new) | |
| 100 col = i + len(new) | |
| 101 ok = 0 | |
| 102 text.undo_block_stop() | |
| 103 if first and last: | |
| 104 self.show_hit(first, last) | |
| 105 self.close() | |
| 106 | |
| 107 def do_find(self, ok=0): | |
| 108 if not self.engine.getprog(): | |
| 25311 | 109 return False |
| 13975 | 110 text = self.text |
| 111 res = self.engine.search_text(text, None, ok) | |
| 112 if not res: | |
| 113 text.bell() | |
| 25311 | 114 return False |
| 13975 | 115 line, m = res |
| 116 i, j = m.span() | |
| 117 first = "%d.%d" % (line, i) | |
| 118 last = "%d.%d" % (line, j) | |
| 119 self.show_hit(first, last) | |
| 120 self.ok = 1 | |
| 25311 | 121 return True |
| 13975 | 122 |
| 123 def do_replace(self): | |
| 124 prog = self.engine.getprog() | |
| 125 if not prog: | |
| 25311 | 126 return False |
| 13975 | 127 text = self.text |
| 128 try: | |
| 129 first = pos = text.index("sel.first") | |
| 130 last = text.index("sel.last") | |
| 131 except TclError: | |
| 132 pos = None | |
| 133 if not pos: | |
| 134 first = last = pos = text.index("insert") | |
| 135 line, col = SearchEngine.get_line_col(pos) | |
| 136 chars = text.get("%d.0" % line, "%d.0" % (line+1)) | |
| 137 m = prog.match(chars, col) | |
| 138 if not prog: | |
| 25311 | 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 | 141 text.mark_set("insert", first) |
| 142 text.undo_block_start() | |
| 143 if m.group(): | |
| 144 text.delete(first, last) | |
| 145 if new: | |
| 146 text.insert(first, new) | |
| 147 text.undo_block_stop() | |
| 148 self.show_hit(first, text.index("insert")) | |
| 149 self.ok = 0 | |
| 25311 | 150 return True |
| 13975 | 151 |
| 152 def show_hit(self, first, last): | |
| 153 text = self.text | |
| 154 text.mark_set("insert", first) | |
| 155 text.tag_remove("sel", "1.0", "end") | |
| 156 text.tag_add("sel", first, last) | |
| 157 text.tag_remove("hit", "1.0", "end") | |
| 158 if first == last: | |
| 159 text.tag_add("hit", first) | |
| 160 else: | |
| 161 text.tag_add("hit", first, last) | |
| 162 text.see("insert") | |
| 163 text.update_idletasks() | |
| 164 | |
| 165 def close(self, event=None): | |
| 166 SearchDialogBase.close(self, event) | |
| 167 self.text.tag_remove("hit", "1.0", "end") |
