blob: 6223661c8e080a9b583d8a9fa927dbbf442bfdf6 [file] [log] [blame]
Terry Jan Reedy6f7b0f52016-07-10 20:21:31 -04001from tkinter import TclError
David Scherer7aced172000-08-15 01:13:23 +00002
Terry Jan Reedy6fa5bdc2016-05-28 13:22:31 -04003from idlelib import searchengine
4from idlelib.searchbase import SearchDialogBase
David Scherer7aced172000-08-15 01:13:23 +00005
6def _setup(text):
Terry Jan Reedyb236fe42016-05-17 18:18:37 -04007 "Create or find the singleton SearchDialog instance."
David Scherer7aced172000-08-15 01:13:23 +00008 root = text._root()
Terry Jan Reedy6fa5bdc2016-05-28 13:22:31 -04009 engine = searchengine.get(root)
David Scherer7aced172000-08-15 01:13:23 +000010 if not hasattr(engine, "_searchdialog"):
11 engine._searchdialog = SearchDialog(root, engine)
12 return engine._searchdialog
13
14def find(text):
Terry Jan Reedyb236fe42016-05-17 18:18:37 -040015 "Handle the editor edit menu item and corresponding event."
Chui Tey5a231c8f2002-11-06 02:18:45 +000016 pat = text.get("sel.first", "sel.last")
Terry Jan Reedyb236fe42016-05-17 18:18:37 -040017 return _setup(text).open(text, pat) # Open is inherited from SDBase.
David Scherer7aced172000-08-15 01:13:23 +000018
19def find_again(text):
Terry Jan Reedyb236fe42016-05-17 18:18:37 -040020 "Handle the editor edit menu item and corresponding event."
David Scherer7aced172000-08-15 01:13:23 +000021 return _setup(text).find_again(text)
22
23def find_selection(text):
Terry Jan Reedyb236fe42016-05-17 18:18:37 -040024 "Handle the editor edit menu item and corresponding event."
David Scherer7aced172000-08-15 01:13:23 +000025 return _setup(text).find_selection(text)
26
Terry Jan Reedybfbaa6b2016-08-31 00:50:55 -040027
David Scherer7aced172000-08-15 01:13:23 +000028class SearchDialog(SearchDialogBase):
29
30 def create_widgets(self):
Terry Jan Reedy27336182015-05-14 18:10:50 -040031 SearchDialogBase.create_widgets(self)
Roger Serwy391f4692013-06-10 23:01:20 -050032 self.make_button("Find Next", self.default_command, 1)
David Scherer7aced172000-08-15 01:13:23 +000033
34 def default_command(self, event=None):
35 if not self.engine.getprog():
36 return
Roger Serwy391f4692013-06-10 23:01:20 -050037 self.find_again(self.text)
David Scherer7aced172000-08-15 01:13:23 +000038
39 def find_again(self, text):
40 if not self.engine.getpat():
41 self.open(text)
Kurt B. Kaiser0f4402d2002-09-18 03:10:10 +000042 return False
David Scherer7aced172000-08-15 01:13:23 +000043 if not self.engine.getprog():
Kurt B. Kaiser0f4402d2002-09-18 03:10:10 +000044 return False
David Scherer7aced172000-08-15 01:13:23 +000045 res = self.engine.search_text(text)
46 if res:
47 line, m = res
48 i, j = m.span()
49 first = "%d.%d" % (line, i)
50 last = "%d.%d" % (line, j)
51 try:
52 selfirst = text.index("sel.first")
53 sellast = text.index("sel.last")
54 if selfirst == first and sellast == last:
Terry Jan Reedy3ff55a82016-08-10 23:44:54 -040055 self.bell()
Kurt B. Kaiser0f4402d2002-09-18 03:10:10 +000056 return False
David Scherer7aced172000-08-15 01:13:23 +000057 except TclError:
58 pass
59 text.tag_remove("sel", "1.0", "end")
60 text.tag_add("sel", first, last)
61 text.mark_set("insert", self.engine.isback() and first or last)
62 text.see("insert")
Kurt B. Kaiser0f4402d2002-09-18 03:10:10 +000063 return True
David Scherer7aced172000-08-15 01:13:23 +000064 else:
Terry Jan Reedy3ff55a82016-08-10 23:44:54 -040065 self.bell()
Kurt B. Kaiser0f4402d2002-09-18 03:10:10 +000066 return False
David Scherer7aced172000-08-15 01:13:23 +000067
68 def find_selection(self, text):
69 pat = text.get("sel.first", "sel.last")
70 if pat:
71 self.engine.setcookedpat(pat)
72 return self.find_again(text)
Terry Jan Reedy0a4d13e2014-05-27 03:30:54 -040073
Terry Jan Reedyb236fe42016-05-17 18:18:37 -040074
75def _search_dialog(parent): # htest #
Terry Jan Reedy6f7b0f52016-07-10 20:21:31 -040076 "Display search test box."
77 from tkinter import Toplevel, Text
78 from tkinter.ttk import Button
79
Terry Jan Reedyb236fe42016-05-17 18:18:37 -040080 box = Toplevel(parent)
81 box.title("Test SearchDialog")
Terry Jan Reedya7480322016-07-10 17:28:10 -040082 x, y = map(int, parent.geometry().split('+')[1:])
83 box.geometry("+%d+%d" % (x, y + 175))
Terry Jan Reedyb236fe42016-05-17 18:18:37 -040084 text = Text(box, inactiveselectbackground='gray')
Terry Jan Reedy0a4d13e2014-05-27 03:30:54 -040085 text.pack()
Terry Jan Reedyb236fe42016-05-17 18:18:37 -040086 text.insert("insert","This is a sample string.\n"*5)
Terry Jan Reedy0a4d13e2014-05-27 03:30:54 -040087
88 def show_find():
Terry Jan Reedy6f7b0f52016-07-10 20:21:31 -040089 text.tag_add('sel', '1.0', 'end')
Terry Jan Reedyb236fe42016-05-17 18:18:37 -040090 _setup(text).open(text)
Terry Jan Reedy6f7b0f52016-07-10 20:21:31 -040091 text.tag_remove('sel', '1.0', 'end')
Terry Jan Reedy0a4d13e2014-05-27 03:30:54 -040092
Terry Jan Reedyb236fe42016-05-17 18:18:37 -040093 button = Button(box, text="Search (selection ignored)", command=show_find)
Terry Jan Reedy0a4d13e2014-05-27 03:30:54 -040094 button.pack()
95
96if __name__ == '__main__':
Terry Jan Reedy4d921582018-06-19 19:12:52 -040097 from unittest import main
98 main('idlelib.idle_test.test_search', verbosity=2, exit=False)
Terry Jan Reedya7480322016-07-10 17:28:10 -040099
Terry Jan Reedy0a4d13e2014-05-27 03:30:54 -0400100 from idlelib.idle_test.htest import run
101 run(_search_dialog)