ValuesSelectionAction.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  *  Niraj Aswani, 2007
011  *
012  *  $Id$
013  *
014  */
015 
016 package gate.gui.ontology;
017 
018 import gate.gui.MainFrame;
019 
020 import java.awt.FlowLayout;
021 import java.awt.event.ActionEvent;
022 import java.awt.event.ActionListener;
023 import java.awt.event.KeyAdapter;
024 import java.awt.event.KeyEvent;
025 import java.util.ArrayList;
026 import java.util.Arrays;
027 import java.util.Collections;
028 import java.util.List;
029 
030 import javax.swing.BoxLayout;
031 import javax.swing.DefaultComboBoxModel;
032 import javax.swing.Icon;
033 import javax.swing.JButton;
034 import javax.swing.JComboBox;
035 import javax.swing.JList;
036 import javax.swing.JOptionPane;
037 import javax.swing.JPanel;
038 import javax.swing.JScrollPane;
039 import javax.swing.text.JTextComponent;
040 
041 public class ValuesSelectionAction {
042   public ValuesSelectionAction() {
043     list = null;
044     domainBox = new JComboBox<String>();
045     domainBox.setEditable(true);
046     list = new JList<String>(new DefaultComboBoxModel<String>());
047     list.setVisibleRowCount(7);
048     add = new JButton("Add");
049     remove = new JButton("Remove");
050     panel = new JPanel();
051     BoxLayout boxlayout = new BoxLayout(panel, BoxLayout.Y_AXIS);
052     panel.setLayout(boxlayout);
053     panel.add(domainBox);
054     domainBox.setEditable(true);
055     domainBox.getEditor().getEditorComponent().addKeyListener(new KeyAdapter() {
056       @Override
057       public void keyReleased(KeyEvent keyevent) {
058         String s = ((JTextComponent)domainBox.getEditor().getEditorComponent())
059                 .getText();
060         if(s != null) {
061           if(keyevent.getKeyCode() != KeyEvent.VK_ENTER) {
062             List<String> arraylist = new ArrayList<String>();
063             for(int i = 0; i < ontologyClasses.length; i++) {
064               String s1 = ontologyClasses[i];
065               if(s1.toLowerCase().startsWith(s.toLowerCase())) {
066                 arraylist.add(s1);
067               }
068             }
069             Collections.sort(arraylist);
070             DefaultComboBoxModel<String> model =
071               new DefaultComboBoxModel<String>(arraylist.toArray(new String[arraylist.size()]));
072             domainBox.setModel(model);
073             if(!arraylist.isEmpty()) domainBox.showPopup();
074           }
075           ((JTextComponent)domainBox.getEditor().getEditorComponent())
076                   .setText(s);
077         }
078       }
079     });
080     JPanel jpanel = new JPanel(new FlowLayout(FlowLayout.CENTER));
081     jpanel.add(add);
082     jpanel.add(remove);
083     panel.add(jpanel);
084     panel.add(new JScrollPane(list));
085     add.addActionListener(new ActionListener() {
086       @Override
087       public void actionPerformed(ActionEvent actionevent) {
088         String s = (String)domainBox.getSelectedItem();
089         if(!allowValueOutsideDropDownList) {
090           if(!Arrays.asList(ontologyClasses).contains(s)) {
091             JOptionPane.showMessageDialog(MainFrame.getInstance(),
092                     "The value \"" + s + "\" is not in the drop down list!");
093             return;
094           }
095         }
096         if(((DefaultComboBoxModel<String>)list.getModel()).getIndexOf(s!= -1) {
097           JOptionPane.showMessageDialog(MainFrame.getInstance(),
098             "Already added!");
099         }
100         else {
101           ((DefaultComboBoxModel<String>)list.getModel()).addElement(s);
102         }
103       }
104     });
105     remove.addActionListener(new ActionListener() {
106       @Override
107       public void actionPerformed(ActionEvent actionevent) {
108         List<String> aobj = list.getSelectedValuesList();
109         if(aobj != null && aobj.size() 0) {
110           for(int i = 0; i < aobj.size(); i++)
111             ((DefaultComboBoxModel<String>)list.getModel()).removeElement(aobj.get(i));
112         }
113       }
114     });
115   }
116 
117   /**
118    * Dialogue that list possible choices to choose from.
119    @param windowTitle title of the window
120    @param inDropDownList list of choices
121    @param alreadySelected initial selection
122    @param allowValueOutsideDropDownList true if allowed
123    @param icon message dialogue icon
124    @return {@link JOptionPane#CLOSED_OPTION},
125    *  {@link JOptionPane#UNINITIALIZED_VALUE}{@link JOptionPane#OK_OPTION},
126    *  {@link JOptionPane#CANCEL_OPTION}.
127    */
128   public int showGUI(String windowTitle, String[] inDropDownList,
129           String[] alreadySelected, boolean allowValueOutsideDropDownList,
130           Icon icon) {
131     this.ontologyClasses = inDropDownList;
132     this.allowValueOutsideDropDownList = allowValueOutsideDropDownList;
133     domainBox.setModel(new DefaultComboBoxModel<String>(inDropDownList));
134     list.setModel(new DefaultComboBoxModel<String>(alreadySelected));
135     @SuppressWarnings("serial")
136     JOptionPane pane = new JOptionPane(panel, JOptionPane.QUESTION_MESSAGE,
137      JOptionPane.OK_CANCEL_OPTION, icon) {
138       @Override
139       public void selectInitialValue() {
140         domainBox.requestFocusInWindow();
141         domainBox.getEditor().selectAll();
142       }
143     };
144     pane.createDialog(MainFrame.getInstance(), windowTitle).setVisible(true);
145     return pane.getValue() == null ?
146       JOptionPane.CLOSED_OPTION : (Integerpane.getValue();
147   }
148 
149   public String[] getSelectedValues() {
150     DefaultComboBoxModel<String> model = (DefaultComboBoxModel<String>list.getModel();
151     String as[] new String[model.getSize()];
152     for(int i = 0; i < as.length; i++)
153       as[i= model.getElementAt(i);
154     return as;
155   }
156 
157   protected JComboBox<String> domainBox;
158   protected JList<String> list;
159   protected JButton add;
160   protected JButton remove;
161   protected JPanel panel;
162   protected String[] ontologyClasses;
163   protected boolean allowValueOutsideDropDownList = true;
164 }