### Eclipse Workspace Patch 1.0 #P org.eclipse.jpt.ui Index: src/org/eclipse/jpt/ui/internal/mappings/details/InheritanceComposite.java =================================================================== RCS file: /cvsroot/webtools/org.eclipse.jpa/components/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/mappings/details/InheritanceComposite.java,v retrieving revision 1.27 diff -u -r1.27 InheritanceComposite.java --- src/org/eclipse/jpt/ui/internal/mappings/details/InheritanceComposite.java 4 Apr 2008 00:34:12 -0000 1.27 +++ src/org/eclipse/jpt/ui/internal/mappings/details/InheritanceComposite.java 7 Apr 2008 14:20:20 -0000 @@ -21,17 +21,25 @@ import org.eclipse.jpt.ui.internal.mappings.JptUiMappingsMessages; import org.eclipse.jpt.ui.internal.mappings.db.ColumnCombo; import org.eclipse.jpt.ui.internal.util.ControlEnabler; -import org.eclipse.jpt.ui.internal.widgets.AbstractFormPane; +import org.eclipse.jpt.ui.internal.util.LabeledControlUpdater; +import org.eclipse.jpt.ui.internal.util.LabeledLabel; +import org.eclipse.jpt.ui.internal.widgets.AbstractPane; import org.eclipse.jpt.ui.internal.widgets.EnumFormComboViewer; -import org.eclipse.jpt.utility.internal.StringTools; +import org.eclipse.jpt.utility.internal.StringConverter; import org.eclipse.jpt.utility.internal.model.value.PropertyAspectAdapter; +import org.eclipse.jpt.utility.internal.model.value.PropertyListValueModelAdapter; +import org.eclipse.jpt.utility.internal.model.value.SimplePropertyValueModel; import org.eclipse.jpt.utility.internal.model.value.TransformationPropertyValueModel; +import org.eclipse.jpt.utility.model.value.ListValueModel; import org.eclipse.jpt.utility.model.value.PropertyValueModel; +import org.eclipse.jpt.utility.model.value.WritablePropertyValueModel; import org.eclipse.osgi.util.NLS; import org.eclipse.swt.custom.CCombo; -import org.eclipse.swt.events.ModifyEvent; -import org.eclipse.swt.events.ModifyListener; +import org.eclipse.swt.layout.GridData; import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Control; +import org.eclipse.swt.widgets.Label; +import org.eclipse.swt.widgets.Spinner; /** * Here the layout of this pane: @@ -41,14 +49,23 @@ * | Strategy: | EnumComboViewer |v| | * | ---------------------------------------------------- | * | ---------------------------------------------------- | - * | Column: | ColumnCombo |v| | + * | Value: | I |v| | * | ---------------------------------------------------- | + * | | + * | > Discriminator Column | + * | | * | ---------------------------------------------------- | - * | Discriminator Type: | EnumComboViewer |v| | + * | Name: | ColumnCombo |v| | * | ---------------------------------------------------- | * | ---------------------------------------------------- | - * | Discriminator Value: | I |v| | + * | Type: | EnumComboViewer |v| | * | ---------------------------------------------------- | + * | ---------------------------------------------------- | + * | Column Definition: | I | | + * | ---------------------------------------------------- | + * | ------------- | + * | Length: | I |I| | + * | ------------- | * | ------------------------------------------------------------------------- | * | | | | * | | PrimaryKeyJoinColumnsComposite | | @@ -57,7 +74,7 @@ * ----------------------------------------------------------------------------- * * @see Entity - * @see EntityComposite - The parent container + * @see AbstractEntityComposite - The parent container * @see ColumnCombo * @see EnumComboViewer * @see PrimaryKeyJoinColumnsComposite @@ -65,9 +82,17 @@ * @version 2.0 * @since 2.0 */ -public class InheritanceComposite extends AbstractFormPane { +@SuppressWarnings("nls") +public class InheritanceComposite extends AbstractPane { - private CCombo discriminatorValueCombo; + /** + * A key used to represent the default value, this is required to convert + * the selected item from a combo to null. This key is most + * likely never typed the user and it will help to convert the value to + * null when it's time to set the new selected value into the + * model. + */ + protected static String DEFAULT_KEY = "?!#!?#?#?default?#?!#?!#?"; /** * Creates a new InheritanceComposite. @@ -75,7 +100,7 @@ * @param parentPane The parent container of this one * @param parent The parent container */ - public InheritanceComposite(AbstractFormPane parentPane, + public InheritanceComposite(AbstractPane parentPane, Composite parent) { super(parentPane, parent, false); @@ -95,21 +120,109 @@ super(subjectHolder, parent, widgetFactory); } - /* - * (non-Javadoc) - */ - @Override - protected void addPropertyNames(Collection propertyNames) { - super.addPropertyNames(propertyNames); - propertyNames.add(Entity.DEFAULT_DISCRIMINATOR_VALUE_PROPERTY); - propertyNames.add(Entity.SPECIFIED_DISCRIMINATOR_VALUE_PROPERTY); + private WritablePropertyValueModel buildColumnDefinitionHolder(PropertyValueModel discriminatorColumnHolder) { + + return new PropertyAspectAdapter(discriminatorColumnHolder, DiscriminatorColumn.COLUMN_DEFINITION_PROPERTY) { + @Override + protected String buildValue_() { + return subject.getColumnDefinition(); + } + + @Override + protected void setValue_(String value) { + if (value.length() == 0) { + value = null; + } + subject.setColumnDefinition(value); + } + }; + } + + private ListValueModel buildDefaultDiscriminatorListValueHolder() { + return new PropertyListValueModelAdapter( + buildDefaultDiscriminatorValueHolder() + ); + } + + private WritablePropertyValueModel buildDefaultDiscriminatorValueHolder() { + return new PropertyAspectAdapter(getSubjectHolder(), Entity.DEFAULT_DISCRIMINATOR_VALUE_PROPERTY) { + @Override + protected String buildValue_() { + String name = subject.getDefaultDiscriminatorValue(); + + if (name == null) { + name = DEFAULT_KEY; + } + else { + name = DEFAULT_KEY + name; + } + + return name; + } + }; + } + + private WritablePropertyValueModel buildDefaultLengthHolder() { + return new PropertyAspectAdapter(buildDiscriminatorColumnHolder(), DiscriminatorColumn.DEFAULT_LENGTH_PROPERTY) { + @Override + protected Integer buildValue_() { + return subject.getDefaultLength(); + } + + @Override + protected void subjectChanged() { + Object oldValue = this.getValue(); + super.subjectChanged(); + Object newValue = this.getValue(); + + // Make sure the default value is appended to the text + if (oldValue == newValue && newValue == null) { + this.fireAspectChange(Integer.MIN_VALUE, newValue); + } + } + }; + } + + private Control buildDefaultLengthLabel(Composite container) { + + Label label = buildLabel( + container, + JptUiMappingsMessages.DefaultWithoutValue + ); + + new LabeledControlUpdater( + new LabeledLabel(label), + buildDefaultLengthLabelHolder() + ); + + return label; } - private ColumnCombo buildColumnCombo(Composite container) { + private PropertyValueModel buildDefaultLengthLabelHolder() { + + return new TransformationPropertyValueModel(buildDefaultLengthHolder()) { + + @Override + protected String transform(Integer value) { + + Integer defaultValue = (subject() != null) ? subject().getDiscriminatorColumn().getDefaultLength() : + DiscriminatorColumn.DEFAULT_LENGTH; + + return NLS.bind( + JptUiMappingsMessages.DefaultWithValue, + defaultValue + ); + } + }; + } + + private ColumnCombo buildDiscriminatorColumnCombo( + Composite container, + PropertyValueModel discriminatorColumnHolder) { return new ColumnCombo( this, - buildDiscriminatorColumnHolder(), + discriminatorColumnHolder, container) { @@ -151,11 +264,13 @@ }; } - private EnumFormComboViewer buildDiscriminatorTypeCombo(Composite container) { + private EnumFormComboViewer buildDiscriminatorTypeCombo( + Composite container, + PropertyValueModel discriminatorColumnHolder) { return new EnumFormComboViewer( this, - buildDiscriminatorColumnHolder(), + discriminatorColumnHolder, container) { @Override @@ -205,13 +320,84 @@ }; } - private ModifyListener buildDiscriminatorValueComboSelectionListener() { - return new ModifyListener() { - public void modifyText(ModifyEvent e) { - if (!isPopulating()) { - CCombo combo = (CCombo) e.widget; - discriminatorValueChanged(combo.getText()); + private StringConverter buildDiscriminatorValueConverter() { + return new StringConverter() { + public String convertToString(String value) { + + if (subject() == null) { + return null; } + + if (value == null) { + value = subject().getDefaultDiscriminatorValue(); + + 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( + JptUiMappingsMessages.DefaultWithValue, + defaultName + ); + } + else { + value = JptUiMappingsMessages.DefaultWithoutValue; + } + } + + return value; + } + }; + } + + private WritablePropertyValueModel buildDiscriminatorValueHolder() { + return new PropertyAspectAdapter(getSubjectHolder(), Entity.SPECIFIED_DISCRIMINATOR_VALUE_PROPERTY) { + @Override + protected String buildValue_() { + return subject.getSpecifiedDiscriminatorValue(); + } + + @Override + protected void setValue_(String value) { + + // Convert the default value or an empty string to null + if ((value != null) && + ((value.length() == 0) || value.startsWith(DEFAULT_KEY))) { + + value = null; + } + + subject.setSpecifiedDiscriminatorValue(value); + } + }; + } + + private ListValueModel buildDiscriminatorValueListHolder() { + return buildDefaultDiscriminatorListValueHolder(); + } + + private WritablePropertyValueModel buildLengthHolder(PropertyValueModel discriminatorColumnHolder) { + + return new PropertyAspectAdapter(discriminatorColumnHolder, DiscriminatorColumn.SPECIFIED_LENGTH_PROPERTY) { + @Override + protected Integer buildValue_() { + return subject.getSpecifiedLength(); + } + + @Override + protected void setValue_(Integer value) { + if (value == -1) { + value = null; + } + subject.setSpecifiedLength(value); } }; } @@ -258,55 +444,53 @@ }; } - private void discriminatorValueChanged(String value) { - - Entity subject = subject(); - String oldValue = (subject != null) ? subject.getSpecifiedDiscriminatorValue() : null; + private void initializeDiscriminatorColumnPane(Composite container) { - // Check for null value - if (StringTools.stringIsEmpty(value)) { - value = null; + PropertyValueModel discriminatorColumnHolder = + buildDiscriminatorColumnHolder(); - if (StringTools.stringIsEmpty(oldValue)) { - return; - } - } - - // The default value - if (value != null && - discriminatorValueCombo.getItemCount() > 0 && - value.equals(discriminatorValueCombo.getItem(0))) - { - value = null; - } + // Name widgets + buildLabeledComposite( + container, + JptUiMappingsMessages.DiscriminatorColumnComposite_name, + buildDiscriminatorColumnCombo(container, discriminatorColumnHolder), + JpaHelpContextIds.ENTITY_INHERITANCE_DISCRIMINATOR_COLUMN + ); - // Nothing to change - if ((oldValue == value) && value == null) { - return; - } + // Discriminator Type widgets + buildLabeledComposite( + container, + JptUiMappingsMessages.DiscriminatorColumnComposite_discriminatorType, + buildDiscriminatorTypeCombo(container, discriminatorColumnHolder), + JpaHelpContextIds.ENTITY_INHERITANCE_DISCRIMINATOR_TYPE + ); - // Set the new value - if ((value != null) && (oldValue == null) || - ((oldValue != null) && !oldValue.equals(value))) { + container = buildCollapsableSubSection( + buildSubPane(container, 10), + JptUiMappingsMessages.InheritanceComposite_detailsGroupBox, + new SimplePropertyValueModel(Boolean.FALSE) + ); - setPopulating(true); + // Length widgets + Spinner lengthSpinner = buildLabeledSpinner( + container, + JptUiMappingsMessages.ColumnComposite_length, + buildLengthHolder(discriminatorColumnHolder), + -1, + -1, + Integer.MAX_VALUE, + buildDefaultLengthLabel(container), + JpaHelpContextIds.MAPPING_COLUMN_LENGTH + ); - try { - subject.setSpecifiedDiscriminatorValue(value); - } - finally { - setPopulating(false); - } - } - } + updateGridData(container, lengthSpinner); - /* - * (non-Javadoc) - */ - @Override - protected void doPopulate() { - super.doPopulate(); - populateDiscriminatorValueCombo(); + // Column Definition widgets + buildLabeledText( + container, + JptUiMappingsMessages.ColumnComposite_columnDefinition, + buildColumnDefinitionHolder(discriminatorColumnHolder) + ); } /* @@ -329,32 +513,26 @@ JpaHelpContextIds.ENTITY_INHERITANCE_STRATEGY ); - // Column widgets - buildLabeledComposite( - subPane, - JptUiMappingsMessages.DiscriminatorColumnComposite_column, - buildColumnCombo(subPane), - JpaHelpContextIds.ENTITY_INHERITANCE_DISCRIMINATOR_COLUMN - ); - - // Discriminator Type widgets - buildLabeledComposite( - subPane, - JptUiMappingsMessages.DiscriminatorColumnComposite_discriminatorType, - buildDiscriminatorTypeCombo(subPane), - JpaHelpContextIds.ENTITY_INHERITANCE_DISCRIMINATOR_TYPE - ); - // Discrinator Value widgets - discriminatorValueCombo = buildLabeledEditableCCombo( + CCombo discriminatorValueCombo = buildLabeledEditableCCombo( subPane, JptUiMappingsMessages.InheritanceComposite_discriminatorValue, - buildDiscriminatorValueComboSelectionListener(), + buildDiscriminatorValueListHolder(), + buildDiscriminatorValueHolder(), + buildDiscriminatorValueConverter(), JpaHelpContextIds.ENTITY_INHERITANCE_DISCRIMINATOR_VALUE ); installDiscriminatorValueComboEnabler(discriminatorValueCombo); + // Discriminator Column sub-pane + Composite discriminatorColumnContainer = buildTitledPane( + buildSubPane(container, 10), + JptUiMappingsMessages.InheritanceComposite_discriminatorColumnGroupBox + ); + + initializeDiscriminatorColumnPane(discriminatorColumnContainer); + // Primary Key Join Columns widgets new PrimaryKeyJoinColumnsComposite( this, @@ -369,53 +547,34 @@ ); } - private void populateDiscriminatorValueCombo() { - - Entity subject = subject(); - discriminatorValueCombo.removeAll(); - - if (subject == null) { - return; - } + /** + * Changes the layout of the given container by changing which widget will + * grab the excess of horizontal space. By default, the center control grabs + * the excess space, we change it to be the right control. + * + * @param container The container containing the controls needing their + * GridData to be modified from the default values + * @param spinner The spinner that got created + */ + private void updateGridData(Composite container, Spinner spinner) { - // Add the default discriminator column value if one exists - String defaultDiscriminatorValue = subject.getDefaultDiscriminatorValue(); + // It is possible the spinner's parent is not the container of the + // label, spinner and right control (a pane is sometimes required for + // painting the spinner's border) + Composite paneContainer = spinner.getParent(); - if (defaultDiscriminatorValue != null) { - discriminatorValueCombo.add(NLS.bind( - JptUiMappingsMessages.ColumnComposite_defaultWithOneParam, - defaultDiscriminatorValue) - ); + while (container != paneContainer.getParent()) { + paneContainer = paneContainer.getParent(); } - else { - discriminatorValueCombo.add(NLS.bind( - JptUiMappingsMessages.DiscriminatorColumnComposite_defaultEmpty, - defaultDiscriminatorValue) - ); - } - - // Select the discriminator column value - String specifiedDiscriminatorValue = subject.getSpecifiedDiscriminatorValue(); - if (specifiedDiscriminatorValue != null) { - discriminatorValueCombo.setText(specifiedDiscriminatorValue); - } - else { - discriminatorValueCombo.select(0); - } - } + Control[] controls = paneContainer.getChildren(); - /* - * (non-Javadoc) - */ - @Override - protected void propertyChanged(String propertyName) { - super.propertyChanged(propertyName); + GridData gridData = new GridData(); + gridData.grabExcessHorizontalSpace = false; + gridData.horizontalAlignment = GridData.BEGINNING; + controls[1].setLayoutData(gridData); - if (propertyName == Entity.DEFAULT_DISCRIMINATOR_VALUE_PROPERTY || - propertyName == Entity.SPECIFIED_DISCRIMINATOR_VALUE_PROPERTY) - { - populateDiscriminatorValueCombo(); - } + controls[2].setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); + removeAlignRight(controls[2]); } } \ No newline at end of file Index: src/org/eclipse/jpt/ui/internal/mappings/details/PrimaryKeyJoinColumnsComposite.java =================================================================== RCS file: /cvsroot/webtools/org.eclipse.jpa/components/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/mappings/details/PrimaryKeyJoinColumnsComposite.java,v retrieving revision 1.20 diff -u -r1.20 PrimaryKeyJoinColumnsComposite.java --- src/org/eclipse/jpt/ui/internal/mappings/details/PrimaryKeyJoinColumnsComposite.java 26 Mar 2008 03:00:33 -0000 1.20 +++ src/org/eclipse/jpt/ui/internal/mappings/details/PrimaryKeyJoinColumnsComposite.java 7 Apr 2008 14:20:20 -0000 @@ -22,7 +22,7 @@ import org.eclipse.jpt.ui.internal.JpaHelpContextIds; import org.eclipse.jpt.ui.internal.mappings.JptUiMappingsMessages; import org.eclipse.jpt.ui.internal.util.PaneEnabler; -import org.eclipse.jpt.ui.internal.widgets.AbstractFormPane; +import org.eclipse.jpt.ui.internal.widgets.AbstractPane; import org.eclipse.jpt.ui.internal.widgets.AddRemoveListPane; import org.eclipse.jpt.ui.internal.widgets.PostExecution; import org.eclipse.jpt.ui.internal.widgets.AddRemovePane.AbstractAdapter; @@ -64,7 +64,7 @@ * @version 2.0 * @since 2.0 */ -public class PrimaryKeyJoinColumnsComposite extends AbstractFormPane +public class PrimaryKeyJoinColumnsComposite extends AbstractPane { private WritablePropertyValueModel joinColumnHolder; @@ -74,7 +74,7 @@ * @param parentPane The parent controller of this one * @param parent The parent container */ - public PrimaryKeyJoinColumnsComposite(AbstractFormPane subjectHolder, + public PrimaryKeyJoinColumnsComposite(AbstractPane subjectHolder, Composite parent) { super(subjectHolder, parent); Index: property_files/jpt_ui_mappings.properties =================================================================== RCS file: /cvsroot/webtools/org.eclipse.jpa/components/jpa/plugins/org.eclipse.jpt.ui/property_files/jpt_ui_mappings.properties,v retrieving revision 1.24 diff -u -r1.24 jpt_ui_mappings.properties --- property_files/jpt_ui_mappings.properties 31 Mar 2008 13:25:37 -0000 1.24 +++ property_files/jpt_ui_mappings.properties 7 Apr 2008 14:20:19 -0000 @@ -178,14 +178,20 @@ OverridesComposite_noName= OverridesComposite_joinColumn=Join Columns -InheritanceComposite_default=Default ({0}) -InheritanceComposite_strategy=Strategy: +InheritanceComposite_char=Character +InheritanceComposite_detailsGroupBox=Details +InheritanceComposite_discriminatorColumnGroupBox=Discriminator Column InheritanceComposite_discriminatorValue=Discriminator Value: -InheritanceComposite_discriminatorValueDefaultWithOneParam=Default ({0}) +InheritanceComposite_integer=Integer +InheritanceComposite_joined=Joined +InheritanceComposite_single_table=Single Table +InheritanceComposite_strategy=Strategy: +InheritanceComposite_string=String +InheritanceComposite_table_per_class=Table Per Class -DiscriminatorColumnComposite_column=Discriminator Column: -DiscriminatorColumnComposite_discriminatorType=Discriminator Type: DiscriminatorColumnComposite_defaultEmpty=Default() +DiscriminatorColumnComposite_discriminatorType=Type: +DiscriminatorColumnComposite_name=Name: IdMappingComposite_pk_generation=PK Generation IdMappingComposite_primaryKeyGeneration=Primary Key Generation @@ -236,7 +242,6 @@ AccessTypeCombo_default=Default MetaDataCompleteCombo_Default=Default ({0}) -InheritanceComposite_defaultDiscriminatorType=Default ({0}) OptionalComposite_false=False OptionalComposite_true=True @@ -258,13 +263,6 @@ CascadeComposite_refresh=Refresh CascadeComposite_remove=Remove -InheritanceComposite_joined=Joined -InheritanceComposite_single_table=Single Table -InheritanceComposite_table_per_class=Table Per Class -InheritanceComposite_char=Character -InheritanceComposite_integer=Integer -InheritanceComposite_string=String - QueriesComposite_addNamedQuery=Add... QueriesComposite_addNamedQueryDescription=Create a new query, which searches against persistent entities independent of the mechanism used to store those entities. QueriesComposite_addNamedQueryDescriptionTitle=Create new named query Index: src/org/eclipse/jpt/ui/internal/mappings/JptUiMappingsMessages.java =================================================================== RCS file: /cvsroot/webtools/org.eclipse.jpa/components/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/mappings/JptUiMappingsMessages.java,v retrieving revision 1.21 diff -u -r1.21 JptUiMappingsMessages.java --- src/org/eclipse/jpt/ui/internal/mappings/JptUiMappingsMessages.java 31 Mar 2008 13:25:37 -0000 1.21 +++ src/org/eclipse/jpt/ui/internal/mappings/JptUiMappingsMessages.java 7 Apr 2008 14:20:20 -0000 @@ -62,9 +62,9 @@ public static String DefaultEmbeddedMappingUiProvider_Default; public static String DefaultWithoutValue; public static String DefaultWithValue; - public static String DiscriminatorColumnComposite_column; public static String DiscriminatorColumnComposite_defaultEmpty; public static String DiscriminatorColumnComposite_discriminatorType; + public static String DiscriminatorColumnComposite_name; public static String EntityComposite_inheritance; public static String EntityComposite_queries; public static String EntityComposite_tableDefault; @@ -92,10 +92,9 @@ public static String IdMappingComposite_sequenceGenerator; public static String IdMappingComposite_tableGenerator; public static String InheritanceComposite_char; - public static String InheritanceComposite_default; - public static String InheritanceComposite_defaultDiscriminatorType; + public static String InheritanceComposite_detailsGroupBox; + public static String InheritanceComposite_discriminatorColumnGroupBox; public static String InheritanceComposite_discriminatorValue; - public static String InheritanceComposite_discriminatorValueDefaultWithOneParam; public static String InheritanceComposite_integer; public static String InheritanceComposite_joined; public static String InheritanceComposite_single_table;