annotate Lib/idlelib/GrepDialog.py @ 58925:eecf1bef052d 2.6

Merged revisions 78207 via svnmerge from svn+ssh://pythondev@svn.python.org/python/trunk ........ r78207 | ezio.melotti | 2010-02-17 01:26:09 +0200 (Wed, 17 Feb 2010) | 1 line #7930: fix stripid ........
author Ezio Melotti <ezio.melotti@gmail.com>
date Tue, 16 Feb 2010 23:29:44 +0000
parents b53604fad54b
children eab361617f6a
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1 import os
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
2 import fnmatch
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
3 import sys
47183
b53604fad54b Tkinter rename reversal: remove tkinter package, adapt imports and docs.
Georg Brandl <georg@python.org>
parents: 47101
diff changeset
4 from Tkinter import *
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
5 import SearchEngine
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
6 from SearchDialogBase import SearchDialogBase
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
7
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
8 def grep(text, io=None, flist=None):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
9 root = text._root()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
10 engine = SearchEngine.get(root)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
11 if not hasattr(engine, "_grepdialog"):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
12 engine._grepdialog = GrepDialog(root, engine, flist)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
13 dialog = engine._grepdialog
29368
1219021c4865 1. Find in Files Dialog shows text selection if there is one
Kurt B. Kaiser <kbk@shore.net>
parents: 25288
diff changeset
14 searchphrase = text.get("sel.first", "sel.last")
1219021c4865 1. Find in Files Dialog shows text selection if there is one
Kurt B. Kaiser <kbk@shore.net>
parents: 25288
diff changeset
15 dialog.open(text, searchphrase, io)
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
16
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
17 class GrepDialog(SearchDialogBase):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
18
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
19 title = "Find in Files Dialog"
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
20 icon = "Grep"
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
21 needwrapbutton = 0
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
22
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
23 def __init__(self, root, engine, flist):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
24 SearchDialogBase.__init__(self, root, engine)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
25 self.flist = flist
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
26 self.globvar = StringVar(root)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
27 self.recvar = BooleanVar(root)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
28
29368
1219021c4865 1. Find in Files Dialog shows text selection if there is one
Kurt B. Kaiser <kbk@shore.net>
parents: 25288
diff changeset
29 def open(self, text, searchphrase, io=None):
1219021c4865 1. Find in Files Dialog shows text selection if there is one
Kurt B. Kaiser <kbk@shore.net>
parents: 25288
diff changeset
30 SearchDialogBase.open(self, text, searchphrase)
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
31 if io:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
32 path = io.filename or ""
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
33 else:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
34 path = ""
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
35 dir, base = os.path.split(path)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
36 head, tail = os.path.splitext(base)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
37 if not tail:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
38 tail = ".py"
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
39 self.globvar.set(os.path.join(dir, "*" + tail))
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
40
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
41 def create_entries(self):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
42 SearchDialogBase.create_entries(self)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
43 self.globent = self.make_entry("In files:", self.globvar)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
44
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
45 def create_other_buttons(self):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
46 f = self.make_frame()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
47
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
48 btn = Checkbutton(f, anchor="w",
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
49 variable=self.recvar,
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
50 text="Recurse down subdirectories")
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
51 btn.pack(side="top", fill="both")
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
52 btn.select()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
53
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
54 def create_command_buttons(self):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
55 SearchDialogBase.create_command_buttons(self)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
56 self.make_button("Search Files", self.default_command, 1)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
57
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
58 def default_command(self, event=None):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
59 prog = self.engine.getprog()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
60 if not prog:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
61 return
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
62 path = self.globvar.get()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
63 if not path:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
64 self.top.bell()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
65 return
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
66 from OutputWindow import OutputWindow
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
67 save = sys.stdout
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
68 try:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
69 sys.stdout = OutputWindow(self.flist)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
70 self.grep_it(prog, path)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
71 finally:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
72 sys.stdout = save
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
73
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
74 def grep_it(self, prog, path):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
75 dir, base = os.path.split(path)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
76 list = self.findfiles(dir, base, self.recvar.get())
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
77 list.sort()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
78 self.close()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
79 pat = self.engine.getpat()
31515
71a294bd7950 Replace backticks with repr() or "%r"
Walter Dörwald <walter@livinglogic.de>
parents: 29368
diff changeset
80 print "Searching %r in %s ..." % (pat, path)
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
81 hits = 0
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
82 for fn in list:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
83 try:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
84 f = open(fn)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
85 except IOError, msg:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
86 print msg
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
87 continue
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
88 lineno = 0
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
89 while 1:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
90 block = f.readlines(100000)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
91 if not block:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
92 break
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
93 for line in block:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
94 lineno = lineno + 1
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
95 if line[-1:] == '\n':
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
96 line = line[:-1]
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
97 if prog.search(line):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
98 sys.stdout.write("%s: %s: %s\n" % (fn, lineno, line))
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
99 hits = hits + 1
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
100 if hits:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
101 if hits == 1:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
102 s = ""
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
103 else:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
104 s = "s"
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
105 print "Found", hits, "hit%s." % s
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
106 print "(Hint: right-click to open locations.)"
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
107 else:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
108 print "No hits."
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
109
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
110 def findfiles(self, dir, base, rec):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
111 try:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
112 names = os.listdir(dir or os.curdir)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
113 except os.error, msg:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
114 print msg
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
115 return []
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
116 list = []
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
117 subdirs = []
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
118 for name in names:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
119 fn = os.path.join(dir, name)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
120 if os.path.isdir(fn):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
121 subdirs.append(fn)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
122 else:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
123 if fnmatch.fnmatch(name, base):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
124 list.append(fn)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
125 if rec:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
126 for subdir in subdirs:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
127 list.extend(self.findfiles(subdir, base, rec))
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
128 return list
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
129
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
130 def close(self, event=None):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
131 if self.top:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
132 self.top.grab_release()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
133 self.top.withdraw()