KickJava   Java API By Example, From Geeks To Geeks.

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


1 /*
2  * FindDialog.java
3  *
4  * Copyright (C) 1998-2003 Peter Graves
5  * $Id: FindDialog.java,v 1.4 2003/10/13 23:52:56 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.event.ActionEvent JavaDoc;
26 import java.awt.event.ActionListener JavaDoc;
27 import java.awt.event.TextEvent JavaDoc;
28 import java.awt.event.TextListener JavaDoc;
29 import javax.swing.Box JavaDoc;
30 import javax.swing.BoxLayout JavaDoc;
31 import javax.swing.JLabel JavaDoc;
32 import javax.swing.JPanel JavaDoc;
33
34 public final class FindDialog extends AbstractDialog implements ActionListener JavaDoc,
35     TextListener JavaDoc
36 {
37     private static final String JavaDoc patternKey = "find.pattern";
38     private static final String JavaDoc 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         // Pre-fill pattern control.
66
String JavaDoc 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 JavaDoc panel = new JPanel JavaDoc();
89             panel.setAlignmentX(LEFT_ALIGNMENT);
90             panel.setLayout(new BoxLayout JavaDoc(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 JavaDoc e)
171     {
172         setIgnoreCaseDefault();
173     }
174
175     public void actionPerformed(ActionEvent JavaDoc e)
176     {
177         String JavaDoc 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 JavaDoc 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     // Also called from IncrementalTextFieldHandler.finish() if the user hits
201
// Enter with an empty search string.
202
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