1   /*  CollectionSelectionDialog.java
2    *
3    *  Copyright (c) 1998-2001, The University of Sheffield.
4    *
5    *  This file is part of GATE (see http://gate.ac.uk/), and is free
6    *  software, licenced under the GNU Library General Public License,
7    *  Version 2, June 1991 (in the distribution as file licence.html,
8    *  and also available at http://gate.ac.uk/gate/licence.html).
9    *
10   *  Cristian URSU,  05/Oct/2001
11   *
12   *  $Id: CollectionSelectionDialog.java,v 1.2 2001/10/11 10:44:02 cursu Exp $
13   *
14   */
15  
16  package gate.gui;
17  
18  import java.awt.Frame;
19  import java.awt.Dimension;
20  import java.awt.Component;
21  import java.awt.event.*;
22  import javax.swing.*;
23  
24  import java.util.*;
25  
26  import gate.*;
27  import gate.annotation.*;
28  import gate.util.*;
29  
30  
31  /** This class visually selects some items from a collection and returns
32    * a collection with the items selected by the user.
33    */
34  public class CollectionSelectionDialog extends JDialog {
35  
36    // Local data
37    ////////////////////////////
38    /** This is the model for the list that the user will choose from*/
39    DefaultListModel sourceListModel = null;
40    /** This is the model for the list that the user chosed*/
41    DefaultListModel targetListModel = null;
42    /** A value indicating which button has been pressed (Ok or Cancel)*/
43    int buttonPressed = JFileChooser.CANCEL_OPTION;
44    // Gui Components
45    /////////////////////////
46    /** The button that removes items from the target list*/
47    JButton removeButton = null;
48    /** The button that adds items to the target list*/
49    JButton addButton = null;
50    /** The source list which contains the items that the user will select from*/
51    JList   sourceList = null;
52    /** The source list which contains the items that the user choosed*/
53    JList   targetList = null;
54    /** The Ok button*/
55    JButton okButton = null;
56    /** The Cancel button*/
57    JButton cancelButton = null;
58    /** A label for the source list*/
59    JLabel sourceLabel = null;
60    /** A label for the target list*/
61    JLabel targetLabel = null;
62    /** The parent frame for this dialog*/
63    Frame mainFrame = null;
64  
65    /** Constructs an ColectionSelectionDialog
66      * @param aFram the parent frame of this dialog
67      * @param aModal (wheter or not this dialog is modal)
68      */
69    public CollectionSelectionDialog(Frame aFrame, boolean aModal){
70      super(aFrame,aModal);
71      this.setLocationRelativeTo(aFrame);
72      mainFrame = aFrame;
73    }//CollectionSelectionDialog
74  
75    /** Constructs an ColectionSelectionDialog using <b>null<b> as a frame
76      *   and <b>true
77      *  </b> as modal value for dialog
78      */
79    public CollectionSelectionDialog(){
80      this(null, true);
81    }// CollectionSelectionDialog
82  
83    /** Init local data from a sorce collection
84      * @param aSourceCollection is the collection from what the user will choose
85      */
86    protected void initLocalData(Collection aSourceData){
87      targetListModel = new DefaultListModel();
88      sourceListModel = new DefaultListModel();
89      if (aSourceData == null) return;
90      ArrayList source = new ArrayList(aSourceData);
91      Collections.sort(source);
92      Iterator iter = source.iterator();
93      while(iter.hasNext()){
94        sourceListModel.addElement(iter.next());
95      }// End while
96    }// initLocalData();
97  
98    /** This method creates the GUI components and paces them into the layout*/
99    protected void initGuiComponents(){
100     this.getContentPane().setLayout(new BoxLayout(this.getContentPane(),
101                                                   BoxLayout.Y_AXIS));
102     // Create source label
103     sourceLabel = new JLabel("Source");
104     sourceLabel.setAlignmentX(Component.LEFT_ALIGNMENT);
105     // Create source list
106     sourceList = new JList(sourceListModel);
107     sourceList.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
108     sourceList.setVisibleRowCount(10);
109     sourceList.setAlignmentX(Component.LEFT_ALIGNMENT);
110 
111     // Create target label
112     targetLabel = new JLabel("Target");
113     targetLabel.setAlignmentX(Component.LEFT_ALIGNMENT);
114     // Create the target list
115     targetList = new JList(targetListModel);
116     targetList.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
117     targetList.setVisibleRowCount(10);
118     targetList.setAlignmentX(Component.LEFT_ALIGNMENT);
119     targetList.setPreferredSize(sourceList.getPreferredSize());
120     // Create Add >>  button
121     addButton = new JButton(">>>");
122     // Create Remove <<  button
123     removeButton = new JButton("<<<");
124     // Create ok button
125     okButton = new JButton("Ok");
126     // Create cancel button
127     cancelButton = new JButton("Cancel");
128     ///////////////////////////////////////
129     // Arange components
130     //////////////////////////////////////
131 
132     // Create the main box
133     Box componentsBox = Box.createVerticalBox();
134     componentsBox.add(Box.createRigidArea(new Dimension(0,5)));
135 
136     Box firstLevelBox = Box.createHorizontalBox();
137     firstLevelBox.add(Box.createRigidArea(new Dimension(10,0)));
138     // Add the Source list
139     Box currentBox = Box.createVerticalBox();
140     currentBox.add(sourceLabel);
141     currentBox.add(new JScrollPane(sourceList));
142 
143     // Add the current box to the firstLevelBox
144     firstLevelBox.add(currentBox);
145     firstLevelBox.add(Box.createRigidArea(new Dimension(10,0)));
146 
147     // Add the add and remove buttons
148     currentBox = Box.createVerticalBox();
149     currentBox.add(addButton);
150     currentBox.add(Box.createRigidArea(new Dimension(0,10)));
151     currentBox.add(removeButton);
152 
153     // Add the remove buttons to the firstLevelBox
154     firstLevelBox.add(currentBox);
155     firstLevelBox.add(Box.createRigidArea(new Dimension(10,0)));
156 
157     // Add the target list
158     currentBox = Box.createVerticalBox();
159     currentBox.add(targetLabel);
160     currentBox.add(new JScrollPane(targetList));
161 
162     // Add target list to the firstLevelBox
163     firstLevelBox.add(currentBox);
164     firstLevelBox.add(Box.createRigidArea(new Dimension(20,0)));
165 
166     // Add ok and cancel buttons to the currentBox
167     currentBox = Box.createHorizontalBox();
168     currentBox.add(Box.createHorizontalGlue());
169     currentBox.add(okButton);
170     currentBox.add(Box.createRigidArea(new Dimension(25,0)));
171     currentBox.add(cancelButton);
172     currentBox.add(Box.createHorizontalGlue());
173 
174     // Add all components to the components box
175     componentsBox.add(firstLevelBox);
176     componentsBox.add(Box.createRigidArea(new Dimension(0,10)));
177     componentsBox.add(currentBox);
178     componentsBox.add(Box.createRigidArea(new Dimension(0,5)));
179     // Add the components box to the dialog
180     this.getContentPane().add(componentsBox);
181     this.pack();
182 }//initGuiComponents();
183 
184   /** Init all the listeners*/
185   protected void initListeners(){
186     okButton.addActionListener(new ActionListener() {
187       public void actionPerformed(ActionEvent e) {
188         doOk();
189       }// actionPerformed();
190     });// addActionListener();
191     cancelButton.addActionListener(new ActionListener() {
192       public void actionPerformed(ActionEvent e) {
193         doCancel();
194       }// actionPerformed();
195     });// addActionListener();
196     addButton.addActionListener(new ActionListener() {
197       public void actionPerformed(ActionEvent e) {
198         doAdd();
199       }// actionPerformed();
200     });// addActionListener();
201     removeButton.addActionListener(new ActionListener() {
202       public void actionPerformed(ActionEvent e) {
203         doRemove();
204       }// actionPerformed();
205     });// addActionListener();
206   }//initListeners()
207 
208   /** This method is called when the user press the OK button*/
209   private void doOk(){
210     buttonPressed = JFileChooser.APPROVE_OPTION;
211     this.hide();
212   }//doOk();
213 
214   /** This method is called when the user press the CANCEL button*/
215   private void doCancel(){
216     buttonPressed = JFileChooser.CANCEL_OPTION;
217     this.hide();
218   }//doCancel();
219   /** Called when user press remove button*/
220   private void doRemove(){
221     Object[] selectedItems = targetList.getSelectedValues();
222     for (int i = 0 ; i < selectedItems.length; i ++){
223       sourceListModel.addElement(selectedItems[i]);
224       targetListModel.removeElement(selectedItems[i]);
225     }// end for
226   }// doRemove();
227   /** Called when user press add button*/
228   private void doAdd(){
229     Object[] selectedItems = sourceList.getSelectedValues();
230     for (int i = 0 ; i < selectedItems.length; i ++){
231       targetListModel.addElement(selectedItems[i]);
232       sourceListModel.removeElement(selectedItems[i]);
233     }// end for
234   }// doAdd();
235   /** Returns the target collection*/
236   public Collection getSelectedCollection(){
237     ArrayList resultsList = new ArrayList();
238     for (int i=0; i<targetListModel.getSize(); i++){
239       resultsList.add(targetListModel.getElementAt(i));
240     }// End for
241     return (Collection) resultsList;
242   }// getSelectedCollection()
243 
244   /** This method displays the CollectionSelectionDialog*/
245   public int show(String aTitle,Collection aSourceData){
246     if (aTitle == null){
247       JOptionPane.showMessageDialog(mainFrame,
248       "Feature selection dialog coud not been created because title was null!",
249       "Gate", JOptionPane.ERROR_MESSAGE);
250       return buttonPressed;
251     }// End if
252     if (aSourceData == null){
253      JOptionPane.showMessageDialog(mainFrame,
254      "Feature selection dialog coud not been created because data source null!",
255      "Gate", JOptionPane.ERROR_MESSAGE);
256      return buttonPressed;
257     }// End if
258     this.setTitle(aTitle);
259     initLocalData(aSourceData);
260     initGuiComponents();
261     initListeners();
262     super.show();
263     return buttonPressed;
264   }// show()
265 }//CollectionSelectionDialog class