CollectionSelectionDialog.java
001 /*  CollectionSelectionDialog.java
002  *
003  *  Copyright (c) 1995-2012, The University of Sheffield. See the file
004  *  COPYRIGHT.txt in the software or at http://gate.ac.uk/gate/COPYRIGHT.txt
005  *
006  *  This file is part of GATE (see http://gate.ac.uk/), and is free
007  *  software, licenced under the GNU Library General Public License,
008  *  Version 2, June 1991 (in the distribution as file licence.html,
009  *  and also available at http://gate.ac.uk/gate/licence.html).
010  *
011  *  Cristian URSU,  05/Oct/2001
012  *
013  *  $Id: CollectionSelectionDialog.java 17879 2014-04-18 16:59:35Z markagreenwood $
014  *
015  */
016 
017 package gate.gui;
018 
019 import java.awt.Component;
020 import java.awt.Dimension;
021 import java.awt.Frame;
022 import java.awt.event.ActionEvent;
023 import java.awt.event.ActionListener;
024 import java.util.ArrayList;
025 import java.util.Collection;
026 import java.util.Collections;
027 import java.util.Iterator;
028 import java.util.List;
029 
030 import javax.swing.Box;
031 import javax.swing.BoxLayout;
032 import javax.swing.DefaultListModel;
033 import javax.swing.JButton;
034 import javax.swing.JDialog;
035 import javax.swing.JFileChooser;
036 import javax.swing.JLabel;
037 import javax.swing.JList;
038 import javax.swing.JOptionPane;
039 import javax.swing.JScrollPane;
040 import javax.swing.ListSelectionModel;
041 
042 
043 /** This class visually selects some items from a collection and returns
044   * a collection with the items selected by the user.
045   */
046 @SuppressWarnings({"serial","unchecked","rawtypes","deprecation"})
047 public class CollectionSelectionDialog extends JDialog {
048 
049   // Local data
050   ////////////////////////////
051   /** This is the model for the list that the user will choose from*/
052   DefaultListModel sourceListModel = null;
053   /** This is the model for the list that the user chosed*/
054   DefaultListModel targetListModel = null;
055   /** A value indicating which button has been pressed (Ok or Cancel)*/
056   int buttonPressed = JFileChooser.CANCEL_OPTION;
057   // Gui Components
058   /////////////////////////
059   /** The button that removes items from the target list*/
060   JButton removeButton = null;
061   /** The button that adds items to the target list*/
062   JButton addButton = null;
063   /** The source list which contains the items that the user will select from*/
064   JList   sourceList = null;
065   /** The source list which contains the items that the user choosed*/
066   JList   targetList = null;
067   /** The Ok button*/
068   JButton okButton = null;
069   /** The Cancel button*/
070   JButton cancelButton = null;
071   /** A label for the source list*/
072   JLabel sourceLabel = null;
073   /** A label for the target list*/
074   JLabel targetLabel = null;
075   /** The parent frame for this dialog*/
076   Frame mainFrame = null;
077 
078   /** Constructs an ColectionSelectionDialog
079     @param aFrame the parent frame of this dialog
080     @param aModal (wheter or not this dialog is modal)
081     */
082   public CollectionSelectionDialog(Frame aFrame, boolean aModal){
083     super(aFrame,aModal);
084     this.setLocationRelativeTo(aFrame);
085     mainFrame = aFrame;
086   }//CollectionSelectionDialog
087 
088   /** Constructs an ColectionSelectionDialog using <b>null<b> as a frame
089     *   and <b>true
090     *  </b> as modal value for dialog
091     */
092   public CollectionSelectionDialog(){
093     this(null, true);
094   }// CollectionSelectionDialog
095 
096   /** Init local data from a source collection
097     @param aSourceData is the collection from what the user will choose
098     */
099   protected void initLocalData(Collection aSourceData){
100     targetListModel = new DefaultListModel();
101     sourceListModel = new DefaultListModel();
102     if (aSourceData == nullreturn;
103     List source = new ArrayList(aSourceData);
104     Collections.sort(source);
105     Iterator iter = source.iterator();
106     while(iter.hasNext()){
107       sourceListModel.addElement(iter.next());
108     }// End while
109   }// initLocalData();
110 
111   /** This method creates the GUI components and paces them into the layout*/
112   protected void initGuiComponents(){
113     this.getContentPane().setLayout(new BoxLayout(this.getContentPane(),
114                                                   BoxLayout.Y_AXIS));
115     // Create source label
116     sourceLabel = new JLabel("Source");
117     sourceLabel.setAlignmentX(Component.LEFT_ALIGNMENT);
118     // Create source list
119     sourceList = new JList(sourceListModel);
120     sourceList.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
121     sourceList.setVisibleRowCount(10);
122     sourceList.setAlignmentX(Component.LEFT_ALIGNMENT);
123 
124     // Create target label
125     targetLabel = new JLabel("Target");
126     targetLabel.setAlignmentX(Component.LEFT_ALIGNMENT);
127     // Create the target list
128     targetList = new JList(targetListModel);
129     targetList.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
130     targetList.setVisibleRowCount(10);
131     targetList.setAlignmentX(Component.LEFT_ALIGNMENT);
132     targetList.setPreferredSize(sourceList.getPreferredSize());
133     // Create Add >>  button
134     addButton = new JButton(">>>");
135     // Create Remove <<  button
136     removeButton = new JButton("<<<");
137     // Create ok button
138     okButton = new JButton("Ok");
139     // Create cancel button
140     cancelButton = new JButton("Cancel");
141     ///////////////////////////////////////
142     // Arange components
143     //////////////////////////////////////
144 
145     // Create the main box
146     Box componentsBox = Box.createVerticalBox();
147     componentsBox.add(Box.createRigidArea(new Dimension(0,5)));
148 
149     Box firstLevelBox = Box.createHorizontalBox();
150     firstLevelBox.add(Box.createRigidArea(new Dimension(10,0)));
151     // Add the Source list
152     Box currentBox = Box.createVerticalBox();
153     currentBox.add(sourceLabel);
154     currentBox.add(new JScrollPane(sourceList));
155 
156     // Add the current box to the firstLevelBox
157     firstLevelBox.add(currentBox);
158     firstLevelBox.add(Box.createRigidArea(new Dimension(10,0)));
159 
160     // Add the add and remove buttons
161     currentBox = Box.createVerticalBox();
162     currentBox.add(addButton);
163     currentBox.add(Box.createRigidArea(new Dimension(0,10)));
164     currentBox.add(removeButton);
165 
166     // Add the remove buttons to the firstLevelBox
167     firstLevelBox.add(currentBox);
168     firstLevelBox.add(Box.createRigidArea(new Dimension(10,0)));
169 
170     // Add the target list
171     currentBox = Box.createVerticalBox();
172     currentBox.add(targetLabel);
173     currentBox.add(new JScrollPane(targetList));
174 
175     // Add target list to the firstLevelBox
176     firstLevelBox.add(currentBox);
177     firstLevelBox.add(Box.createRigidArea(new Dimension(20,0)));
178 
179     // Add ok and cancel buttons to the currentBox
180     currentBox = Box.createHorizontalBox();
181     currentBox.add(Box.createHorizontalGlue());
182     currentBox.add(okButton);
183     currentBox.add(Box.createRigidArea(new Dimension(25,0)));
184     currentBox.add(cancelButton);
185     currentBox.add(Box.createHorizontalGlue());
186 
187     // Add all components to the components box
188     componentsBox.add(firstLevelBox);
189     componentsBox.add(Box.createRigidArea(new Dimension(0,10)));
190     componentsBox.add(currentBox);
191     componentsBox.add(Box.createRigidArea(new Dimension(0,5)));
192     // Add the components box to the dialog
193     this.getContentPane().add(componentsBox);
194     this.pack();
195 }//initGuiComponents();
196 
197   /** Init all the listeners*/
198   protected void initListeners(){
199     okButton.addActionListener(new ActionListener() {
200       @Override
201       public void actionPerformed(ActionEvent e) {
202         doOk();
203       }// actionPerformed();
204     });// addActionListener();
205     cancelButton.addActionListener(new ActionListener() {
206       @Override
207       public void actionPerformed(ActionEvent e) {
208         doCancel();
209       }// actionPerformed();
210     });// addActionListener();
211     addButton.addActionListener(new ActionListener() {
212       @Override
213       public void actionPerformed(ActionEvent e) {
214         doAdd();
215       }// actionPerformed();
216     });// addActionListener();
217     removeButton.addActionListener(new ActionListener() {
218       @Override
219       public void actionPerformed(ActionEvent e) {
220         doRemove();
221       }// actionPerformed();
222     });// addActionListener();
223   }//initListeners()
224 
225   /** This method is called when the user press the OK button*/
226   private void doOk(){
227     buttonPressed = JFileChooser.APPROVE_OPTION;
228     this.setVisible(false);
229   }//doOk();
230 
231   /** This method is called when the user press the CANCEL button*/
232   private void doCancel(){
233     buttonPressed = JFileChooser.CANCEL_OPTION;
234     this.setVisible(false);
235   }//doCancel();
236   /** Called when user press remove button*/
237   private void doRemove(){
238     Object[] selectedItems = targetList.getSelectedValues();
239     for (int i = ; i < selectedItems.length; i ++){
240       sourceListModel.addElement(selectedItems[i]);
241       targetListModel.removeElement(selectedItems[i]);
242     }// end for
243   }// doRemove();
244   /** Called when user press add button*/
245   private void doAdd(){
246     Object[] selectedItems = sourceList.getSelectedValues();
247     for (int i = ; i < selectedItems.length; i ++){
248       targetListModel.addElement(selectedItems[i]);
249       sourceListModel.removeElement(selectedItems[i]);
250     }// end for
251   }// doAdd();
252   /** Returns the target collection*/
253   public Collection getSelectedCollection(){
254     List resultsList = new ArrayList();
255     for (int i=0; i<targetListModel.getSize(); i++){
256       resultsList.add(targetListModel.getElementAt(i));
257     }// End for
258     return resultsList;
259   }// getSelectedCollection()
260 
261   /** This method displays the CollectionSelectionDialog*/
262   public int show(String aTitle,Collection aSourceData){
263     if (aTitle == null){
264       JOptionPane.showMessageDialog(mainFrame,
265       "Feature selection dialog coud not been created because title was null!",
266       "GATE", JOptionPane.ERROR_MESSAGE);
267       return buttonPressed;
268     }// End if
269     if (aSourceData == null){
270      JOptionPane.showMessageDialog(mainFrame,
271      "Feature selection dialog coud not been created because data source null!",
272      "GATE", JOptionPane.ERROR_MESSAGE);
273      return buttonPressed;
274     }// End if
275     this.setTitle(aTitle);
276     initLocalData(aSourceData);
277     initGuiComponents();
278     initListeners();
279     super.setVisible(true);
280     return buttonPressed;
281   }// show()
282 }//CollectionSelectionDialog class