10a8c90248264a8b26970b4473770bcc3df8515fJosh Gaofrom Tkinter import * 20a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 30a8c90248264a8b26970b4473770bcc3df8515fJosh Gaofrom idlelib import SearchEngine 40a8c90248264a8b26970b4473770bcc3df8515fJosh Gaofrom idlelib.SearchDialogBase import SearchDialogBase 50a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 60a8c90248264a8b26970b4473770bcc3df8515fJosh Gaodef _setup(text): 70a8c90248264a8b26970b4473770bcc3df8515fJosh Gao root = text._root() 80a8c90248264a8b26970b4473770bcc3df8515fJosh Gao engine = SearchEngine.get(root) 90a8c90248264a8b26970b4473770bcc3df8515fJosh Gao if not hasattr(engine, "_searchdialog"): 100a8c90248264a8b26970b4473770bcc3df8515fJosh Gao engine._searchdialog = SearchDialog(root, engine) 110a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return engine._searchdialog 120a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 130a8c90248264a8b26970b4473770bcc3df8515fJosh Gaodef find(text): 140a8c90248264a8b26970b4473770bcc3df8515fJosh Gao pat = text.get("sel.first", "sel.last") 150a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return _setup(text).open(text,pat) 160a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 170a8c90248264a8b26970b4473770bcc3df8515fJosh Gaodef find_again(text): 180a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return _setup(text).find_again(text) 190a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 200a8c90248264a8b26970b4473770bcc3df8515fJosh Gaodef find_selection(text): 210a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return _setup(text).find_selection(text) 220a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 230a8c90248264a8b26970b4473770bcc3df8515fJosh Gaoclass SearchDialog(SearchDialogBase): 240a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 250a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def create_widgets(self): 260a8c90248264a8b26970b4473770bcc3df8515fJosh Gao f = SearchDialogBase.create_widgets(self) 270a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.make_button("Find", self.default_command, 1) 280a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 290a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def default_command(self, event=None): 300a8c90248264a8b26970b4473770bcc3df8515fJosh Gao if not self.engine.getprog(): 310a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return 320a8c90248264a8b26970b4473770bcc3df8515fJosh Gao if self.find_again(self.text): 330a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.close() 340a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 350a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def find_again(self, text): 360a8c90248264a8b26970b4473770bcc3df8515fJosh Gao if not self.engine.getpat(): 370a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.open(text) 380a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return False 390a8c90248264a8b26970b4473770bcc3df8515fJosh Gao if not self.engine.getprog(): 400a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return False 410a8c90248264a8b26970b4473770bcc3df8515fJosh Gao res = self.engine.search_text(text) 420a8c90248264a8b26970b4473770bcc3df8515fJosh Gao if res: 430a8c90248264a8b26970b4473770bcc3df8515fJosh Gao line, m = res 440a8c90248264a8b26970b4473770bcc3df8515fJosh Gao i, j = m.span() 450a8c90248264a8b26970b4473770bcc3df8515fJosh Gao first = "%d.%d" % (line, i) 460a8c90248264a8b26970b4473770bcc3df8515fJosh Gao last = "%d.%d" % (line, j) 470a8c90248264a8b26970b4473770bcc3df8515fJosh Gao try: 480a8c90248264a8b26970b4473770bcc3df8515fJosh Gao selfirst = text.index("sel.first") 490a8c90248264a8b26970b4473770bcc3df8515fJosh Gao sellast = text.index("sel.last") 500a8c90248264a8b26970b4473770bcc3df8515fJosh Gao if selfirst == first and sellast == last: 510a8c90248264a8b26970b4473770bcc3df8515fJosh Gao text.bell() 520a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return False 530a8c90248264a8b26970b4473770bcc3df8515fJosh Gao except TclError: 540a8c90248264a8b26970b4473770bcc3df8515fJosh Gao pass 550a8c90248264a8b26970b4473770bcc3df8515fJosh Gao text.tag_remove("sel", "1.0", "end") 560a8c90248264a8b26970b4473770bcc3df8515fJosh Gao text.tag_add("sel", first, last) 570a8c90248264a8b26970b4473770bcc3df8515fJosh Gao text.mark_set("insert", self.engine.isback() and first or last) 580a8c90248264a8b26970b4473770bcc3df8515fJosh Gao text.see("insert") 590a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return True 600a8c90248264a8b26970b4473770bcc3df8515fJosh Gao else: 610a8c90248264a8b26970b4473770bcc3df8515fJosh Gao text.bell() 620a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return False 630a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 640a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def find_selection(self, text): 650a8c90248264a8b26970b4473770bcc3df8515fJosh Gao pat = text.get("sel.first", "sel.last") 660a8c90248264a8b26970b4473770bcc3df8515fJosh Gao if pat: 670a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.engine.setcookedpat(pat) 680a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return self.find_again(text) 69