Changeset 14747


Ignore:
Timestamp:
2007-10-30T15:41:41+13:00 (16 years ago)
Author:
anna
Message:

same changes as in trunk.

Location:
gli/branches/2.75/src/org/greenstone/gatherer/cdm
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • gli/branches/2.75/src/org/greenstone/gatherer/cdm/FormatManager.java

    r14231 r14747  
    2929import java.awt.*;
    3030import java.awt.event.*;
     31import java.lang.reflect.Field;
    3132import java.util.*;
    3233import javax.swing.*;
     
    166167  }
    167168 
     169  public String getDefaultFormatString(String name){
     170    String default_str = "";
     171    try{
     172      String field_name = name.toUpperCase()+"_DEFAULT_FORMAT";   
     173      Field field = this.getClass().getDeclaredField(field_name);
     174      Class fieldType = field.getType();
     175      default_str = (String) field.get(fieldType);
     176    } catch (SecurityException e) {
     177      //System.err.println("Debug: "+e.getMessage());
     178      default_str = VLIST_DEFAULT_FORMAT;
     179    } catch (NoSuchFieldException e) {
     180      //System.err.println("Debug: "+e.getMessage());
     181      default_str = VLIST_DEFAULT_FORMAT;
     182    } catch (IllegalArgumentException e) {
     183      //System.err.println("Debug: "+e.getMessage());
     184      default_str = VLIST_DEFAULT_FORMAT;
     185    } catch (IllegalAccessException e) {
     186      //System.err.println("Debug: "+e.getMessage());       
     187      default_str = VLIST_DEFAULT_FORMAT;
     188    }
     189    return default_str;
     190  }
     191 
    168192  /** Method to retrieve this managers controls.
    169193   * @return the Control for this collection.
     
    225249    return part_model;
    226250  }
    227  
     251   
    228252  private ArrayList buildVariableModel() {
    229253    ArrayList variable_model = new ArrayList();
     
    555579     
    556580      public void update() {
    557        
     581   
    558582        // Determine if replace should be enabled
    559583        if(!format_list.isSelectionEmpty()) {
     
    563587          if (shouldSave){
    564588            String format_str = editor_textarea.getText().trim();
    565             format_str = (format_str.equals(""))? VLIST_DEFAULT_FORMAT : format_str;
     589            format_str = (format_str.equals(""))? getDefaultFormatString(format.getName()) : format_str;
    566590            format.setValue(format_str);
    567591            model.refresh((DOMProxyListEntry)format);
     
    608632          // Step one: reset part
    609633          if (entry.canHavePart()) {
     634            // update AffectedComponents according to current entry             
     635            part_model = entry.getPartModel();
     636            part_combobox.setModel(new DefaultComboBoxModel(part_model.toArray()));
     637            part_combobox.updateUI();           
     638           
    610639            part_combobox.setEnabled(true);
    611             part_combobox.setSelectedIndex(part_combobox.getModel().getSize()-1);
     640            part_combobox.setSelectedIndex(part_combobox.getModel().getSize()-1);                       
    612641           
    613642          } else {
     
    718747            Format format = (Format)format_list.getSelectedValue();
    719748            // Try to match the target, remembering the entries within are Entry's
    720             Entry an_entry = new Entry(format.getFeature());
    721             feature_combobox.setSelectedItem(an_entry);
     749            Entry an_entry = new Entry(format.getFeature());           
     750            feature_combobox.setSelectedItem(an_entry);           
    722751            // If we didn't match anything, add it and select it again
    723752            Entry result_entry = (Entry) feature_combobox.getSelectedItem();
     
    746775              if (format.canHavePart()) {
    747776                part_combobox.setEnabled(true);
     777               
     778                // Should update the part list and re-render the part ComboBox here
     779                part_model = result_entry.getPartModel();
     780                part_combobox.setModel(new DefaultComboBoxModel(part_model.toArray()));
     781                part_combobox.updateUI();     
     782               
    748783                // Try to match the part.
    749784                String part_entry = format.getPart();
     
    10811116    }
    10821117   
     1118    public ArrayList getPartModel(){
     1119      DebugStream.println("getPartModel(): get appopriate affected components of this classifier");
     1120      String classifier_name = classifier == null ? "" : classifier.toString();
     1121      if(!classifier_name.equals("")){
     1122        classifier_name = classifier_name.substring(0, classifier_name.indexOf("-")).trim();       
     1123      }     
     1124      ArrayList part_model = new ArrayList();
     1125      // DateList only has DateList component
     1126      if(classifier_name.equals("DateList")){
     1127        part_model.add(new Part(DATELIST, DATELIST_DEFAULT_FORMAT));
     1128      }
     1129      // Other Format Entries, display the default Affected Components
     1130      else if(classifier_name.equals("")){     
     1131        part_model = buildPartModel();     
     1132      }
     1133      // Other Classifiers have HList and VList as Affected Component
     1134      else {
     1135        part_model.add(new Part(HLIST, HLIST_DEFAULT_FORMAT));
     1136        part_model.add(new Part(VLIST, VLIST_DEFAULT_FORMAT));
     1137      }
     1138      return part_model;
     1139    }
     1140   
    10831141    public String toString() {
    10841142      if(classifier != null) {
  • gli/branches/2.75/src/org/greenstone/gatherer/cdm/LanguageManager.java

    r13195 r14747  
    284284    /** button to move a language down in the list */
    285285    private JButton move_up_button;
     286    /** button to select all the languages in the list */
     287    private JButton select_all_button;
     288    /** button to clear the current selection in the list */
     289    private JButton select_none_button;
    286290    /** The button to set the current language as the default one. */
    287291    private JButton set_default_button = null;
     
    311315       
    312316        JPanel control_panel = new JPanel();
     317       
     318        JPanel labels_pane = new JPanel();     
    313319        JLabel selector_label = new JLabel(Dictionary.get("CDM.LanguageManager.Selector"));
     320        select_all_button = new GLIButton(Dictionary.get("CDM.IndexManager.Select_All"), Dictionary.get("CDM.IndexManager.Select_All_Tooltip"));
     321        select_none_button = new GLIButton(Dictionary.get("CDM.IndexManager.Select_None"), Dictionary.get("CDM.IndexManager.Select_None_Tooltip"));
    314322       
    315323        language_metadata_combo = new JComboBox(MetadataSetManager.getEveryMetadataSetElement().toArray());
     
    326334        language_list.setToolTipText(Dictionary.get("CDM.LanguageManager.Selector_Tooltip"));
    327335        language_list.setCellRenderer(new LanguageCheckListCellRenderer());
     336       
     337        select_all_button.setEnabled(isSelectAllEnabled());
     338        select_none_button.setEnabled(isSelectAllEnabled());
    328339               
    329340        JPanel movement_pane = new JPanel();
     
    359370        replace_button.addActionListener(new ReplaceListener());
    360371        replace_button.addActionListener(CollectionDesignManager.buildcol_change_listener);
     372        select_all_button.addActionListener(new SelectAllListener());           
     373        select_all_button.addActionListener(CollectionDesignManager.buildcol_change_listener);
     374        select_none_button.addActionListener(new SelectNoneListener());
     375        select_none_button.addActionListener(CollectionDesignManager.buildcol_change_listener);
    361376
    362377        language_list.addListSelectionListener(new LanguageListListener());
     
    395410        control_panel.setBorder(BorderFactory.createEmptyBorder(5,0,0,0));
    396411        control_panel.setLayout(new BorderLayout());
    397         control_panel.add(selector_label, BorderLayout.WEST);
     412               
     413        labels_pane.setLayout(new BorderLayout());
     414        labels_pane.setBorder(BorderFactory.createEmptyBorder(5, 5, 10, 5));
     415       
     416        // add the select all and select none buttons to the label panel             
     417        GridBagLayout gridbag = new GridBagLayout();           
     418        GridBagConstraints c = new GridBagConstraints();
     419        labels_pane.setLayout(gridbag);
     420
     421        c.fill = GridBagConstraints.BOTH;       
     422        c.weightx = 1.0;
     423        c.weighty = 1.0;
     424        c.gridx = 0;
     425        c.gridy = 0;
     426       
     427        gridbag.setConstraints(selector_label, c);
     428        labels_pane.add(selector_label);
     429       
     430        c.fill = GridBagConstraints.HORIZONTAL;
     431        c.weighty = 0.0;
     432        c.gridy = 1;
     433       
     434        gridbag.setConstraints(select_all_button, c);
     435        labels_pane.add(select_all_button);         
     436       
     437        c.gridy = 2;
     438        gridbag.setConstraints(select_none_button, c);
     439        labels_pane.add(select_none_button);   
     440               
     441        control_panel.add(labels_pane, BorderLayout.WEST);
     442       
    398443        control_panel.add(new JScrollPane(language_list), BorderLayout.CENTER);
    399444        control_panel.add(button_panel, BorderLayout.SOUTH);
     
    435480        move_down_button.setEnabled(false);
    436481        move_up_button.setEnabled(false);
     482        select_all_button.setEnabled(isSelectAllEnabled());         
     483        select_none_button.setEnabled(isSelectAllEnabled());
    437484
    438485    }
     
    447494       
    448495        // Display the selected subcollection index's sources
    449         language_list.clearTicked();
    450         language_list.setTickedObjects(selected_lang.getCode().split(","));
    451        
     496        language_list.clearTicked();   
     497        // for multi-languages indexes, getCode returns null
     498        if(selected_lang.getCode()==null){               
     499          return;
     500        }
     501        language_list.setTickedObjects(selected_lang.getCode().split(","));     
    452502    }
    453503
     
    481531        add_button.setEnabled(add_enabled);
    482532        replace_button.setEnabled(replace_enabled);
     533        select_all_button.setEnabled(isSelectAllEnabled());
     534        select_none_button.setEnabled(isSelectAllEnabled());
    483535    }
    484536   
     
    538590        validateButtons();
    539591        }
     592    }
     593   
     594    private class SelectAllListener
     595    implements ActionListener {
     596       
     597        public void actionPerformed(ActionEvent event){
     598            if(select_all_button.isEnabled()){
     599              language_list.setAllTicked();
     600              validateButtons();
     601            }
     602        }
     603    }
     604   
     605    private class SelectNoneListener
     606    implements ActionListener {
     607       
     608        public void actionPerformed(ActionEvent event){
     609            if(select_all_button.isEnabled()){
     610              language_list.clearTicked();
     611              validateButtons();
     612            }
     613        }
    540614    }
    541615   
     
    598672        int i = selected_languages_list.getSelectedIndex();
    599673        int size = selected_languages_list.getModel().getSize();
     674       
     675        select_all_button.setEnabled(isSelectAllEnabled());
     676        select_none_button.setEnabled(isSelectAllEnabled());
     677       
    600678        Language selected_lang = (Language)selected_languages_list.getSelectedValue();
    601679        remove_button.setEnabled(true);
     
    631709        return component;
    632710        }
     711    }
     712   
     713    private boolean isSelectAllEnabled(){
     714      return language_list.getModel().getSize() > 0 ? true : false;         
    633715    }
    634716    }
     
    662744    }
    663745    }
     746   
     747   
    664748
    665749}
  • gli/branches/2.75/src/org/greenstone/gatherer/cdm/SubcollectionIndex.java

    r12798 r14747  
    5050
    5151    /** Constructor. */
    52     public SubcollectionIndex(Element element) {
     52    public SubcollectionIndex(Element element) { 
    5353    this.element = element;
    5454    }
     
    8080    }
    8181   
    82     public DOMProxyListEntry create(Element element) {
     82    public DOMProxyListEntry create(Element element) {         
    8383    return new SubcollectionIndex(element);
    8484    }
     
    118118    if(sources == null) {
    119119        sources = new ArrayList();
    120         NodeList content_elements = element.getElementsByTagName(StaticStrings.CONTENT_ELEMENT);
     120        // for the last entry in the assigned subcollection partitions, element is null
     121        // why this is null for the last entry?
     122        if(element==null){   
     123          return sources;
     124        }
     125        NodeList content_elements = element.getElementsByTagName(StaticStrings.CONTENT_ELEMENT);       
    121126        int content_elements_length = content_elements.getLength();
    122127        for(int i = 0; i < content_elements_length; i++) {
  • gli/branches/2.75/src/org/greenstone/gatherer/cdm/SubcollectionIndexManager.java

    r12808 r14747  
    4747 */
    4848public class SubcollectionIndexManager
    49     extends DOMProxyListModel
     49extends DOMProxyListModel
    5050{
    51     static final private Dimension FIELD_SIZE = new Dimension(200, 30);
    52 
    53     private Control controls;
    54     private DOMProxyListModel model;
    55     private SubcollectionIndex default_index;
    56 
    57 
    58     /** Constructor. */
    59     public SubcollectionIndexManager(Element subindexes)
    60     {
    61     super(subindexes, StaticStrings.INDEX_ELEMENT, new SubcollectionIndex());
    62     DebugStream.println("SubcollectionIndexManager: " + getSize() + " subcollection indexes parsed.");
    63     this.model = this;
    64 
    65     // Parse and retrieve the default index
    66     NodeList default_index_elements = CollectionConfiguration.getElementsByTagName(StaticStrings.SUBCOLLECTION_DEFAULT_INDEX_ELEMENT);
    67     if (default_index_elements.getLength() > 0) {
    68         default_index = new SubcollectionIndex((Element) default_index_elements.item(0));
    69     }
    70     }
    71 
    72 
    73     /** Method to add a subindex.
    74      * @param subindex a SubcollectionIndex
    75      * @see org.greenstone.gatherer.Gatherer
    76      * @see org.greenstone.gatherer.collection.CollectionManager
    77      */
    78     private void addSubcollectionIndex(SubcollectionIndex subcollection_index)
    79     {
    80     if (!contains(subcollection_index)) {
    81         // add a pseudo metadata
    82         CollectionMeta metadatum = new CollectionMeta(StaticStrings.STOP_CHARACTER + subcollection_index.getID());
    83         metadatum.setValue(subcollection_index.getID());
    84         CollectionDesignManager.collectionmeta_manager.addMetadatum(metadatum);
    85         add(getSize(), subcollection_index);
    86     }
    87     }
    88 
    89 
    90     public void destroy()
    91     {
    92     if (controls != null) {
    93         controls.destroy();
    94         controls = null;
    95     }
    96     default_index = null;
    97     model = null;
    98     }
    99 
    100 
    101     public Control getControls()
    102     {
    103     if (controls == null) {
    104         controls = new SubcollectionIndexControls();
    105     }
    106     return controls;
    107     }
    108 
    109 
    110     /** Method to get all of the subindexes set.
    111      * @return an ArrayList containing all the defined indexes
    112      */
    113     public ArrayList getSubcollectionIndexes()
    114     {
    115     return children();
    116     }
    117 
    118     /** Called when the detail mode has changed which in turn may cause several design elements to be available/hidden
    119      * @param mode the new mode as an int
    120      */
    121     public void modeChanged(int mode) {
    122    
    123     }
    124 
    125     private int moveSubcollectionIndex(SubcollectionIndex subcollection_index, boolean move_up)
    126     {
    127     // Determine the current position of the subcollection index
    128     int position = indexOf(subcollection_index);
    129     int new_position;
    130 
    131     // Attempt to move the subcollection index up
    132     if (move_up) {
    133         // Check it's not already at the top
    134         if (position == 0) {
    135         return position;
    136         }
    137 
    138         // This automatically removes the index first, as an Element can only exist once in a particular document
    139         new_position = position - 1;
    140         addBefore(subcollection_index, (SubcollectionIndex) getElementAt(new_position));
    141     }
    142 
    143     // Attempt to move the subcollection index down
    144     else {
    145         // Check it's not already at the bottom
    146         if (position == (getSize()) - 1) {
    147         return position;
    148         }
    149 
    150         // This automatically removes the index first, as an Element can only exist once in a particular document
    151         new_position = position + 1;
    152         addAfter(subcollection_index, (SubcollectionIndex) getElementAt(new_position));
    153     }
    154 
    155     return new_position;
    156     }
    157 
    158 
    159     /** Method to remove a certain subcollection index. */
    160     private void removeSubcollectionIndex(SubcollectionIndex subcollection_index)
    161     {
    162     if (subcollection_index != null) {
    163         // Remove any current metadata from this index
    164         CollectionDesignManager.collectionmeta_manager.removeMetadata(StaticStrings.STOP_CHARACTER + subcollection_index.getID());
    165 
    166         // Check if the index removed happens to be the default index
    167         if (default_index != null && default_index.equals(subcollection_index)) {
    168         setDefault(null);
    169         }
    170        
    171         // Remove the index
    172         remove(subcollection_index);
    173     }
    174     }
    175 
    176 
    177     /** Method to remove all of the subindexes that contain a certain subcollection.
    178      * @param subcollection the Subcollection that has been removed
    179      * @see org.greenstone.gatherer.cdm.Subcollection
    180      * @see org.greenstone.gatherer.cdm.SubcollectionIndex
    181      */
    182     public void removeSubcollectionIndexes(Subcollection subcollection)
    183     {
    184     String subcollection_name = subcollection.getName();
    185     int size = getSize();
    186     for(int i = size - 1; i >= 0; i--) {
    187         SubcollectionIndex subcollection_index = (SubcollectionIndex) getElementAt(i);
    188         if (subcollection_index.getSources().contains(subcollection_name)) {
    189         removeSubcollectionIndex(subcollection_index);
    190         }
    191     }
    192     }
    193 
    194     private void replaceSubcollectionIndex(SubcollectionIndex old_subcollection, SubcollectionIndex new_subcollection) {
    195     // Remove old collection meta
    196     CollectionDesignManager.collectionmeta_manager.removeMetadata(StaticStrings.STOP_CHARACTER + old_subcollection.getID());
    197     // Add new one
    198     CollectionMeta metadatum = new CollectionMeta(StaticStrings.STOP_CHARACTER + new_subcollection.getID());
    199     metadatum.setValue(new_subcollection.getID());
    200     CollectionDesignManager.collectionmeta_manager.addMetadatum(metadatum);
    201     if(default_index != null && default_index.equals(old_subcollection)) {
    202         setDefault(new_subcollection);
    203     }
    204 
    205     // get the position of the old one
    206     int position = indexOf(old_subcollection);
    207     remove(old_subcollection);
    208     add(position, new_subcollection);
    209     }
    210 
    211     /** Method to set the default subcollection index.
    212      * @param index The <strong>SubcollectionIndex</strong> to use as the default index.
    213      * @see org.greenstone.gatherer.Gatherer
    214      * @see org.greenstone.gatherer.collection.CollectionManager
    215      * @see org.greenstone.gatherer.cdm.SubcollectionIndex
    216      */
    217     private void setDefault(SubcollectionIndex subcollection_index)
    218     {
    219     if (subcollection_index != null) {
    220         if (default_index == null) {
    221         // Create the default index element, and place immediately after indexes element.
    222         Element default_index_element = root.getOwnerDocument().createElement(StaticStrings.SUBCOLLECTION_DEFAULT_INDEX_ELEMENT);
    223         default_index = new SubcollectionIndex(default_index_element);
    224         Node target_node = CollectionConfiguration.findInsertionPoint(default_index_element);
    225         if (target_node != null) {
    226             root.getOwnerDocument().getDocumentElement().insertBefore(default_index_element, target_node);
    227         }
     51    static final private Dimension FIELD_SIZE = new Dimension(200, 30);
     52
     53    private Control controls;
     54    private DOMProxyListModel model;
     55    private SubcollectionIndex default_index;
     56
     57
     58    /** Constructor. */
     59    public SubcollectionIndexManager(Element subindexes)
     60    {
     61        super(subindexes, StaticStrings.INDEX_ELEMENT, new SubcollectionIndex());
     62        DebugStream.println("SubcollectionIndexManager: " + getSize() + " subcollection indexes parsed.");
     63        this.model = this;
     64
     65        // Parse and retrieve the default index
     66        NodeList default_index_elements = CollectionConfiguration.getElementsByTagName(StaticStrings.SUBCOLLECTION_DEFAULT_INDEX_ELEMENT);
     67        if (default_index_elements.getLength() > 0) {
     68            default_index = new SubcollectionIndex((Element) default_index_elements.item(0));
     69        }
     70    }
     71
     72
     73    /** Method to add a subindex.
     74     * @param subindex a SubcollectionIndex
     75     * @see org.greenstone.gatherer.Gatherer
     76     * @see org.greenstone.gatherer.collection.CollectionManager
     77     */
     78    private void addSubcollectionIndex(SubcollectionIndex subcollection_index)
     79    {
     80        if (!contains(subcollection_index)) {
     81            // add a pseudo metadata
     82            CollectionMeta metadatum = new CollectionMeta(StaticStrings.STOP_CHARACTER + subcollection_index.getID());
     83            metadatum.setValue(subcollection_index.getID());
     84            CollectionDesignManager.collectionmeta_manager.addMetadatum(metadatum);
     85            add(getSize(), subcollection_index);
     86        }
     87    }
     88
     89
     90    public void destroy()
     91    {
     92        if (controls != null) {
     93            controls.destroy();
     94            controls = null;
     95        }
     96        default_index = null;
     97        model = null;
     98    }
     99
     100
     101    public Control getControls()
     102    {
     103        if (controls == null) {
     104            controls = new SubcollectionIndexControls();
     105        }
     106        return controls;
     107    }
     108
     109
     110    /** Method to get all of the subindexes set.
     111     * @return an ArrayList containing all the defined indexes
     112     */
     113    public ArrayList getSubcollectionIndexes()
     114    {
     115        return children();
     116    }
     117
     118    /** Called when the detail mode has changed which in turn may cause several design elements to be available/hidden
     119     * @param mode the new mode as an int
     120     */
     121    public void modeChanged(int mode) {
     122
     123    }
     124
     125    private int moveSubcollectionIndex(SubcollectionIndex subcollection_index, boolean move_up)
     126    {
     127        // Determine the current position of the subcollection index
     128        int position = indexOf(subcollection_index);
     129        int new_position;
     130
     131        // Attempt to move the subcollection index up
     132        if (move_up) {
     133            // Check it's not already at the top
     134            if (position == 0) {
     135                return position;
     136            }
     137
     138            // This automatically removes the index first, as an Element can only exist once in a particular document
     139            new_position = position - 1;
     140            addBefore(subcollection_index, (SubcollectionIndex) getElementAt(new_position));
     141        }
     142
     143        // Attempt to move the subcollection index down
    228144        else {
    229             root.getOwnerDocument().getDocumentElement().appendChild(default_index_element);
    230         }
    231         }
    232         default_index.setAssigned(true);
    233         default_index.setSources(subcollection_index.getSources());
    234     }
    235     else {
    236         if (default_index != null) {
    237         default_index.setAssigned(false);
    238         }
    239     }
    240     }
    241 
    242 
    243     /** This class creates a set of controls for editing the indexes. */
    244     private class SubcollectionIndexControls
     145            // Check it's not already at the bottom
     146            if (position == (getSize()) - 1) {
     147                return position;
     148            }
     149
     150            // This automatically removes the index first, as an Element can only exist once in a particular document
     151            new_position = position + 1;
     152            addAfter(subcollection_index, (SubcollectionIndex) getElementAt(new_position));
     153        }
     154
     155        return new_position;
     156    }
     157
     158
     159    /** Method to remove a certain subcollection index. */
     160    private void removeSubcollectionIndex(SubcollectionIndex subcollection_index)
     161    {
     162        if (subcollection_index != null) {
     163            // Remove any current metadata from this index
     164            CollectionDesignManager.collectionmeta_manager.removeMetadata(StaticStrings.STOP_CHARACTER + subcollection_index.getID());
     165
     166            // Check if the index removed happens to be the default index
     167            if (default_index != null && default_index.equals(subcollection_index)) {
     168                setDefault(null);
     169            }
     170
     171            // Remove the index
     172            remove(subcollection_index);
     173        }
     174    }
     175
     176
     177    /** Method to remove all of the subindexes that contain a certain subcollection.
     178     * @param subcollection the Subcollection that has been removed
     179     * @see org.greenstone.gatherer.cdm.Subcollection
     180     * @see org.greenstone.gatherer.cdm.SubcollectionIndex
     181     */
     182    public void removeSubcollectionIndexes(Subcollection subcollection)
     183    {
     184        String subcollection_name = subcollection.getName();
     185        int size = getSize();
     186        for(int i = size - 1; i >= 0; i--) {
     187            SubcollectionIndex subcollection_index = (SubcollectionIndex) getElementAt(i);
     188            if (subcollection_index.getSources().contains(subcollection_name)) {
     189                removeSubcollectionIndex(subcollection_index);
     190            }
     191        }
     192    }
     193
     194    private void replaceSubcollectionIndex(SubcollectionIndex old_subcollection, SubcollectionIndex new_subcollection) {
     195        // Remove old collection meta
     196        CollectionDesignManager.collectionmeta_manager.removeMetadata(StaticStrings.STOP_CHARACTER + old_subcollection.getID());
     197        // Add new one
     198        CollectionMeta metadatum = new CollectionMeta(StaticStrings.STOP_CHARACTER + new_subcollection.getID());
     199        metadatum.setValue(new_subcollection.getID());
     200        CollectionDesignManager.collectionmeta_manager.addMetadatum(metadatum);
     201        if(default_index != null && default_index.equals(old_subcollection)) {
     202            setDefault(new_subcollection);
     203        }
     204
     205        // get the position of the old one
     206        int position = indexOf(old_subcollection);
     207        remove(old_subcollection);
     208        add(position, new_subcollection);
     209    }
     210
     211    /** Method to set the default subcollection index.
     212     * @param index The <strong>SubcollectionIndex</strong> to use as the default index.
     213     * @see org.greenstone.gatherer.Gatherer
     214     * @see org.greenstone.gatherer.collection.CollectionManager
     215     * @see org.greenstone.gatherer.cdm.SubcollectionIndex
     216     */
     217    private void setDefault(SubcollectionIndex subcollection_index)
     218    {
     219        if (subcollection_index != null) {
     220            if (default_index == null) {
     221                // Create the default index element, and place immediately after indexes element.
     222                Element default_index_element = root.getOwnerDocument().createElement(StaticStrings.SUBCOLLECTION_DEFAULT_INDEX_ELEMENT);
     223                default_index = new SubcollectionIndex(default_index_element);
     224                Node target_node = CollectionConfiguration.findInsertionPoint(default_index_element);
     225                if (target_node != null) {
     226                    root.getOwnerDocument().getDocumentElement().insertBefore(default_index_element, target_node);
     227                }
     228                else {
     229                    root.getOwnerDocument().getDocumentElement().appendChild(default_index_element);
     230                }
     231            }
     232            default_index.setAssigned(true);
     233            default_index.setSources(subcollection_index.getSources());
     234        }
     235        else {
     236            if (default_index != null) {
     237                default_index.setAssigned(false);
     238            }
     239        }
     240    }
     241
     242
     243    /** This class creates a set of controls for editing the indexes. */
     244    private class SubcollectionIndexControls
    245245    extends JPanel
    246246    implements Control
    247     {
    248     private CheckList source_list;
    249     private JButton add_button;
    250     private JButton move_down_button;
    251     private JButton move_up_button;
    252     private JButton remove_button;
    253     private JButton replace_button;
    254     private JButton set_default_button;
    255     private JList subcollection_index_list;
    256     private JTextField subcollection_index_name_textfield;
    257 
    258 
    259     /** Constructor.
    260      */
    261     public SubcollectionIndexControls()
    262     {
    263         super();
    264 
    265         ArrayList sources = new ArrayList();
    266         ListModel source_model = CollectionDesignManager.subcollection_manager;
    267         for (int i = 0; i < source_model.getSize(); i++) {
    268         sources.add(source_model.getElementAt(i));
    269         }
    270 
    271         // Creation
    272         JPanel assigned_indexes_pane = new JPanel();
    273         JLabel index_label = new JLabel(Dictionary.get("CDM.SubcollectionIndexManager.Subindexes"));
    274         subcollection_index_list = new JList(model);
    275         subcollection_index_list.setCellRenderer(new SubcollectionIndexListCellRenderer());
    276         subcollection_index_list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    277         subcollection_index_list.setVisibleRowCount(2);
    278 
    279         JPanel movement_pane = new JPanel();
    280         move_up_button = new GLIButton(Dictionary.get("CDM.Move.Move_Up"), JarTools.getImage("arrow-up.gif"), Dictionary.get("CDM.Move.Move_Up_Tooltip"));
    281         move_up_button.setEnabled(false);
    282        
    283         move_down_button = new GLIButton(Dictionary.get("CDM.Move.Move_Down"), JarTools.getImage("arrow-down.gif"), Dictionary.get("CDM.Move.Move_Down_Tooltip"));
    284         move_down_button.setEnabled(false);
    285        
    286         set_default_button = new GLIButton(Dictionary.get("CDM.SubcollectionIndexManager.Set_Default_Subindex"), Dictionary.get("CDM.SubcollectionIndexManager.Set_Default_Subindex_Tooltip"));
    287         set_default_button.setEnabled(false);
    288        
    289         JPanel index_pane = new JPanel();
    290         JPanel details_pane = new JPanel();
    291         JPanel labels_pane = new JPanel();
    292         JPanel boxes_pane = new JPanel();
    293         JPanel content_pane = new JPanel();
    294 
    295         JLabel source_label = new JLabel(Dictionary.get("CDM.SubcollectionIndexManager.Source"));
    296        
    297         source_list = new CheckList(false);
    298         source_list.setListData(sources);
    299         source_list.setToolTipText(Dictionary.get("CDM.SubcollectionIndexManager.Source_Tooltip"));
    300        
    301         JPanel button_pane = new JPanel();
    302         add_button = new GLIButton(Dictionary.get("CDM.SubcollectionIndexManager.Add_Subindex"), Dictionary.get("CDM.SubcollectionIndexManager.Add_Subindex_Tooltip"));
    303         add_button.setEnabled(false);
    304        
    305         remove_button = new GLIButton(Dictionary.get("CDM.SubcollectionIndexManager.Remove_Subindex"), Dictionary.get("CDM.SubcollectionIndexManager.Remove_Subindex_Tooltip"));
    306         remove_button.setEnabled(false);
    307        
    308         replace_button = new GLIButton(Dictionary.get("CDM.SubcollectionIndexManager.Replace_Subindex"), Dictionary.get("CDM.SubcollectionIndexManager.Replace_Subindex_Tooltip"));
    309         replace_button.setEnabled(false);
    310        
    311         // Listeners
    312         add_button.addActionListener(new AddListener());
    313         add_button.addActionListener(CollectionDesignManager.buildcol_change_listener);
    314         move_down_button.addActionListener(new MoveListener(false));
    315         move_down_button.addActionListener(CollectionDesignManager.buildcol_change_listener);
    316         move_up_button.addActionListener(new MoveListener(true));
    317         move_up_button.addActionListener(CollectionDesignManager.buildcol_change_listener);
    318         remove_button.addActionListener(new RemoveListener());
    319         remove_button.addActionListener(CollectionDesignManager.buildcol_change_listener);
    320         replace_button.addActionListener(new ReplaceListener());
    321         replace_button.addActionListener(CollectionDesignManager.buildcol_change_listener);
    322         set_default_button.addActionListener(new SetDefaultListener());
    323         set_default_button.addActionListener(CollectionDesignManager.buildcol_change_listener);
    324         subcollection_index_list.addListSelectionListener(new AssignedListListener());
    325         source_list.addListSelectionListener(new SourceListListener());
    326 
    327         // Layout
    328         movement_pane.setBorder(BorderFactory.createEmptyBorder(0,2,0,0));
    329         movement_pane.setLayout(new GridLayout(3,1));
    330         movement_pane.add(move_up_button);
    331         movement_pane.add(move_down_button);
    332         movement_pane.add(set_default_button);
    333 
    334         assigned_indexes_pane.setBorder(BorderFactory.createEmptyBorder(0,0,5,0));
    335         assigned_indexes_pane.setLayout(new BorderLayout());
    336         assigned_indexes_pane.add(index_label, BorderLayout.NORTH);
    337         assigned_indexes_pane.add(new JScrollPane(subcollection_index_list), BorderLayout.CENTER);
    338         assigned_indexes_pane.add(movement_pane, BorderLayout.EAST);
    339 
    340         labels_pane.setLayout(new BorderLayout());
    341         labels_pane.setBorder(BorderFactory.createEmptyBorder(5, 5, 10, 5));
    342         labels_pane.add(source_label, BorderLayout.CENTER);
    343        
    344         boxes_pane.setLayout(new BorderLayout());
    345         boxes_pane.add(new JScrollPane(source_list), BorderLayout.CENTER);
    346        
    347         details_pane.setLayout(new BorderLayout());
    348         details_pane.add(labels_pane, BorderLayout.WEST);
    349         details_pane.add(boxes_pane, BorderLayout.CENTER);
    350 
    351         button_pane.setLayout(new GridLayout(1,3));
    352         button_pane.add(add_button);
    353         button_pane.add(replace_button);
    354         button_pane.add(remove_button);
    355 
    356         index_pane.setLayout(new BorderLayout());
    357         index_pane.add(details_pane, BorderLayout.CENTER);
    358         index_pane.add(button_pane, BorderLayout.SOUTH);
    359 
    360         content_pane.setLayout(new BorderLayout());
    361         content_pane.add(assigned_indexes_pane, BorderLayout.NORTH);
    362         content_pane.add(index_pane, BorderLayout.CENTER);
    363 
    364         setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
    365         setLayout(new BorderLayout());
    366         add(content_pane, BorderLayout.CENTER);
    367     }
    368 
    369 
    370     public void destroy()
    371     {
    372     }
    373 
    374 
    375     public void gainFocus()
    376     {
    377         // Reload the source list
    378         ArrayList sources = new ArrayList();
    379         ListModel source_model = CollectionDesignManager.subcollection_manager;
    380         for (int i = 0; i < source_model.getSize(); i++) {
    381         sources.add(source_model.getElementAt(i));
    382         }
    383         source_list.setListData(sources);
    384 
    385         // Refresh the subcollection index list
    386         subcollection_index_list.updateUI();
    387 
    388         clearControls();
    389        
    390     }
    391 
    392 
    393     public void loseFocus() {
    394     }
    395 
    396     private void clearControls() {
    397         subcollection_index_list.clearSelection();
    398         source_list.clearTicked();
    399         add_button.setEnabled(false);
    400         remove_button.setEnabled(false);
    401         replace_button.setEnabled(false);
    402         set_default_button.setEnabled(false);
    403         move_down_button.setEnabled(false);
    404         move_up_button.setEnabled(false);
    405 
    406     }
    407 
    408     private void updateControlsWithSelectedIndex()
    409     {
    410         SubcollectionIndex selected_index = (SubcollectionIndex) subcollection_index_list.getSelectedValue();
    411         if (selected_index == null) {
    412         source_list.clearTicked();
    413         return;
    414         }
    415 
    416         // Display the selected subcollection index's sources
    417         source_list.clearTicked();
    418         source_list.setTickedObjects(selected_index.getSources().toArray());
    419     }
    420 
    421 
    422     private void validateButtons() {
    423        
    424         boolean add_enabled = false;
    425         boolean replace_enabled = false;
    426 
    427         // Can't add a new index if no sources are selected
    428         if (!source_list.isNothingTicked()) {
    429         ArrayList sources = source_list.getTicked();
    430         SubcollectionIndex subcollection_index = new SubcollectionIndex(sources.toArray());
    431 
    432         // Subcollection index already exists: can't add, but can replace if the name has changed
    433         if (!model.contains(subcollection_index)) {
    434             add_enabled = true;
    435             if (!subcollection_index_list.isSelectionEmpty()) {
    436             replace_enabled = true;
    437             }
    438         }
    439         }
    440 
    441         // We should now know the add_button state
    442         add_button.setEnabled(add_enabled);
    443         replace_button.setEnabled(replace_enabled);
    444     }
    445 
    446 
    447     private class AddListener
    448         implements ActionListener {
    449        
    450         public void actionPerformed(ActionEvent event)
    451         {
    452         if (!source_list.isNothingTicked()) {
    453             ArrayList sources = source_list.getTicked();
    454             SubcollectionIndex subcollection_index = new SubcollectionIndex(sources.toArray());
    455             addSubcollectionIndex(subcollection_index);
    456             clearControls();
    457         }
    458         }
    459     }
    460 
    461 
    462     private class MoveListener
    463         implements ActionListener
    464     {
    465         private boolean move_up;
    466 
    467         public MoveListener(boolean move_up)
    468         {
    469         this.move_up = move_up;
    470         }
    471 
    472         public void actionPerformed(ActionEvent event)
    473         {
    474         // Retrieve the selected subcollection index
    475         SubcollectionIndex subcollection_index = (SubcollectionIndex) subcollection_index_list.getSelectedValue();
    476         if (subcollection_index != null) {
    477             int new_position = moveSubcollectionIndex(subcollection_index, move_up);
    478             // Ensure the subcollection index that moved is still selected
    479             subcollection_index_list.setSelectedIndex(new_position);
    480         }
    481         }
    482     }
    483 
    484     private class RemoveListener
    485         implements ActionListener
    486     {
    487         public void actionPerformed(ActionEvent event) {
     247    {
     248        private CheckList source_list;
     249        private JButton add_button;
     250        private JButton move_down_button;
     251        private JButton move_up_button;
     252        private JButton remove_button;
     253        private JButton replace_button;
     254        private JButton select_all_button;
     255        private JButton select_none_button;
     256        private JButton set_default_button;
     257        private JList subcollection_index_list;
     258        private JTextField subcollection_index_name_textfield;
     259
     260
     261        /** Constructor.
     262         */
     263        public SubcollectionIndexControls()
     264        {
     265            super();
     266
     267            ArrayList sources = new ArrayList();
     268            ListModel source_model = CollectionDesignManager.subcollection_manager;
     269            for (int i = 0; i < source_model.getSize(); i++) {
     270                sources.add(source_model.getElementAt(i));
     271            }
     272
     273            // Creation
     274            JPanel assigned_indexes_pane = new JPanel();
     275            JLabel index_label = new JLabel(Dictionary.get("CDM.SubcollectionIndexManager.Subindexes"));
     276            subcollection_index_list = new JList(model);
     277            subcollection_index_list.setCellRenderer(new SubcollectionIndexListCellRenderer());
     278            subcollection_index_list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
     279            subcollection_index_list.setVisibleRowCount(2);
     280
     281            JPanel movement_pane = new JPanel();
     282            move_up_button = new GLIButton(Dictionary.get("CDM.Move.Move_Up"), JarTools.getImage("arrow-up.gif"), Dictionary.get("CDM.Move.Move_Up_Tooltip"));
     283            move_up_button.setEnabled(false);
     284
     285            move_down_button = new GLIButton(Dictionary.get("CDM.Move.Move_Down"), JarTools.getImage("arrow-down.gif"), Dictionary.get("CDM.Move.Move_Down_Tooltip"));
     286            move_down_button.setEnabled(false);
     287
     288            set_default_button = new GLIButton(Dictionary.get("CDM.SubcollectionIndexManager.Set_Default_Subindex"), Dictionary.get("CDM.SubcollectionIndexManager.Set_Default_Subindex_Tooltip"));
     289            set_default_button.setEnabled(false);
     290
     291            JPanel index_pane = new JPanel();
     292            JPanel details_pane = new JPanel();
     293           
     294            JPanel labels_pane = new JPanel();
     295           
     296            select_all_button = new GLIButton(Dictionary.get("CDM.IndexManager.Select_All"), Dictionary.get("CDM.IndexManager.Select_All_Tooltip"));
     297            select_none_button = new GLIButton(Dictionary.get("CDM.IndexManager.Select_None"), Dictionary.get("CDM.IndexManager.Select_None_Tooltip"));
     298           
     299           
     300            JPanel boxes_pane = new JPanel();
     301            JPanel content_pane = new JPanel();
     302
     303            JLabel source_label = new JLabel(Dictionary.get("CDM.SubcollectionIndexManager.Source"));
     304
     305            source_list = new CheckList(false);
     306            source_list.setListData(sources);
     307            source_list.setToolTipText(Dictionary.get("CDM.SubcollectionIndexManager.Source_Tooltip"));
     308           
     309            select_all_button.setEnabled(isSelectAllEnabled());
     310            select_none_button.setEnabled(isSelectAllEnabled());
     311
     312            JPanel button_pane = new JPanel();
     313            add_button = new GLIButton(Dictionary.get("CDM.SubcollectionIndexManager.Add_Subindex"), Dictionary.get("CDM.SubcollectionIndexManager.Add_Subindex_Tooltip"));
     314            add_button.setEnabled(false);
     315
     316            remove_button = new GLIButton(Dictionary.get("CDM.SubcollectionIndexManager.Remove_Subindex"), Dictionary.get("CDM.SubcollectionIndexManager.Remove_Subindex_Tooltip"));
     317            remove_button.setEnabled(false);
     318
     319            replace_button = new GLIButton(Dictionary.get("CDM.SubcollectionIndexManager.Replace_Subindex"), Dictionary.get("CDM.SubcollectionIndexManager.Replace_Subindex_Tooltip"));
     320            replace_button.setEnabled(false);
     321                       
     322
     323            // Listeners
     324            add_button.addActionListener(new AddListener());
     325            add_button.addActionListener(CollectionDesignManager.buildcol_change_listener);
     326            move_down_button.addActionListener(new MoveListener(false));
     327            move_down_button.addActionListener(CollectionDesignManager.buildcol_change_listener);
     328            move_up_button.addActionListener(new MoveListener(true));
     329            move_up_button.addActionListener(CollectionDesignManager.buildcol_change_listener);
     330            remove_button.addActionListener(new RemoveListener());
     331            remove_button.addActionListener(CollectionDesignManager.buildcol_change_listener);
     332            replace_button.addActionListener(new ReplaceListener());
     333            replace_button.addActionListener(CollectionDesignManager.buildcol_change_listener);
     334            select_all_button.addActionListener(new SelectAllListener());           
     335            select_all_button.addActionListener(CollectionDesignManager.buildcol_change_listener);         
     336            select_none_button.addActionListener(new SelectNoneListener());
     337            select_none_button.addActionListener(CollectionDesignManager.buildcol_change_listener);
     338            set_default_button.addActionListener(new SetDefaultListener());
     339            set_default_button.addActionListener(CollectionDesignManager.buildcol_change_listener);
     340            subcollection_index_list.addListSelectionListener(new AssignedListListener());
     341            source_list.addListSelectionListener(new SourceListListener());     
     342           
     343           
     344            // Layout
     345            movement_pane.setBorder(BorderFactory.createEmptyBorder(0,2,0,0));
     346            movement_pane.setLayout(new GridLayout(3,1));
     347            movement_pane.add(move_up_button);
     348            movement_pane.add(move_down_button);
     349            movement_pane.add(set_default_button);
     350
     351            assigned_indexes_pane.setBorder(BorderFactory.createEmptyBorder(0,0,5,0));
     352            assigned_indexes_pane.setLayout(new BorderLayout());
     353            assigned_indexes_pane.add(index_label, BorderLayout.NORTH);
     354            assigned_indexes_pane.add(new JScrollPane(subcollection_index_list), BorderLayout.CENTER);
     355            assigned_indexes_pane.add(movement_pane, BorderLayout.EAST);
     356
     357            labels_pane.setLayout(new BorderLayout());
     358            labels_pane.setBorder(BorderFactory.createEmptyBorder(5, 5, 10, 5));
     359           
     360            // add the select all and select none buttons to the label panel             
     361            GridBagLayout gridbag = new GridBagLayout();           
     362            GridBagConstraints c = new GridBagConstraints();
     363            labels_pane.setLayout(gridbag);
     364           
     365            c.fill = GridBagConstraints.BOTH;       
     366            c.weightx = 1.0;
     367            c.weighty = 1.0;
     368            c.gridx = 0;
     369            c.gridy = 0;
     370           
     371            gridbag.setConstraints(source_label, c);
     372            labels_pane.add(source_label);
     373           
     374            c.fill = GridBagConstraints.HORIZONTAL;
     375            c.weighty = 0.0;
     376            c.gridy = 1;
     377           
     378            gridbag.setConstraints(select_all_button, c);
     379            labels_pane.add(select_all_button);
     380           
     381            c.gridy = 2;
     382            gridbag.setConstraints(select_none_button, c);
     383            labels_pane.add(select_none_button);   
     384           
     385           
     386            boxes_pane.setLayout(new BorderLayout());
     387            boxes_pane.add(new JScrollPane(source_list), BorderLayout.CENTER);
     388
     389            details_pane.setLayout(new BorderLayout());
     390            details_pane.add(labels_pane, BorderLayout.WEST);
     391            details_pane.add(boxes_pane, BorderLayout.CENTER);
     392
     393            button_pane.setLayout(new GridLayout(1,3));
     394            button_pane.add(add_button);
     395            button_pane.add(replace_button);
     396            button_pane.add(remove_button);
     397
     398            index_pane.setLayout(new BorderLayout());
     399            index_pane.add(details_pane, BorderLayout.CENTER);
     400            index_pane.add(button_pane, BorderLayout.SOUTH);
     401
     402            content_pane.setLayout(new BorderLayout());
     403            content_pane.add(assigned_indexes_pane, BorderLayout.NORTH);
     404            content_pane.add(index_pane, BorderLayout.CENTER);
     405
     406            setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
     407            setLayout(new BorderLayout());
     408            add(content_pane, BorderLayout.CENTER);
     409        }
     410
     411
     412        public void destroy()
     413        {
     414        }
     415
     416
     417        public void gainFocus()
     418        {
     419            // Reload the source list
     420            ArrayList sources = new ArrayList();
     421            ListModel source_model = CollectionDesignManager.subcollection_manager;
     422            for (int i = 0; i < source_model.getSize(); i++) {
     423                sources.add(source_model.getElementAt(i));
     424            }
     425            source_list.setListData(sources);
     426
     427            // Refresh the subcollection index list
     428            subcollection_index_list.updateUI();
     429
     430            clearControls();
     431
     432        }
     433
     434
     435        public void loseFocus() {
     436        }
     437
     438        private void clearControls() {
     439            subcollection_index_list.clearSelection();
     440            source_list.clearTicked();
     441            add_button.setEnabled(false);
     442            remove_button.setEnabled(false);
     443            replace_button.setEnabled(false);
     444            set_default_button.setEnabled(false);
     445            move_down_button.setEnabled(false);
     446            move_up_button.setEnabled(false);
     447            select_all_button.setEnabled(isSelectAllEnabled());         
     448            select_none_button.setEnabled(isSelectAllEnabled());
     449        }
    488450       
    489         SubcollectionIndex delete_me = (SubcollectionIndex) subcollection_index_list.getSelectedValue();
    490         if (delete_me != null) {
    491             removeSubcollectionIndex(delete_me);
    492         }
    493         }
    494     }
    495 
    496 
    497     private class ReplaceListener
    498         implements ActionListener {
    499        
    500         public void actionPerformed(ActionEvent event) {
    501        
    502         if (subcollection_index_list.isSelectionEmpty()|| source_list.isNothingTicked()) {
    503             // This should never happen, but just in case...
    504             replace_button.setEnabled(false);
    505             return;
    506         }
    507         SubcollectionIndex old_index = (SubcollectionIndex) subcollection_index_list.getSelectedValue();
    508         ArrayList sources = source_list.getTicked();
    509         SubcollectionIndex new_index = new SubcollectionIndex(sources.toArray());
    510         replaceSubcollectionIndex(old_index, new_index);
    511         }
    512     }
    513 
    514 
    515     private class SetDefaultListener
    516         implements ActionListener {
    517        
    518         public void actionPerformed(ActionEvent event)
    519         {
    520         SubcollectionIndex subcollection_index = (SubcollectionIndex) subcollection_index_list.getSelectedValue();
    521         if (subcollection_index != null) {
    522             setDefault(subcollection_index);
    523             // This should cause a repaint of just the desired row
    524             subcollection_index_list.setSelectedValue(subcollection_index, true);
    525         }
    526         set_default_button.setEnabled(false);
    527         }
    528     }
    529 
    530 
    531     private class SourceListListener
    532         implements ListSelectionListener {
    533    
    534         public void valueChanged(ListSelectionEvent event) {
    535         if (event.getValueIsAdjusting()) {
    536             return;
    537         }
    538         validateButtons();
    539         }
    540     }
    541 
    542 
    543     /** Listens for selections within the assigned subcollection indexes list  */
    544     private class AssignedListListener
    545         implements ListSelectionListener {
    546        
    547         public void valueChanged(ListSelectionEvent event) {
     451        private boolean isSelectAllEnabled(){
     452            return source_list.getModel().getSize() > 0 ? true : false;         
     453        }
     454
     455        private void updateControlsWithSelectedIndex()
     456        {
     457            SubcollectionIndex selected_index = (SubcollectionIndex) subcollection_index_list.getSelectedValue();
     458            if (selected_index == null) {
     459                source_list.clearTicked();
     460                return;
     461            }
     462
     463            // Display the selected subcollection index's sources
     464            source_list.clearTicked();
     465            source_list.setTickedObjects(selected_index.getSources().toArray());
     466        }
     467
     468
     469        private void validateButtons() {
     470
     471            boolean add_enabled = false;
     472            boolean replace_enabled = false;
     473
     474            // Can't add a new index if no sources are selected
     475            if (!source_list.isNothingTicked()) {
     476                ArrayList sources = source_list.getTicked();
     477                SubcollectionIndex subcollection_index = new SubcollectionIndex(sources.toArray());
     478
     479                // Subcollection index already exists: can't add, but can replace if the name has changed
     480                if (!model.contains(subcollection_index)) {
     481                    add_enabled = true;
     482                    if (!subcollection_index_list.isSelectionEmpty()) {
     483                        replace_enabled = true;
     484                    }
     485                }
     486            }
     487           
     488            select_all_button.setEnabled(isSelectAllEnabled());
     489            select_none_button.setEnabled(isSelectAllEnabled());
     490
     491            // We should now know the add_button state
     492            add_button.setEnabled(add_enabled);
     493            replace_button.setEnabled(replace_enabled);
     494        }
     495
     496
     497        private class AddListener
     498        implements ActionListener {
     499         
     500            public void actionPerformed(ActionEvent event)
     501            {
     502                if (!source_list.isNothingTicked()) {
     503                    ArrayList sources = source_list.getTicked();
     504                    SubcollectionIndex subcollection_index = new SubcollectionIndex(sources.toArray());
     505                    addSubcollectionIndex(subcollection_index);
     506                    clearControls();
     507                }
     508            }
     509        }
     510
     511
     512        private class MoveListener
     513        implements ActionListener
     514        {
     515            private boolean move_up;
     516
     517            public MoveListener(boolean move_up)
     518            {
     519                this.move_up = move_up;
     520            }
     521
     522            public void actionPerformed(ActionEvent event)
     523            {
     524                // Retrieve the selected subcollection index
     525                SubcollectionIndex subcollection_index = (SubcollectionIndex) subcollection_index_list.getSelectedValue();
     526                if (subcollection_index != null) {
     527                    int new_position = moveSubcollectionIndex(subcollection_index, move_up);
     528                    // Ensure the subcollection index that moved is still selected
     529                    subcollection_index_list.setSelectedIndex(new_position);                   
     530                }
     531            }
     532        }
     533
     534        private class RemoveListener
     535        implements ActionListener
     536        {
     537            public void actionPerformed(ActionEvent event) {
     538
     539                SubcollectionIndex delete_me = (SubcollectionIndex) subcollection_index_list.getSelectedValue();
     540                if (delete_me != null) {
     541                    removeSubcollectionIndex(delete_me);
     542                }
     543            }
     544        }
     545
     546
     547        private class ReplaceListener
     548        implements ActionListener {
     549
     550            public void actionPerformed(ActionEvent event) {
     551
     552                if (subcollection_index_list.isSelectionEmpty()|| source_list.isNothingTicked()) {
     553                    // This should never happen, but just in case...
     554                    replace_button.setEnabled(false);
     555                    return;
     556                }
     557                SubcollectionIndex old_index = (SubcollectionIndex) subcollection_index_list.getSelectedValue();
     558                ArrayList sources = source_list.getTicked();
     559                SubcollectionIndex new_index = new SubcollectionIndex(sources.toArray());
     560                replaceSubcollectionIndex(old_index, new_index);
     561            }
     562        }
     563
     564
     565        private class SetDefaultListener
     566        implements ActionListener {
     567
     568            public void actionPerformed(ActionEvent event)
     569            {
     570                SubcollectionIndex subcollection_index = (SubcollectionIndex) subcollection_index_list.getSelectedValue();
     571                if (subcollection_index != null) {
     572                    setDefault(subcollection_index);
     573                    // This should cause a repaint of just the desired row
     574                    subcollection_index_list.setSelectedValue(subcollection_index, true);
     575                }
     576                set_default_button.setEnabled(false);
     577            }
     578        }
     579
     580
     581        private class SourceListListener
     582        implements ListSelectionListener {
     583
     584            public void valueChanged(ListSelectionEvent event) {
     585                if (event.getValueIsAdjusting()) {
     586                    return;
     587                }
     588                validateButtons();
     589            }
     590        }
    548591       
    549         if (event.getValueIsAdjusting()) {
    550             return;
    551         }
    552 
    553         if (subcollection_index_list.isSelectionEmpty()) {
    554             clearControls();
    555             return;
     592        private class SelectAllListener
     593        implements ActionListener {
     594           
     595            public void actionPerformed(ActionEvent event){
     596                if(select_all_button.isEnabled()){
     597                    source_list.setAllTicked();
     598                    validateButtons();
     599                }
     600            }
    556601        }
    557602       
    558         int i = subcollection_index_list.getSelectedIndex();
    559         int size = subcollection_index_list.getModel().getSize();
    560        
    561         // Enable the buttons appropriately
    562         remove_button.setEnabled(true);
    563         replace_button.setEnabled(false);
    564         add_button.setEnabled(false);
    565         SubcollectionIndex selected_index = (SubcollectionIndex) subcollection_index_list.getSelectedValue();
    566         set_default_button.setEnabled(default_index == null || !default_index.equals(selected_index));
    567         if (i > 0) {
    568             move_up_button.setEnabled(true);
    569         }
    570         else {
    571             move_up_button.setEnabled(false);
    572         }
    573         if (i < size-1){
    574             move_down_button.setEnabled(true);
    575         }
    576         else {
    577             move_down_button.setEnabled(false);
    578         }
    579 
    580         // Need to fill in the rest of the bits
    581         updateControlsWithSelectedIndex();
    582         }
    583     }
    584 
    585 
    586     private class SubcollectionIndexListCellRenderer
    587         extends DefaultListCellRenderer
    588     {
    589         /** Return a component that has been configured to display the specified value. */
    590         public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
    591         JLabel component = (JLabel) super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
    592         if (default_index != null && default_index.equals(value)) {
    593             component.setText(component.getText() + " " + Dictionary.get("CDM.SubcollectionIndexManager.Default_Partition_Indicator"));
    594         }
    595         return component;
    596         }
    597     }
    598     }
     603        private class SelectNoneListener
     604        implements ActionListener {
     605           
     606            public void actionPerformed(ActionEvent event){
     607                if(select_none_button.isEnabled()){
     608                    source_list.clearTicked();
     609                    validateButtons();
     610                }
     611            }
     612        }
     613
     614
     615        /** Listens for selections within the assigned subcollection indexes list  */
     616        private class AssignedListListener
     617        implements ListSelectionListener {
     618
     619            public void valueChanged(ListSelectionEvent event) {
     620
     621                if (event.getValueIsAdjusting()) {
     622                    return;
     623                }
     624
     625                if (subcollection_index_list.isSelectionEmpty()) {
     626                    clearControls();
     627                    return;
     628                }
     629
     630                int i = subcollection_index_list.getSelectedIndex();
     631                int size = subcollection_index_list.getModel().getSize();
     632               
     633                select_all_button.setEnabled(isSelectAllEnabled());
     634                select_none_button.setEnabled(isSelectAllEnabled());
     635
     636                // Enable the buttons appropriately
     637                remove_button.setEnabled(true);
     638                replace_button.setEnabled(false);
     639                add_button.setEnabled(false);
     640                SubcollectionIndex selected_index = (SubcollectionIndex) subcollection_index_list.getSelectedValue();
     641                set_default_button.setEnabled(default_index == null || !default_index.equals(selected_index));
     642                if (i > 0) {
     643                    move_up_button.setEnabled(true);                   
     644                }
     645                else {
     646                    move_up_button.setEnabled(false);
     647                }
     648                if (i < size-1){
     649                    move_down_button.setEnabled(true);
     650                }
     651                else {
     652                    move_down_button.setEnabled(false);
     653                }
     654
     655                // Need to fill in the rest of the bits
     656                updateControlsWithSelectedIndex();
     657            }
     658        }
     659
     660
     661        private class SubcollectionIndexListCellRenderer
     662        extends DefaultListCellRenderer
     663        {
     664            /** Return a component that has been configured to display the specified value. */
     665            public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
     666                JLabel component = (JLabel) super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
     667                if (default_index != null && default_index.equals(value)) {
     668                    component.setText(component.getText() + " " + Dictionary.get("CDM.SubcollectionIndexManager.Default_Partition_Indicator"));
     669                }
     670                return component;
     671            }
     672        }
     673    }
    599674}
Note: See TracChangeset for help on using the changeset viewer.