diff options
Diffstat (limited to 'jpa')
8 files changed, 935 insertions, 251 deletions
diff --git a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/mappings/details/EmbeddedAttributeOverridesComposite.java b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/mappings/details/EmbeddedAttributeOverridesComposite.java index f29571e634..478d7e8722 100644 --- a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/mappings/details/EmbeddedAttributeOverridesComposite.java +++ b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/mappings/details/EmbeddedAttributeOverridesComposite.java @@ -27,12 +27,12 @@ import org.eclipse.jpt.ui.internal.widgets.AbstractFormPane; import org.eclipse.jpt.ui.internal.widgets.AddRemoveListPane; import org.eclipse.jpt.ui.internal.widgets.AddRemovePane.Adapter; import org.eclipse.jpt.utility.internal.StringTools; +import org.eclipse.jpt.utility.internal.model.value.CachingTransformationWritablePropertyValueModel; import org.eclipse.jpt.utility.internal.model.value.CompositeListValueModel; import org.eclipse.jpt.utility.internal.model.value.ItemPropertyListValueModelAdapter; import org.eclipse.jpt.utility.internal.model.value.ListAspectAdapter; import org.eclipse.jpt.utility.internal.model.value.SimplePropertyValueModel; import org.eclipse.jpt.utility.internal.model.value.TransformationPropertyValueModel; -import org.eclipse.jpt.utility.internal.model.value.TransformationWritablePropertyValueModel; import org.eclipse.jpt.utility.internal.model.value.swing.ObjectListSelectionModel; import org.eclipse.jpt.utility.model.value.ListValueModel; import org.eclipse.jpt.utility.model.value.PropertyValueModel; @@ -70,6 +70,8 @@ public class EmbeddedAttributeOverridesComposite extends AbstractFormPane<BaseEm { private WritablePropertyValueModel<AttributeOverride> selectedAttributeOverrideHolder; + private WritablePropertyValueModel<Boolean> overrideVirtualAttributeOverrideHolder; + /** * Creates a new <code>EmbeddedAttributeOverridesComposite</code>. * @@ -96,6 +98,87 @@ public class EmbeddedAttributeOverridesComposite extends AbstractFormPane<BaseEm super(subjectHolder, parent, widgetFactory); } + @Override + protected void initialize() { + super.initialize(); + this.selectedAttributeOverrideHolder = buildAttributeOverrideHolder(); + } + + private AddRemoveListPane<BaseEmbeddedMapping> initializeAttributeOverridesList(Composite container) { + + return new AddRemoveListPane<BaseEmbeddedMapping>( + this, + buildSubPane(container, 8), + buildAttributeOverridesAdapter(), + buildAttributeOverridesListModel(), + this.selectedAttributeOverrideHolder, + buildAttributeOverrideLabelProvider(), + JpaHelpContextIds.MAPPING_EMBEDDED_ATTRIBUTE_OVERRIDES + ) + { + @Override + protected void initializeButtonPane(Composite container, String helpId) { + } + + @Override + protected void updateButtons() { + } + }; + } + + @Override + protected void initializeLayout(Composite container) { + + // Attribute Overrides group box + container = buildTitledPane( + container, + JptUiMappingsMessages.AttributeOverridesComposite_attributeOverrides + ); + + // Attribute Overrides list + initializeAttributeOverridesList(container); + + // Property pane + initializePropertyPane(buildSubPane(container, 5, 0)); + } + + private void initializePropertyPane(Composite container) { + + // Override Default check box + Button overrideDefaultButton = buildCheckBox( + buildSubPane(container, 0, groupBoxMargin()), + JptUiMappingsMessages.AttributeOverridesComposite_overrideDefault, + getOverrideVirtualAttributeOverrideHolder() + ); + + removeFromEnablementControl(overrideDefaultButton); + installOverrideDefaultButtonEnabler(overrideDefaultButton); + + // Column widgets + ColumnComposite columnComposite = new ColumnComposite( + this, + buildColumnHolder(this.selectedAttributeOverrideHolder), + container + ); + + installColumnCompositeEnabler(columnComposite); + removeFromEnablementControl(columnComposite.getControl()); + } + + private void installColumnCompositeEnabler(ColumnComposite columnComposite) { + new PaneEnabler( + getOverrideVirtualAttributeOverrideHolder(), + columnComposite + ); + } + + private void installOverrideDefaultButtonEnabler(Button overrideDefaultButton) { + new ControlEnabler( + buildOverrideVirtualAttributeOverrideEnablerHolder(), + overrideDefaultButton + ); + } + private WritablePropertyValueModel<AttributeOverride> buildAttributeOverrideHolder() { return new SimplePropertyValueModel<AttributeOverride>(); } @@ -123,7 +206,7 @@ public class EmbeddedAttributeOverridesComposite extends AbstractFormPane<BaseEm private ListValueModel<AttributeOverride> buildAttributeOverridesListHolder() { List<ListValueModel<AttributeOverride>> list = new ArrayList<ListValueModel<AttributeOverride>>(); list.add(buildSpecifiedAttributeOverridesListHolder()); - list.add(buildDefaultAttributeOverridesListHolder()); + list.add(buildVirtualAttributeOverridesListHolder()); return new CompositeListValueModel<ListValueModel<AttributeOverride>, AttributeOverride>(list); } @@ -143,7 +226,7 @@ public class EmbeddedAttributeOverridesComposite extends AbstractFormPane<BaseEm }; } - private ListValueModel<AttributeOverride> buildDefaultAttributeOverridesListHolder() { + private ListValueModel<AttributeOverride> buildVirtualAttributeOverridesListHolder() { return new ListAspectAdapter<BaseEmbeddedMapping, AttributeOverride>( this.getSubjectHolder(), BaseEmbeddedMapping.VIRTUAL_ATTRIBUTE_OVERRIDES_LIST) @@ -160,7 +243,7 @@ public class EmbeddedAttributeOverridesComposite extends AbstractFormPane<BaseEm }; } - private PropertyValueModel<Boolean> buildOverrideDefaultAttributeOverrideEnablerHolder() { + private PropertyValueModel<Boolean> buildOverrideVirtualAttributeOverrideEnablerHolder() { return new TransformationPropertyValueModel<AttributeOverride, Boolean>(this.selectedAttributeOverrideHolder) { @Override protected Boolean transform(AttributeOverride value) { @@ -169,8 +252,15 @@ public class EmbeddedAttributeOverridesComposite extends AbstractFormPane<BaseEm }; } - private WritablePropertyValueModel<Boolean> buildOverrideDefaultAttributeOverrideHolder() { - return new TransformationWritablePropertyValueModel<AttributeOverride, Boolean>(this.selectedAttributeOverrideHolder) { + protected WritablePropertyValueModel<Boolean> getOverrideVirtualAttributeOverrideHolder() { + if (this.overrideVirtualAttributeOverrideHolder == null) { + this.overrideVirtualAttributeOverrideHolder = buildOverrideVirtualAttributeOverrideHolder(); + } + return this.overrideVirtualAttributeOverrideHolder; + } + + private WritablePropertyValueModel<Boolean> buildOverrideVirtualAttributeOverrideHolder() { + return new CachingTransformationWritablePropertyValueModel<AttributeOverride, Boolean>(this.selectedAttributeOverrideHolder) { @Override public void setValue(Boolean value) { updateAttributeOverride(value); @@ -214,92 +304,6 @@ public class EmbeddedAttributeOverridesComposite extends AbstractFormPane<BaseEm }; } - /* - * (non-Javadoc) - */ - @Override - protected void initialize() { - super.initialize(); - this.selectedAttributeOverrideHolder = buildAttributeOverrideHolder(); - } - - private AddRemoveListPane<BaseEmbeddedMapping> initializeAttributeOverridesList(Composite container) { - - return new AddRemoveListPane<BaseEmbeddedMapping>( - this, - buildSubPane(container, 8), - buildAttributeOverridesAdapter(), - buildAttributeOverridesListModel(), - this.selectedAttributeOverrideHolder, - buildAttributeOverrideLabelProvider(), - JpaHelpContextIds.MAPPING_EMBEDDED_ATTRIBUTE_OVERRIDES - ) - { - @Override - protected void initializeButtonPane(Composite container, String helpId) { - } - - @Override - protected void updateButtons() { - } - }; - } - - /* - * (non-Javadoc) - */ - @Override - protected void initializeLayout(Composite container) { - - // Attribute Overrides group box - container = buildTitledPane( - container, - JptUiMappingsMessages.AttributeOverridesComposite_attributeOverrides - ); - - // Attribute Overrides list - initializeAttributeOverridesList(container); - - // Property pane - initializePropertyPane(buildSubPane(container, 5, 0)); - } - - private void initializePropertyPane(Composite container) { - - // Override Default check box - Button overrideDefaultButton = buildCheckBox( - buildSubPane(container, 0, groupBoxMargin()), - JptUiMappingsMessages.AttributeOverridesComposite_overrideDefault, - buildOverrideDefaultAttributeOverrideHolder() - ); - - removeFromEnablementControl(overrideDefaultButton); - installOverrideDefaultButtonEnabler(overrideDefaultButton); - - // Column widgets - ColumnComposite columnComposite = new ColumnComposite( - this, - buildColumnHolder(this.selectedAttributeOverrideHolder), - container - ); - - installColumnCompositeEnabler(columnComposite); - removeFromEnablementControl(columnComposite.getControl()); - } - - private void installColumnCompositeEnabler(ColumnComposite columnComposite) { - new PaneEnabler( - buildOverrideDefaultAttributeOverrideHolder(), - columnComposite - ); - } - - private void installOverrideDefaultButtonEnabler(Button overrideDefaultButton) { - new ControlEnabler( - buildOverrideDefaultAttributeOverrideEnablerHolder(), - overrideDefaultButton - ); - } private void updateAttributeOverride(boolean selected) { diff --git a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/mappings/details/OverridesComposite.java b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/mappings/details/OverridesComposite.java index 43bc625147..9c3a55f5b8 100644 --- a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/mappings/details/OverridesComposite.java +++ b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/mappings/details/OverridesComposite.java @@ -32,6 +32,7 @@ import org.eclipse.jpt.ui.internal.widgets.PostExecution; import org.eclipse.jpt.ui.internal.widgets.AddRemovePane.Adapter; import org.eclipse.jpt.utility.internal.StringTools; import org.eclipse.jpt.utility.internal.Transformer; +import org.eclipse.jpt.utility.internal.model.value.CachingTransformationWritablePropertyValueModel; import org.eclipse.jpt.utility.internal.model.value.CompositeListValueModel; import org.eclipse.jpt.utility.internal.model.value.ItemPropertyListValueModelAdapter; import org.eclipse.jpt.utility.internal.model.value.ListAspectAdapter; @@ -82,7 +83,9 @@ public class OverridesComposite extends AbstractFormPane<Entity> { private Composite columnPane; private Composite joinColumnsPane; - private WritablePropertyValueModel<BaseOverride> overrideHolder; + private WritablePropertyValueModel<BaseOverride> selectedOverrideHolder; + private WritablePropertyValueModel<Boolean> overrideVirtualAttributeOverrideHolder; + private WritablePropertyValueModel<Boolean> overrideVirtualAssociationOverrideHolder; /** * Creates a new <code>OverridesComposite</code>. @@ -110,21 +113,142 @@ public class OverridesComposite extends AbstractFormPane<Entity> super(subjectHolder, parent, widgetFactory); } - private void addJoinColumn(AssociationOverride subject) { + @Override + protected void initialize() { + super.initialize(); + this.selectedOverrideHolder = buildSelectedOverrideHolder(); + } - JoinColumnInAssociationOverrideDialog dialog = - new JoinColumnInAssociationOverrideDialog(shell(), subject, null); + private WritablePropertyValueModel<BaseOverride> buildSelectedOverrideHolder() { + return new SimplePropertyValueModel<BaseOverride>(); + } - dialog.openDialog(buildAddJoinColumnPostExecution()); + + @Override + protected void initializeLayout(Composite container) { + + // Overrides group pane + container = buildTitledPane( + container, + JptUiMappingsMessages.AttributeOverridesComposite_attributeOverrides + ); + + // Overrides list pane + initializeOverridesList(container); + + // Property pane + PageBook pageBook = buildPageBook(container); + initializeJoinColumnsPane(pageBook); + initializeColumnPane(pageBook); + installOverrideControlSwitcher(this.selectedOverrideHolder, pageBook); } - private void addJoinColumn(JoinColumnInAssociationOverrideStateObject stateObject) { + private AddRemoveListPane<Entity> initializeOverridesList(Composite container) { - AssociationOverride associationOverride = stateObject.getOwner(); - int index = associationOverride.specifiedJoinColumnsSize(); + return new AddRemoveListPane<Entity>( + this, + buildSubPane(container, 8), + buildOverridesAdapter(), + buildOverridesListModel(), + this.selectedOverrideHolder, + buildOverrideLabelProvider(), + JpaHelpContextIds.ENTITY_ATTRIBUTE_OVERRIDES + ) + { + @Override + protected void initializeButtonPane(Composite container, String helpId) { + } - JoinColumn joinColumn = associationOverride.addSpecifiedJoinColumn(index); - stateObject.updateJoinColumn(joinColumn); + @Override + protected void updateButtons() { + } + }; + } + + private void initializeColumnPane(PageBook pageBook) { + + int groupBoxMargin = groupBoxMargin(); + this.columnPane = buildSubPane(pageBook, 5); + + // Override Default check box + buildCheckBox( + buildSubPane(this.columnPane, 0, groupBoxMargin, 0, groupBoxMargin), + JptUiMappingsMessages.AttributeOverridesComposite_overrideDefault, + getOverrideVirtualAttributeOverrideHolder() + ); + + // Column widgets (for IOverrideAttribute) + ColumnComposite columnComposite = new ColumnComposite( + this, + buildColumnHolder(buildAttributeOverrideHolder()), + this.columnPane, + false + ); + + this.columnPane.setVisible(false); + installColumnsPaneEnabler(columnComposite); + } + + private void installColumnsPaneEnabler(ColumnComposite pane) { + new PaneEnabler( + getOverrideVirtualAttributeOverrideHolder(), + pane + ); + } + + private void initializeJoinColumnsPane(PageBook pageBook) { + + this.joinColumnsPane = buildSubPane(pageBook); + + // Override Default check box + buildCheckBox( + buildSubPane(this.joinColumnsPane, 5, groupBoxMargin()), + JptUiMappingsMessages.AttributeOverridesComposite_overrideDefault, + getOverrideVirtualAssociationOverrideHolder() + ); + + Group joinColumnsGroupPane = buildTitledPane( + this.joinColumnsPane, + JptUiMappingsMessages.OverridesComposite_joinColumn + ); + + // Join Columns list pane (for IOverrideAssociation) + JoinColumnsComposite<AssociationOverride> joinColumnsComposite = + new JoinColumnsComposite<AssociationOverride>( + this, + buildAssociationOverrideHolder(), + joinColumnsGroupPane, + buildJoinColumnsEditor(), + false + ); + + this.joinColumnsPane.setVisible(false); + installJoinColumnsPaneEnabler(joinColumnsComposite); + } + + private void installJoinColumnsPaneEnabler(JoinColumnsComposite<AssociationOverride> pane) { + new PaneEnabler( + getOverrideVirtualAssociationOverrideHolder(), + pane + ); + } + + private void installOverrideControlSwitcher(PropertyValueModel<BaseOverride> overrideHolder, + PageBook pageBook) { + + new ControlSwitcher( + overrideHolder, + buildPaneTransformer(), + pageBook + ); + } + + private void addJoinColumn(AssociationOverride subject) { + + JoinColumnInAssociationOverrideDialog dialog = + new JoinColumnInAssociationOverrideDialog(shell(), subject, null); + + dialog.openDialog(buildAddJoinColumnPostExecution()); } private PostExecution<JoinColumnInAssociationOverrideDialog> buildAddJoinColumnPostExecution() { @@ -137,8 +261,17 @@ public class OverridesComposite extends AbstractFormPane<Entity> }; } + private void addJoinColumn(JoinColumnInAssociationOverrideStateObject stateObject) { + + AssociationOverride associationOverride = stateObject.getOwner(); + int index = associationOverride.specifiedJoinColumnsSize(); + + JoinColumn joinColumn = associationOverride.addSpecifiedJoinColumn(index); + stateObject.updateJoinColumn(joinColumn); + } + private WritablePropertyValueModel<AssociationOverride> buildAssociationOverrideHolder() { - return new TransformationWritablePropertyValueModel<BaseOverride, AssociationOverride>(overrideHolder) { + return new TransformationWritablePropertyValueModel<BaseOverride, AssociationOverride>(this.selectedOverrideHolder) { @Override protected AssociationOverride transform_(BaseOverride value) { return (value instanceof AssociationOverride) ? (AssociationOverride) value : null; @@ -147,7 +280,7 @@ public class OverridesComposite extends AbstractFormPane<Entity> } private WritablePropertyValueModel<AttributeOverride> buildAttributeOverrideHolder() { - return new TransformationWritablePropertyValueModel<BaseOverride, AttributeOverride>(overrideHolder) { + return new TransformationWritablePropertyValueModel<BaseOverride, AttributeOverride>(this.selectedOverrideHolder) { @Override protected AttributeOverride transform_(BaseOverride value) { return (value instanceof AttributeOverride) ? (AttributeOverride) value : null; @@ -168,12 +301,12 @@ public class OverridesComposite extends AbstractFormPane<Entity> return new ListAspectAdapter<Entity, AssociationOverride>(getSubjectHolder(), Entity.VIRTUAL_ASSOCIATION_OVERRIDES_LIST) { @Override protected ListIterator<AssociationOverride> listIterator_() { - return subject.virtualAssociationOverrides(); + return this.subject.virtualAssociationOverrides(); } @Override protected int size_() { - return subject.virtualAssociationOverridesSize(); + return this.subject.virtualAssociationOverridesSize(); } }; } @@ -182,12 +315,12 @@ public class OverridesComposite extends AbstractFormPane<Entity> return new ListAspectAdapter<Entity, AttributeOverride>(getSubjectHolder(), Entity.VIRTUAL_ATTRIBUTE_OVERRIDES_LIST) { @Override protected ListIterator<AttributeOverride> listIterator_() { - return subject.virtualAttributeOverrides(); + return this.subject.virtualAttributeOverrides(); } @Override protected int size_() { - return subject.virtualAttributeOverridesSize(); + return this.subject.virtualAttributeOverridesSize(); } }; } @@ -206,8 +339,15 @@ public class OverridesComposite extends AbstractFormPane<Entity> return new JoinColumnsProvider(); } - private WritablePropertyValueModel<Boolean> buildOverrideDefaultAssociationOverrideHolder() { - return new TransformationWritablePropertyValueModel<AssociationOverride, Boolean>(buildAssociationOverrideHolder()) { + protected WritablePropertyValueModel<Boolean> getOverrideVirtualAssociationOverrideHolder() { + if (this.overrideVirtualAssociationOverrideHolder == null) { + this.overrideVirtualAssociationOverrideHolder = buildOverrideVirtualAssociationOverrideHolder(); + } + return this.overrideVirtualAssociationOverrideHolder; + } + + private WritablePropertyValueModel<Boolean> buildOverrideVirtualAssociationOverrideHolder() { + return new CachingTransformationWritablePropertyValueModel<AssociationOverride, Boolean>(buildAssociationOverrideHolder()) { @Override public void setValue(Boolean value) { updateOverride(value); @@ -220,8 +360,16 @@ public class OverridesComposite extends AbstractFormPane<Entity> }; } - private WritablePropertyValueModel<Boolean> buildOverrideDefaultAttributeOverrideHolder() { - return new TransformationWritablePropertyValueModel<AttributeOverride, Boolean>(buildAttributeOverrideHolder()) { + protected WritablePropertyValueModel<Boolean> getOverrideVirtualAttributeOverrideHolder() { + if (this.overrideVirtualAttributeOverrideHolder == null) { + this.overrideVirtualAttributeOverrideHolder = buildOverrideVirtualAttributeOverrideHolder(); + } + return this.overrideVirtualAttributeOverrideHolder; + } + + + private WritablePropertyValueModel<Boolean> buildOverrideVirtualAttributeOverrideHolder() { + return new CachingTransformationWritablePropertyValueModel<AttributeOverride, Boolean>(buildAttributeOverrideHolder()) { @Override public void setValue(Boolean value) { updateOverride(value); @@ -261,10 +409,6 @@ public class OverridesComposite extends AbstractFormPane<Entity> return sb.toString(); } - private WritablePropertyValueModel<BaseOverride> buildOverrideHolder() { - return new SimplePropertyValueModel<BaseOverride>(); - } - private ILabelProvider buildOverrideLabelProvider() { return new LabelProvider() { @Override @@ -351,7 +495,7 @@ public class OverridesComposite extends AbstractFormPane<Entity> JoinColumnInAssociationOverrideDialog dialog = new JoinColumnInAssociationOverrideDialog( shell(), - (AssociationOverride) overrideHolder.getValue(), + (AssociationOverride) this.selectedOverrideHolder.getValue(), joinColumn ); @@ -362,136 +506,6 @@ public class OverridesComposite extends AbstractFormPane<Entity> stateObject.updateJoinColumn(stateObject.getJoinColumn()); } - /* - * (non-Javadoc) - */ - @Override - protected void initialize() { - super.initialize(); - overrideHolder = buildOverrideHolder(); - } - - private void initializeColumnPane(PageBook pageBook) { - - int groupBoxMargin = groupBoxMargin(); - columnPane = buildSubPane(pageBook, 5); - - // Override Default check box - buildCheckBox( - buildSubPane(columnPane, 0, groupBoxMargin, 0, groupBoxMargin), - JptUiMappingsMessages.AttributeOverridesComposite_overrideDefault, - buildOverrideDefaultAttributeOverrideHolder() - ); - - // Column widgets (for IOverrideAttribute) - ColumnComposite columnComposite = new ColumnComposite( - this, - buildColumnHolder(buildAttributeOverrideHolder()), - columnPane, - false - ); - - columnPane.setVisible(false); - installColumnsPaneEnabler(columnComposite); - } - - private void initializeJoinColumnsPane(PageBook pageBook) { - - joinColumnsPane = buildSubPane(pageBook); - - // Override Default check box - buildCheckBox( - buildSubPane(joinColumnsPane, 5, groupBoxMargin()), - JptUiMappingsMessages.AttributeOverridesComposite_overrideDefault, - buildOverrideDefaultAssociationOverrideHolder() - ); - - Group joinColumnsGroupPane = buildTitledPane( - joinColumnsPane, - JptUiMappingsMessages.OverridesComposite_joinColumn - ); - - // Join Columns list pane (for IOverrideAssociation) - JoinColumnsComposite<AssociationOverride> joinColumnsComposite = - new JoinColumnsComposite<AssociationOverride>( - this, - buildAssociationOverrideHolder(), - joinColumnsGroupPane, - buildJoinColumnsEditor(), - false - ); - - joinColumnsPane.setVisible(false); - installJoinColumnsPaneEnabler(joinColumnsComposite); - } - - /* - * (non-Javadoc) - */ - @Override - protected void initializeLayout(Composite container) { - - // Overrides group pane - container = buildTitledPane( - container, - JptUiMappingsMessages.AttributeOverridesComposite_attributeOverrides - ); - - // Overrides list pane - initializeOverridesList(container); - - // Property pane - PageBook pageBook = buildPageBook(container); - initializeJoinColumnsPane(pageBook); - initializeColumnPane(pageBook); - installOverrideControlSwitcher(overrideHolder, pageBook); - } - - private AddRemoveListPane<Entity> initializeOverridesList(Composite container) { - - return new AddRemoveListPane<Entity>( - this, - buildSubPane(container, 8), - buildOverridesAdapter(), - buildOverridesListModel(), - overrideHolder, - buildOverrideLabelProvider(), - JpaHelpContextIds.ENTITY_ATTRIBUTE_OVERRIDES - ) - { - @Override - protected void initializeButtonPane(Composite container, String helpId) { - } - - @Override - protected void updateButtons() { - } - }; - } - - private void installColumnsPaneEnabler(ColumnComposite pane) { - new PaneEnabler( - buildOverrideDefaultAttributeOverrideHolder(), - pane - ); - } - - private void installJoinColumnsPaneEnabler(JoinColumnsComposite<AssociationOverride> pane) { - new PaneEnabler( - buildOverrideDefaultAssociationOverrideHolder(), - pane - ); - } - - private void installOverrideControlSwitcher(PropertyValueModel<BaseOverride> overrideHolder, - PageBook pageBook) { - - new ControlSwitcher( - overrideHolder, - buildPaneTransformer(), - pageBook - ); - } private void updateOverride(boolean selected) { @@ -502,10 +516,10 @@ public class OverridesComposite extends AbstractFormPane<Entity> setPopulating(true); try { - BaseOverride override = overrideHolder.getValue(); + BaseOverride override = this.selectedOverrideHolder.getValue(); BaseOverride newOverride = override.setVirtual(!selected); - overrideHolder.setValue(newOverride); + this.selectedOverrideHolder.setValue(newOverride); } finally { setPopulating(false); diff --git a/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/model/value/CachingTransformationPropertyValueModel.java b/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/model/value/CachingTransformationPropertyValueModel.java new file mode 100644 index 0000000000..3f584aa496 --- /dev/null +++ b/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/model/value/CachingTransformationPropertyValueModel.java @@ -0,0 +1,96 @@ +/******************************************************************************* + * Copyright (c) 2007, 2008 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.utility.internal.model.value; + +import org.eclipse.jpt.utility.internal.Transformer; +import org.eclipse.jpt.utility.model.value.PropertyValueModel; + +/** + * A <code>CachingTransformationPropertyValueModel</code> wraps another + * <code>PropertyValueModel</code> and uses a <code>Transformer</code> + * to transform the wrapped value before it is returned by <code>value()</code>. + * It also caches the value so that a transform is not done on the oldValue when + * firing a property change event. + * <p> + * As an alternative to building a <code>Transformer</code>, + * a subclass of <code>CachingTransformationPropertyValueModel</code> can + * either override the <code>transform_(Object)</code> method or, + * if something other than null should be returned when the wrapped value + * is null, override the <code>transform(Object)</code> method. + */ +public class CachingTransformationPropertyValueModel<T1, T2> + extends TransformationPropertyValueModel<T1, T2> + implements PropertyValueModel<T2> +{ + + /** + * Cache the transformed value so that during property change event notification + * we do not have to transform the value. The oldValue could no longer be valid in + * the model, thus transforming it would not be valid. + */ + protected T2 cachedValue; + + // ********** constructors/initialization ********** + + /** + * Construct a property value model with the specified nested + * property value model and the default transformer. + * Use this constructor if you want to override the + * <code>transform_(Object)</code> or <code>transform(Object)</code> + * method instead of building a <code>Transformer</code>. + */ + public CachingTransformationPropertyValueModel(PropertyValueModel<? extends T1> valueHolder) { + super(valueHolder); + } + + /** + * Construct an property value model with the specified nested + * property value model and transformer. + */ + public CachingTransformationPropertyValueModel(PropertyValueModel<? extends T1> valueHolder, Transformer<T1, T2> transformer) { + super(valueHolder, transformer); + } + + // ********** behavior ********** + + @Override + protected void engageValueHolder() { + super.engageValueHolder(); + this.cachedValue = this.transform(this.valueHolder.getValue()); + } + + @Override + protected void disengageValueHolder() { + super.disengageValueHolder(); + this.cachedValue = null; + } + + @Override + public T2 getValue() { + return this.cachedValue; + } + + /** + * Transform the new value, caching it before returning it + */ + @Override + protected T2 transformNew(T1 value) { + this.cachedValue = super.transformNew(value); + return this.cachedValue; + }; + + /** + * no transformation, just return the cachedValue which is already transformed + */ + @Override + protected T2 transformOld(T1 value) { + return this.cachedValue; + } +} diff --git a/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/model/value/CachingTransformationWritablePropertyValueModel.java b/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/model/value/CachingTransformationWritablePropertyValueModel.java new file mode 100644 index 0000000000..1d97e46fca --- /dev/null +++ b/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/model/value/CachingTransformationWritablePropertyValueModel.java @@ -0,0 +1,84 @@ +/******************************************************************************* + * Copyright (c) 2007, 2008 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.utility.internal.model.value; + +import org.eclipse.jpt.utility.internal.BidiTransformer; +import org.eclipse.jpt.utility.model.value.PropertyValueModel; +import org.eclipse.jpt.utility.model.value.WritablePropertyValueModel; + +/** + * A <code>TransformationPropertyValueModel</code> wraps another + * <code>PropertyValueModel</code> and uses a <code>Transformer</code> + * to transform the wrapped value before it is returned by <code>value()</code>. + * <p> + * As an alternative to building a <code>Transformer</code>, + * a subclass of <code>TransformationPropertyValueModel</code> can + * either override the <code>transform_(Object)</code> method or, + * if something other than null should be returned when the wrapped value + * is null, override the <code>transform(Object)</code> method. + */ +public class CachingTransformationWritablePropertyValueModel<T1, T2> + extends TransformationWritablePropertyValueModel<T1, T2> + implements PropertyValueModel<T2> +{ + + protected T2 cachedValue; + + // ********** constructors/initialization ********** + + /** + * Construct a property value model with the specified nested + * property value model and the default transformer. + * Use this constructor if you want to override the + * <code>transform_(Object)</code> or <code>transform(Object)</code> + * method instead of building a <code>Transformer</code>. + */ + public CachingTransformationWritablePropertyValueModel(WritablePropertyValueModel<T1> valueHolder) { + super(valueHolder); + } + + /** + * Construct an property value model with the specified nested + * property value model and transformer. + */ + public CachingTransformationWritablePropertyValueModel(WritablePropertyValueModel<T1> valueHolder, BidiTransformer<T1, T2> transformer) { + super(valueHolder, transformer); + } + + // ********** behavior ********** + + @Override + protected void engageValueHolder() { + super.engageValueHolder(); + this.cachedValue = this.transform(this.valueHolder.getValue()); + } + + @Override + protected void disengageValueHolder() { + super.disengageValueHolder(); + this.cachedValue = null; + } + + @Override + public T2 getValue() { + return this.cachedValue; + } + + @Override + protected T2 transformNew(T1 value) { + this.cachedValue = super.transformNew(value); + return this.cachedValue; + }; + + @Override + protected T2 transformOld(T1 value) { + return this.cachedValue; + } +} diff --git a/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/model/value/TransformationPropertyValueModel.java b/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/model/value/TransformationPropertyValueModel.java index 5d3b93e821..cc115cc1c8 100644 --- a/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/model/value/TransformationPropertyValueModel.java +++ b/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/model/value/TransformationPropertyValueModel.java @@ -73,9 +73,9 @@ public class TransformationPropertyValueModel<T1, T2> protected void valueChanged(PropertyChangeEvent event) { // transform the values before propagating the change event @SuppressWarnings("unchecked") - Object oldValue = this.transform((T1) event.getOldValue()); + Object oldValue = this.transformOld((T1) event.getOldValue()); @SuppressWarnings("unchecked") - Object newValue = this.transform((T1) event.getNewValue()); + Object newValue = this.transformNew((T1) event.getNewValue()); this.firePropertyChanged(VALUE, oldValue, newValue); } @@ -97,6 +97,23 @@ public class TransformationPropertyValueModel<T1, T2> throw new UnsupportedOperationException(); } + /** + * Transform the specified old value and return the result. + * In this case just call {@link #transform(Object)}, override to change. + * This is called by #valueChanged(PropertyChangeEvent). + */ + protected T2 transformOld(T1 value) { + return this.transform(value); + } + + /** + * Transform the specified new value and return the result. + * In this case just call {@link #transform(Object)}, override to change. + * This is called by #valueChanged(PropertyChangeEvent). + */ + protected T2 transformNew(T1 value) { + return this.transform(value); + } // ********** default transformer ********** diff --git a/jpa/tests/org.eclipse.jpt.utility.tests/src/org/eclipse/jpt/utility/tests/internal/model/value/CachingTransformationPropertyValueModelTests.java b/jpa/tests/org.eclipse.jpt.utility.tests/src/org/eclipse/jpt/utility/tests/internal/model/value/CachingTransformationPropertyValueModelTests.java new file mode 100644 index 0000000000..fd6ff2ae34 --- /dev/null +++ b/jpa/tests/org.eclipse.jpt.utility.tests/src/org/eclipse/jpt/utility/tests/internal/model/value/CachingTransformationPropertyValueModelTests.java @@ -0,0 +1,218 @@ +/******************************************************************************* + * Copyright (c) 2007, 2008 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.utility.tests.internal.model.value; + +import junit.framework.TestCase; +import org.eclipse.jpt.utility.internal.BidiTransformer; +import org.eclipse.jpt.utility.internal.model.AbstractModel; +import org.eclipse.jpt.utility.internal.model.value.CachingTransformationPropertyValueModel; +import org.eclipse.jpt.utility.internal.model.value.SimplePropertyValueModel; +import org.eclipse.jpt.utility.model.event.PropertyChangeEvent; +import org.eclipse.jpt.utility.model.listener.PropertyChangeListener; +import org.eclipse.jpt.utility.model.value.PropertyValueModel; +import org.eclipse.jpt.utility.model.value.WritablePropertyValueModel; +import org.eclipse.jpt.utility.tests.internal.TestTools; + +public class CachingTransformationPropertyValueModelTests extends TestCase { + private WritablePropertyValueModel<Person> objectHolder; + PropertyChangeEvent event; + + private PropertyValueModel<Person> transformationObjectHolder; + PropertyChangeEvent transformationEvent; + + public CachingTransformationPropertyValueModelTests(String name) { + super(name); + } + + @Override + protected void setUp() throws Exception { + super.setUp(); + this.objectHolder = new SimplePropertyValueModel<Person>(new Person("Karen", "Peggy", null)); + this.transformationObjectHolder = new CachingTransformationPropertyValueModel<Person, Person>(this.objectHolder, this.buildTransformer()); + } + + private BidiTransformer<Person, Person> buildTransformer() { + return new BidiTransformer<Person, Person>() { + public Person transform(Person p) { + return (p == null) ? null : p.getParent(); + } + public Person reverseTransform(Person p) { + return (p == null) ? null : p.getChild(); + } + }; + } + + @Override + protected void tearDown() throws Exception { + TestTools.clear(this); + super.tearDown(); + } + + public void testValue() { + PropertyChangeListener listener = this.buildTransformationListener(); + this.transformationObjectHolder.addPropertyChangeListener(listener); + + + Person person = this.objectHolder.getValue(); + assertEquals("Karen", person.getName()); + Person parent = this.transformationObjectHolder.getValue(); + assertEquals(person.getParent().getName(), parent.getName()); + assertNotSame(person.getParent(), this.transformationObjectHolder.getValue()); + assertEquals(parent, this.transformationObjectHolder.getValue()); + + Person person1 = new Person("Matt", "Mitch", null); + this.objectHolder.setValue(person1); + Person parent2 = this.transformationObjectHolder.getValue(); + assertEquals(person1.getParent().getName(), parent2.getName()); + assertNotSame(person1.getParent(), this.transformationObjectHolder.getValue()); + assertEquals(parent2, this.transformationObjectHolder.getValue()); + + + this.objectHolder.setValue(null); + assertNull(this.objectHolder.getValue()); + assertNull(this.transformationObjectHolder.getValue()); + + Person person3 = new Person("Karen", "Peggy", null); + this.objectHolder.setValue(person3); + assertEquals("Karen", person3.getName()); + Person parent3 = this.transformationObjectHolder.getValue(); + assertEquals(person3.getParent().getName(), parent3.getName()); + assertNotSame(person3.getParent(), this.transformationObjectHolder.getValue()); + assertEquals(parent3, this.transformationObjectHolder.getValue()); + } + + public void testLazyListening() { + assertTrue(((AbstractModel) this.objectHolder).hasNoPropertyChangeListeners(PropertyValueModel.VALUE)); + PropertyChangeListener listener = this.buildTransformationListener(); + this.transformationObjectHolder.addPropertyChangeListener(listener); + assertTrue(((AbstractModel) this.objectHolder).hasAnyPropertyChangeListeners(PropertyValueModel.VALUE)); + this.transformationObjectHolder.removePropertyChangeListener(listener); + assertTrue(((AbstractModel) this.objectHolder).hasNoPropertyChangeListeners(PropertyValueModel.VALUE)); + + this.transformationObjectHolder.addPropertyChangeListener(PropertyValueModel.VALUE, listener); + assertTrue(((AbstractModel) this.objectHolder).hasAnyPropertyChangeListeners(PropertyValueModel.VALUE)); + this.transformationObjectHolder.removePropertyChangeListener(PropertyValueModel.VALUE, listener); + assertTrue(((AbstractModel) this.objectHolder).hasNoPropertyChangeListeners(PropertyValueModel.VALUE)); + } + + public void testPropertyChange1() { + this.objectHolder.addPropertyChangeListener(this.buildListener()); + this.transformationObjectHolder.addPropertyChangeListener(this.buildTransformationListener()); + this.verifyPropertyChanges(); + } + + public void testPropertyChange2() { + this.objectHolder.addPropertyChangeListener(PropertyValueModel.VALUE, this.buildListener()); + this.transformationObjectHolder.addPropertyChangeListener(PropertyValueModel.VALUE, this.buildTransformationListener()); + this.verifyPropertyChanges(); + } + + private void verifyPropertyChanges() { + this.event = null; + this.transformationEvent = null; + Person karen = this.objectHolder.getValue(); + Person peggyParent = this.transformationObjectHolder.getValue(); + Person peggy = new Person("Peggy", "Marian", null); + this.objectHolder.setValue(peggy); + Person marianParent = this.transformationObjectHolder.getValue(); + this.verifyEvent(this.event, this.objectHolder, karen, peggy); + this.verifyEvent(this.transformationEvent, this.transformationObjectHolder, peggyParent, marianParent); + + this.event = null; + this.transformationEvent = null; + Person matt = new Person("Matt", "Mitch", null); + this.objectHolder.setValue(matt); + Person mitchParent = this.transformationObjectHolder.getValue(); + this.verifyEvent(this.event, this.objectHolder, peggy, matt); + this.verifyEvent(this.transformationEvent, this.transformationObjectHolder, marianParent, mitchParent); + + this.event = null; + this.transformationEvent = null; + this.objectHolder.setValue(null); + this.verifyEvent(this.event, this.objectHolder, matt, null); + this.verifyEvent(this.transformationEvent, this.transformationObjectHolder, mitchParent, null); + + this.event = null; + this.transformationEvent = null; + this.objectHolder.setValue(matt); + mitchParent = this.transformationObjectHolder.getValue(); + this.verifyEvent(this.event, this.objectHolder, null, matt); + this.verifyEvent(this.transformationEvent, this.transformationObjectHolder, null, mitchParent); + } + + private PropertyChangeListener buildListener() { + return new PropertyChangeListener() { + public void propertyChanged(PropertyChangeEvent e) { + CachingTransformationPropertyValueModelTests.this.event = e; + } + }; + } + + private PropertyChangeListener buildTransformationListener() { + return new PropertyChangeListener() { + public void propertyChanged(PropertyChangeEvent e) { + CachingTransformationPropertyValueModelTests.this.transformationEvent = e; + } + }; + } + + private void verifyEvent(PropertyChangeEvent e, Object source, Object oldValue, Object newValue) { + assertEquals(source, e.getSource()); + assertEquals(PropertyValueModel.VALUE, e.getPropertyName()); + assertEquals(oldValue, e.getOldValue()); + assertEquals(newValue, e.getNewValue()); + } + + + private class Person extends AbstractModel { + + private String name; + public static final String NAME_PROPERTY = "nameProperty"; + + private String parentName; + public static final String PARENT_NAME_PROPERTY = "parentNameProperty"; + + private Person child; + + public Person(String name, String parentName, Person child) { + this.name = name; + this.parentName = parentName; + this.child = child; + } + + public String getName() { + return this.name; + } + + public void setName(String newName) { + String oldName = this.name; + this.name = newName; + firePropertyChanged(NAME_PROPERTY, oldName, newName); + } + + public Person getParent() { + return new Person(this.parentName, null, this); + } + + public String getParentName() { + return this.parentName; + } + + public void setParentName(String newParentName) { + String oldParentName = this.parentName; + this.parentName = newParentName; + firePropertyChanged(PARENT_NAME_PROPERTY, oldParentName, newParentName); + } + + public Person getChild() { + return this.child; + } + } +} diff --git a/jpa/tests/org.eclipse.jpt.utility.tests/src/org/eclipse/jpt/utility/tests/internal/model/value/CachingTransformationWritablePropertyValueModelTests.java b/jpa/tests/org.eclipse.jpt.utility.tests/src/org/eclipse/jpt/utility/tests/internal/model/value/CachingTransformationWritablePropertyValueModelTests.java new file mode 100644 index 0000000000..023c3134dd --- /dev/null +++ b/jpa/tests/org.eclipse.jpt.utility.tests/src/org/eclipse/jpt/utility/tests/internal/model/value/CachingTransformationWritablePropertyValueModelTests.java @@ -0,0 +1,249 @@ +/******************************************************************************* + * Copyright (c) 2007, 2008 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.utility.tests.internal.model.value; + +import org.eclipse.jpt.utility.internal.BidiTransformer; +import org.eclipse.jpt.utility.internal.model.AbstractModel; +import org.eclipse.jpt.utility.internal.model.value.CachingTransformationWritablePropertyValueModel; +import org.eclipse.jpt.utility.internal.model.value.SimplePropertyValueModel; +import org.eclipse.jpt.utility.model.event.PropertyChangeEvent; +import org.eclipse.jpt.utility.model.listener.PropertyChangeListener; +import org.eclipse.jpt.utility.model.value.PropertyValueModel; +import org.eclipse.jpt.utility.model.value.WritablePropertyValueModel; +import org.eclipse.jpt.utility.tests.internal.TestTools; + +import junit.framework.TestCase; + +public class CachingTransformationWritablePropertyValueModelTests extends TestCase { + private WritablePropertyValueModel<Person> objectHolder; + PropertyChangeEvent event; + + private WritablePropertyValueModel<Person> transformationObjectHolder; + PropertyChangeEvent transformationEvent; + + public CachingTransformationWritablePropertyValueModelTests(String name) { + super(name); + } + + @Override + protected void setUp() throws Exception { + super.setUp(); + this.objectHolder = new SimplePropertyValueModel<Person>(new Person("Karen", "Peggy", null)); + this.transformationObjectHolder = new CachingTransformationWritablePropertyValueModel<Person, Person>(this.objectHolder, this.buildTransformer()); + } + + private BidiTransformer<Person, Person> buildTransformer() { + return new BidiTransformer<Person, Person>() { + public Person transform(Person p) { + return (p == null) ? null : p.getParent(); + } + public Person reverseTransform(Person p) { + return (p == null) ? null : p.getChild(); + } + }; + } + + @Override + protected void tearDown() throws Exception { + TestTools.clear(this); + super.tearDown(); + } + + public void testValue() { + PropertyChangeListener listener = this.buildTransformationListener(); + this.transformationObjectHolder.addPropertyChangeListener(listener); + + + Person person = this.objectHolder.getValue(); + assertEquals("Karen", person.getName()); + Person parent = this.transformationObjectHolder.getValue(); + assertEquals(person.getParent().getName(), parent.getName()); + assertNotSame(person.getParent(), this.transformationObjectHolder.getValue()); + assertEquals(parent, this.transformationObjectHolder.getValue()); + + Person person1 = new Person("Matt", "Mitch", null); + this.objectHolder.setValue(person1); + Person parent2 = this.transformationObjectHolder.getValue(); + assertEquals(person1.getParent().getName(), parent2.getName()); + assertNotSame(person1.getParent(), this.transformationObjectHolder.getValue()); + assertEquals(parent2, this.transformationObjectHolder.getValue()); + + + this.objectHolder.setValue(null); + assertNull(this.objectHolder.getValue()); + assertNull(this.transformationObjectHolder.getValue()); + + Person person3 = new Person("Karen", "Peggy", null); + this.objectHolder.setValue(person3); + assertEquals("Karen", person3.getName()); + Person parent3 = this.transformationObjectHolder.getValue(); + assertEquals(person3.getParent().getName(), parent3.getName()); + assertNotSame(person3.getParent(), this.transformationObjectHolder.getValue()); + assertEquals(parent3, this.transformationObjectHolder.getValue()); + } + + public void testSetValue() { + PropertyChangeListener listener = this.buildTransformationListener(); + this.transformationObjectHolder.addPropertyChangeListener(listener); + + Person person = new Person("Chris", "Noel", null); + this.transformationObjectHolder.setValue(person.getParent()); + assertEquals(person, this.objectHolder.getValue()); + assertEquals(person.getParent().getName(), this.transformationObjectHolder.getValue().getName()); + assertNotSame(person.getParent(), this.transformationObjectHolder.getValue()); + + Person person2 = new Person("Jon", "Elizabeth", null); + this.transformationObjectHolder.setValue(person2.getParent()); + assertEquals(person2, this.objectHolder.getValue()); + assertEquals(person2.getParent().getName(), this.transformationObjectHolder.getValue().getName()); + assertNotSame(person2.getParent(), this.transformationObjectHolder.getValue()); + + this.transformationObjectHolder.setValue(null); + assertNull(this.objectHolder.getValue()); + assertNull(this.transformationObjectHolder.getValue()); + + this.transformationObjectHolder.setValue(person.getParent()); + assertEquals(person, this.objectHolder.getValue()); + assertEquals(person.getParent().getName(), this.transformationObjectHolder.getValue().getName()); + assertNotSame(person.getParent(), this.transformationObjectHolder.getValue()); + } + + public void testLazyListening() { + assertTrue(((AbstractModel) this.objectHolder).hasNoPropertyChangeListeners(PropertyValueModel.VALUE)); + PropertyChangeListener listener = this.buildTransformationListener(); + this.transformationObjectHolder.addPropertyChangeListener(listener); + assertTrue(((AbstractModel) this.objectHolder).hasAnyPropertyChangeListeners(PropertyValueModel.VALUE)); + this.transformationObjectHolder.removePropertyChangeListener(listener); + assertTrue(((AbstractModel) this.objectHolder).hasNoPropertyChangeListeners(PropertyValueModel.VALUE)); + + this.transformationObjectHolder.addPropertyChangeListener(PropertyValueModel.VALUE, listener); + assertTrue(((AbstractModel) this.objectHolder).hasAnyPropertyChangeListeners(PropertyValueModel.VALUE)); + this.transformationObjectHolder.removePropertyChangeListener(PropertyValueModel.VALUE, listener); + assertTrue(((AbstractModel) this.objectHolder).hasNoPropertyChangeListeners(PropertyValueModel.VALUE)); + } + + public void testPropertyChange1() { + this.objectHolder.addPropertyChangeListener(this.buildListener()); + this.transformationObjectHolder.addPropertyChangeListener(this.buildTransformationListener()); + this.verifyPropertyChanges(); + } + + public void testPropertyChange2() { + this.objectHolder.addPropertyChangeListener(PropertyValueModel.VALUE, this.buildListener()); + this.transformationObjectHolder.addPropertyChangeListener(PropertyValueModel.VALUE, this.buildTransformationListener()); + this.verifyPropertyChanges(); + } + + private void verifyPropertyChanges() { + this.event = null; + this.transformationEvent = null; + Person oldPerson = this.objectHolder.getValue(); + Person oldParent = this.transformationObjectHolder.getValue(); + Person newPerson = new Person("Karen" , "Peggy", null); + this.objectHolder.setValue(newPerson); + Person newParent = this.transformationObjectHolder.getValue(); + this.verifyEvent(this.event, this.objectHolder, oldPerson, newPerson); + this.verifyEvent(this.transformationEvent, this.transformationObjectHolder, oldParent, newParent); + +// +// this.event = null; +// this.transformationEvent = null; +// this.objectHolder.setValue("Foo"); +// this.verifyEvent(this.event, this.objectHolder, "baz", "Foo"); +// this.verifyEvent(this.transformationEvent, this.transformationObjectHolder, "BAZ", "FOO"); +// +// this.event = null; +// this.transformationEvent = null; +// this.objectHolder.setValue("FOO"); +// this.verifyEvent(this.event, this.objectHolder, "Foo", "FOO"); +// assertNull(this.transformationEvent); +// +// this.event = null; +// this.transformationEvent = null; +// this.objectHolder.setValue(null); +// this.verifyEvent(this.event, this.objectHolder, "FOO", null); +// this.verifyEvent(this.transformationEvent, this.transformationObjectHolder, "FOO", null); +// +// this.event = null; +// this.transformationEvent = null; +// this.objectHolder.setValue("bar"); +// this.verifyEvent(this.event, this.objectHolder, null, "bar"); +// this.verifyEvent(this.transformationEvent, this.transformationObjectHolder, null, "BAR"); + } + + private PropertyChangeListener buildListener() { + return new PropertyChangeListener() { + public void propertyChanged(PropertyChangeEvent e) { + CachingTransformationWritablePropertyValueModelTests.this.event = e; + } + }; + } + + private PropertyChangeListener buildTransformationListener() { + return new PropertyChangeListener() { + public void propertyChanged(PropertyChangeEvent e) { + CachingTransformationWritablePropertyValueModelTests.this.transformationEvent = e; + } + }; + } + + private void verifyEvent(PropertyChangeEvent e, Object source, Object oldValue, Object newValue) { + assertEquals(source, e.getSource()); + assertEquals(PropertyValueModel.VALUE, e.getPropertyName()); + assertEquals(oldValue, e.getOldValue()); + assertEquals(newValue, e.getNewValue()); + } + + + private class Person extends AbstractModel { + + private String name; + public static final String NAME_PROPERTY = "nameProperty"; + + private String parentName; + public static final String PARENT_NAME_PROPERTY = "parentNameProperty"; + + private Person child; + + public Person(String name, String parentName, Person child) { + this.name = name; + this.parentName = parentName; + this.child = child; + } + + public String getName() { + return this.name; + } + + public void setName(String newName) { + String oldName = this.name; + this.name = newName; + firePropertyChanged(NAME_PROPERTY, oldName, newName); + } + + public Person getParent() { + return new Person(this.parentName, null, this); + } + + public String getParentName() { + return this.parentName; + } + + public void setParentName(String newParentName) { + String oldParentName = this.parentName; + this.parentName = newParentName; + firePropertyChanged(PARENT_NAME_PROPERTY, oldParentName, newParentName); + } + + public Person getChild() { + return this.child; + } + } +} diff --git a/jpa/tests/org.eclipse.jpt.utility.tests/src/org/eclipse/jpt/utility/tests/internal/model/value/JptUtilityModelValueTests.java b/jpa/tests/org.eclipse.jpt.utility.tests/src/org/eclipse/jpt/utility/tests/internal/model/value/JptUtilityModelValueTests.java index e53070c828..1939e03021 100644 --- a/jpa/tests/org.eclipse.jpt.utility.tests/src/org/eclipse/jpt/utility/tests/internal/model/value/JptUtilityModelValueTests.java +++ b/jpa/tests/org.eclipse.jpt.utility.tests/src/org/eclipse/jpt/utility/tests/internal/model/value/JptUtilityModelValueTests.java @@ -24,6 +24,8 @@ public class JptUtilityModelValueTests { suite.addTest(JptUtilityModelValueSwingTests.suite()); suite.addTestSuite(BufferedWritablePropertyValueModelTests.class); + suite.addTestSuite(CachingTransformationPropertyValueModelTests.class); + suite.addTestSuite(CachingTransformationWritablePropertyValueModelTests.class); suite.addTestSuite(CollectionAspectAdapterTests.class); suite.addTestSuite(CollectionListValueModelAdapterTests.class); suite.addTestSuite(CollectionPropertyValueModelAdapterTests.class); |