SearchExpressionsAction.java
001 /*
002  *  Copyright (c) 1995-2012, The University of Sheffield. See the file
003  *  COPYRIGHT.txt in the software or at http://gate.ac.uk/gate/COPYRIGHT.txt
004  *
005  *  This file is part of GATE (see http://gate.ac.uk/), and is free
006  *  software, licenced under the GNU Library General Public License,
007  *  Version 2, June 1991 (in the distribution as file licence.html,
008  *  and also available at http://gate.ac.uk/gate/licence.html).
009  *
010  *  Thomas Heitz, Nov 7, 2008
011  *
012  *  $Id: SchemaAnnotationEditor.java 9221 2007-11-14 17:46:37Z valyt $
013  */
014 
015 package gate.gui.annedit;
016 
017 import gate.util.LuckyException;
018 
019 import javax.swing.*;
020 import javax.swing.text.BadLocationException;
021 import javax.swing.event.CaretListener;
022 import javax.swing.event.CaretEvent;
023 import javax.swing.event.ListSelectionListener;
024 import javax.swing.event.ListSelectionEvent;
025 import java.awt.event.ActionEvent;
026 import java.awt.event.ActionListener;
027 import java.awt.event.MouseAdapter;
028 import java.awt.event.MouseEvent;
029 import java.awt.*;
030 
031 /**
032  * Dialog for building a regular expression.
033  */
034 public class SearchExpressionsAction extends AbstractAction {
035   private static final long serialVersionUID = 1L;
036   private JTextField sourceTextField;
037   private Window annotationEditorWindow;
038   private JCheckBox searchRegExpChk;
039 
040   /**
041    * Shows a dialog with a list of predefined search expressions
042    * to modified the current search expression.
043    *
044    @param sourceTextField text field that contains the search expression
045    @param annotationEditorWindow search window
046    @param searchRegExpChk check box for regular expression; may be null
047    */
048   public SearchExpressionsAction(JTextField sourceTextField,
049                                  Window annotationEditorWindow,
050                                  JCheckBox searchRegExpChk){
051     super("?");
052     super.putValue(SHORT_DESCRIPTION, "GATE search expression builder.");
053     this.sourceTextField = sourceTextField;
054     this.annotationEditorWindow = annotationEditorWindow;
055     this.searchRegExpChk = searchRegExpChk;
056   }
057 
058   @Override
059   public void actionPerformed(ActionEvent arg0) {
060     String[] values1 = {
061       "Number",
062       "Person"
063     };
064     String[] values2 = {
065       "Any character",
066       "The beginning of a line",
067       "The end of a line",
068       "All letters",
069       "Letter uppercase",
070       "Letter lowercase",
071       "Letter titlecase",
072       "Letter modifier",
073       "Letter other",
074       "All Numbers",
075       "Number decimal digit",
076       "Number letter",
077       "Number other",
078       "All punctuations",
079       "Punctuation connector",
080       "Punctuation dash",
081       "Punctuation open",
082       "Punctuation close",
083       "Punctuation initial quote",
084       "Punctuation final quote",
085       "Punctuation other",
086       "All symbols",
087       "Symbol math",
088       "Symbol currency",
089       "Symbol modifier",
090       "Symbol other",
091       "All separators",
092       "Separator space",
093       "Separator line",
094       "Separator paragraph",
095       "All Marks",
096       "Mark nonspacing",
097       "Mark spacing combining",
098       "Mark enclosing",
099       "All others",
100       "Other control",
101       "Other format",
102       "Other surrogate",
103       "Other private use",
104       "Other not assigned",
105       "Any character except Category",
106       "Category1 and/or Category2",
107       "Category1 and Category2"
108     };
109     String[] values3 = {
110       "Either the selection or X",
111       "Once or not at all",
112       "Zero or more times",
113       "One or more times",
114       "Capturing group",
115       "Non-capturing group"
116     };
117     final JTextField modifiedTextField = new JTextField(25);
118     modifiedTextField.setText(sourceTextField.getText());
119     JPanel vspace1 = new JPanel();
120     vspace1.setSize(05);
121     final JList<String> list1 = new JList<String>(values1);
122     list1.setVisibleRowCount(Math.min(10, values1.length));
123     list1.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
124     JScrollPane jsp1 = new JScrollPane(list1);
125     final JButton b1 = new JButton("Replace search expression");
126     b1.setEnabled(false);
127     JPanel vspace2 = new JPanel();
128     vspace2.setSize(05);
129     final JList<String> list2 = new JList<String>(values2);
130     list2.setVisibleRowCount(Math.min(10, values2.length));
131     list2.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
132     JScrollPane jsp2 = new JScrollPane(list2);
133     final JButton b2 = new JButton("Insert at the caret position");
134     b2.setEnabled(false);
135     JPanel vspace3 = new JPanel();
136     vspace3.setSize(05);
137     final JList<String> list3 = new JList<String>(values3);
138     list3.setVisibleRowCount(Math.min(10, values3.length));
139     list3.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
140     JScrollPane jsp3 = new JScrollPane(list3);
141     final JButton b3 = new JButton("Modify the selection");
142     b3.setEnabled(false);
143     modifiedTextField.addCaretListener(new CaretListener() {
144       @Override
145       public void caretUpdate(CaretEvent e) {
146         list3.setEnabled(modifiedTextField.getSelectedText() != null);
147       }
148     });
149     Object[] messageObjects = {
150       "Current search expression:", modifiedTextField,
151       vspace1, jsp1, b1, vspace2, jsp2, b2, vspace3, jsp3, b3
152     };
153     String options[] {"OK""Cancel"};
154     final JOptionPane optionPane = new JOptionPane(
155       messageObjects,
156       JOptionPane.QUESTION_MESSAGE, JOptionPane.YES_NO_OPTION,
157       null, options, "Cancel");
158     b1.addActionListener(new ActionListener() {
159       @Override
160       public void actionPerformed(ActionEvent e) {
161           modifySearchExpression(list1.getSelectedValue().toString(),
162             modifiedTextField);
163       }
164     });
165     list1.addMouseListener(new MouseAdapter() {
166       @Override
167       public void mouseClicked(MouseEvent e) {
168         super.mouseClicked(e);
169         if (e.getClickCount() == 2) {
170           modifySearchExpression(list1.getSelectedValue().toString(),
171             modifiedTextField);
172         }
173       }
174     });
175     list1.addListSelectionListener(new ListSelectionListener() {
176       @Override
177       public void valueChanged(ListSelectionEvent e) {
178         if (list1.getSelectedValue() != null) {
179           b1.setEnabled(true);
180         else {
181           b1.setEnabled(false);
182         }
183       }
184     });
185     b2.addActionListener(new ActionListener() {
186       @Override
187       public void actionPerformed(ActionEvent e) {
188           modifySearchExpression(list2.getSelectedValue().toString(),
189             modifiedTextField);
190       }
191     });
192     list2.addMouseListener(new MouseAdapter() {
193       @Override
194       public void mouseClicked(MouseEvent e) {
195         super.mouseClicked(e);
196         if (e.getClickCount() == 2) {
197           modifySearchExpression(list2.getSelectedValue().toString(),
198             modifiedTextField);
199         }
200       }
201     });
202     list2.addListSelectionListener(new ListSelectionListener() {
203       @Override
204       public void valueChanged(ListSelectionEvent e) {
205         if (list2.getSelectedValue() != null) {
206           b2.setEnabled(true);
207         else {
208           b2.setEnabled(false);
209         }
210       }
211     });
212     b3.addActionListener(new ActionListener() {
213       @Override
214       public void actionPerformed(ActionEvent e) {
215           modifySearchExpression(list3.getSelectedValue().toString(),
216             modifiedTextField);
217       }
218     });
219     list3.addMouseListener(new MouseAdapter() {
220       @Override
221       public void mouseClicked(MouseEvent e) {
222         super.mouseClicked(e);
223         if (e.getClickCount() == && list3.isEnabled()) {
224           modifySearchExpression(list3.getSelectedValue().toString(),
225             modifiedTextField);
226         }
227       }
228     });
229     list3.addListSelectionListener(new ListSelectionListener() {
230       @Override
231       public void valueChanged(ListSelectionEvent e) {
232         if (list3.getSelectedValue() != null) {
233           b3.setEnabled(true);
234         else {
235           b3.setEnabled(false);
236         }
237       }
238     });
239     annotationEditorWindow.setVisible(false);
240     JDialog optionDialog = optionPane.createDialog(
241       gate.gui.MainFrame.getInstance()"GATE search expression builder");
242     modifiedTextField.setCaretPosition(
243       sourceTextField.getSelectionStart()
244       == sourceTextField.getCaretPosition()?
245         sourceTextField.getSelectionEnd()
246        :sourceTextField.getSelectionStart());
247     modifiedTextField.moveCaretPosition(
248       sourceTextField.getCaretPosition());
249     modifiedTextField.requestFocus();
250     optionDialog.setVisible(true);
251     Object selectedValue = optionPane.getValue();
252     if (selectedValue != null
253      && selectedValue.equals("OK")) {
254       if (searchRegExpChk != null) {
255         searchRegExpChk.setSelected(true);
256       }
257       sourceTextField.setText(modifiedTextField.getText());
258     }
259     annotationEditorWindow.setVisible(true);
260   }
261 
262   private void modifySearchExpression(String modification,
263                                       JTextField textField) {
264     if (modification == null) {
265       return;
266     }
267 
268     int p = textField.getCaretPosition();
269     int s1 = textField.getSelectionStart();
270     int s2 = textField.getSelectionEnd();
271     try {
272     if (modification.equals("Number")) {
273       textField.setText("\\b[\\p{N}][\\p{N},.]*\\b");
274     else if (modification.equals("Person")) {
275       textField.setText("\\p{Lu}\\p{L}+, \\p{Lu}\\.(?: \\p{Lu}\\.)*");
276     else if (modification.equals("Either the selection or X")) {
277       textField.getDocument().insertString(s1, "(?:"null);
278       textField.getDocument().insertString(s2+3")|(?:X)"null);
279     else if (modification.equals("Once or not at all")) {
280       textField.getDocument().insertString(s1, "(?:"null);
281       textField.getDocument().insertString(s2+3")?"null);
282     else if (modification.equals("Zero or more times")) {
283       textField.getDocument().insertString(s1, "(?:"null);
284       textField.getDocument().insertString(s2+3")*"null);
285     else if (modification.equals("One or more times")) {
286       textField.getDocument().insertString(s1, "(?:"null);
287       textField.getDocument().insertString(s2+3")+"null);
288     else if (modification.equals("Capturing group")) {
289       textField.getDocument().insertString(s1, "(?:"null);
290       textField.getDocument().insertString(s2+3")"null);
291     else if (modification.equals("Non-capturing group")) {
292       textField.getDocument().insertString(s1, "(?:"null);
293       textField.getDocument().insertString(s2+3")"null);
294     else if (modification.equals("Any character")) {
295       textField.getDocument().insertString(p, "."null);
296     else if (modification.equals("The beginning of a line")) {
297       textField.getDocument().insertString(p, "^"null);
298     else if (modification.equals("The end of a line")) {
299       textField.getDocument().insertString(p, "$"null);
300     else if (modification.equals("Any character except Category")) {
301       textField.getDocument().insertString(p, "\\P{Category}"null);
302     else if (modification.equals("Category1 and/or Category2")) {
303       textField.getDocument().insertString(p, "[\\p{Category1}\\p{Category2}]"null);
304     else if (modification.equals("Category1 and Category2")) {
305       textField.getDocument().insertString(p, "[\\p{Category1}&&\\p{Category2}]"null);
306     else if (modification.equals("All letters")) {
307       textField.getDocument().insertString(p, "\\p{L}"null);
308     else if (modification.equals("Letter uppercase")) {
309       textField.getDocument().insertString(p, "\\p{Lu}"null);
310     else if (modification.equals("Letter lowercase")) {
311       textField.getDocument().insertString(p, "\\p{Ll}"null);
312     else if (modification.equals("Letter titlecase")) {
313       textField.getDocument().insertString(p, "\\p{Lt}"null);
314     else if (modification.equals("Letter modifier")) {
315       textField.getDocument().insertString(p, "\\p{Lm}"null);
316     else if (modification.equals("Letter other")) {
317       textField.getDocument().insertString(p, "\\p{Lo}"null);
318     else if (modification.equals("All Marks")) {
319       textField.getDocument().insertString(p, "\\p{M}"null);
320     else if (modification.equals("Mark nonspacing")) {
321       textField.getDocument().insertString(p, "\\p{Mn}"null);
322     else if (modification.equals("Mark spacing combining")) {
323       textField.getDocument().insertString(p, "\\p{Mc}"null);
324     else if (modification.equals("Mark enclosing")) {
325       textField.getDocument().insertString(p, "\\p{Me}"null);
326     else if (modification.equals("All Numbers")) {
327       textField.getDocument().insertString(p, "\\p{N}"null);
328     else if (modification.equals("Number decimal digit")) {
329       textField.getDocument().insertString(p, "\\p{Nd}"null);
330     else if (modification.equals("Number letter")) {
331       textField.getDocument().insertString(p, "\\p{Nl}"null);
332     else if (modification.equals("Number other")) {
333       textField.getDocument().insertString(p, "\\p{No}"null);
334     else if (modification.equals("All separators")) {
335       textField.getDocument().insertString(p, "\\p{Z}"null);
336     else if (modification.equals("Separator space")) {
337       textField.getDocument().insertString(p, "\\p{Zs}"null);
338     else if (modification.equals("Separator line")) {
339       textField.getDocument().insertString(p, "\\p{Zl}"null);
340     else if (modification.equals("Separator paragraph")) {
341       textField.getDocument().insertString(p, "\\p{Zp}"null);
342     else if (modification.equals("All others")) {
343       textField.getDocument().insertString(p, "\\p{C}"null);
344     else if (modification.equals("Other control")) {
345       textField.getDocument().insertString(p, "\\p{Cc}"null);
346     else if (modification.equals("Other format")) {
347       textField.getDocument().insertString(p, "\\p{Cf}"null);
348     else if (modification.equals("Other surrogate")) {
349       textField.getDocument().insertString(p, "\\p{Cs}"null);
350     else if (modification.equals("Other private use")) {
351       textField.getDocument().insertString(p, "\\p{Co}"null);
352     else if (modification.equals("Other not assigned")) {
353       textField.getDocument().insertString(p, "\\p{Cn}"null);
354     else if (modification.equals("All punctuations")) {
355       textField.getDocument().insertString(p, "\\p{P}"null);
356     else if (modification.equals("Punctuation connector")) {
357       textField.getDocument().insertString(p, "\\p{Pc}"null);
358     else if (modification.equals("Punctuation dash")) {
359       textField.getDocument().insertString(p, "\\p{Pd}"null);
360     else if (modification.equals("Punctuation open")) {
361       textField.getDocument().insertString(p, "\\p{Ps}"null);
362     else if (modification.equals("Punctuation close")) {
363       textField.getDocument().insertString(p, "\\p{Pe}"null);
364     else if (modification.equals("Punctuation initial quote")) {
365       textField.getDocument().insertString(p, "\\p{Pi}"null);
366     else if (modification.equals("Punctuation final quote")) {
367       textField.getDocument().insertString(p, "\\p{Pf}"null);
368     else if (modification.equals("Punctuation other")) {
369       textField.getDocument().insertString(p, "\\p{Po}"null);
370     else if (modification.equals("All symbols")) {
371       textField.getDocument().insertString(p, "\\p{S}"null);
372     else if (modification.equals("Symbol math")) {
373       textField.getDocument().insertString(p, "\\p{Sm}"null);
374     else if (modification.equals("Symbol currency")) {
375       textField.getDocument().insertString(p, "\\p{Sc}"null);
376     else if (modification.equals("Symbol modifier")) {
377       textField.getDocument().insertString(p, "\\p{Sk}"null);
378     else if (modification.equals("Symbol other")) {
379       textField.getDocument().insertString(p, "\\p{So}"null);
380     }
381     catch (BadLocationException e) {
382       // should never happend
383       throw new LuckyException(e);
384     }
385     textField.requestFocus();
386   }
387 
388 }