| ListEditorDialog |

    1   /*
    2    *  Copyright (c) 1998-2001, The University of Sheffield.
    3    *
    4    *  This file is part of GATE (see http://gate.ac.uk/), and is free
    5    *  software, licenced under the GNU Library General Public License,
    6    *  Version 2, June 1991 (in the distribution as file licence.html,
    7    *  and also available at http://gate.ac.uk/gate/licence.html).
    8    *
    9    *  Valentin Tablan 16/10/2001
    10   *
    11   *  $Id: ListEditorDialog.java,v 1.4 2001/11/12 18:06:08 valyt Exp $
    12   *
    13   */
    14
    15  package gate.gui;
    16
    17  import java.awt.Component;
    18  import java.awt.event.*;
    19  import javax.swing.*;
    20
    21  import java.util.*;
    22
    23
    24  import gate.*;
    25  import gate.util.*;
    26  import gate.creole.*;
    27
    28  /**
    29   * A simple editor for List values.
    30   */
    31  public class ListEditorDialog extends JDialog {
    32
    33    /**
    34     * Contructs a new ListEditorDialog.
    35     * @param owner the component this dialog will be centred on.
    36     * @param data a list with the initial values. This list will not be changed,
    37     * its values will be cached and if the user selects the OK option a new list
    38     * with the updated contents will be returned.
    39     * @param itemType the type of the elements in the list in the form of a
    40     * fully qualified class name
    41     */
    42    public ListEditorDialog(Component owner, List data, String itemType) {
    43      this.itemType = itemType == null ? "java.lang.String" : itemType;
    44      setLocationRelativeTo(owner);
    45      initLocalData(data);
    46      initGuiComponents();
    47      initListeners();
    48    }
    49
    50    protected void initLocalData(List data){
    51      listModel = new DefaultListModel();
    52      if(data != null){
    53        Iterator elemIter = data.iterator();
    54        while(elemIter.hasNext()){
    55          listModel.addElement(elemIter.next());
    56        }
    57      }
    58
    59      try{
    60        ResourceData rData = (ResourceData)Gate.getCreoleRegister().get(itemType);
    61        itemTypeClass = rData == null ? Class.forName(itemType) :
    62                        rData.getResourceClass();
    63      }catch(ClassNotFoundException cnfe){
    64        throw new GateRuntimeException(cnfe.toString());
    65      }
    66
    67      finiteType = Gate.isGateType(itemType);
    68
    69      ResourceData rData = (ResourceData)Gate.getCreoleRegister().get(itemType);
    70      setTitle("List of " + ((rData== null) ? itemType :rData.getName()));
    71
    72      addAction = new AddAction();
    73      removeAction = new RemoveAction();
    74    }
    75
    76    protected void initGuiComponents(){
    77      getContentPane().setLayout(new BoxLayout(getContentPane(),
    78                                               BoxLayout.Y_AXIS));
    79
    80      //the editor component
    81      JComponent editComp = null;
    82      if(finiteType){
    83        editComp = combo = new JComboBox(new ResourceComboModel());
    84        combo.setRenderer(new ResourceRenderer());
    85        if(combo.getModel().getSize() > 0){
    86          combo.getModel().setSelectedItem(combo.getModel().getElementAt(0));
    87        }
    88      }else{
    89        editComp = textField = new JTextField(20);
    90      }
    91
    92      getContentPane().add(editComp);
    93      getContentPane().add(Box.createVerticalStrut(5));
    94
    95      //the buttons box
    96      Box buttonsBox = Box.createHorizontalBox();
    97      addBtn = new JButton(addAction);
    98      removeBtn = new JButton(removeAction);
    99      buttonsBox.add(Box.createHorizontalGlue());
    100     buttonsBox.add(addBtn);
    101     buttonsBox.add(Box.createHorizontalStrut(5));
    102     buttonsBox.add(removeBtn);
    103     buttonsBox.add(Box.createHorizontalGlue());
    104     getContentPane().add(buttonsBox);
    105     getContentPane().add(Box.createVerticalStrut(5));
    106
    107     //the list component
    108     Box horBox = Box.createHorizontalBox();
    109     listComponent = new JList(listModel);
    110     listComponent.setSelectionMode(ListSelectionModel.
    111                                    MULTIPLE_INTERVAL_SELECTION);
    112     listComponent.setCellRenderer(new ResourceRenderer());
    113     horBox.add(new JScrollPane(listComponent));
    114     //up down buttons
    115     Box verBox = Box.createVerticalBox();
    116     verBox.add(Box.createVerticalGlue());
    117     moveUpBtn = new JButton(MainFrame.getIcon("moveup.gif"));
    118     verBox.add(moveUpBtn);
    119     verBox.add(Box.createVerticalStrut(5));
    120     moveDownBtn = new JButton(MainFrame.getIcon("movedown.gif"));
    121     verBox.add(moveDownBtn);
    122     verBox.add(Box.createVerticalGlue());
    123     horBox.add(Box.createHorizontalStrut(3));
    124     horBox.add(verBox);
    125     horBox.add(Box.createHorizontalStrut(3));
    126     getContentPane().add(horBox);
    127     getContentPane().add(Box.createVerticalStrut(5));
    128
    129     //the bottom buttons
    130     buttonsBox = Box.createHorizontalBox();
    131     buttonsBox.add(Box.createHorizontalGlue());
    132     okButton = new JButton("OK");
    133     buttonsBox.add(okButton);
    134     buttonsBox.add(Box.createHorizontalStrut(5));
    135     cancelButton = new JButton("Cancel");
    136     buttonsBox.add(cancelButton);
    137     buttonsBox.add(Box.createHorizontalGlue());
    138     getContentPane().add(buttonsBox);
    139   }
    140
    141   protected void initListeners(){
    142     okButton.addActionListener(new ActionListener() {
    143       public void actionPerformed(ActionEvent e) {
    144         userCancelled = false;
    145         hide();
    146       }
    147     });
    148
    149     cancelButton.addActionListener(new ActionListener() {
    150       public void actionPerformed(ActionEvent e) {
    151         userCancelled = true;
    152         hide();
    153       }
    154     });
    155
    156
    157     moveUpBtn.addActionListener(new ActionListener() {
    158       public void actionPerformed(ActionEvent e) {
    159         int rows[] = listComponent.getSelectedIndices();
    160         if(rows == null || rows.length == 0){
    161           JOptionPane.showMessageDialog(
    162               ListEditorDialog.this,
    163               "Please select some items to be moved ",
    164               "Gate", JOptionPane.ERROR_MESSAGE);
    165         }else{
    166           //we need to make sure the rows are sorted
    167           Arrays.sort(rows);
    168           //get the list of items
    169           for(int i = 0; i < rows.length; i++){
    170             int row = rows[i];
    171             if(row > 0){
    172               //move it up
    173               Object value = listModel.remove(row);
    174               listModel.add(row - 1, value);
    175             }
    176           }
    177           //restore selection
    178           for(int i = 0; i < rows.length; i++){
    179             int newRow = -1;
    180             if(rows[i] > 0) newRow = rows[i] - 1;
    181             else newRow = rows[i];
    182             listComponent.addSelectionInterval(newRow, newRow);
    183           }
    184         }
    185
    186       }//public void actionPerformed(ActionEvent e)
    187     });
    188
    189
    190     moveDownBtn.addActionListener(new ActionListener() {
    191       public void actionPerformed(ActionEvent e) {
    192         int rows[] = listComponent.getSelectedIndices();
    193         if(rows == null || rows.length == 0){
    194           JOptionPane.showMessageDialog(
    195               ListEditorDialog.this,
    196               "Please select some items to be moved ",
    197               "Gate", JOptionPane.ERROR_MESSAGE);
    198         } else {
    199           //we need to make sure the rows are sorted
    200           Arrays.sort(rows);
    201           //get the list of items
    202           for(int i = rows.length - 1; i >= 0; i--){
    203             int row = rows[i];
    204             if(row < listModel.size() -1){
    205               //move it down
    206               Object value = listModel.remove(row);
    207               listModel.add(row + 1, value);
    208             }
    209           }
    210           //restore selection
    211           for(int i = 0; i < rows.length; i++){
    212             int newRow = -1;
    213             if(rows[i] < listModel.size() - 1) newRow = rows[i] + 1;
    214             else newRow = rows[i];
    215             listComponent.addSelectionInterval(newRow, newRow);
    216           }
    217         }
    218
    219       }//public void actionPerformed(ActionEvent e)
    220     });
    221
    222   }
    223
    224   /**
    225    * Make this dialog visible allowing the editing of the list.
    226    * If the user selects the <b>OK</b> option a new list with the updated
    227    * contents will be returned; it the <b>Cancel</b> option is selected this
    228    * method return <tt>null</tt>.
    229    */
    230   public List showDialog(){
    231     pack();
    232     userCancelled = true;
    233     setModal(true);
    234     super.show();
    235     return userCancelled ? null : Arrays.asList(listModel.toArray());
    236   }
    237
    238   /**
    239    * test code
    240    */
    241   public static void main(String[] args){
    242     try{
    243       Gate.init();
    244     }catch(Exception e){
    245       e.printStackTrace();
    246     }
    247     JFrame frame = new JFrame("Foo frame");
    248
    249     ListEditorDialog dialog = new ListEditorDialog(frame,
    250                                                    new ArrayList(),
    251                                                    "java.lang.Integer");
    252
    253     frame.setSize(300, 300);
    254     frame.setVisible(true);
    255     System.out.println(dialog.showDialog());
    256   }
    257
    258   /**
    259    * Adds an element to the list from the editing component located at the top
    260    * of this dialog.
    261    */
    262   protected class AddAction extends AbstractAction{
    263     AddAction(){
    264       super("Add");
    265       putValue(SHORT_DESCRIPTION, "Add the edited value to the list");
    266     }
    267     public void actionPerformed(ActionEvent e){
    268       if(finiteType){
    269         listModel.addElement(combo.getSelectedItem());
    270       }else{
    271         Object value = null;
    272         //convert the value to the proper type
    273         String stringValue = textField.getText();
    274         if(stringValue == null || stringValue.length() == 0) stringValue = null;
    275
    276         if(itemTypeClass.isAssignableFrom(String.class)){
    277           //no conversion necessary
    278           value = stringValue;
    279         }else{
    280           //try conversion
    281           try{
    282             value = itemTypeClass.getConstructor(new Class[]{String.class}).
    283                                   newInstance( new Object[]{stringValue} );
    284           }catch(Exception ex){
    285             JOptionPane.showMessageDialog(
    286                 ListEditorDialog.this,
    287                 "Invalid value!\nIs it the right type?",
    288                 "Gate", JOptionPane.ERROR_MESSAGE);
    289             return;
    290           }
    291         }
    292         listModel.addElement(value);
    293         textField.setText("");
    294       }
    295     }
    296   }
    297
    298   /**
    299    * Removes the selected element(s) from the list
    300    */
    301   protected class RemoveAction extends AbstractAction{
    302     RemoveAction(){
    303       super("Remove");
    304       putValue(SHORT_DESCRIPTION, "Remove the selected value(s) from the list");
    305     }
    306
    307     public void actionPerformed(ActionEvent e){
    308       int[] indices = listComponent.getSelectedIndices();
    309       Arrays.sort(indices);
    310       for(int i = indices.length -1; i >= 0; i--){
    311         listModel.remove(indices[i]);
    312       }
    313     }
    314   }
    315
    316
    317   /**
    318    * A model for a combobox containing the loaded corpora in the system
    319    */
    320   protected class ResourceComboModel extends AbstractListModel
    321                                   implements ComboBoxModel{
    322
    323     public int getSize(){
    324       //get all corpora regardless of their actual type
    325       java.util.List loadedResources = null;
    326       try{
    327         loadedResources = Gate.getCreoleRegister().
    328                                getAllInstances(itemType);
    329       }catch(GateException ge){
    330         ge.printStackTrace(Err.getPrintWriter());
    331       }
    332
    333       return loadedResources == null ? 0 : loadedResources.size();
    334     }
    335
    336     public Object getElementAt(int index){
    337       //get all corpora regardless of their actual type
    338       java.util.List loadedResources = null;
    339       try{
    340         loadedResources = Gate.getCreoleRegister().
    341                                getAllInstances(itemType);
    342       }catch(GateException ge){
    343         ge.printStackTrace(Err.getPrintWriter());
    344       }
    345       return loadedResources == null? null : loadedResources.get(index);
    346     }
    347
    348     public void setSelectedItem(Object anItem){
    349       if(anItem == null) selectedItem = null;
    350       else selectedItem = anItem;
    351     }
    352
    353     public Object getSelectedItem(){
    354       return selectedItem;
    355     }
    356
    357     void fireDataChanged(){
    358       fireContentsChanged(this, 0, getSize());
    359     }
    360
    361     Object selectedItem = null;
    362   }
    363
    364   /**
    365    * The type of the elements in the list
    366    */
    367   String itemType;
    368
    369   /**
    370    * The Class for the elements in the list
    371    */
    372   Class itemTypeClass;
    373
    374   /**
    375    * The GUI compoenent used to display the list
    376    */
    377   JList listComponent;
    378
    379   /**
    380    * Comobox used to select among values for GATE types
    381    */
    382   JComboBox combo;
    383
    384   /**
    385    * Text field used to input new arbitrary values
    386    */
    387   JTextField textField;
    388
    389   /**
    390    * Used to remove the selected element in the list;
    391    */
    392   JButton removeBtn;
    393
    394   /**
    395    * Used to add a new value to the list
    396    */
    397   JButton addBtn;
    398
    399   /**
    400    * Moves up one or more items in the list
    401    */
    402   JButton moveUpBtn;
    403
    404   /**
    405    * Moves down one or more items in the list
    406    */
    407   JButton moveDownBtn;
    408
    409   /**
    410    * The model used by the {@link listComponent}
    411    */
    412   DefaultListModel listModel;
    413
    414   /**
    415    * Does the item type have a finite range (i.e. should we use the combo)?
    416    */
    417   boolean finiteType;
    418
    419   /**
    420    * An action that adds the item being edited to the list
    421    */
    422   Action addAction;
    423
    424   /**
    425    * An action that removes the item(s) currently selected from the list
    426    */
    427   Action removeAction;
    428
    429   /**
    430    * The OK button for this dialog
    431    */
    432   JButton okButton;
    433
    434   /**
    435    * The cancel button for this dialog
    436    */
    437   JButton cancelButton;
    438
    439   /**
    440    * Did the user press the cancel button?
    441    */
    442   boolean userCancelled;
    443 }

| ListEditorDialog |