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