blob: 508a35c3f1c26eb10d8877210a762890190324d3 [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
27class SearchDialog(SearchDialogBase):
28
29 def create_widgets(self):
Terry Jan Reedy27336182015-05-14 18:10:50 -040030 SearchDialogBase.create_widgets(self)
Roger Serwy391f4692013-06-10 23:01:20 -050031 self.make_button("Find Next", self.default_command, 1)
David Scherer7aced172000-08-15 01:13:23 +000032
33 def default_command(self, event=None):
34 if not self.engine.getprog():
35 return
Roger Serwy391f4692013-06-10 23:01:20 -050036 self.find_again(self.text)
David Scherer7aced172000-08-15 01:13:23 +000037
38 def find_again(self, text):
39 if not self.engine.getpat():
40 self.open(text)
Kurt B. Kaiser0f4402d2002-09-18 03:10:10 +000041 return False
David Scherer7aced172000-08-15 01:13:23 +000042 if not self.engine.getprog():
Kurt B. Kaiser0f4402d2002-09-18 03:10:10 +000043 return False
David Scherer7aced172000-08-15 01:13:23 +000044 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:
Terry Jan Reedy3ff55a82016-08-10 23:44:54 -040054 self.bell()
Kurt B. Kaiser0f4402d2002-09-18 03:10:10 +000055 return False
David Scherer7aced172000-08-15 01:13:23 +000056 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. Kaiser0f4402d2002-09-18 03:10:10 +000062 return True
David Scherer7aced172000-08-15 01:13:23 +000063 else:
Terry Jan Reedy3ff55a82016-08-10 23:44:54 -040064 self.bell()
Kurt B. Kaiser0f4402d2002-09-18 03:10:10 +000065 return False
David Scherer7aced172000-08-15 01:13:23 +000066
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 Reedy0a4d13e2014-05-27 03:30:54 -040072
Terry Jan Reedyb236fe42016-05-17 18:18:37 -040073
74def _search_dialog(parent): # htest #
Terry Jan Reedy6f7b0f52016-07-10 20:21:31 -040075 "Display search test box."
76 from tkinter import Toplevel, Text
77 from tkinter.ttk import Button
78
Terry Jan Reedyb236fe42016-05-17 18:18:37 -040079 box = Toplevel(parent)
80 box.title("Test SearchDialog")
Terry Jan Reedya7480322016-07-10 17:28:10 -040081 x, y = map(int, parent.geometry().split('+')[1:])
82 box.geometry("+%d+%d" % (x, y + 175))
Terry Jan Reedyb236fe42016-05-17 18:18:37 -040083 text = Text(box, inactiveselectbackground='gray')
Terry Jan Reedy0a4d13e2014-05-27 03:30:54 -040084 text.pack()
Terry Jan Reedyb236fe42016-05-17 18:18:37 -040085 text.insert("insert","This is a sample string.\n"*5)
Terry Jan Reedy0a4d13e2014-05-27 03:30:54 -040086
87 def show_find():
Terry Jan Reedy6f7b0f52016-07-10 20:21:31 -040088 text.tag_add('sel', '1.0', 'end')
Terry Jan Reedyb236fe42016-05-17 18:18:37 -040089 _setup(text).open(text)
Terry Jan Reedy6f7b0f52016-07-10 20:21:31 -040090 text.tag_remove('sel', '1.0', 'end')
Terry Jan Reedy0a4d13e2014-05-27 03:30:54 -040091
Terry Jan Reedyb236fe42016-05-17 18:18:37 -040092 button = Button(box, text="Search (selection ignored)", command=show_find)
Terry Jan Reedy0a4d13e2014-05-27 03:30:54 -040093 button.pack()
94
95if __name__ == '__main__':
Terry Jan Reedyb236fe42016-05-17 18:18:37 -040096 import unittest
Terry Jan Reedya7480322016-07-10 17:28:10 -040097 unittest.main('idlelib.idle_test.test_search',
Terry Jan Reedyb236fe42016-05-17 18:18:37 -040098 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)