/******************************************************************************* * Copyright (c) 2006, 2011 Oracle. All rights reserved. * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v1.0, which accompanies this distribution * and is available at http://www.eclipse.org/legal/epl-v10.html. * * Contributors: * Oracle - initial API and implementation ******************************************************************************/ package org.eclipse.jpt.jpa.eclipselink.ui.internal.details; import java.util.ArrayList; import org.eclipse.jpt.common.ui.WidgetFactory; import org.eclipse.jpt.common.ui.internal.JptCommonUiMessages; import org.eclipse.jpt.common.ui.internal.util.PaneEnabler; import org.eclipse.jpt.common.ui.internal.util.SWTUtil; import org.eclipse.jpt.common.ui.internal.widgets.Pane; import org.eclipse.jpt.common.utility.Filter; import org.eclipse.jpt.common.utility.internal.StringConverter; import org.eclipse.jpt.common.utility.internal.StringTools; import org.eclipse.jpt.common.utility.internal.model.value.CollectionAspectAdapter; import org.eclipse.jpt.common.utility.internal.model.value.CompositeListValueModel; import org.eclipse.jpt.common.utility.internal.model.value.FilteringCollectionValueModel; import org.eclipse.jpt.common.utility.internal.model.value.ItemPropertyListValueModelAdapter; import org.eclipse.jpt.common.utility.internal.model.value.PropertyAspectAdapter; import org.eclipse.jpt.common.utility.internal.model.value.PropertyListValueModelAdapter; import org.eclipse.jpt.common.utility.internal.model.value.SetCollectionValueModel; import org.eclipse.jpt.common.utility.internal.model.value.SimplePropertyValueModel; import org.eclipse.jpt.common.utility.internal.model.value.SortedListValueModelAdapter; import org.eclipse.jpt.common.utility.internal.model.value.StaticListValueModel; import org.eclipse.jpt.common.utility.internal.model.value.TransformationListValueModel; import org.eclipse.jpt.common.utility.internal.model.value.TransformationPropertyValueModel; import org.eclipse.jpt.common.utility.model.value.CollectionValueModel; import org.eclipse.jpt.common.utility.model.value.ListValueModel; import org.eclipse.jpt.common.utility.model.value.PropertyValueModel; import org.eclipse.jpt.common.utility.model.value.WritablePropertyValueModel; import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkConvert; import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkConverter; import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkCustomConverter; import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkObjectTypeConverter; import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkStructConverter; import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkTypeConverter; import org.eclipse.jpt.jpa.eclipselink.core.context.persistence.EclipseLinkPersistenceUnit; import org.eclipse.osgi.util.NLS; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.widgets.Combo; import org.eclipse.swt.widgets.Composite; /** * Here the layout of this pane: *
 * -----------------------------------------------------------------------------
 * |            -------------------------------------------------------------- |
 * | Enum Type: |                                                          |v| |
 * |            -------------------------------------------------------------- |
 * -----------------------------------------------------------------------------
* * @see EclipseLinkConvert * @see EclipseLinkBasicMappingComposite - A container of this widget * * @version 2.1 * @since 2.1 */ public class EclipseLinkConvertComposite extends Pane { /** * A key used to represent the default value, this is required to convert * the selected item from a combo to an empty string. This key is most * likely never typed the user and it will help to convert the value to * an empty string when it's time to set the new selected value into the * model. */ protected static String DEFAULT_KEY = "?!#!?#?#?default?#?!#?!#?"; //$NON-NLS-1$ /** * Creates a new EnumTypeComposite. */ public EclipseLinkConvertComposite(PropertyValueModel subjectHolder, Composite parent, WidgetFactory widgetFactory) { super(subjectHolder, parent, widgetFactory); } @Override protected void initializeLayout(Composite container) { Combo combo = addLabeledEditableCombo( container, EclipseLinkUiDetailsMessages.EclipseLinkConvertComposite_converterNameLabel, buildConvertNameListHolder(), buildConvertNameHolder(), buildNameConverter(), null ); SWTUtil.attachDefaultValueHandler(combo); Composite subSection = addCollapsibleSubSection( container, EclipseLinkUiDetailsMessages.EclipseLinkConvertComposite_defineConverterSection, new SimplePropertyValueModel(Boolean.FALSE)); // No Converter addRadioButton( subSection, EclipseLinkUiDetailsMessages.EclipseLinkConvertComposite_default, buildNoConverterHolder(), null); PropertyValueModel converterHolder = buildConverterHolder(); // CustomConverter addRadioButton( subSection, EclipseLinkUiDetailsMessages.EclipseLinkConvertComposite_custom, buildConverterHolder(EclipseLinkCustomConverter.class), null); EclipseLinkCustomConverterComposite converterComposite = new EclipseLinkCustomConverterComposite(buildCustomConverterHolder(converterHolder), subSection, getWidgetFactory()); GridData gridData = (GridData) converterComposite.getControl().getLayoutData(); gridData.horizontalIndent = 20; registerSubPane(converterComposite); // Type Converter addRadioButton( subSection, EclipseLinkUiDetailsMessages.EclipseLinkConvertComposite_type, buildConverterHolder(EclipseLinkTypeConverter.class), null); EclipseLinkTypeConverterComposite typeConverterComposite = new EclipseLinkTypeConverterComposite(buildTypeConverterHolder(converterHolder), subSection, getWidgetFactory()); gridData = (GridData) typeConverterComposite.getControl().getLayoutData(); gridData.horizontalIndent = 20; registerSubPane(typeConverterComposite); // Object Type Converter addRadioButton( subSection, EclipseLinkUiDetailsMessages.EclipseLinkConvertComposite_objectType, buildConverterHolder(EclipseLinkObjectTypeConverter.class), null); EclipseLinkObjectTypeConverterComposite objectTypeConverterComposite = new EclipseLinkObjectTypeConverterComposite(buildObjectTypeConverterHolder(converterHolder), subSection, getWidgetFactory()); gridData = (GridData) objectTypeConverterComposite.getControl().getLayoutData(); gridData.horizontalIndent = 20; registerSubPane(objectTypeConverterComposite); // Struct Converter addRadioButton( subSection, EclipseLinkUiDetailsMessages.EclipseLinkConvertComposite_struct, buildConverterHolder(EclipseLinkStructConverter.class), null); EclipseLinkStructConverterComposite structConverterComposite = new EclipseLinkStructConverterComposite(buildStructConverterHolder(converterHolder), subSection, getWidgetFactory()); gridData = (GridData) structConverterComposite.getControl().getLayoutData(); gridData.horizontalIndent = 20; registerSubPane(structConverterComposite); new PaneEnabler(buildBooleanHolder(), this); } protected final WritablePropertyValueModel buildConvertNameHolder() { return new PropertyAspectAdapter(getSubjectHolder(), EclipseLinkConvert.SPECIFIED_CONVERTER_NAME_PROPERTY) { @Override protected String buildValue_() { return this.subject.getSpecifiedConverterName(); } @Override protected void setValue_(String value) { // Convert the default value to the default converter if ((value != null) && (value.startsWith(DEFAULT_KEY))) { value = EclipseLinkConvert.DEFAULT_CONVERTER_NAME; } this.subject.setSpecifiedConverterName(value); } }; } private ListValueModel buildConvertNameListHolder() { java.util.List> list = new ArrayList>(); list.add(buildDefaultNameListHolder()); list.add(buildReservedConverterNameListHolder()); list.add(buildSortedConverterNamesModel()); return new CompositeListValueModel, String>(list); } protected ListValueModel buildDefaultNameListHolder() { return new PropertyListValueModelAdapter( buildDefaultNameHolder() ); } private WritablePropertyValueModel buildDefaultNameHolder() { return new PropertyAspectAdapter(getSubjectHolder(), EclipseLinkConvert.DEFAULT_CONVERTER_NAME_PROPERTY) { @Override protected String buildValue_() { String name = this.subject.getDefaultConverterName(); if (name == null) { name = DEFAULT_KEY; } else { name = DEFAULT_KEY + name; } return name; } }; } private StringConverter buildNameConverter() { return new StringConverter() { public String convertToString(String value) { if (getSubject() == null) { return value; } if (value == null) { value = getSubject().getDefaultConverterName(); if (value != null) { value = DEFAULT_KEY + value; } else { value = DEFAULT_KEY; } } if (value.startsWith(DEFAULT_KEY)) { String defaultName = value.substring(DEFAULT_KEY.length()); if (defaultName.length() > 0) { value = NLS.bind( JptCommonUiMessages.DefaultWithOneParam, defaultName ); } else { value = NLS.bind( JptCommonUiMessages.DefaultWithOneParam, EclipseLinkConvert.NO_CONVERTER ); } } return value; } }; } protected ListValueModel buildReservedConverterNameListHolder() { return new StaticListValueModel(EclipseLinkConvert.RESERVED_CONVERTER_NAMES); } protected ListValueModel buildSortedConverterNamesModel() { return new SortedListValueModelAdapter(this.buildUniqueConverterNamesModel()); } protected CollectionValueModel buildUniqueConverterNamesModel() { return new SetCollectionValueModel(this.buildConverterNamesModel()); } protected CollectionValueModel buildConverterNamesModel() { return new FilteringCollectionValueModel(this.buildConverterNamesModel_(), NON_EMPTY_STRING_FILTER); } protected static final Filter NON_EMPTY_STRING_FILTER = new Filter() { public boolean accept(String string) { return StringTools.stringIsNotEmpty(string); } }; protected ListValueModel buildConverterNamesModel_() { return new TransformationListValueModel(this.buildConvertersModel()) { @Override protected String transformItem_(EclipseLinkConverter converter) { return converter.getName(); } }; } protected ListValueModel buildConvertersModel() { return new ItemPropertyListValueModelAdapter(this.buildConvertersModel_(), EclipseLinkConverter.NAME_PROPERTY); } protected CollectionValueModel buildConvertersModel_() { return new CollectionAspectAdapter(this.buildPersistenceUnitHolder(), EclipseLinkPersistenceUnit.CONVERTERS_COLLECTION) { @Override protected Iterable getIterable() { return this.subject.getConverters(); } @Override protected int size_() { return this.subject.getConvertersSize(); } }; } protected PropertyValueModel buildPersistenceUnitHolder() { return new PropertyAspectAdapter(getSubjectHolder()) { @Override protected EclipseLinkPersistenceUnit buildValue_() { return (EclipseLinkPersistenceUnit) this.subject.getPersistenceUnit(); } }; } private WritablePropertyValueModel buildNoConverterHolder() { return new PropertyAspectAdapter(getSubjectHolder(), EclipseLinkConvert.CONVERTER_PROPERTY) { @Override protected Boolean buildValue_() { return Boolean.valueOf(this.subject.getConverter() == null); } @Override protected void setValue_(Boolean value) { if (value.booleanValue()) { this.subject.setConverter(null); } } }; } private WritablePropertyValueModel buildConverterHolder(final Class converterType) { return new PropertyAspectAdapter(getSubjectHolder(), EclipseLinkConvert.CONVERTER_PROPERTY) { @Override protected Boolean buildValue_() { EclipseLinkConverter converter = this.subject.getConverter(); boolean result = ((converter != null) && (converter.getType() == converterType)); return Boolean.valueOf(result); } @Override protected void setValue_(Boolean value) { if (value.booleanValue()) { this.subject.setConverter(converterType); } } }; } private PropertyValueModel buildConverterHolder() { return new PropertyAspectAdapter(getSubjectHolder(), EclipseLinkConvert.CONVERTER_PROPERTY) { @Override protected EclipseLinkConverter buildValue_() { return this.subject.getConverter(); } }; } private PropertyValueModel buildCustomConverterHolder(PropertyValueModel converterHolder) { return new TransformationPropertyValueModel(converterHolder) { @Override protected EclipseLinkCustomConverter transform_(EclipseLinkConverter converter) { return (converter != null && converter.getType() == EclipseLinkCustomConverter.class) ? (EclipseLinkCustomConverter) converter : null; } }; } private PropertyValueModel buildTypeConverterHolder(PropertyValueModel converterHolder) { return new TransformationPropertyValueModel(converterHolder) { @Override protected EclipseLinkTypeConverter transform_(EclipseLinkConverter converter) { return (converter != null && converter.getType() == EclipseLinkTypeConverter.class) ? (EclipseLinkTypeConverter) converter : null; } }; } private PropertyValueModel buildObjectTypeConverterHolder(PropertyValueModel converterHolder) { return new TransformationPropertyValueModel(converterHolder) { @Override protected EclipseLinkObjectTypeConverter transform_(EclipseLinkConverter converter) { return (converter != null && converter.getType() == EclipseLinkObjectTypeConverter.class) ? (EclipseLinkObjectTypeConverter) converter : null; } }; } private PropertyValueModel buildStructConverterHolder(PropertyValueModel converterHolder) { return new TransformationPropertyValueModel(converterHolder) { @Override protected EclipseLinkStructConverter transform_(EclipseLinkConverter converter) { return (converter != null && converter.getType() == EclipseLinkStructConverter.class) ? (EclipseLinkStructConverter) converter : null; } }; } protected PropertyValueModel buildBooleanHolder() { return new TransformationPropertyValueModel(getSubjectHolder()) { @Override protected Boolean transform(EclipseLinkConvert value) { if (getSubject() != null && getSubject().getParent().getPersistentAttribute().isVirtual()) { return Boolean.FALSE; } return Boolean.valueOf(value != null); } }; } }