1 21 22 package org.armedbear.j; 23 24 import gnu.regexp.RE; 25 import gnu.regexp.REException; 26 import java.awt.Dimension ; 27 import java.awt.event.ActionEvent ; 28 import java.awt.event.ActionListener ; 29 import java.awt.event.FocusEvent ; 30 import java.awt.event.FocusListener ; 31 import java.awt.event.TextEvent ; 32 import java.awt.event.TextListener ; 33 import java.util.ArrayList ; 34 import java.util.Iterator ; 35 import java.util.StringTokenizer ; 36 import javax.swing.Box ; 37 import javax.swing.BoxLayout ; 38 import javax.swing.JComboBox ; 39 import javax.swing.JPanel ; 40 41 public class FindInFilesDialog extends AbstractDialog implements Constants, 42 ActionListener , FocusListener , TextListener 43 { 44 private static final String patternKey = "find.pattern"; 45 private static final String replacementKey = "replace.replacement"; 46 private static final String filesKey = "findInFiles.files"; 47 private static final String wholeWordsOnlyKey = "findInFiles.wholeWordsOnly"; 48 private static final String regExpKey = "findInFiles.regularExpression"; 49 private static final String includeSubdirsKey = "findInFiles.includeSubdirs"; 50 private static final String searchFilesInMemoryKey = "findInFiles.searchFilesInMemory"; 51 private static final String 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 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 String s; 95 if (editor.getBuffer() instanceof Directory) 96 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 modeComboBox = new JComboBox (getPermissibleModes()); 149 Dimension dim = modeComboBox.getPreferredSize(); 150 modeComboBox.setMinimumSize(dim); 151 modeComboBox.setMaximumSize(dim); 152 153 JPanel panel = new JPanel (); 154 panel.setLayout(new BoxLayout (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 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 list = new ArrayList (); 213 synchronized (modeList) { 214 Iterator 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 files = filesControl.getText(); 295 try { 296 findInFiles.setFiles(files); 297 } 298 catch (Exception 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 e) 317 { 318 setIgnoreCaseDefault(); 319 } 320 321 public void actionPerformed(ActionEvent e) 322 { 323 String 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 e) {} 331 332 public void focusLost(FocusEvent e) 333 { 334 if (e.getComponent() == filesControl) 335 updateModeControl(); 336 } 337 338 private void updateModeControl() 339 { 340 if (modeComboBox != null) { 341 String files = filesControl.getText(); 342 StringTokenizer st = new StringTokenizer (files, ";"); 343 if (st.hasMoreTokens()) { 344 String 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 pattern = patternControl.getText(); 367 ignoreCaseCheckBox.setSelected(pattern == null || Utilities.isLowerCase(pattern)); 368 } 369 } 370 | Popular Tags |