KickJava   Java API By Example, From Geeks To Geeks.

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


1 /*
2  * ReplaceDialog.java
3  *
4  * Copyright (C) 1998-2003 Peter Graves
5  * $Id: ReplaceDialog.java,v 1.5 2003/10/13 23:51:19 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.REException;
25 import java.awt.Dimension JavaDoc;
26 import java.awt.Point JavaDoc;
27 import java.awt.event.ActionEvent JavaDoc;
28 import java.awt.event.TextEvent JavaDoc;
29 import java.awt.event.TextListener JavaDoc;
30 import javax.swing.Box JavaDoc;
31 import javax.swing.BoxLayout JavaDoc;
32 import javax.swing.JPanel JavaDoc;
33 import javax.swing.undo.CompoundEdit JavaDoc;
34
35 public final class ReplaceDialog extends AbstractDialog implements Constants,
36     TextListener JavaDoc
37 {
38     private static final String JavaDoc FIND_PATTERN = "find.pattern";
39     private static final String JavaDoc REPLACE_REPLACEMENT = "replace.replacement";
40     private static final String JavaDoc REPLACE_IGNORE_CASE = "replace.ignoreCase";
41     private static final String JavaDoc REPLACE_REGULAR_EXPRESSION = "replace.regularExpression";
42     private static final String JavaDoc REPLACE_MULTILINE_PATTERN = "replace.multilinePattern";
43     private static final String JavaDoc REPLACE_CONFIRM_CHANGES = "replace.confirmChanges";
44     private static final String JavaDoc REPLACE_WHOLE_WORDS_ONLY = "replace.wholeWordsOnly";
45
46     private final Editor editor;
47
48     private Replacement replacement;
49
50     private HistoryTextField patternControl;
51     private HistoryTextField replacementControl;
52
53     private History patternHistory;
54     private History replacementHistory;
55
56     // Options.
57
private CheckBox ignoreCaseCheckBox;
58     private CheckBox wholeWordsOnlyCheckBox;
59     private CheckBox regularExpressionCheckBox;
60     private CheckBox multilinePatternCheckBox;
61     private CheckBox restrictToSelectionCheckBox;
62     private CheckBox confirmChangesCheckBox;
63
64     public ReplaceDialog()
65     {
66         super(Editor.currentEditor(), "Replace", true);
67         editor = Editor.currentEditor();
68         replacement = new Replacement(editor);
69         patternControl = new HistoryTextField(20);
70         patternHistory = new History(FIND_PATTERN);
71         patternControl.setHistory(patternHistory);
72         // Pre-fill pattern control.
73
String JavaDoc s = editor.getCurrentText();
74         if (s != null)
75             patternControl.setText(s);
76         else
77             patternControl.recallLast();
78         patternControl.addTextListener(this);
79         replacementControl = new HistoryTextField(20);
80         replacementHistory = new History(REPLACE_REPLACEMENT);
81         replacementControl.setHistory(replacementHistory);
82         replacementControl.recallLast();
83         Label label = new Label("Pattern:");
84         label.setDisplayedMnemonic('P');
85         addLabelAndTextField(label, patternControl);
86         addVerticalStrut();
87         label = new Label("Replace with:");
88         label.setDisplayedMnemonic('E');
89         addLabelAndTextField(label, replacementControl);
90         addVerticalStrut();
91         SessionProperties sessionProperties = Editor.getSessionProperties();
92         replacement.setIgnoreCase(
93             sessionProperties.getBooleanProperty(REPLACE_IGNORE_CASE, false));
94         ignoreCaseCheckBox =
95             new CheckBox("Ignore case", replacement.ignoreCase());
96         ignoreCaseCheckBox.setMnemonic('I');
97         addCheckBox(ignoreCaseCheckBox);
98         replacement.setWholeWordsOnly(
99             sessionProperties.getBooleanProperty(REPLACE_WHOLE_WORDS_ONLY,
100                 false));
101         wholeWordsOnlyCheckBox =
102             new CheckBox("Whole words only", replacement.wholeWordsOnly());
103         wholeWordsOnlyCheckBox.setMnemonic('W');
104         addCheckBox(wholeWordsOnlyCheckBox);
105         replacement.setRegularExpression(
106             sessionProperties.getBooleanProperty(REPLACE_REGULAR_EXPRESSION,
107                 false));
108         regularExpressionCheckBox = new CheckBox("Regular expression",
109             replacement.isRegularExpression());
110         regularExpressionCheckBox.setMnemonic('X');
111         regularExpressionCheckBox.addActionListener(this);
112         addCheckBox(regularExpressionCheckBox);
113         if (Editor.checkExperimental()) {
114             JPanel JavaDoc panel = new JPanel JavaDoc();
115             panel.setAlignmentX(LEFT_ALIGNMENT);
116             panel.setLayout(new BoxLayout JavaDoc(panel, BoxLayout.X_AXIS));
117             panel.add(Box.createHorizontalStrut(17));
118             if (replacement.isRegularExpression()) {
119                 replacement.setMultiline(sessionProperties.getBooleanProperty(
120                         REPLACE_MULTILINE_PATTERN, false));
121             } else
122                 replacement.setMultiline(false);
123             multilinePatternCheckBox =
124                 new CheckBox("Multiline pattern (experimental)",
125                     replacement.isMultilinePattern());
126             multilinePatternCheckBox.setMnemonic('M');
127             panel.add(multilinePatternCheckBox);
128             multilinePatternCheckBox.addKeyListener(this);
129             multilinePatternCheckBox.setEnabled(
130                 regularExpressionCheckBox.isSelected());
131             mainPanel.add(panel);
132         }
133         restrictToSelectionCheckBox =
134             new CheckBox("Restrict changes to selected text");
135         restrictToSelectionCheckBox.setMnemonic('R');
136         replacement.setConfirmChanges(
137             sessionProperties.getBooleanProperty(REPLACE_CONFIRM_CHANGES,
138                 true));
139         confirmChangesCheckBox =
140             new CheckBox("Confirm changes", replacement.confirmChanges());
141         confirmChangesCheckBox.setMnemonic('C');
142         if (restrictToSelectionCheckBox != null) {
143             setRestrictToSelectionDefault();
144             addCheckBox(restrictToSelectionCheckBox);
145         }
146         addCheckBox(confirmChangesCheckBox);
147         addVerticalStrut();
148         addOKCancel();
149         pack();
150         patternControl.requestFocus();
151     }
152
153     public final Replacement getReplacement()
154     {
155         return replacement;
156     }
157
158     public void textValueChanged(TextEvent JavaDoc e)
159     {
160         setRestrictToSelectionDefault();
161     }
162
163     public void actionPerformed(ActionEvent JavaDoc e)
164     {
165         final String JavaDoc cmd = e.getActionCommand();
166         if (cmd != null && cmd.equals(regularExpressionCheckBox.getText())) {
167             if (multilinePatternCheckBox != null) {
168                 boolean isRegExp = regularExpressionCheckBox.isSelected();
169                 if (!isRegExp)
170                     multilinePatternCheckBox.setSelected(false);
171                 multilinePatternCheckBox.setEnabled(isRegExp);
172             }
173         } else
174             super.actionPerformed(e);
175     }
176
177     private void setRestrictToSelectionDefault()
178     {
179         if (restrictToSelectionCheckBox == null)
180             return;
181         // Enable the checkbox if a selection is active.
182
boolean enabled = editor.getMark() != null && !editor.isColumnSelection();
183         restrictToSelectionCheckBox.setEnabled(enabled);
184         // Normally the checkbox should be checked if a non-column selection
185
// is active.
186
boolean checked = enabled;
187         // But if the selection is on a single line, we try to be smarter...
188
if (checked) {
189             if (editor.getMark().getLine() == editor.getDot().getLine()) {
190                 // Only handle the simple case; if the pattern is a regular
191
// expression, be conservative and leave the box checked.
192
if (!regularExpressionCheckBox.isSelected()) {
193                     String JavaDoc pattern = patternControl.getText();
194                     if (pattern != null) {
195                         Region r = new Region(editor);
196                         String JavaDoc selection = r.toString();
197                         // If the pattern is identical to the selected text, or if
198
// the selected text isn't long enough to contain a match
199
// for the pattern, it makes no sense to restrict changes
200
// to the selected text, and we shouldn't check the box.
201
if (pattern.equals(selection))
202                             checked = false;
203                         else if (pattern.length() >= selection.length())
204                             checked = false;
205                     }
206                 }
207             }
208         }
209         restrictToSelectionCheckBox.setSelected(checked);
210     }
211
212     protected void ok()
213     {
214         replacement.setPattern(patternControl.getText());
215         if (replacement.getPatternLength() == 0) {
216             editor.status("No pattern");
217             replacement = null;
218             dispose();
219             return;
220         }
221         replacement.setReplaceWith(replacementControl.getText());
222         replacement.setIgnoreCase(ignoreCaseCheckBox.isSelected());
223         replacement.setWholeWordsOnly(wholeWordsOnlyCheckBox.isSelected());
224         replacement.setRegularExpression(regularExpressionCheckBox.isSelected());
225         if (multilinePatternCheckBox != null) {
226             replacement.setMultiline(multilinePatternCheckBox.isSelected());
227             // We don't allow the "Multiline pattern" checkbox to be checked
228
// unless the "Regular expression" checkbox is also checked.
229
if (multilinePatternCheckBox.isSelected())
230                 if (!regularExpressionCheckBox.isSelected())
231                     Debug.bug();
232         }
233         if (restrictToSelectionCheckBox != null)
234             replacement.setRestrictToSelection(restrictToSelectionCheckBox.isSelected());
235         replacement.setConfirmChanges(confirmChangesCheckBox.isSelected());
236         if (replacement.isRegularExpression()) {
237             try {
238                 replacement.setREFromPattern();
239             }
240             catch (REException e) {
241                 MessageDialog.showMessageDialog(editor,
242                     e.getMessage(), "Error");
243                 patternControl.requestFocus();
244                 return;
245             }
246         }
247         patternHistory.append(replacement.getPattern());
248         patternHistory.save();
249         replacementHistory.append(replacement.getReplaceWith());
250         replacementHistory.save();
251         SessionProperties sessionProperties = Editor.getSessionProperties();
252         sessionProperties.setBooleanProperty(REPLACE_IGNORE_CASE,
253             replacement.ignoreCase());
254         sessionProperties.setBooleanProperty(REPLACE_WHOLE_WORDS_ONLY,
255             replacement.wholeWordsOnly());
256         sessionProperties.setBooleanProperty(REPLACE_REGULAR_EXPRESSION,
257             replacement.isRegularExpression());
258         sessionProperties.setBooleanProperty(REPLACE_MULTILINE_PATTERN,
259             replacement.isMultilinePattern());
260         sessionProperties.setBooleanProperty(REPLACE_CONFIRM_CHANGES,
261             replacement.confirmChanges());
262         sessionProperties.save();
263         dispose();
264     }
265
266     protected void cancel()
267     {
268         replacement = null;
269         dispose();
270     }
271
272     public static void replace()
273     {
274         final Editor editor = Editor.currentEditor();
275         if (!editor.checkReadOnly())
276             return;
277         if (editor.isColumnSelection()) {
278             editor.notSupportedForColumnSelections();
279             return;
280         }
281         ReplaceDialog d = new ReplaceDialog();
282         editor.centerDialog(d);
283         d.show();
284         if (d.cancelled())
285             return;
286         final Replacement replacement = d.getReplacement();
287         if (replacement == null)
288             return;
289         CompoundEdit JavaDoc compoundEdit = editor.beginCompoundEdit();
290         editor.addUndo(SimpleEdit.MOVE);
291         if (editor.getMark() != null) {
292             replacement.setRegion(new Region(editor));
293             editor.getDot().moveTo(replacement.getRegion().getBegin());
294         }
295         final Buffer buffer = editor.getBuffer();
296         if (replacement.confirmChanges()) {
297             Position pos = replacement.find(buffer, editor.getDot());
298             if (pos == null) {
299                 editor.endCompoundEdit(compoundEdit);
300                 editor.undo();
301                 replacement.notFound(editor);
302                 return;
303             }
304             editor.moveDotTo(pos);
305             editor.markFoundPattern(replacement);
306             editor.updateDisplay();
307             ConfirmReplacementDialog confirmDialog =
308                 new ConfirmReplacementDialog(replacement, false);
309             // Center dialog at top of editor window.
310
Dimension JavaDoc parent = editor.getSize();
311             Dimension JavaDoc dialog = confirmDialog.getSize();
312             Point JavaDoc p = editor.getLocation();
313             p.translate((parent.width - dialog.width) / 2, 0);
314             confirmDialog.setLocation(p);
315             // Do all the replacements.
316
confirmDialog.show();
317             if (replacement.restrictToSelection() && replacement.getRegion() != null) {
318                 // Leave selection marked as before.
319
editor.addUndo(SimpleEdit.MOVE);
320                 editor.setDot(replacement.getRegion().getBegin());
321                 editor.moveCaretToDotCol();
322                 editor.setMark(replacement.getRegion().getEnd());
323                 editor.setUpdateFlag(REPAINT);
324             } else {
325                 editor.unmark();
326                 editor.moveCaretToDotCol();
327             }
328         } else {
329             // Not confirming changes.
330
Position saved = new Position(editor.getDot());
331             Position pos;
332             while ((pos = replacement.find(buffer, editor.getDot())) != null) {
333                 editor.addUndo(SimpleEdit.MOVE);
334                 editor.getDot().moveTo(pos);
335                 if (replacement.isMultilinePattern())
336                     editor.markFoundPattern(replacement);
337                 replacement.replaceOccurrence();
338             }
339             if (replacement.restrictToSelection() && replacement.getRegion() != null) {
340                 editor.addUndo(SimpleEdit.MOVE);
341                 editor.setDot(replacement.getRegion().getBegin());
342                 editor.moveCaretToDotCol();
343                 editor.setMark(replacement.getRegion().getEnd());
344             } else {
345                 editor.addUndo(SimpleEdit.MOVE);
346                 editor.setDot(saved);
347                 editor.setMark(null);
348                 editor.moveCaretToDotCol();
349             }
350             editor.getDisplay().setUpdateFlag(REPAINT);
351             if (replacement.getReplacementCount() == 0)
352                 replacement.notFound(editor);
353         }
354         editor.endCompoundEdit(compoundEdit);
355         int replacementCount = replacement.getReplacementCount();
356         if (replacementCount == 0) {
357             editor.undo();
358         } else {
359             FastStringBuffer sb =
360                 new FastStringBuffer(String.valueOf(replacementCount));
361             sb.append(" occurrence");
362             if (replacementCount > 1)
363                 sb.append('s');
364             sb.append(" replaced");
365             editor.status(sb.toString());
366         }
367     }
368 }
369
Popular Tags