1 21 22 package org.armedbear.j; 23 24 import gnu.regexp.REException; 25 import java.awt.event.ActionEvent ; 26 import java.awt.event.ActionListener ; 27 import java.awt.event.TextEvent ; 28 import java.awt.event.TextListener ; 29 import javax.swing.Box ; 30 import javax.swing.BoxLayout ; 31 import javax.swing.JLabel ; 32 import javax.swing.JPanel ; 33 34 public final class FindDialog extends AbstractDialog implements ActionListener , 35 TextListener 36 { 37 private static final String patternKey = "find.pattern"; 38 private static final String searchFromStartKey = "find.searchFromStart"; 39 40 private static boolean wholeWordsOnly; 41 private static boolean regularExpression; 42 private static boolean isMultilinePattern; 43 44 private Search search; 45 private final Editor editor; 46 private HistoryTextField patternControl; 47 private History patternHistory; 48 private CheckBox ignoreCaseCheckBox; 49 private CheckBox wholeWordsCheckBox; 50 private CheckBox regularExpressionCheckBox; 51 private CheckBox multilinePatternCheckBox; 52 private CheckBox listOccurrencesCheckBox; 53 private CheckBox searchFromStartCheckBox; 54 private boolean listOccurrences; 55 private boolean searchFromStart; 56 57 public FindDialog(Editor editor) 58 { 59 super(editor, "Find", true); 60 this.editor = editor; 61 search = new Search(); 62 patternControl = new HistoryTextField(20); 63 patternHistory = new History(patternKey); 64 patternControl.setHistory(patternHistory); 65 String s = editor.getCurrentText(); 67 if (s != null) 68 patternControl.setText(s); 69 else 70 patternControl.recallLast(); 71 Label label = new Label("Pattern:"); 72 label.setDisplayedMnemonic('P'); 73 addLabelAndTextField(label, patternControl); 74 addVerticalStrut(); 75 ignoreCaseCheckBox = new CheckBox("Ignore case"); 76 ignoreCaseCheckBox.setMnemonic('I'); 77 setIgnoreCaseDefault(); 78 addCheckBox(ignoreCaseCheckBox); 79 wholeWordsCheckBox = new CheckBox("Whole words only", wholeWordsOnly); 80 wholeWordsCheckBox.setMnemonic('W'); 81 addCheckBox(wholeWordsCheckBox); 82 regularExpressionCheckBox = 83 new CheckBox("Regular expression", regularExpression); 84 regularExpressionCheckBox.setMnemonic('X'); 85 regularExpressionCheckBox.addActionListener(this); 86 addCheckBox(regularExpressionCheckBox); 87 if (Editor.checkExperimental()) { 88 JPanel panel = new JPanel (); 89 panel.setAlignmentX(LEFT_ALIGNMENT); 90 panel.setLayout(new BoxLayout (panel, BoxLayout.X_AXIS)); 91 panel.add(Box.createHorizontalStrut(17)); 92 multilinePatternCheckBox = 93 new CheckBox("Multiline pattern (experimental)", isMultilinePattern); 94 multilinePatternCheckBox.setMnemonic('M'); 95 panel.add(multilinePatternCheckBox); 96 multilinePatternCheckBox.addKeyListener(this); 97 multilinePatternCheckBox.setEnabled(regularExpressionCheckBox.isSelected()); 98 mainPanel.add(panel); 99 } 100 listOccurrencesCheckBox = 101 new CheckBox("List occurrences", listOccurrences); 102 listOccurrencesCheckBox.setMnemonic('L'); 103 addCheckBox(listOccurrencesCheckBox); 104 searchFromStart = Editor.getSessionProperties().getBooleanProperty(searchFromStartKey, false); 105 searchFromStartCheckBox = 106 new CheckBox("Search from start of document", searchFromStart); 107 searchFromStartCheckBox.setMnemonic('S'); 108 addCheckBox(searchFromStartCheckBox); 109 addVerticalStrut(); 110 addOKCancel(); 111 patternControl.addTextListener(this); 112 patternControl.addActionListener(this); 113 pack(); 114 patternControl.requestFocus(); 115 } 116 117 public Search getSearch() 118 { 119 return search; 120 } 121 122 public boolean getListOccurrences() 123 { 124 return listOccurrences; 125 } 126 127 public boolean searchFromStart() 128 { 129 return searchFromStart; 130 } 131 132 protected void ok() 133 { 134 search.setPattern(patternControl.getText()); 135 search.setIgnoreCase(ignoreCaseCheckBox.isSelected()); 136 wholeWordsOnly = wholeWordsCheckBox.isSelected(); 137 search.setWholeWordsOnly(wholeWordsOnly); 138 regularExpression = regularExpressionCheckBox.isSelected(); 139 search.setRegularExpression(regularExpression); 140 if (multilinePatternCheckBox != null) { 141 isMultilinePattern = multilinePatternCheckBox.isSelected(); 142 search.setMultiline(isMultilinePattern); 143 } 144 if (regularExpression) { 145 try { 146 search.setREFromPattern(); 147 } 148 catch (REException e) { 149 MessageDialog.showMessageDialog(editor, 150 e.getMessage(), "Error"); 151 patternControl.requestFocus(); 152 return; 153 } 154 } 155 listOccurrences = listOccurrencesCheckBox.isSelected(); 156 searchFromStart = searchFromStartCheckBox.isSelected(); 157 Editor.getSessionProperties().setBooleanProperty(searchFromStartKey, searchFromStart); 158 patternHistory.append(search.getPattern()); 159 patternHistory.save(); 160 dispose(); 161 } 162 163 protected void cancel() 164 { 165 cancelled = true; 166 search = null; 167 dispose(); 168 } 169 170 public void textValueChanged(TextEvent e) 171 { 172 setIgnoreCaseDefault(); 173 } 174 175 public void actionPerformed(ActionEvent e) 176 { 177 String cmd = e.getActionCommand(); 178 if (cmd != null && cmd.equals(regularExpressionCheckBox.getText())) { 179 if (multilinePatternCheckBox != null) { 180 boolean isRegExp = regularExpressionCheckBox.isSelected(); 181 if (!isRegExp) 182 multilinePatternCheckBox.setSelected(false); 183 multilinePatternCheckBox.setEnabled(isRegExp); 184 } 185 } else 186 super.actionPerformed(e); 187 } 188 189 private void setIgnoreCaseDefault() 190 { 191 String pattern = patternControl.getText(); 192 ignoreCaseCheckBox.setSelected(pattern == null || Utilities.isLowerCase(pattern)); 193 } 194 195 public static void find() 196 { 197 find(Editor.currentEditor()); 198 } 199 200 public static void find(Editor editor) 203 { 204 if (editor.getDot() == null) 205 return; 206 FindDialog d = new FindDialog(editor); 207 editor.centerDialog(d); 208 d.show(); 209 Search search = d.getSearch(); 210 if (search == null) 211 return; 212 editor.setLastSearch(search); 213 if (d.getListOccurrences()) { 214 ListOccurrences.listOccurrences(editor); 215 } else { 216 editor.setWaitCursor(); 217 final Position start; 218 if (d.searchFromStart()) 219 start = new Position(editor.getBuffer().getFirstLine(), 0); 220 else 221 start = editor.getDot(); 222 Position pos = search.find(editor.getBuffer(), start); 223 editor.setDefaultCursor(); 224 if (pos != null) { 225 editor.moveDotTo(pos); 226 editor.markFoundPattern(search); 227 } else 228 search.notFound(editor); 229 } 230 } 231 } 232 | Popular Tags |