blob: a609fd9583554cc1dedb2cb3596d51b1e909c569 [file] [log] [blame]
Georg Brandl14fc4272008-05-17 18:39:55 +00001from tkinter import *
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:
54 text.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:
64 text.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 #
75 '''Display search test box.'''
76 box = Toplevel(parent)
77 box.title("Test SearchDialog")
Terry Jan Reedy0a4d13e2014-05-27 03:30:54 -040078 width, height, x, y = list(map(int, re.split('[x+]', parent.geometry())))
Terry Jan Reedyb236fe42016-05-17 18:18:37 -040079 box.geometry("+%d+%d"%(x, y + 150))
80 text = Text(box, inactiveselectbackground='gray')
Terry Jan Reedy0a4d13e2014-05-27 03:30:54 -040081 text.pack()
Terry Jan Reedyb236fe42016-05-17 18:18:37 -040082 text.insert("insert","This is a sample string.\n"*5)
Terry Jan Reedy0a4d13e2014-05-27 03:30:54 -040083
84 def show_find():
85 text.tag_add(SEL, "1.0", END)
Terry Jan Reedyb236fe42016-05-17 18:18:37 -040086 _setup(text).open(text)
Terry Jan Reedy0a4d13e2014-05-27 03:30:54 -040087 text.tag_remove(SEL, "1.0", END)
88
Terry Jan Reedyb236fe42016-05-17 18:18:37 -040089 button = Button(box, text="Search (selection ignored)", command=show_find)
Terry Jan Reedy0a4d13e2014-05-27 03:30:54 -040090 button.pack()
91
92if __name__ == '__main__':
Terry Jan Reedyb236fe42016-05-17 18:18:37 -040093 import unittest
94 unittest.main('idlelib.idle_test.test_searchdialog',
95 verbosity=2, exit=False)
Terry Jan Reedy0a4d13e2014-05-27 03:30:54 -040096 from idlelib.idle_test.htest import run
97 run(_search_dialog)