1 21 22 package org.armedbear.j; 23 24 import gnu.regexp.REException; 25 import java.awt.Dimension ; 26 import java.awt.Point ; 27 import java.awt.event.ActionEvent ; 28 import java.awt.event.TextEvent ; 29 import java.awt.event.TextListener ; 30 import javax.swing.Box ; 31 import javax.swing.BoxLayout ; 32 import javax.swing.JPanel ; 33 import javax.swing.undo.CompoundEdit ; 34 35 public final class ReplaceDialog extends AbstractDialog implements Constants, 36 TextListener 37 { 38 private static final String FIND_PATTERN = "find.pattern"; 39 private static final String REPLACE_REPLACEMENT = "replace.replacement"; 40 private static final String REPLACE_IGNORE_CASE = "replace.ignoreCase"; 41 private static final String REPLACE_REGULAR_EXPRESSION = "replace.regularExpression"; 42 private static final String REPLACE_MULTILINE_PATTERN = "replace.multilinePattern"; 43 private static final String REPLACE_CONFIRM_CHANGES = "replace.confirmChanges"; 44 private static final String 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 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 String 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 panel = new JPanel (); 115 panel.setAlignmentX(LEFT_ALIGNMENT); 116 panel.setLayout(new BoxLayout (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 e) 159 { 160 setRestrictToSelectionDefault(); 161 } 162 163 public void actionPerformed(ActionEvent e) 164 { 165 final String 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 boolean enabled = editor.getMark() != null && !editor.isColumnSelection(); 183 restrictToSelectionCheckBox.setEnabled(enabled); 184 boolean checked = enabled; 187 if (checked) { 189 if (editor.getMark().getLine() == editor.getDot().getLine()) { 190 if (!regularExpressionCheckBox.isSelected()) { 193 String pattern = patternControl.getText(); 194 if (pattern != null) { 195 Region r = new Region(editor); 196 String selection = r.toString(); 197 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 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 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 Dimension parent = editor.getSize(); 311 Dimension dialog = confirmDialog.getSize(); 312 Point p = editor.getLocation(); 313 p.translate((parent.width - dialog.width) / 2, 0); 314 confirmDialog.setLocation(p); 315 confirmDialog.show(); 317 if (replacement.restrictToSelection() && replacement.getRegion() != null) { 318 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 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 |