source: python/vendor/Python-2.7.6/Lib/idlelib/GrepDialog.py

Last change on this file was 388, checked in by dmik, 11 years ago

python: Update vendor to 2.7.6.

  • Property svn:eol-style set to native
File size: 4.0 KB
Line 
1import os
2import fnmatch
3import sys
4from Tkinter import *
5from idlelib import SearchEngine
6from idlelib.SearchDialogBase import SearchDialogBase
7
8def grep(text, io=None, flist=None):
9 root = text._root()
10 engine = SearchEngine.get(root)
11 if not hasattr(engine, "_grepdialog"):
12 engine._grepdialog = GrepDialog(root, engine, flist)
13 dialog = engine._grepdialog
14 searchphrase = text.get("sel.first", "sel.last")
15 dialog.open(text, searchphrase, io)
16
17class GrepDialog(SearchDialogBase):
18
19 title = "Find in Files Dialog"
20 icon = "Grep"
21 needwrapbutton = 0
22
23 def __init__(self, root, engine, flist):
24 SearchDialogBase.__init__(self, root, engine)
25 self.flist = flist
26 self.globvar = StringVar(root)
27 self.recvar = BooleanVar(root)
28
29 def open(self, text, searchphrase, io=None):
30 SearchDialogBase.open(self, text, searchphrase)
31 if io:
32 path = io.filename or ""
33 else:
34 path = ""
35 dir, base = os.path.split(path)
36 head, tail = os.path.splitext(base)
37 if not tail:
38 tail = ".py"
39 self.globvar.set(os.path.join(dir, "*" + tail))
40
41 def create_entries(self):
42 SearchDialogBase.create_entries(self)
43 self.globent = self.make_entry("In files:", self.globvar)
44
45 def create_other_buttons(self):
46 f = self.make_frame()
47
48 btn = Checkbutton(f, anchor="w",
49 variable=self.recvar,
50 text="Recurse down subdirectories")
51 btn.pack(side="top", fill="both")
52 btn.select()
53
54 def create_command_buttons(self):
55 SearchDialogBase.create_command_buttons(self)
56 self.make_button("Search Files", self.default_command, 1)
57
58 def default_command(self, event=None):
59 prog = self.engine.getprog()
60 if not prog:
61 return
62 path = self.globvar.get()
63 if not path:
64 self.top.bell()
65 return
66 from idlelib.OutputWindow import OutputWindow
67 save = sys.stdout
68 try:
69 sys.stdout = OutputWindow(self.flist)
70 self.grep_it(prog, path)
71 finally:
72 sys.stdout = save
73
74 def grep_it(self, prog, path):
75 dir, base = os.path.split(path)
76 list = self.findfiles(dir, base, self.recvar.get())
77 list.sort()
78 self.close()
79 pat = self.engine.getpat()
80 print "Searching %r in %s ..." % (pat, path)
81 hits = 0
82 for fn in list:
83 try:
84 with open(fn) as f:
85 for lineno, line in enumerate(f, 1):
86 if line[-1:] == '\n':
87 line = line[:-1]
88 if prog.search(line):
89 sys.stdout.write("%s: %s: %s\n" %
90 (fn, lineno, line))
91 hits += 1
92 except IOError as msg:
93 print msg
94 print(("Hits found: %s\n"
95 "(Hint: right-click to open locations.)"
96 % hits) if hits else "No hits.")
97
98 def findfiles(self, dir, base, rec):
99 try:
100 names = os.listdir(dir or os.curdir)
101 except os.error as msg:
102 print msg
103 return []
104 list = []
105 subdirs = []
106 for name in names:
107 fn = os.path.join(dir, name)
108 if os.path.isdir(fn):
109 subdirs.append(fn)
110 else:
111 if fnmatch.fnmatch(name, base):
112 list.append(fn)
113 if rec:
114 for subdir in subdirs:
115 list.extend(self.findfiles(subdir, base, rec))
116 return list
117
118 def close(self, event=None):
119 if self.top:
120 self.top.grab_release()
121 self.top.withdraw()
122
123if __name__ == "__main__":
124 # A human test is a bit tricky since EditorWindow() imports this module.
125 # Hence Idle must be restarted after editing this file for a live test.
126 import unittest
127 unittest.main('idlelib.idle_test.test_grep', verbosity=2, exit=False)
Note: See TracBrowser for help on using the repository browser.