Georg Brandl | 14fc427 | 2008-05-17 18:39:55 +0000 | [diff] [blame] | 1 | from tkinter import * |
David Scherer | 7aced17 | 2000-08-15 01:13:23 +0000 | [diff] [blame] | 2 | |
Terry Jan Reedy | 6fa5bdc | 2016-05-28 13:22:31 -0400 | [diff] [blame] | 3 | from idlelib import searchengine |
| 4 | from idlelib.searchbase import SearchDialogBase |
David Scherer | 7aced17 | 2000-08-15 01:13:23 +0000 | [diff] [blame] | 5 | |
| 6 | def _setup(text): |
Terry Jan Reedy | b236fe4 | 2016-05-17 18:18:37 -0400 | [diff] [blame] | 7 | "Create or find the singleton SearchDialog instance." |
David Scherer | 7aced17 | 2000-08-15 01:13:23 +0000 | [diff] [blame] | 8 | root = text._root() |
Terry Jan Reedy | 6fa5bdc | 2016-05-28 13:22:31 -0400 | [diff] [blame] | 9 | engine = searchengine.get(root) |
David Scherer | 7aced17 | 2000-08-15 01:13:23 +0000 | [diff] [blame] | 10 | if not hasattr(engine, "_searchdialog"): |
| 11 | engine._searchdialog = SearchDialog(root, engine) |
| 12 | return engine._searchdialog |
| 13 | |
| 14 | def find(text): |
Terry Jan Reedy | b236fe4 | 2016-05-17 18:18:37 -0400 | [diff] [blame] | 15 | "Handle the editor edit menu item and corresponding event." |
Chui Tey | 5a231c8f | 2002-11-06 02:18:45 +0000 | [diff] [blame] | 16 | pat = text.get("sel.first", "sel.last") |
Terry Jan Reedy | b236fe4 | 2016-05-17 18:18:37 -0400 | [diff] [blame] | 17 | return _setup(text).open(text, pat) # Open is inherited from SDBase. |
David Scherer | 7aced17 | 2000-08-15 01:13:23 +0000 | [diff] [blame] | 18 | |
| 19 | def find_again(text): |
Terry Jan Reedy | b236fe4 | 2016-05-17 18:18:37 -0400 | [diff] [blame] | 20 | "Handle the editor edit menu item and corresponding event." |
David Scherer | 7aced17 | 2000-08-15 01:13:23 +0000 | [diff] [blame] | 21 | return _setup(text).find_again(text) |
| 22 | |
| 23 | def find_selection(text): |
Terry Jan Reedy | b236fe4 | 2016-05-17 18:18:37 -0400 | [diff] [blame] | 24 | "Handle the editor edit menu item and corresponding event." |
David Scherer | 7aced17 | 2000-08-15 01:13:23 +0000 | [diff] [blame] | 25 | return _setup(text).find_selection(text) |
| 26 | |
| 27 | class SearchDialog(SearchDialogBase): |
| 28 | |
| 29 | def create_widgets(self): |
Terry Jan Reedy | 2733618 | 2015-05-14 18:10:50 -0400 | [diff] [blame] | 30 | SearchDialogBase.create_widgets(self) |
Roger Serwy | 391f469 | 2013-06-10 23:01:20 -0500 | [diff] [blame] | 31 | self.make_button("Find Next", self.default_command, 1) |
David Scherer | 7aced17 | 2000-08-15 01:13:23 +0000 | [diff] [blame] | 32 | |
| 33 | def default_command(self, event=None): |
| 34 | if not self.engine.getprog(): |
| 35 | return |
Roger Serwy | 391f469 | 2013-06-10 23:01:20 -0500 | [diff] [blame] | 36 | self.find_again(self.text) |
David Scherer | 7aced17 | 2000-08-15 01:13:23 +0000 | [diff] [blame] | 37 | |
| 38 | def find_again(self, text): |
| 39 | if not self.engine.getpat(): |
| 40 | self.open(text) |
Kurt B. Kaiser | 0f4402d | 2002-09-18 03:10:10 +0000 | [diff] [blame] | 41 | return False |
David Scherer | 7aced17 | 2000-08-15 01:13:23 +0000 | [diff] [blame] | 42 | if not self.engine.getprog(): |
Kurt B. Kaiser | 0f4402d | 2002-09-18 03:10:10 +0000 | [diff] [blame] | 43 | return False |
David Scherer | 7aced17 | 2000-08-15 01:13:23 +0000 | [diff] [blame] | 44 | res = self.engine.search_text(text) |
| 45 | if res: |
| 46 | line, m = res |
| 47 | i, j = m.span() |
| 48 | first = "%d.%d" % (line, i) |
| 49 | last = "%d.%d" % (line, j) |
| 50 | try: |
| 51 | selfirst = text.index("sel.first") |
| 52 | sellast = text.index("sel.last") |
| 53 | if selfirst == first and sellast == last: |
| 54 | text.bell() |
Kurt B. Kaiser | 0f4402d | 2002-09-18 03:10:10 +0000 | [diff] [blame] | 55 | return False |
David Scherer | 7aced17 | 2000-08-15 01:13:23 +0000 | [diff] [blame] | 56 | except TclError: |
| 57 | pass |
| 58 | text.tag_remove("sel", "1.0", "end") |
| 59 | text.tag_add("sel", first, last) |
| 60 | text.mark_set("insert", self.engine.isback() and first or last) |
| 61 | text.see("insert") |
Kurt B. Kaiser | 0f4402d | 2002-09-18 03:10:10 +0000 | [diff] [blame] | 62 | return True |
David Scherer | 7aced17 | 2000-08-15 01:13:23 +0000 | [diff] [blame] | 63 | else: |
| 64 | text.bell() |
Kurt B. Kaiser | 0f4402d | 2002-09-18 03:10:10 +0000 | [diff] [blame] | 65 | return False |
David Scherer | 7aced17 | 2000-08-15 01:13:23 +0000 | [diff] [blame] | 66 | |
| 67 | def find_selection(self, text): |
| 68 | pat = text.get("sel.first", "sel.last") |
| 69 | if pat: |
| 70 | self.engine.setcookedpat(pat) |
| 71 | return self.find_again(text) |
Terry Jan Reedy | 0a4d13e | 2014-05-27 03:30:54 -0400 | [diff] [blame] | 72 | |
Terry Jan Reedy | b236fe4 | 2016-05-17 18:18:37 -0400 | [diff] [blame] | 73 | |
| 74 | def _search_dialog(parent): # htest # |
| 75 | '''Display search test box.''' |
| 76 | box = Toplevel(parent) |
| 77 | box.title("Test SearchDialog") |
Terry Jan Reedy | 0a4d13e | 2014-05-27 03:30:54 -0400 | [diff] [blame] | 78 | width, height, x, y = list(map(int, re.split('[x+]', parent.geometry()))) |
Terry Jan Reedy | b236fe4 | 2016-05-17 18:18:37 -0400 | [diff] [blame] | 79 | box.geometry("+%d+%d"%(x, y + 150)) |
| 80 | text = Text(box, inactiveselectbackground='gray') |
Terry Jan Reedy | 0a4d13e | 2014-05-27 03:30:54 -0400 | [diff] [blame] | 81 | text.pack() |
Terry Jan Reedy | b236fe4 | 2016-05-17 18:18:37 -0400 | [diff] [blame] | 82 | text.insert("insert","This is a sample string.\n"*5) |
Terry Jan Reedy | 0a4d13e | 2014-05-27 03:30:54 -0400 | [diff] [blame] | 83 | |
| 84 | def show_find(): |
| 85 | text.tag_add(SEL, "1.0", END) |
Terry Jan Reedy | b236fe4 | 2016-05-17 18:18:37 -0400 | [diff] [blame] | 86 | _setup(text).open(text) |
Terry Jan Reedy | 0a4d13e | 2014-05-27 03:30:54 -0400 | [diff] [blame] | 87 | text.tag_remove(SEL, "1.0", END) |
| 88 | |
Terry Jan Reedy | b236fe4 | 2016-05-17 18:18:37 -0400 | [diff] [blame] | 89 | button = Button(box, text="Search (selection ignored)", command=show_find) |
Terry Jan Reedy | 0a4d13e | 2014-05-27 03:30:54 -0400 | [diff] [blame] | 90 | button.pack() |
| 91 | |
| 92 | if __name__ == '__main__': |
Terry Jan Reedy | b236fe4 | 2016-05-17 18:18:37 -0400 | [diff] [blame] | 93 | import unittest |
| 94 | unittest.main('idlelib.idle_test.test_searchdialog', |
| 95 | verbosity=2, exit=False) |
Terry Jan Reedy | 0a4d13e | 2014-05-27 03:30:54 -0400 | [diff] [blame] | 96 | from idlelib.idle_test.htest import run |
| 97 | run(_search_dialog) |