/******************************************************************************* * Copyright (c) 1998, 2015 Oracle and/or its affiliates. All rights reserved. * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0 * which accompanies this distribution. * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html * and the Eclipse Distribution License is available at * http://www.eclipse.org/org/documents/edl-v10.php. * * Contributors: * Oracle - initial API and implementation from Oracle TopLink ******************************************************************************/ package org.eclipse.persistence.tools.workbench.mappingsplugin.ui.mapping.xml; import java.awt.BorderLayout; import java.util.Iterator; import javax.swing.ButtonModel; import javax.swing.ComboBoxModel; import javax.swing.JCheckBox; import javax.swing.JComponent; import org.eclipse.persistence.tools.workbench.framework.context.WorkbenchContextHolder; import org.eclipse.persistence.tools.workbench.framework.ui.chooser.DefaultListChooser; import org.eclipse.persistence.tools.workbench.framework.ui.view.AbstractSubjectPanel; import org.eclipse.persistence.tools.workbench.framework.uitools.GroupBox; import org.eclipse.persistence.tools.workbench.mappingsmodel.descriptor.MWMappingDescriptor; import org.eclipse.persistence.tools.workbench.mappingsmodel.mapping.MWMapping; import org.eclipse.persistence.tools.workbench.mappingsmodel.mapping.xml.MWEisReferenceMapping; import org.eclipse.persistence.tools.workbench.mappingsplugin.ui.common.cell.MappingCellRendererAdapter; import org.eclipse.persistence.tools.workbench.uitools.ComponentEnabler; import org.eclipse.persistence.tools.workbench.uitools.app.*; import org.eclipse.persistence.tools.workbench.uitools.app.swing.CheckBoxModelAdapter; import org.eclipse.persistence.tools.workbench.uitools.app.swing.ComboBoxModelAdapter; import org.eclipse.persistence.tools.workbench.uitools.cell.AdaptableListCellRenderer; import org.eclipse.persistence.tools.workbench.uitools.chooser.ListChooser; //TODO this should not have been copied directly from the ui.mapping.relational bundle! final class MaintainsBidirectionalRelationshipPanel extends AbstractSubjectPanel { MaintainsBidirectionalRelationshipPanel(ValueModel subjectHolder, WorkbenchContextHolder context) { super(new BorderLayout(), subjectHolder, context); } private ButtonModel buildMaintainsBidirectionalityRelationshipCheckBoxAdapter() { return new CheckBoxModelAdapter(buildMaintainsBidirectionalityRelationshipHolder()); } private PropertyValueModel buildMaintainsBidirectionalityRelationshipHolder() { return new PropertyAspectAdapter(getSubjectHolder(), MWEisReferenceMapping.MAINTAINS_BIDIRECTIONAL_RELATIONSHIP_PROPERTY) { protected Object getValueFromSubject() { MWEisReferenceMapping mapping = (MWEisReferenceMapping) subject; return Boolean.valueOf(mapping.maintainsBidirectionalRelationship()); } protected void setValueOnSubject(Object value) { MWEisReferenceMapping mapping = (MWEisReferenceMapping) subject; mapping.setMaintainsBidirectionalRelationship(Boolean.TRUE.equals(value)); } }; } private ListChooser buildRelationshipPartnerChooser() { ListChooser chooser = new DefaultListChooser(this.buildRelationshipPartnerComboAdapter(), this.getWorkbenchContextHolder()); chooser.setRenderer(new AdaptableListCellRenderer(new MappingCellRendererAdapter(this.resourceRepository()))); return chooser; } private CollectionValueModel buildRelationshipPartnerCollectionHolder() { PropertyAspectAdapter referenceDescriptorHolder = new PropertyAspectAdapter(getSubjectHolder(), MWEisReferenceMapping.REFERENCE_DESCRIPTOR_PROPERTY) { protected Object getValueFromSubject() { MWEisReferenceMapping mapping = (MWEisReferenceMapping) subject; return mapping.getReferenceDescriptor(); } }; return new CollectionAspectAdapter(referenceDescriptorHolder, MWMappingDescriptor.MAPPINGS_COLLECTION) { protected Iterator getValueFromSubject() { return ((MWMappingDescriptor) subject).mappings(); } protected int sizeFromSubject() { return ((MWMappingDescriptor) subject).mappingsSize(); } }; } private ComboBoxModel buildRelationshipPartnerComboAdapter() { return new ComboBoxModelAdapter(buildRelationshipPartnerListModel(), buildRelationshipPartnerHolder()); } private PropertyValueModel buildRelationshipPartnerHolder() { return new PropertyAspectAdapter(getSubjectHolder(), MWEisReferenceMapping.RELATIONSHIP_PARTNER_MAPPING_PROPERTY) { protected Object getValueFromSubject() { MWEisReferenceMapping mapping = (MWEisReferenceMapping) subject; return mapping.getRelationshipPartnerMapping(); } protected void setValueOnSubject(Object value) { MWEisReferenceMapping mapping = (MWEisReferenceMapping) subject; mapping.setRelationshipPartnerMapping((MWMapping) value); } }; } private ListValueModel buildRelationshipPartnerListModel() { return new SortedListValueModelAdapter ( new FilteringCollectionValueModel(buildRelationshipPartnerCollectionHolder()) { protected boolean accept(Object value) { return value != subject(); } } ); } protected void initializeLayout() { JCheckBox maintainsBidiRelationshipCheckBox = buildCheckBox ( "MAINTAINS_BIDI_RELATIONSHIP_CHECK_BOX", buildMaintainsBidirectionalityRelationshipCheckBoxAdapter() ); JComponent relationshipPartnerWidgets = buildLabeledComponent ( "MAINTAINS_BIDI_RELATIONSHIP_RELATIONSHIP_PARTNER_CHOOSER", buildRelationshipPartnerChooser() ); new ComponentEnabler(buildMaintainsBidirectionalityRelationshipHolder(), relationshipPartnerWidgets.getComponents()); GroupBox groupBox = new GroupBox(maintainsBidiRelationshipCheckBox, relationshipPartnerWidgets); add(groupBox, BorderLayout.CENTER); addHelpTopicId(this, "mapping.maintainsBidirectionalRelationship"); } }