Changeset 14742

Show
Ignore:
Timestamp:
30.10.2007 15:07:19 (12 years ago)
Author:
anna
Message:

Added SelectAll? and SelectNone? buttons.

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • gli/trunk/src/org/greenstone/gatherer/cdm/SubcollectionIndexManager.java

    r12808 r14742  
    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}