KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > armedbear > j > FindInFilesDialog


1 /*
2  * FindInFilesDialog.java
3  *
4  * Copyright (C) 1998-2003 Peter Graves
5  * $Id: FindInFilesDialog.java,v 1.7 2003/07/27 01:12:55 piso Exp $
6  *
7  * This program is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU General Public License
9  * as published by the Free Software Foundation; either version 2
10  * of the License, or (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, write to the Free Software
19  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
20  */

21
22 package org.armedbear.j;
23
24 import gnu.regexp.RE;
25 import gnu.regexp.REException;
26 import java.awt.Dimension JavaDoc;
27 import java.awt.event.ActionEvent JavaDoc;
28 import java.awt.event.ActionListener JavaDoc;
29 import java.awt.event.FocusEvent JavaDoc;
30 import java.awt.event.FocusListener JavaDoc;
31 import java.awt.event.TextEvent JavaDoc;
32 import java.awt.event.TextListener JavaDoc;
33 import java.util.ArrayList JavaDoc;
34 import java.util.Iterator JavaDoc;
35 import java.util.StringTokenizer JavaDoc;
36 import javax.swing.Box JavaDoc;
37 import javax.swing.BoxLayout JavaDoc;
38 import javax.swing.JComboBox JavaDoc;
39 import javax.swing.JPanel JavaDoc;
40
41 public class FindInFilesDialog extends AbstractDialog implements Constants,
42     ActionListener JavaDoc, FocusListener JavaDoc, TextListener JavaDoc
43 {
44     private static final String JavaDoc patternKey = "find.pattern";
45     private static final String JavaDoc replacementKey = "replace.replacement";
46     private static final String JavaDoc filesKey = "findInFiles.files";
47     private static final String JavaDoc wholeWordsOnlyKey = "findInFiles.wholeWordsOnly";
48     private static final String JavaDoc regExpKey = "findInFiles.regularExpression";
49     private static final String JavaDoc includeSubdirsKey = "findInFiles.includeSubdirs";
50     private static final String JavaDoc searchFilesInMemoryKey = "findInFiles.searchFilesInMemory";
51     private static final String JavaDoc listOccurrencesKey = "findInFiles.listOccurrences";
52
53     private final SessionProperties sessionProperties =
54         Editor.getSessionProperties();
55
56     private FindInFiles findInFiles;
57
58     private final Editor editor;
59     private final boolean replace;
60
61     private HistoryTextField patternControl;
62     private HistoryTextField replacementControl;
63     private HistoryTextField filesControl;
64
65     private History patternHistory;
66     private History replacementHistory;
67     private History filesHistory;
68
69     private CheckBox ignoreCaseCheckBox;
70     private CheckBox wholeWordsOnlyCheckBox;
71     private CheckBox regExpCheckBox;
72     private CheckBox confirmChangesCheckBox;
73     private CheckBox includeSubdirsCheckBox;
74     private CheckBox searchFilesInMemoryCheckBox;
75     private CheckBox listOccurrencesCheckBox;
76
77     private Label modeLabel;
78     private JComboBox JavaDoc modeComboBox;
79
80     private ModeListEntry[] permissibleModes;
81
82     public FindInFilesDialog(Editor editor, boolean replace)
83     {
84         super(editor, replace ? "Replace In Files" : "Find In Files", true);
85
86         this.editor = editor;
87         this.replace = replace;
88
89         patternControl = new HistoryTextField(20);
90         patternHistory = new History(patternKey);
91         patternControl.setHistory(patternHistory);
92
93         // Pre-fill pattern control.
94
String JavaDoc s;
95         if (editor.getBuffer() instanceof Directory)
96             // It's not very likely that we want to search for the text at dot
97
// in a directory buffer.
98
s = null;
99         else
100             s = editor.getCurrentText();
101         if (s != null)
102             patternControl.setText(s);
103         else
104             patternControl.recallLast();
105
106         Label label = new Label("Pattern:");
107         label.setDisplayedMnemonic('P');
108         addLabelAndTextField(label, patternControl);
109         patternControl.addTextListener(this);
110
111         addVerticalStrut();
112
113         if (replace) {
114             replacementControl = new HistoryTextField(20);
115             replacementHistory = new History(replacementKey);
116             replacementControl.setHistory(replacementHistory);
117             replacementControl.recallLast();
118             label = new Label("Replace with:");
119             label.setDisplayedMnemonic('E');
120             addLabelAndTextField(label, replacementControl);
121             addVerticalStrut();
122         }
123
124         filesControl = new HistoryTextField(20);
125         filesHistory = new History(filesKey);
126         filesControl.setHistory(filesHistory);
127         filesControl.recallLast();
128         label = new Label("Files:");
129         label.setDisplayedMnemonic('F');
130         addLabelAndTextField(label, filesControl);
131
132         filesControl.addFocusListener(this);
133
134         addVerticalStrut();
135
136         ignoreCaseCheckBox = new CheckBox("Ignore case");
137         ignoreCaseCheckBox.setMnemonic('I');
138         setIgnoreCaseDefault();
139         addCheckBox(ignoreCaseCheckBox);
140
141         wholeWordsOnlyCheckBox = new CheckBox("Whole words only",
142             sessionProperties.getBooleanProperty(wholeWordsOnlyKey, false));
143         wholeWordsOnlyCheckBox.setMnemonic('W');
144         wholeWordsOnlyCheckBox.addActionListener(this);
145         addCheckBox(wholeWordsOnlyCheckBox);
146
147         // Mode combo box.
148
modeComboBox = new JComboBox JavaDoc(getPermissibleModes());
149         Dimension JavaDoc dim = modeComboBox.getPreferredSize();
150         modeComboBox.setMinimumSize(dim);
151         modeComboBox.setMaximumSize(dim);
152
153         JPanel JavaDoc panel = new JPanel JavaDoc();
154         panel.setLayout(new BoxLayout JavaDoc(panel, BoxLayout.X_AXIS));
155         panel.setAlignmentX(LEFT_ALIGNMENT);
156         panel.add(Box.createHorizontalStrut(22));
157         modeLabel = new Label("Mode:");
158         panel.add(modeLabel);
159         modeLabel.setDisplayedMnemonic('O');
160         modeLabel.setLabelFor(modeComboBox);
161         panel.add(Box.createHorizontalStrut(5));
162         panel.add(modeComboBox);
163         updateModeControl();
164         modeComboBox.addKeyListener(this);
165         mainPanel.add(panel);
166
167         regExpCheckBox = new CheckBox(
168             replace ? "Regular expressions" : "Regular expression",
169             sessionProperties.getBooleanProperty(regExpKey, false));
170         regExpCheckBox.setMnemonic('X');
171         addCheckBox(regExpCheckBox);
172
173         if (replace) {
174             confirmChangesCheckBox = new CheckBox("Confirm changes", true);
175             confirmChangesCheckBox.setMnemonic('C');
176             addCheckBox(confirmChangesCheckBox);
177         }
178
179         includeSubdirsCheckBox = new CheckBox("Include subdirectories",
180             sessionProperties.getBooleanProperty(includeSubdirsKey, false));
181         includeSubdirsCheckBox.setMnemonic('S');
182         addCheckBox(includeSubdirsCheckBox);
183
184         // Always search files in memory for replace in files.
185
// Otherwise it's up to the user.
186
if (!replace) {
187             searchFilesInMemoryCheckBox =
188                 new CheckBox("Search files in memory",
189                     sessionProperties.getBooleanProperty(searchFilesInMemoryKey,
190                         true));
191             searchFilesInMemoryCheckBox.setMnemonic('M');
192             addCheckBox(searchFilesInMemoryCheckBox);
193             listOccurrencesCheckBox = new CheckBox("List occurrences",
194                 sessionProperties.getBooleanProperty(listOccurrencesKey, true));
195             listOccurrencesCheckBox.setMnemonic('L');
196             addCheckBox(listOccurrencesCheckBox);
197         }
198
199         addVerticalStrut();
200
201         addOKCancel();
202
203         pack();
204
205         patternControl.requestFocus();
206     }
207
208     private ModeListEntry[] getPermissibleModes()
209     {
210         if (permissibleModes == null) {
211             ModeList modeList = Editor.getModeList();
212             ArrayList JavaDoc list = new ArrayList JavaDoc();
213             synchronized (modeList) {
214                 Iterator JavaDoc it = modeList.iterator();
215                 while (it.hasNext()) {
216                     ModeListEntry entry = (ModeListEntry) it.next();
217                     if (entry.isSelectable() && entry.getId() != BINARY_MODE)
218                         list.add(entry);
219                 }
220             }
221             permissibleModes =
222                 (ModeListEntry[]) list.toArray(new ModeListEntry[list.size()]);
223         }
224         return permissibleModes;
225     }
226
227     public FindInFiles getFindInFiles()
228     {
229         return findInFiles;
230     }
231
232     protected void ok()
233     {
234         findInFiles = new FindInFiles(editor);
235
236         findInFiles.setPattern(patternControl.getText());
237
238         if (replacementControl != null) {
239             findInFiles.setReplaceWith(replacementControl.getText());
240             replacementHistory.append(findInFiles.getReplaceWith());
241             replacementHistory.save();
242         }
243
244         findInFiles.setIgnoreCase(ignoreCaseCheckBox.isSelected());
245         findInFiles.setWholeWordsOnly(wholeWordsOnlyCheckBox.isSelected());
246         findInFiles.setRegularExpression(regExpCheckBox.isSelected());
247
248         if (confirmChangesCheckBox != null)
249             findInFiles.setConfirmChanges(confirmChangesCheckBox.isSelected());
250
251         findInFiles.setIncludeSubdirs(includeSubdirsCheckBox.isSelected());
252
253         if (searchFilesInMemoryCheckBox != null)
254             findInFiles.setSearchFilesInMemory(searchFilesInMemoryCheckBox.isSelected());
255         else
256             findInFiles.setSearchFilesInMemory(true);
257
258         if (listOccurrencesCheckBox != null && listOccurrencesCheckBox.isSelected())
259             findInFiles.setListEachOccurrence(true);
260
261         patternHistory.append(findInFiles.getPattern());
262         patternHistory.save();
263
264         sessionProperties.setBooleanProperty(wholeWordsOnlyKey,
265             findInFiles.wholeWordsOnly());
266         sessionProperties.setBooleanProperty(regExpKey,
267             findInFiles.isRegularExpression());
268         sessionProperties.setBooleanProperty(includeSubdirsKey,
269             findInFiles.getIncludeSubdirs());
270         sessionProperties.setBooleanProperty(searchFilesInMemoryKey,
271             findInFiles.getSearchFilesInMemory());
272         if (!replace)
273             sessionProperties.setBooleanProperty(listOccurrencesKey,
274                 findInFiles.getListEachOccurrence());
275
276         if (findInFiles.isRegularExpression()) {
277             if (findInFiles.getRE() == null) {
278                 try {
279                     int flags = RE.REG_MULTILINE;
280                     if (findInFiles.ignoreCase())
281                         flags |= RE.REG_ICASE;
282                     findInFiles.setRE(new RE(findInFiles.getPattern(), flags));
283                 }
284                 catch (REException e) {
285                     findInFiles = null;
286                     MessageDialog.showMessageDialog(editor,
287                         e.getMessage(), "Error");
288                     patternControl.requestFocus();
289                     return;
290                 }
291             }
292         }
293
294         final String JavaDoc files = filesControl.getText();
295         try {
296             findInFiles.setFiles(files);
297         }
298         catch (Exception JavaDoc e) {
299             findInFiles = null;
300             filesControl.requestFocus();
301             MessageDialog.showMessageDialog(editor, e.getMessage(), "Error");
302             return;
303         }
304         filesHistory.append(files);
305         filesHistory.save();
306
307         if (modeComboBox != null) {
308             ModeListEntry entry =
309                 (ModeListEntry) modeComboBox.getSelectedItem();
310             findInFiles.setMode(entry.getMode(true));
311         }
312
313         dispose();
314     }
315
316     public void textValueChanged(TextEvent JavaDoc e)
317     {
318         setIgnoreCaseDefault();
319     }
320
321     public void actionPerformed(ActionEvent JavaDoc e)
322     {
323         String JavaDoc cmd = e.getActionCommand();
324         if (cmd != null && cmd.equals(wholeWordsOnlyCheckBox.getText()))
325             updateModeControl();
326         else
327             super.actionPerformed(e);
328     }
329
330     public void focusGained(FocusEvent JavaDoc e) {}
331
332     public void focusLost(FocusEvent JavaDoc e)
333     {
334         if (e.getComponent() == filesControl)
335             updateModeControl();
336     }
337
338     private void updateModeControl()
339     {
340         if (modeComboBox != null) {
341             String JavaDoc files = filesControl.getText();
342             StringTokenizer JavaDoc st = new StringTokenizer JavaDoc(files, ";");
343             if (st.hasMoreTokens()) {
344                 String JavaDoc token = st.nextToken().trim();
345                 if (token.length() > 0) {
346                     int id = Editor.getModeList().getModeIdForFileName(token);
347                     if (id >= 0) {
348                         ModeListEntry[] modes = getPermissibleModes();
349                         for (int i = modes.length; i-- > 0;) {
350                             if (modes[i].getId() == id) {
351                                 modeComboBox.setSelectedItem(modes[i]);
352                                 break;
353                             }
354                         }
355                     }
356                 }
357             }
358             boolean b = wholeWordsOnlyCheckBox.isSelected();
359             modeComboBox.setEnabled(b);
360             modeLabel.setEnabled(b);
361         }
362     }
363
364     private void setIgnoreCaseDefault()
365     {
366         String JavaDoc pattern = patternControl.getText();
367         ignoreCaseCheckBox.setSelected(pattern == null || Utilities.isLowerCase(pattern));
368     }
369 }
370
Popular Tags