Changeset 14742
- Timestamp:
- 2007-10-30T15:07:19+13:00 (17 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
gli/trunk/src/org/greenstone/gatherer/cdm/SubcollectionIndexManager.java
r12808 r14742 47 47 */ 48 48 public class SubcollectionIndexManager 49 49 extends DOMProxyListModel 50 50 { 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 228 144 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 245 245 extends JPanel 246 246 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 } 488 450 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 } 548 591 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 } 556 601 } 557 602 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 } 599 674 }
Note:
See TracChangeset
for help on using the changeset viewer.