/* * CDDL HEADER START * * The contents of this file are subject to the terms of the * Common Development and Distribution License, Version 1.0 only * (the "License"). You may not use this file except in compliance * with the License. * * You can obtain a copy of the license at * trunk/opends/resource/legal-notices/OpenDS.LICENSE * or https://OpenDS.dev.java.net/OpenDS.LICENSE. * See the License for the specific language governing permissions * and limitations under the License. * * When distributing Covered Code, include this CDDL HEADER in each * file and include the License file at * trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable, * add the following below this CDDL HEADER, with the fields enclosed * by brackets "[]" replaced with your own identifying information: * Portions Copyright [yyyy] [name of copyright owner] * * CDDL HEADER END * * * Copyright 2008 Sun Microsystems, Inc. */ package org.opends.guitools.controlpanel.ui; import static org.opends.messages.AdminToolMessages.*; import java.awt.Component; import java.awt.GridBagConstraints; import java.util.SortedSet; import java.util.TreeSet; import javax.swing.DefaultComboBoxModel; import javax.swing.JComboBox; import javax.swing.JLabel; import javax.swing.SwingUtilities; import org.opends.guitools.controlpanel.datamodel.ObjectClassValue; import org.opends.guitools.controlpanel.datamodel.SortableListModel; import org.opends.guitools.controlpanel.event.ConfigurationChangeEvent; import org.opends.guitools.controlpanel.ui.components.AddRemovePanel; import org.opends.guitools.controlpanel.util.Utilities; import org.opends.messages.Message; import org.opends.server.types.ObjectClass; import org.opends.server.types.ObjectClassType; import org.opends.server.types.Schema; /** * This is the class used to edit the object class of a given entry, it displays * the structural objectclass of the entry and its auxiliary objectclasses. * */ public class ObjectClassEditorPanel extends StatusGenericPanel { private static final long serialVersionUID = 6632731109835897496L; private JComboBox structural; private AddRemovePanel<String> auxiliary; private ObjectClassValue value; private boolean valueChanged; /** * Default constructor. * */ public ObjectClassEditorPanel() { super(); createLayout(); } /** * Sets the object class to be displayed in the panel. * @param value the object class to be displayed in the panel. */ public void setValue(ObjectClassValue value) { this.value = value; String struct = value.getStructural(); if (struct != null) { DefaultComboBoxModel structuralModel = (DefaultComboBoxModel)structural.getModel(); for (int i=0; i<structuralModel.getSize(); i++) { if (struct.equalsIgnoreCase((String)structuralModel.getElementAt(i))) { structural.setSelectedIndex(i); break; } } } SortableListModel<String> availableListModel = auxiliary.getAvailableListModel(); SortableListModel<String> selectedListModel = auxiliary.getSelectedListModel(); availableListModel.addAll(selectedListModel.getData()); selectedListModel.clear(); for (String oc : value.getAuxiliary()) { int index = -1; for (int i=0; i<availableListModel.getSize(); i++) { if (availableListModel.getElementAt(i).equalsIgnoreCase(oc)) { index = i; break; } } if (index != -1) { oc = availableListModel.getElementAt(index); selectedListModel.add(oc); availableListModel.remove(oc); } } selectedListModel.fireContentsChanged( selectedListModel, 0, selectedListModel.getSize()); availableListModel.fireContentsChanged( availableListModel, 0, availableListModel.getSize()); } /** * {@inheritDoc} */ public Component getPreferredFocusComponent() { return structural; } /** * {@inheritDoc} */ public void cancelClicked() { valueChanged = false; super.cancelClicked(); } /** * Returns the object class value displayed by the panel. * @return the object class value displayed by the panel. */ public ObjectClassValue getObjectClassValue() { return value; } /** * {@inheritDoc} */ public void okClicked() { String struct = (String) structural.getSelectedItem(); TreeSet<String> aux = new TreeSet<String>(); aux.addAll(auxiliary.getSelectedListModel().getData()); aux.add("top"); ObjectClassValue newValue = new ObjectClassValue(struct, aux); valueChanged = !newValue.equals(value); value = newValue; Utilities.getParentDialog(this).setVisible(false); } /** * {@inheritDoc} */ public Message getTitle() { return INFO_CTRL_PANEL_EDIT_OBJECTCLASS_TITLE.get(); } /** * {@inheritDoc} */ public void configurationChanged(ConfigurationChangeEvent ev) { final Schema schema = ev.getNewDescriptor().getSchema(); if (schema != null) { final SortedSet<String> auxiliaryOcs = new TreeSet<String>(); final SortedSet<String> structuralOcs = new TreeSet<String>(); for (ObjectClass oc : schema.getObjectClasses().values()) { if (oc.getObjectClassType() == ObjectClassType.AUXILIARY) { if (!oc.getNameOrOID().equals("top")) { auxiliaryOcs.add(oc.getNameOrOID()); } } else if (oc.getObjectClassType() == ObjectClassType.STRUCTURAL) { structuralOcs.add(oc.getNameOrOID()); } } SwingUtilities.invokeLater(new Runnable() { /** * {@inheritDoc} */ public void run() { String currentStruct = (String)structural.getSelectedItem(); SortedSet<String> currentAux; if (currentStruct != null) { currentAux = auxiliary.getSelectedListModel().getData(); } else if (value != null) { // This is to handle the case where the schema is updated after // a value was set. currentStruct = value.getStructural(); currentAux = value.getAuxiliary(); } else { currentAux = new TreeSet<String>(); } SortableListModel<String> availableListModel = auxiliary.getAvailableListModel(); SortableListModel<String> selectedListModel = auxiliary.getSelectedListModel(); DefaultComboBoxModel structuralModel = (DefaultComboBoxModel)structural.getModel(); structuralModel.removeAllElements(); availableListModel.clear(); selectedListModel.clear(); for (String oc : structuralOcs) { structuralModel.addElement(oc); } for (String oc : auxiliaryOcs) { availableListModel.add(oc); } if (currentStruct != null) { structural.setSelectedItem(currentStruct); } for (String oc : currentAux) { availableListModel.remove(oc); selectedListModel.add(oc); } selectedListModel.fireContentsChanged( selectedListModel, 0, selectedListModel.getSize()); availableListModel.fireContentsChanged( availableListModel, 0, availableListModel.getSize()); setEnabledOK(true); } }); } else { updateErrorPane(errorPane, ERR_CTRL_PANEL_SCHEMA_NOT_FOUND_SUMMARY.get(), ColorAndFontConstants.errorTitleFont, ERR_CTRL_PANEL_SCHEMA_NOT_FOUND_DETAILS.get(), ColorAndFontConstants.defaultFont); SwingUtilities.invokeLater(new Runnable() { /** * {@inheritDoc} */ public void run() { setEnabledOK(false); } }); } } /** * Returns <CODE>true</CODE> if the value changed and <CODE>false</CODE> * otherwise. * @return <CODE>true</CODE> if the value changed and <CODE>false</CODE> * otherwise. */ public boolean valueChanged() { return valueChanged; } /** * {@inheritDoc} */ public boolean requiresScroll() { return false; } /** * Creates the layout of the panel (but the contents are not populated here). */ private void createLayout() { GridBagConstraints gbc = new GridBagConstraints(); gbc.gridx = 0; gbc.gridy = 0; gbc.weighty = 0.0; gbc.weightx = 1.0; gbc.fill = GridBagConstraints.BOTH; gbc.gridwidth = 2; addErrorPane(gbc); gbc.gridwidth = 1; gbc.fill = GridBagConstraints.HORIZONTAL; gbc.weightx = 0.0; JLabel l = Utilities.createPrimaryLabel( INFO_CTRL_PANEL_STRUCTURAL_OBJECTCLASS_LABEL.get()); add(l, gbc); gbc.gridx ++; gbc.insets.left = 10; gbc.anchor = GridBagConstraints.WEST; DefaultComboBoxModel model = new DefaultComboBoxModel(); structural = Utilities.createComboBox(); structural.setModel(model); gbc.weightx = 1.0; add(structural, gbc); gbc.gridy ++; gbc.gridwidth = 2; gbc.gridx = 0; gbc.insets.top = 10; gbc.insets.left = 0; l = Utilities.createPrimaryLabel( INFO_CTRL_PANEL_AUXILIARY_OBJECTCLASS_LABEL.get()); add(l, gbc); gbc.gridy ++; gbc.weightx = 1.0; gbc.weighty = 1.0; gbc.fill = GridBagConstraints.BOTH; auxiliary = new AddRemovePanel<String>(String.class); gbc.insets.left = 30; add(auxiliary, gbc); } }