Skip to main content

This CGIT instance is deprecated, and repositories have been moved to Gitlab or Github. See the repository descriptions for specific locations.

aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorkmoore2011-02-06 02:26:37 +0000
committerkmoore2011-02-06 02:26:37 +0000
commit8eebfc6acb049ce23afc7e7b80978f4648964648 (patch)
tree55be1817395e1eb62d655ceb2e72929976a888f2
parentd9d1cec925824e51f34a7620406e00bcd44393d3 (diff)
downloadwebtools.dali-8eebfc6acb049ce23afc7e7b80978f4648964648.tar.gz
webtools.dali-8eebfc6acb049ce23afc7e7b80978f4648964648.tar.xz
webtools.dali-8eebfc6acb049ce23afc7e7b80978f4648964648.zip
renamed org.eclipse.jpt.ui to org.eclipse.jpt.jpa.ui
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/.classpath13
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/.cvsignore6
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/.jetproperties4
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/.options14
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/.project34
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/.settings/org.eclipse.core.resources.prefs3
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/.settings/org.eclipse.jdt.core.prefs7
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/META-INF/MANIFEST.MF94
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/about.html34
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/build.properties26
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/component.xml12
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/dtool16/new_entity_wiz.gifbin0 -> 594 bytes
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/dtool16/new_jpa_file_wiz.gifbin0 -> 359 bytes
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/dtool16/new_jpaproject_wiz.gifbin0 -> 372 bytes
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/etool16/jpa_facet.gifbin0 -> 896 bytes
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/etool16/new_entity_wiz.gifbin0 -> 624 bytes
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/etool16/new_jpa_file_wiz.gifbin0 -> 586 bytes
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/etool16/new_jpaproject_wiz.gifbin0 -> 991 bytes
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/eview16/jpa_details.gifbin0 -> 953 bytes
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/eview16/jpa_perspective.gifbin0 -> 896 bytes
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/eview16/jpa_structure.gifbin0 -> 900 bytes
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/obj16/basic.gifbin0 -> 897 bytes
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/obj16/element-collection.gifbin0 -> 872 bytes
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/obj16/embeddable.gifbin0 -> 1003 bytes
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/obj16/embedded-id.gifbin0 -> 953 bytes
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/obj16/embedded.gifbin0 -> 905 bytes
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/obj16/entity-mappings.gifbin0 -> 974 bytes
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/obj16/entity.gifbin0 -> 1010 bytes
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/obj16/id.gifbin0 -> 938 bytes
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/obj16/jpa-content.gifbin0 -> 896 bytes
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/obj16/jpa-file.gifbin0 -> 968 bytes
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/obj16/jpa-jar-file.gifbin0 -> 1013 bytes
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/obj16/many-to-many.gifbin0 -> 328 bytes
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/obj16/many-to-one.gifbin0 -> 307 bytes
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/obj16/mapped-superclass.gifbin0 -> 1005 bytes
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/obj16/null-attribute-mapping.gifbin0 -> 911 bytes
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/obj16/null-type-mapping.gifbin0 -> 586 bytes
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/obj16/one-to-many.gifbin0 -> 306 bytes
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/obj16/one-to-one.gifbin0 -> 283 bytes
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/obj16/persistence-unit.gifbin0 -> 931 bytes
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/obj16/persistence.gifbin0 -> 961 bytes
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/obj16/transient.gifbin0 -> 892 bytes
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/obj16/version.gifbin0 -> 321 bytes
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/obj16/warning.gifbin0 -> 338 bytes
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/wizban/new_entity_wizban.gifbin0 -> 3316 bytes
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/wizban/new_jpa_file_wizban.gifbin0 -> 3070 bytes
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/wizban/new_jpa_prj_wiz.gifbin0 -> 2791 bytes
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/images/buttons/add-connection.gifbin0 -> 920 bytes
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/images/buttons/add.pngbin0 -> 1000 bytes
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/images/buttons/browse-mini.pngbin0 -> 448 bytes
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/images/buttons/browse.pngbin0 -> 1072 bytes
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/images/buttons/collapse-all.pngbin0 -> 989 bytes
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/images/buttons/delete.pngbin0 -> 1059 bytes
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/images/buttons/deselect-all.pngbin0 -> 1050 bytes
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/images/buttons/dot.gifbin0 -> 121 bytes
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/images/buttons/edit.pngbin0 -> 380 bytes
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/images/buttons/expand-all.pngbin0 -> 1004 bytes
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/images/buttons/list-of-values.pngbin0 -> 1072 bytes
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/images/buttons/move-down.pngbin0 -> 305 bytes
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/images/buttons/move-up.pngbin0 -> 284 bytes
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/images/buttons/reconnect.pngbin0 -> 1022 bytes
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/images/buttons/restore-defaults.pngbin0 -> 1057 bytes
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/images/buttons/select-all.pngbin0 -> 1096 bytes
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/images/buttons/warningstd.pngbin0 -> 993 bytes
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/images/diagram/export-as-img-hover.pngbin0 -> 1222 bytes
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/images/diagram/export-as-img.pngbin0 -> 1047 bytes
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/images/diagram/header_left_bg.pngbin0 -> 232 bytes
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/images/diagram/header_mid_bg.pngbin0 -> 190 bytes
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/images/diagram/header_right_bg.pngbin0 -> 232 bytes
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/images/diagram/print-hover.pngbin0 -> 1219 bytes
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/images/diagram/print.pngbin0 -> 1051 bytes
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/images/diagram/shadow-bottom.pngbin0 -> 928 bytes
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/images/diagram/shadow-lower-left.pngbin0 -> 978 bytes
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/images/diagram/shadow-lower-right.pngbin0 -> 989 bytes
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/images/diagram/shadow-side.pngbin0 -> 924 bytes
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/images/diagram/shadow-upper-right.pngbin0 -> 976 bytes
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/images/diagram/toolbar_bg.pngbin0 -> 196 bytes
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/images/objects/column.gifbin0 -> 113 bytes
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/images/objects/columnKey.gifbin0 -> 1715 bytes
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/images/objects/file.pngbin0 -> 456 bytes
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/images/objects/folder.pngbin0 -> 310 bytes
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/images/objects/forward.gifbin0 -> 138 bytes
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/images/objects/moveRight.gifbin0 -> 138 bytes
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/images/objects/package.pngbin0 -> 319 bytes
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/images/objects/table.gifbin0 -> 953 bytes
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/images/objects/table_obj.gifbin0 -> 561 bytes
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/images/overlays/error.gifbin0 -> 82 bytes
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/images/overlays/warning.pngbin0 -> 322 bytes
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/images/save-image-16.pngbin0 -> 508 bytes
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/plugin.properties73
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/plugin.xml1039
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/property_files/jpt_ui.properties155
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/property_files/jpt_ui_details.properties323
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/property_files/jpt_ui_details2_0.properties52
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/property_files/jpt_ui_details_orm.properties55
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/property_files/jpt_ui_entity_gen.properties111
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/property_files/jpt_ui_entity_wizard.properties57
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/property_files/jpt_ui_persistence.properties56
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/property_files/jpt_ui_persistence2_0.properties60
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/property_files/jpt_ui_validation_preferences.properties211
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/schema/jpaPlatformUis.exsd139
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/JpaPlatformUi.java126
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/JpaPlatformUiFactory.java26
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/JpaPlatformUiProvider.java46
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/JptJpaUiPlugin.java236
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/MappingResourceUiDefinition.java73
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/PersistenceXmlResourceUiDefinition.java34
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/ResourceUiDefinition.java34
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/details/DefaultMappingUiDefinition.java28
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/details/JpaComposite.java45
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/details/JpaDetailsPage.java51
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/details/JpaDetailsProvider.java50
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/details/JpaPageComposite.java47
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/details/MappingUiDefinition.java69
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/details/java/DefaultJavaAttributeMappingUiDefinition.java27
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/details/java/DefaultJavaTypeMappingUiDefinition.java27
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/details/java/JavaAttributeMappingUiDefinition.java48
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/details/java/JavaTypeMappingUiDefinition.java48
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/details/java/JavaUiFactory.java265
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/details/orm/OrmAttributeMappingUiDefinition.java48
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/details/orm/OrmTypeMappingUiDefinition.java48
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/details/orm/OrmXmlUiFactory.java220
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/AbstractJpaPlatformUiProvider.java88
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/EditorPartAdapterFactory.java65
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/GenericJpaPlatformUiProvider.java70
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/ImageRepository.java149
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/JpaHelpContextIds.java151
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/JpaJavaCompletionProposalComputer.java187
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/JpaMappingImageHelper.java86
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/JptUiIcons.java127
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/JptUiMessages.java154
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/JptUiValidationPreferenceMessages.java220
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/actions/GenerateDDLAction.java27
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/actions/GenerateEntitiesAction.java26
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/actions/MakePersistentAction.java145
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/actions/OpenJpaResourceAction.java101
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/actions/ProjectAction.java94
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/actions/SynchronizeClassesAction.java49
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/commands/AddPersistentAttributeToXmlAndMapHandler.java69
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/commands/AddPersistentAttributeToXmlHandler.java56
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/commands/AddPersistentClassHandler.java57
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/commands/ConvertJavaProjectToJpaCommandHandler.java158
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/commands/PersistentAttributeMapAsHandler.java143
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/commands/PersistentTypeMapAsHandler.java124
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/commands/RemovePersistentAttributeFromXmlHandler.java60
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/commands/RemovePersistentClassHandler.java37
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/commands/UpgradeXmlFileVersionHandler.java63
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractBasicMappingComposite.java217
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractBasicMappingUiDefinition.java41
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractEmbeddableComposite.java66
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractEmbeddableUiDefinition.java41
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractEmbeddedIdMappingComposite.java48
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractEmbeddedIdMappingUiDefinition.java42
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractEmbeddedMappingComposite.java75
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractEmbeddedMappingOverridesComposite.java39
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractEmbeddedMappingUiDefinition.java41
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractEntityComposite.java216
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractEntityMappingsDetailsProvider.java32
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractEntityOverridesComposite.java55
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractEntityUiDefinition.java41
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractIdMappingComposite.java136
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractIdMappingUiDefinition.java42
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractInheritanceComposite.java291
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractJoiningStrategyPane.java99
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractJpaDetailsPage.java53
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractManyToManyMappingComposite.java140
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractManyToManyMappingUiDefinition.java41
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractManyToOneMappingComposite.java80
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractManyToOneMappingUiDefinition.java41
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractMappedSuperclassComposite.java62
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractMappedSuperclassUiDefinition.java41
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractMappingUiDefinition.java25
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractOneToManyMappingComposite.java132
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractOneToManyMappingUiDefinition.java41
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractOneToOneMappingComposite.java80
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractOneToOneMappingUiDefinition.java41
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractOrderingComposite.java139
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractOverridesComposite.java414
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractPrimaryKeyJoinColumnsComposite.java344
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractSecondaryTablesComposite.java177
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractTransientMappingUiDefinition.java41
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractVersionMappingComposite.java161
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractVersionMappingUiDefinition.java41
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AccessTypeComposite.java117
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AddQueryDialog.java195
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AddQueryStateObject.java146
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AssociationOverrideComposite.java85
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AttributeOverrideComposite.java71
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/BaseJoinColumnDialog.java111
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/BaseJoinColumnDialogPane.java442
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/BaseJoinColumnStateObject.java389
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/BasicMappingComposite.java80
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/CascadeComposite.java211
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/ColumnComposite.java587
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/DiscriminatorColumnComposite.java309
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/EmbeddedIdMappingComposite.java35
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/EmbeddedMappingComposite.java50
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/EmbeddedMappingOverridesComposite.java50
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/EntityNameComposite.java122
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/EntityOverridesComposite.java25
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/EnumTypeComposite.java115
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/FetchTypeComposite.java109
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/GeneratedValueComposite.java217
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/GenerationComposite.java234
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/GeneratorComposite.java206
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/IdClassComposite.java139
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/IdMappingComposite.java33
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/IdMappingGenerationComposite.java348
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/InverseJoinColumnInJoinTableDialog.java78
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/InverseJoinColumnInJoinTableStateObject.java94
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/JoinColumnDialog.java53
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/JoinColumnDialogPane.java286
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/JoinColumnInJoiningStrategyDialog.java62
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/JoinColumnInJoiningStrategyStateObject.java97
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/JoinColumnInReferenceTableDialog.java80
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/JoinColumnInReferenceTableStateObject.java87
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/JoinColumnJoiningStrategyPane.java152
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/JoinColumnStateObject.java212
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/JoinColumnsComposite.java329
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/JoinTableComposite.java417
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/JoinTableJoiningStrategyPane.java114
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/JoiningStrategyJoinColumnsComposite.java237
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/JoiningStrategyJoinColumnsWithOverrideOptionComposite.java152
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/JptUiDetailsMessages.java303
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/ManyToManyJoiningStrategyPane.java125
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/ManyToManyMappingComposite.java83
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/ManyToOneJoiningStrategyPane.java68
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/ManyToOneMappingComposite.java84
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/MapAsComposite.java638
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/MappedByJoiningStrategyPane.java94
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/MappedByPane.java100
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/NamedNativeQueryPropertyComposite.java182
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/NamedQueryPropertyComposite.java119
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/OneToManyJoiningStrategyPane.java82
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/OneToManyMappingComposite.java82
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/OneToOneJoiningStrategyPane.java96
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/OneToOneMappingComposite.java85
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/OptionalComposite.java102
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/OrderingComposite.java115
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/PersistentAttributeDetailsPage.java182
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/PersistentAttributeMapAsComposite.java134
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/PersistentTypeDetailsPage.java169
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/PersistentTypeMapAsComposite.java127
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/PrimaryKeyJoinColumnDialog.java108
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/PrimaryKeyJoinColumnInSecondaryTableDialog.java111
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/PrimaryKeyJoinColumnInSecondaryTableStateObject.java99
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/PrimaryKeyJoinColumnJoiningStrategyPane.java86
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/PrimaryKeyJoinColumnStateObject.java101
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/PrimaryKeyJoinColumnsInSecondaryTableComposite.java414
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/QueriesComposite.java313
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/QueryHintsComposite.java339
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/ReferenceTableComposite.java436
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/SecondaryTableDialog.java450
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/SequenceGeneratorComposite.java136
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/TableComposite.java239
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/TableGeneratorComposite.java499
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/TargetEntityComposite.java131
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/TemporalTypeComposite.java139
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/TransientMappingComposite.java50
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/VersionMappingComposite.java61
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/db/CatalogCombo.java44
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/db/ColumnCombo.java63
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/db/DatabaseObjectCombo.java349
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/db/SchemaCombo.java56
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/db/SequenceCombo.java49
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/db/TableCombo.java56
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/java/AbstractJavaResourceUiDefinition.java242
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/java/BaseJavaUiFactory.java173
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/java/DefaultBasicMappingUiDefinition.java83
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/java/DefaultEmbeddedMappingUiDefinition.java83
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/java/GenericJavaResourceUiDefinition.java75
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/java/GenericJavaUiFactory.java23
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/java/JavaBasicMappingUiDefinition.java55
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/java/JavaEmbeddableComposite.java45
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/java/JavaEmbeddableUiDefinition.java54
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/java/JavaEmbeddedIdMappingUDefinition.java55
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/java/JavaEmbeddedMappingUiDefinition.java55
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/java/JavaEntityComposite.java53
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/java/JavaEntityUiDefinition.java55
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/java/JavaIdMappingUiDefinition.java55
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/java/JavaInheritanceComposite.java44
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/java/JavaManyToManyMappingUiDefinition.java55
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/java/JavaManyToOneMappingUiDefinition.java55
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/java/JavaMappedSuperclassComposite.java54
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/java/JavaMappedSuperclassUiDefinition.java55
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/java/JavaOneToManyMappingUiDefinition.java55
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/java/JavaOneToOneMappingUiDefinition.java55
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/java/JavaPersistentAttributeDetailsPage.java69
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/java/JavaPersistentAttributeDetailsProvider.java60
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/java/JavaPersistentTypeDetailsProvider.java61
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/java/JavaPrimaryKeyJoinColumnsComposite.java67
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/java/JavaSecondaryTablesComposite.java130
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/java/JavaTransientMappingUiDefinition.java55
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/java/JavaVersionMappingUiDefinition.java55
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/java/NullJavaAttributeMappingUiDefinition.java92
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/java/NullJavaTypeMappingUiDefinition.java95
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/AbstractEntityMappingsDetailsPage.java268
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/AbstractOrmEntityComposite.java90
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/AbstractOrmXmlResourceUiDefinition.java174
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/AddGeneratorDialog.java194
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/AddGeneratorStateObject.java146
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/BaseOrmXmlUiFactory.java134
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/EntityMappingsDetailsPage.java82
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/EntityMappingsDetailsProvider.java60
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/EntityMappingsGeneratorsComposite.java371
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/GenericOrmXmlUiFactory.java15
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/JptUiDetailsOrmMessages.java76
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/MetadataCompleteComposite.java89
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmBasicMappingComposite.java45
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmBasicMappingUiDefinition.java54
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmEmbeddableComposite.java54
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmEmbeddableUiDefinition.java54
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmEmbeddedIdMappingComposite.java39
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmEmbeddedIdMappingUiDefinition.java56
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmEmbeddedMappingComposite.java64
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmEmbeddedMappingUiDefinition.java56
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmEntityComposite.java43
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmEntityUiDefinition.java55
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmIdMappingComposite.java36
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmIdMappingUiDefinition.java56
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmInheritanceComposite.java44
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmJavaClassChooser.java112
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmManyToManyMappingComposite.java90
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmManyToManyMappingUiDefinition.java56
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmManyToOneMappingComposite.java92
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmManyToOneMappingUiDefinition.java56
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmMappedSuperclassComposite.java51
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmMappedSuperclassUiDefinition.java55
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmMappingNameChooser.java71
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmOneToManyMappingComposite.java89
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmOneToManyMappingUiDefinition.java56
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmOneToOneMappingComposite.java91
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmOneToOneMappingUiDefinition.java56
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmPackageChooser.java98
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmPersistentAttributeDetailsPage.java114
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmPersistentAttributeDetailsProvider.java61
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmPersistentTypeDetailsProvider.java62
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmPrimaryKeyJoinColumnsComposite.java70
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmQueriesComposite.java94
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmSecondaryTablesComposite.java211
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmTransientMappingUiDefinition.java56
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmVersionMappingComposite.java41
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmVersionMappingUiDefinition.java56
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmXmlUiDefinition.java84
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/PersistenceUnitMetadataComposite.java303
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/UnsupportedOrmMappingUiDefinition.java89
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/dialogs/AddPersistentAttributeToXmlAndMapDialog.java197
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/dialogs/AddPersistentClassDialog.java310
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/editors/PersistenceContributor.java106
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/editors/PersistenceEditor.java436
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jface/JarFileItemLabelProvider.java47
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jface/XmlMappingFileViewerFilter.java78
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/Generic2_0JpaPlatformUiProvider.java77
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/GenericOrmXml2_0UiFactory.java147
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/Jpa2_0ProjectFlagModel.java31
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/AbstractElementCollectionMapping2_0Composite.java378
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/AbstractElementCollectionMapping2_0UiDefinition.java42
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/AbstractManyToOneMapping2_0Composite.java57
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/AbstractOneToOneMapping2_0Composite.java53
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/AssociationOverride2_0Composite.java86
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/Cacheable2_0Pane.java107
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/CascadePane2_0.java81
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/CollectionTable2_0Composite.java157
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/DerivedIdentity2_0Pane.java200
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/ElementCollectionMapping2_0Composite.java81
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/ElementCollectionValueOverridesComposite.java64
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/EmbeddedIdMapping2_0Composite.java37
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/EmbeddedIdMapping2_0MappedByRelationshipPane.java70
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/EmbeddedMapping2_0OverridesComposite.java64
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/Entity2_0OverridesComposite.java35
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/Generation2_0Composite.java42
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/IdMapping2_0MappedByRelationshipPane.java72
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/IdMappingGeneration2_0Composite.java48
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/JptUiDetailsMessages2_0.java78
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/LockModeComposite.java89
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/ManyToOneJoiningStrategy2_0Pane.java84
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/NamedQueryProperty2_0Composite.java67
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/OneToManyJoiningStrategy2_0Pane.java95
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/OneToOneJoiningStrategy2_0Pane.java115
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/OrderColumnComposite.java370
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/Ordering2_0Composite.java168
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/OrphanRemoval2_0Composite.java111
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/Queries2_0Composite.java55
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/SequenceGenerator2_0Composite.java190
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/TargetClassComposite.java130
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/java/Generic2_0JavaResourceUiDefinition.java91
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/java/Generic2_0JavaUiFactory.java134
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/java/JavaElementCollectionMapping2_0UiDefinition.java56
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/java/JavaEmbeddable2_0Composite.java69
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/java/JavaEmbeddedMapping2_0Composite.java60
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/java/JavaEntity2_0Composite.java105
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/java/JavaIdMapping2_0Composite.java43
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/java/JavaManyToManyMapping2_0Composite.java46
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/java/JavaManyToOneMapping2_0Composite.java42
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/java/JavaManyToOneMapping2_0Pane.java14
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/java/JavaMappedSuperclass2_0Composite.java74
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/java/JavaOneToManyMapping2_0Composite.java66
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/java/JavaOneToOneMapping2_0Composite.java62
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/orm/EntityMappings2_0DetailsPage.java43
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/orm/EntityMappings2_0DetailsProvider.java58
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/orm/EntityMappingsGenerators2_0Composite.java53
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/orm/OrmBasicMapping2_0Composite.java58
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/orm/OrmElementCollectionMapping2_0Composite.java59
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/orm/OrmElementCollectionMapping2_0UiDefinition.java56
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/orm/OrmEmbeddedIdMapping2_0Composite.java53
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/orm/OrmEmbeddedMapping2_0Composite.java77
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/orm/OrmEntity2_0Composite.java91
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/orm/OrmIdMapping2_0Composite.java58
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/orm/OrmManyToManyMapping2_0Composite.java57
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/orm/OrmManyToOneMapping2_0Composite.java57
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/orm/OrmOneToManyMapping2_0Composite.java80
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/orm/OrmOneToOneMapping2_0Composite.java76
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/orm/OrmQueries2_0Composite.java43
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/orm/OrmVersionMapping2_0Composite.java55
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/orm/OrmXml2_0UiDefinition.java96
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/persistence/Generic2_0PersistenceXmlUiFactory.java83
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/persistence/JptUiPersistence2_0Messages.java82
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/persistence/PersistenceXml2_0UiDefinition.java55
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/persistence/connection/ConnectionPropertiesComposite.java38
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/persistence/connection/DataSourcePropertiesComposite.java142
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/persistence/connection/GenericPersistenceUnit2_0ConnectionComposite.java49
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/persistence/connection/GenericPersistenceUnit2_0ConnectionTab.java90
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/persistence/connection/JdbcConnectionPropertiesComposite.java314
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/persistence/connection/JdbcDriverComposite.java94
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/persistence/connection/JdbcPropertiesComposite.java79
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/persistence/connection/TransactionTypeComposite.java123
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/persistence/options/GenericPersistenceUnit2_0OptionsComposite.java63
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/persistence/options/GenericPersistenceUnit2_0OptionsTab.java90
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/persistence/options/LockingConfigurationComposite.java85
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/persistence/options/QueryConfigurationComposite.java85
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/persistence/options/SharedCacheModeComposite.java94
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/persistence/options/ValidationConfigurationComposite.java385
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/persistence/options/ValidationModeComposite.java94
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/platform/generic/Generic2_0JpaPlatformUiFactory.java34
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/listeners/SWTConnectionListenerWrapper.java348
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/menus/MapAsContribution.java204
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/menus/PersistentAttributeMapAsContribution.java86
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/menus/PersistentTypeMapAsContribution.java64
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/navigator/JpaNavigatorActionProvider.java59
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/navigator/JpaNavigatorContentAndLabelProvider.java20
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/navigator/JpaNavigatorContentProvider.java216
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/navigator/JpaNavigatorItemLabelProviderFactory.java75
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/navigator/JpaNavigatorLabelProvider.java138
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/navigator/JpaNavigatorTreeItemContentProviderFactory.java75
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/persistence/JptUiPersistenceMessages.java78
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/persistence/details/AbstractPersistenceXmlResourceUiDefinition.java50
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/persistence/details/ArchiveFileSelectionDialog.java225
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/persistence/details/GenericPersistenceUnitGeneralComposite.java116
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/persistence/details/GenericPersistenceUnitJarFilesComposite.java26
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/persistence/details/GenericPersistenceUnitMappingFilesComposite.java52
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/persistence/details/GenericPersistenceXmlUiFactory.java38
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/persistence/details/PersistenceUnitClassesComposite.java376
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/persistence/details/PersistenceUnitConnectionComposite.java144
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/persistence/details/PersistenceUnitConnectionDatabaseComposite.java159
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/persistence/details/PersistenceUnitConnectionGeneralComposite.java106
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/persistence/details/PersistenceUnitGeneralComposite.java230
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/persistence/details/PersistenceUnitJarFilesComposite.java230
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/persistence/details/PersistenceUnitMappingFilesComposite.java261
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/persistence/details/PersistenceUnitPropertiesComposite.java419
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/persistence/details/PersistenceXmlUiDefinition.java53
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/persistence/details/PersistenceXmlUiFactory.java38
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/perspective/JpaPerspectiveFactory.java51
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/platform/JpaPlatformUiRegistry.java190
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/platform/base/BaseJpaPlatformUi.java191
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/platform/base/EntitiesGenerator.java66
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/platform/generic/ClassRefItemLabelProvider.java64
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/platform/generic/EntityMappingsItemLabelProvider.java48
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/platform/generic/GenericJpaPlatformUi.java34
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/platform/generic/GenericJpaPlatformUiFactory.java32
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/platform/generic/GenericNavigatorItemContentProviderFactory.java255
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/platform/generic/GenericNavigatorItemLabelProviderFactory.java51
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/platform/generic/GenericNavigatorProvider.java29
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/platform/generic/JarFileRefItemLabelProvider.java57
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/platform/generic/JavaPersistentTypeItemContentProvider.java53
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/platform/generic/MappingFileRefItemLabelProvider.java63
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/platform/generic/OrmPersistentTypeItemContentProvider.java82
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/platform/generic/OrmXmlItemContentProvider.java69
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/platform/generic/OrmXmlItemLabelProvider.java46
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/platform/generic/PersistenceItemLabelProvider.java47
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/platform/generic/PersistenceUnitItemLabelProvider.java55
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/platform/generic/PersistenceXmlItemContentProvider.java61
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/platform/generic/PersistenceXmlItemLabelProvider.java46
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/platform/generic/PersistentAttributeItemContentProvider.java39
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/platform/generic/PersistentAttributeItemLabelProvider.java77
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/platform/generic/PersistentTypeItemLabelProvider.java67
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/platform/generic/RootContextItemContentProvider.java51
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/platform/generic/RootContextItemLabelProvider.java46
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/preferences/JpaPreferencesPage.java68
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/preferences/JpaProblemSeveritiesPage.java941
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/properties/DataModelPropertyPage.java309
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/properties/JpaProjectPropertiesPage.java1617
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/selection/DefaultJpaSelection.java60
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/selection/DefaultJpaSelectionManager.java288
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/selection/JpaDetailsSelectionParticipant.java42
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/selection/JpaSelection.java37
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/selection/JpaSelectionEvent.java64
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/selection/JpaSelectionManager.java57
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/selection/JpaSelectionParticipant.java38
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/selection/JpaStructureSelectionParticipant.java69
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/selection/SelectionManagerFactory.java105
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/selection/TextEditorSelectionParticipant.java215
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/selection/WorkbenchPartAdapterFactory.java61
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/structure/GeneralJpaMappingItemLabelProviderFactory.java33
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/structure/JavaItemContentProviderFactory.java39
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/structure/JavaItemLabelProviderFactory.java17
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/structure/JavaResourceModelStructureProvider.java45
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/structure/OrmItemContentProviderFactory.java79
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/structure/OrmItemLabelProviderFactory.java27
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/structure/OrmResourceModelStructureProvider.java46
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/structure/PersistenceItemContentProviderFactory.java271
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/structure/PersistenceItemLabelProviderFactory.java48
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/structure/PersistenceResourceModelStructureProvider.java46
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/structure/ResourceModelItemContentProvider.java55
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/views/AbstractJpaView.java166
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/views/JpaDetailsView.java190
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/views/structure/JpaStructurePage.java409
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/views/structure/JpaStructureView.java134
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/DatabaseSchemaWizardPage.java445
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/JpaFacetActionPage.java203
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/JpaFacetInstallPage.java248
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/JpaFacetVersionChangePage.java44
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/JpaMakePersistentWizard.java79
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/JpaMakePersistentWizardPage.java635
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/NewEntityDropDownAction.java261
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/SelectJpaOrmMappingFileDialog.java146
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/entity/AnnotatedEntityTemplate.java166
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/entity/EntityClassWizardPage.java408
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/entity/EntityFieldsWizardPage.java234
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/entity/EntityRowTableWizardSection.java822
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/entity/EntityTemplate.java126
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/entity/EntityWizard.java176
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/entity/EntityWizardMsg.java127
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/entity/IdClassTemplate.java255
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/entity/data/model/CreateEntityTemplateModel.java384
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/entity/data/model/EntityDataModelProvider.java504
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/entity/data/model/EntityRow.java206
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/entity/data/model/IEntityDataModelProperties.java33
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/entity/data/operation/NewEntityClassOperation.java537
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/gen/AssociationFigure.java227
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/gen/AssociationTablesPage.java194
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/gen/AssociationsListComposite.java137
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/gen/CardinalityPage.java161
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/gen/CascadeDialog.java191
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/gen/ColumnGenPanel.java360
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/gen/DatabaseGroup.java526
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/gen/DefaultTableGenerationWizardPage.java327
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/gen/GenerateEntitiesFromSchemaWizard.java541
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/gen/JoinColumnsPage.java629
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/gen/JptUiEntityGenMessages.java123
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/gen/NewAssociationWizard.java199
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/gen/NewAssociationWizardPage.java60
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/gen/PromptJPAProjectWizardPage.java154
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/gen/SWTUtil.java133
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/gen/SelectTableDialog.java75
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/gen/TableAssociationsWizardPage.java775
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/gen/TableFigure.java86
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/gen/TableGenPanel.java400
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/gen/TablesAndColumnsCustomizationWizardPage.java377
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/gen/TablesSelectorWizardPage.java557
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/orm/MappingFileNewFileWizardPage.java76
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/orm/MappingFileOptionsWizardPage.java125
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/orm/MappingFileWizard.java347
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/proj/AddToEarComposite.java114
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/proj/JpaProjectWizard.java62
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/proj/JpaProjectWizardFirstPage.java121
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/proj/model/JpaProjectCreationDataModelProperties.java28
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/proj/model/JpaProjectCreationDataModelProvider.java349
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/jpa2/details/java/JavaUiFactory2_0.java41
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/jpa2/details/orm/OrmXmlUiFactory2_0.java41
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/navigator/JpaNavigatorProvider.java43
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/structure/JpaStructureProvider.java41
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/templates/annotated_entity.javajet64
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/templates/entity.javajet50
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.ui/templates/idClass.javajet124
574 files changed, 65098 insertions, 0 deletions
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/.classpath b/jpa/plugins/org.eclipse.jpt.jpa.ui/.classpath
new file mode 100644
index 0000000000..83c0a39455
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/.classpath
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="src" path="property_files"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins">
+ <accessrules>
+ <accessrule kind="accessible" pattern="org/eclipse/jst/**"/>
+ <accessrule kind="accessible" pattern="org/eclipse/wst/**"/>
+ </accessrules>
+ </classpathentry>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/.cvsignore b/jpa/plugins/org.eclipse.jpt.jpa.ui/.cvsignore
new file mode 100644
index 0000000000..a196dd7686
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/.cvsignore
@@ -0,0 +1,6 @@
+bin
+@dot
+temp.folder
+build.xml
+javaCompiler...args
+javaCompiler...args.* \ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/.jetproperties b/jpa/plugins/org.eclipse.jpt.jpa.ui/.jetproperties
new file mode 100644
index 0000000000..2907c83a43
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/.jetproperties
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<jet-settings>
+ <template-container>templates</template-container> <source-container>src</source-container>
+</jet-settings>
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/.options b/jpa/plugins/org.eclipse.jpt.jpa.ui/.options
new file mode 100644
index 0000000000..c49913db89
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/.options
@@ -0,0 +1,14 @@
+# Debugging options for org.eclipse.jpt.jpa.ui plug-in
+
+# Turn on debugging for the org.eclipse.jpt.jpa.ui plugin.
+org.eclipse.jpt.jpa.ui/debug=false
+
+# Turn on debugging for unit-tests
+org.eclipse.jpt.jpa.ui/debug/unit-tests=false
+
+# Turn on debugging for events occurring in the UI panes
+org.eclipse.jpt.jpa.ui/debug/ui/layout=false
+org.eclipse.jpt.jpa.ui/debug/ui/detailsView=false
+
+# Turn on debugging for events coming from ConnectionProfile
+org.eclipse.jpt.jpa.ui/debug/ui/db=false
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/.project b/jpa/plugins/org.eclipse.jpt.jpa.ui/.project
new file mode 100644
index 0000000000..4c5101c089
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/.project
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.jpt.jpa.ui</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.emf.codegen.JETBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.emf.codegen.jet.IJETNature</nature>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ </natures>
+</projectDescription>
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/.settings/org.eclipse.core.resources.prefs b/jpa/plugins/org.eclipse.jpt.jpa.ui/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 0000000000..2c6dda4a74
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,3 @@
+#Tue Jan 15 11:12:14 EST 2008
+eclipse.preferences.version=1
+encoding/<project>=ISO-8859-1
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/.settings/org.eclipse.jdt.core.prefs b/jpa/plugins/org.eclipse.jpt.jpa.ui/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000000..d909c105d5
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,7 @@
+#Sun May 27 14:55:01 EDT 2007
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.5
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/META-INF/MANIFEST.MF b/jpa/plugins/org.eclipse.jpt.jpa.ui/META-INF/MANIFEST.MF
new file mode 100644
index 0000000000..59a19ac511
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/META-INF/MANIFEST.MF
@@ -0,0 +1,94 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %pluginName
+Bundle-Vendor: %providerName
+Bundle-SymbolicName: org.eclipse.jpt.jpa.ui;singleton:=true
+Bundle-Version: 2.4.0.qualifier
+Bundle-Activator: org.eclipse.jpt.jpa.ui.JptJpaUiPlugin
+Bundle-ActivationPolicy: lazy
+Bundle-ClassPath: .
+Bundle-Localization: plugin
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
+Require-Bundle: org.eclipse.core.expressions;bundle-version="[3.4.0,4.0.0)",
+ org.eclipse.core.resources;bundle-version="[3.4.0,4.0.0)",
+ org.eclipse.draw2d;bundle-version="[3.4.0,4.0.0)",
+ org.eclipse.emf.codegen;bundle-version="[2.4.0,3.0.0)",
+ org.eclipse.emf.ecore.xmi;bundle-version="[2.5.0,3.0.0)",
+ org.eclipse.help;bundle-version="[3.4.0,4.0.0)",
+ org.eclipse.jdt.core;bundle-version="[3.4.0,4.0.0)",
+ org.eclipse.jdt.ui;bundle-version="[3.4.0,4.0.0)",
+ org.eclipse.jem.util;bundle-version="[2.0.100,3.0.0)",
+ org.eclipse.jface;bundle-version="[3.7.0,4.0.0)",
+ org.eclipse.jface.text;bundle-version="[3.4.0,4.0.0)",
+ org.eclipse.jpt.common.core;bundle-version="[1.0.0,2.0.0)",
+ org.eclipse.jpt.common.ui;bundle-version="[1.0.0,2.0.0)",
+ org.eclipse.jpt.jpa.core;bundle-version="[2.0.0,3.0.0)",
+ org.eclipse.jpt.jpa.db;bundle-version="[1.2.0,2.0.0)",
+ org.eclipse.jpt.jpa.db.ui;bundle-version="[1.0.1,2.0.0)",
+ org.eclipse.jpt.jpa.gen;bundle-version="[1.1.0,2.0.0)",
+ org.eclipse.jpt.common.utility;bundle-version="[1.2.0,2.0.0)",
+ org.eclipse.jst.common.annotations.controller;bundle-version="[1.1.100,2.0.0)",
+ org.eclipse.jst.common.project.facet.core;bundle-version="[1.3.100,2.0.0)",
+ org.eclipse.jst.common.project.facet.ui;bundle-version="[1.3.100,2.0.0)",
+ org.eclipse.jst.j2ee;bundle-version="[1.1.200,2.0.0)",
+ org.eclipse.jst.j2ee.ui;bundle-version="[1.1.200,2.0.0)",
+ org.eclipse.ui.ide;bundle-version="[3.4.0,4.0.0)",
+ org.eclipse.ui.views.properties.tabbed;bundle-version="[3.4.0,4.0.0)",
+ org.eclipse.ui.navigator;bundle-version="[3.3.100,4.0.0)",
+ org.eclipse.ui.navigator.resources;bundle-version="[3.3.100,4.0.0)",
+ org.eclipse.ui.workbench.texteditor;bundle-version="[3.4.0,4.0.0)",
+ org.eclipse.wst.common.emf;bundle-version="[1.1.200,2.0.0)",
+ org.eclipse.wst.common.frameworks.ui;bundle-version="[1.1.200,2.0.0)",
+ org.eclipse.wst.common.project.facet.ui;bundle-version="[1.3.0,2.0.0)",
+ org.eclipse.wst.sse.ui;bundle-version="[1.1.0,2.0.0)",
+ org.eclipse.wst.web.ui;bundle-version="[1.1.200,2.0.0)"
+Export-Package: org.eclipse.jpt.jpa.ui,
+ org.eclipse.jpt.jpa.ui.details,
+ org.eclipse.jpt.jpa.ui.details.java,
+ org.eclipse.jpt.jpa.ui.details.orm,
+ org.eclipse.jpt.jpa.ui.internal;x-internal:=true,
+ org.eclipse.jpt.jpa.ui.internal.actions;x-internal:=true,
+ org.eclipse.jpt.jpa.ui.internal.commands;x-internal:=true,
+ org.eclipse.jpt.jpa.ui.internal.details;x-internal:=true,
+ org.eclipse.jpt.jpa.ui.internal.details.db;x-internal:=true,
+ org.eclipse.jpt.jpa.ui.internal.details.java;x-internal:=true,
+ org.eclipse.jpt.jpa.ui.internal.details.orm;x-internal:=true,
+ org.eclipse.jpt.jpa.ui.internal.dialogs;x-internal:=true,
+ org.eclipse.jpt.jpa.ui.internal.editors;x-internal:=true,
+ org.eclipse.jpt.jpa.ui.internal.jface;x-internal:=true,
+ org.eclipse.jpt.jpa.ui.internal.jpa2;x-internal:=true,
+ org.eclipse.jpt.jpa.ui.internal.jpa2.details;x-internal:=true,
+ org.eclipse.jpt.jpa.ui.internal.jpa2.details.java;x-internal:=true,
+ org.eclipse.jpt.jpa.ui.internal.jpa2.details.orm;x-internal:=true,
+ org.eclipse.jpt.jpa.ui.internal.jpa2.persistence;x-internal:=true,
+ org.eclipse.jpt.jpa.ui.internal.jpa2.persistence.connection;x-internal:=true,
+ org.eclipse.jpt.jpa.ui.internal.jpa2.persistence.options;x-internal:=true,
+ org.eclipse.jpt.jpa.ui.internal.jpa2.platform.generic;x-internal:=true,
+ org.eclipse.jpt.jpa.ui.internal.listeners;x-internal:=true,
+ org.eclipse.jpt.jpa.ui.internal.menus;x-internal:=true,
+ org.eclipse.jpt.jpa.ui.internal.navigator;x-internal:=true,
+ org.eclipse.jpt.jpa.ui.internal.persistence;x-internal:=true,
+ org.eclipse.jpt.jpa.ui.internal.persistence.details;x-internal:=true,
+ org.eclipse.jpt.jpa.ui.internal.perspective;x-internal:=true,
+ org.eclipse.jpt.jpa.ui.internal.platform;x-internal:=true,
+ org.eclipse.jpt.jpa.ui.internal.platform.base;x-internal:=true,
+ org.eclipse.jpt.jpa.ui.internal.platform.generic;x-internal:=true,
+ org.eclipse.jpt.jpa.ui.internal.preferences;x-internal:=true,
+ org.eclipse.jpt.jpa.ui.internal.properties;x-internal:=true,
+ org.eclipse.jpt.jpa.ui.internal.selection;x-internal:=true,
+ org.eclipse.jpt.jpa.ui.internal.structure;x-internal:=true,
+ org.eclipse.jpt.jpa.ui.internal.views;x-internal:=true,
+ org.eclipse.jpt.jpa.ui.internal.views.structure;x-internal:=true,
+ org.eclipse.jpt.jpa.ui.internal.wizards;x-internal:=true,
+ org.eclipse.jpt.jpa.ui.internal.wizards.entity;x-internal:=true,
+ org.eclipse.jpt.jpa.ui.internal.wizards.entity.data.model;x-internal:=true,
+ org.eclipse.jpt.jpa.ui.internal.wizards.entity.data.operation;x-internal:=true,
+ org.eclipse.jpt.jpa.ui.internal.wizards.gen;x-internal:=true,
+ org.eclipse.jpt.jpa.ui.internal.wizards.orm;x-internal:=true,
+ org.eclipse.jpt.jpa.ui.internal.wizards.proj,
+ org.eclipse.jpt.jpa.ui.internal.wizards.proj.model,
+ org.eclipse.jpt.jpa.ui.jpa2.details.java,
+ org.eclipse.jpt.jpa.ui.jpa2.details.orm,
+ org.eclipse.jpt.jpa.ui.navigator,
+ org.eclipse.jpt.jpa.ui.structure
+Import-Package: com.ibm.icu.text;version="4.0.1"
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/about.html b/jpa/plugins/org.eclipse.jpt.jpa.ui/about.html
new file mode 100644
index 0000000000..be534ba44f
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/about.html
@@ -0,0 +1,34 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<HTML>
+
+<head>
+<title>About</title>
+<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
+</head>
+
+<BODY lang="EN-US">
+
+<H3>About This Content</H3>
+
+<P>May 02, 2008</P>
+
+<H3>License</H3>
+
+<P>The Eclipse Foundation makes available all content in this plug-in
+("Content"). Unless otherwise indicated below, the Content is provided to you
+under the terms and conditions of the Eclipse Public License Version 1.0
+("EPL"). A copy of the EPL is available at
+<A href="http://www.eclipse.org/org/documents/epl-v10.php">http://www.eclipse.org/org/documents/epl-v10.php</A>.
+For purposes of the EPL, "Program" will mean the Content.</P>
+
+<P>If you did not receive this Content directly from the Eclipse Foundation, the
+Content is being redistributed by another party ("Redistributor") and different
+terms and conditions may apply to your use of any object code in the Content.
+Check the Redistributor's license that was provided with the Content. If no such
+license exists, contact the Redistributor. Unless otherwise indicated below, the
+terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at
+<A href="http://www.eclipse.org/">http://www.eclipse.org/</A>.</P>
+
+</BODY>
+</HTML>
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/build.properties b/jpa/plugins/org.eclipse.jpt.jpa.ui/build.properties
new file mode 100644
index 0000000000..83fdfc70e1
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/build.properties
@@ -0,0 +1,26 @@
+################################################################################
+# Copyright (c) 2006, 2009 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
+################################################################################
+javacSource = 1.5
+javacTarget = 1.5
+source.. = src/,\
+ property_files/
+output.. = bin/
+bin.includes = .,\
+ META-INF/,\
+ about.html,\
+ icons/,\
+ plugin.xml,\
+ plugin.properties,\
+ templates/,\
+ images/
+jars.compile.order = .
+src.includes = templates/,\
+ schema/
+
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/component.xml b/jpa/plugins/org.eclipse.jpt.jpa.ui/component.xml
new file mode 100644
index 0000000000..dd3e793443
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/component.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (c) 2007, 2010 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
+ -->
+
+<component xmlns="http://eclipse.org/wtp/releng/tools/component-model" name="org.eclipse.jpt.jpa.ui"><description url=""></description><component-depends unrestricted="true"></component-depends><plugin id="org.eclipse.jpt.jpa.ui" fragment="false"/></component> \ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/dtool16/new_entity_wiz.gif b/jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/dtool16/new_entity_wiz.gif
new file mode 100644
index 0000000000..55f7cc932f
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/dtool16/new_entity_wiz.gif
Binary files differ
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/dtool16/new_jpa_file_wiz.gif b/jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/dtool16/new_jpa_file_wiz.gif
new file mode 100644
index 0000000000..610f6042d0
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/dtool16/new_jpa_file_wiz.gif
Binary files differ
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/dtool16/new_jpaproject_wiz.gif b/jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/dtool16/new_jpaproject_wiz.gif
new file mode 100644
index 0000000000..633768f35d
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/dtool16/new_jpaproject_wiz.gif
Binary files differ
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/etool16/jpa_facet.gif b/jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/etool16/jpa_facet.gif
new file mode 100644
index 0000000000..c0ab917511
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/etool16/jpa_facet.gif
Binary files differ
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/etool16/new_entity_wiz.gif b/jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/etool16/new_entity_wiz.gif
new file mode 100644
index 0000000000..8533ca10fb
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/etool16/new_entity_wiz.gif
Binary files differ
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/etool16/new_jpa_file_wiz.gif b/jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/etool16/new_jpa_file_wiz.gif
new file mode 100644
index 0000000000..6e0042e98c
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/etool16/new_jpa_file_wiz.gif
Binary files differ
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/etool16/new_jpaproject_wiz.gif b/jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/etool16/new_jpaproject_wiz.gif
new file mode 100644
index 0000000000..12da8074ae
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/etool16/new_jpaproject_wiz.gif
Binary files differ
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/eview16/jpa_details.gif b/jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/eview16/jpa_details.gif
new file mode 100644
index 0000000000..3280138b67
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/eview16/jpa_details.gif
Binary files differ
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/eview16/jpa_perspective.gif b/jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/eview16/jpa_perspective.gif
new file mode 100644
index 0000000000..c0ab917511
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/eview16/jpa_perspective.gif
Binary files differ
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/eview16/jpa_structure.gif b/jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/eview16/jpa_structure.gif
new file mode 100644
index 0000000000..682c90a589
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/eview16/jpa_structure.gif
Binary files differ
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/obj16/basic.gif b/jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/obj16/basic.gif
new file mode 100644
index 0000000000..a547d743e7
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/obj16/basic.gif
Binary files differ
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/obj16/element-collection.gif b/jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/obj16/element-collection.gif
new file mode 100644
index 0000000000..64706d215f
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/obj16/element-collection.gif
Binary files differ
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/obj16/embeddable.gif b/jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/obj16/embeddable.gif
new file mode 100644
index 0000000000..8856f78874
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/obj16/embeddable.gif
Binary files differ
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/obj16/embedded-id.gif b/jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/obj16/embedded-id.gif
new file mode 100644
index 0000000000..c1c8e210e7
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/obj16/embedded-id.gif
Binary files differ
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/obj16/embedded.gif b/jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/obj16/embedded.gif
new file mode 100644
index 0000000000..c2ae66497a
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/obj16/embedded.gif
Binary files differ
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/obj16/entity-mappings.gif b/jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/obj16/entity-mappings.gif
new file mode 100644
index 0000000000..c349c962e2
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/obj16/entity-mappings.gif
Binary files differ
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/obj16/entity.gif b/jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/obj16/entity.gif
new file mode 100644
index 0000000000..d606f482e2
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/obj16/entity.gif
Binary files differ
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/obj16/id.gif b/jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/obj16/id.gif
new file mode 100644
index 0000000000..a205ec38ab
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/obj16/id.gif
Binary files differ
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/obj16/jpa-content.gif b/jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/obj16/jpa-content.gif
new file mode 100644
index 0000000000..c0ab917511
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/obj16/jpa-content.gif
Binary files differ
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/obj16/jpa-file.gif b/jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/obj16/jpa-file.gif
new file mode 100644
index 0000000000..b4e9f4724b
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/obj16/jpa-file.gif
Binary files differ
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/obj16/jpa-jar-file.gif b/jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/obj16/jpa-jar-file.gif
new file mode 100644
index 0000000000..e92828d2d9
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/obj16/jpa-jar-file.gif
Binary files differ
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/obj16/many-to-many.gif b/jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/obj16/many-to-many.gif
new file mode 100644
index 0000000000..48885b21fe
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/obj16/many-to-many.gif
Binary files differ
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/obj16/many-to-one.gif b/jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/obj16/many-to-one.gif
new file mode 100644
index 0000000000..2e1e2b9387
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/obj16/many-to-one.gif
Binary files differ
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/obj16/mapped-superclass.gif b/jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/obj16/mapped-superclass.gif
new file mode 100644
index 0000000000..8cc37645c0
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/obj16/mapped-superclass.gif
Binary files differ
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/obj16/null-attribute-mapping.gif b/jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/obj16/null-attribute-mapping.gif
new file mode 100644
index 0000000000..70a9c23541
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/obj16/null-attribute-mapping.gif
Binary files differ
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/obj16/null-type-mapping.gif b/jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/obj16/null-type-mapping.gif
new file mode 100644
index 0000000000..6279478c51
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/obj16/null-type-mapping.gif
Binary files differ
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/obj16/one-to-many.gif b/jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/obj16/one-to-many.gif
new file mode 100644
index 0000000000..1e90027861
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/obj16/one-to-many.gif
Binary files differ
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/obj16/one-to-one.gif b/jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/obj16/one-to-one.gif
new file mode 100644
index 0000000000..578ec36aa3
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/obj16/one-to-one.gif
Binary files differ
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/obj16/persistence-unit.gif b/jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/obj16/persistence-unit.gif
new file mode 100644
index 0000000000..9cc45f6945
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/obj16/persistence-unit.gif
Binary files differ
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/obj16/persistence.gif b/jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/obj16/persistence.gif
new file mode 100644
index 0000000000..d1f616d64f
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/obj16/persistence.gif
Binary files differ
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/obj16/transient.gif b/jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/obj16/transient.gif
new file mode 100644
index 0000000000..cc5d83db20
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/obj16/transient.gif
Binary files differ
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/obj16/version.gif b/jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/obj16/version.gif
new file mode 100644
index 0000000000..202a8104f4
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/obj16/version.gif
Binary files differ
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/obj16/warning.gif b/jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/obj16/warning.gif
new file mode 100644
index 0000000000..14009e9974
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/obj16/warning.gif
Binary files differ
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/wizban/new_entity_wizban.gif b/jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/wizban/new_entity_wizban.gif
new file mode 100644
index 0000000000..b1d934cb87
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/wizban/new_entity_wizban.gif
Binary files differ
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/wizban/new_jpa_file_wizban.gif b/jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/wizban/new_jpa_file_wizban.gif
new file mode 100644
index 0000000000..e84622322a
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/wizban/new_jpa_file_wizban.gif
Binary files differ
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/wizban/new_jpa_prj_wiz.gif b/jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/wizban/new_jpa_prj_wiz.gif
new file mode 100644
index 0000000000..4f52bb65bc
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/icons/full/wizban/new_jpa_prj_wiz.gif
Binary files differ
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/images/buttons/add-connection.gif b/jpa/plugins/org.eclipse.jpt.jpa.ui/images/buttons/add-connection.gif
new file mode 100644
index 0000000000..864034f74e
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/images/buttons/add-connection.gif
Binary files differ
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/images/buttons/add.png b/jpa/plugins/org.eclipse.jpt.jpa.ui/images/buttons/add.png
new file mode 100644
index 0000000000..6bd3486b7a
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/images/buttons/add.png
Binary files differ
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/images/buttons/browse-mini.png b/jpa/plugins/org.eclipse.jpt.jpa.ui/images/buttons/browse-mini.png
new file mode 100644
index 0000000000..1f64f24965
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/images/buttons/browse-mini.png
Binary files differ
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/images/buttons/browse.png b/jpa/plugins/org.eclipse.jpt.jpa.ui/images/buttons/browse.png
new file mode 100644
index 0000000000..8081fd9293
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/images/buttons/browse.png
Binary files differ
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/images/buttons/collapse-all.png b/jpa/plugins/org.eclipse.jpt.jpa.ui/images/buttons/collapse-all.png
new file mode 100644
index 0000000000..3582d18d5b
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/images/buttons/collapse-all.png
Binary files differ
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/images/buttons/delete.png b/jpa/plugins/org.eclipse.jpt.jpa.ui/images/buttons/delete.png
new file mode 100644
index 0000000000..afba8b4463
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/images/buttons/delete.png
Binary files differ
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/images/buttons/deselect-all.png b/jpa/plugins/org.eclipse.jpt.jpa.ui/images/buttons/deselect-all.png
new file mode 100644
index 0000000000..49544f5703
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/images/buttons/deselect-all.png
Binary files differ
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/images/buttons/dot.gif b/jpa/plugins/org.eclipse.jpt.jpa.ui/images/buttons/dot.gif
new file mode 100644
index 0000000000..57a514d649
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/images/buttons/dot.gif
Binary files differ
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/images/buttons/edit.png b/jpa/plugins/org.eclipse.jpt.jpa.ui/images/buttons/edit.png
new file mode 100644
index 0000000000..306d6a1c5f
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/images/buttons/edit.png
Binary files differ
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/images/buttons/expand-all.png b/jpa/plugins/org.eclipse.jpt.jpa.ui/images/buttons/expand-all.png
new file mode 100644
index 0000000000..db729a3990
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/images/buttons/expand-all.png
Binary files differ
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/images/buttons/list-of-values.png b/jpa/plugins/org.eclipse.jpt.jpa.ui/images/buttons/list-of-values.png
new file mode 100644
index 0000000000..8081fd9293
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/images/buttons/list-of-values.png
Binary files differ
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/images/buttons/move-down.png b/jpa/plugins/org.eclipse.jpt.jpa.ui/images/buttons/move-down.png
new file mode 100644
index 0000000000..f6e5281b70
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/images/buttons/move-down.png
Binary files differ
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/images/buttons/move-up.png b/jpa/plugins/org.eclipse.jpt.jpa.ui/images/buttons/move-up.png
new file mode 100644
index 0000000000..7c8b1ccf79
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/images/buttons/move-up.png
Binary files differ
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/images/buttons/reconnect.png b/jpa/plugins/org.eclipse.jpt.jpa.ui/images/buttons/reconnect.png
new file mode 100644
index 0000000000..df009468ab
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/images/buttons/reconnect.png
Binary files differ
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/images/buttons/restore-defaults.png b/jpa/plugins/org.eclipse.jpt.jpa.ui/images/buttons/restore-defaults.png
new file mode 100644
index 0000000000..2d74ae4e01
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/images/buttons/restore-defaults.png
Binary files differ
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/images/buttons/select-all.png b/jpa/plugins/org.eclipse.jpt.jpa.ui/images/buttons/select-all.png
new file mode 100644
index 0000000000..4eaff2beab
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/images/buttons/select-all.png
Binary files differ
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/images/buttons/warningstd.png b/jpa/plugins/org.eclipse.jpt.jpa.ui/images/buttons/warningstd.png
new file mode 100644
index 0000000000..a7b471c2d3
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/images/buttons/warningstd.png
Binary files differ
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/images/diagram/export-as-img-hover.png b/jpa/plugins/org.eclipse.jpt.jpa.ui/images/diagram/export-as-img-hover.png
new file mode 100644
index 0000000000..0751b3267c
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/images/diagram/export-as-img-hover.png
Binary files differ
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/images/diagram/export-as-img.png b/jpa/plugins/org.eclipse.jpt.jpa.ui/images/diagram/export-as-img.png
new file mode 100644
index 0000000000..5fb4dc2a2c
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/images/diagram/export-as-img.png
Binary files differ
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/images/diagram/header_left_bg.png b/jpa/plugins/org.eclipse.jpt.jpa.ui/images/diagram/header_left_bg.png
new file mode 100644
index 0000000000..abfffe4bc7
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/images/diagram/header_left_bg.png
Binary files differ
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/images/diagram/header_mid_bg.png b/jpa/plugins/org.eclipse.jpt.jpa.ui/images/diagram/header_mid_bg.png
new file mode 100644
index 0000000000..caa828d3c0
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/images/diagram/header_mid_bg.png
Binary files differ
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/images/diagram/header_right_bg.png b/jpa/plugins/org.eclipse.jpt.jpa.ui/images/diagram/header_right_bg.png
new file mode 100644
index 0000000000..bd7414470c
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/images/diagram/header_right_bg.png
Binary files differ
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/images/diagram/print-hover.png b/jpa/plugins/org.eclipse.jpt.jpa.ui/images/diagram/print-hover.png
new file mode 100644
index 0000000000..468a09b5de
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/images/diagram/print-hover.png
Binary files differ
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/images/diagram/print.png b/jpa/plugins/org.eclipse.jpt.jpa.ui/images/diagram/print.png
new file mode 100644
index 0000000000..ee15ba107e
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/images/diagram/print.png
Binary files differ
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/images/diagram/shadow-bottom.png b/jpa/plugins/org.eclipse.jpt.jpa.ui/images/diagram/shadow-bottom.png
new file mode 100644
index 0000000000..d84b339401
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/images/diagram/shadow-bottom.png
Binary files differ
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/images/diagram/shadow-lower-left.png b/jpa/plugins/org.eclipse.jpt.jpa.ui/images/diagram/shadow-lower-left.png
new file mode 100644
index 0000000000..fa25df32e8
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/images/diagram/shadow-lower-left.png
Binary files differ
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/images/diagram/shadow-lower-right.png b/jpa/plugins/org.eclipse.jpt.jpa.ui/images/diagram/shadow-lower-right.png
new file mode 100644
index 0000000000..a58c953f1a
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/images/diagram/shadow-lower-right.png
Binary files differ
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/images/diagram/shadow-side.png b/jpa/plugins/org.eclipse.jpt.jpa.ui/images/diagram/shadow-side.png
new file mode 100644
index 0000000000..585ed6a9e4
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/images/diagram/shadow-side.png
Binary files differ
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/images/diagram/shadow-upper-right.png b/jpa/plugins/org.eclipse.jpt.jpa.ui/images/diagram/shadow-upper-right.png
new file mode 100644
index 0000000000..ccabb96f5c
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/images/diagram/shadow-upper-right.png
Binary files differ
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/images/diagram/toolbar_bg.png b/jpa/plugins/org.eclipse.jpt.jpa.ui/images/diagram/toolbar_bg.png
new file mode 100644
index 0000000000..c483a49336
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/images/diagram/toolbar_bg.png
Binary files differ
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/images/objects/column.gif b/jpa/plugins/org.eclipse.jpt.jpa.ui/images/objects/column.gif
new file mode 100644
index 0000000000..5f1551ba96
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/images/objects/column.gif
Binary files differ
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/images/objects/columnKey.gif b/jpa/plugins/org.eclipse.jpt.jpa.ui/images/objects/columnKey.gif
new file mode 100644
index 0000000000..4f385155d6
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/images/objects/columnKey.gif
Binary files differ
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/images/objects/file.png b/jpa/plugins/org.eclipse.jpt.jpa.ui/images/objects/file.png
new file mode 100644
index 0000000000..f5c1810a63
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/images/objects/file.png
Binary files differ
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/images/objects/folder.png b/jpa/plugins/org.eclipse.jpt.jpa.ui/images/objects/folder.png
new file mode 100644
index 0000000000..9759da4e20
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/images/objects/folder.png
Binary files differ
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/images/objects/forward.gif b/jpa/plugins/org.eclipse.jpt.jpa.ui/images/objects/forward.gif
new file mode 100644
index 0000000000..562bd70b5c
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/images/objects/forward.gif
Binary files differ
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/images/objects/moveRight.gif b/jpa/plugins/org.eclipse.jpt.jpa.ui/images/objects/moveRight.gif
new file mode 100644
index 0000000000..7a1511dd8e
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/images/objects/moveRight.gif
Binary files differ
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/images/objects/package.png b/jpa/plugins/org.eclipse.jpt.jpa.ui/images/objects/package.png
new file mode 100644
index 0000000000..471cc4367d
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/images/objects/package.png
Binary files differ
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/images/objects/table.gif b/jpa/plugins/org.eclipse.jpt.jpa.ui/images/objects/table.gif
new file mode 100644
index 0000000000..a99388a9af
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/images/objects/table.gif
Binary files differ
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/images/objects/table_obj.gif b/jpa/plugins/org.eclipse.jpt.jpa.ui/images/objects/table_obj.gif
new file mode 100644
index 0000000000..e2ccabb383
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/images/objects/table_obj.gif
Binary files differ
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/images/overlays/error.gif b/jpa/plugins/org.eclipse.jpt.jpa.ui/images/overlays/error.gif
new file mode 100644
index 0000000000..119dcccd5a
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/images/overlays/error.gif
Binary files differ
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/images/overlays/warning.png b/jpa/plugins/org.eclipse.jpt.jpa.ui/images/overlays/warning.png
new file mode 100644
index 0000000000..8c1e86c479
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/images/overlays/warning.png
Binary files differ
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/images/save-image-16.png b/jpa/plugins/org.eclipse.jpt.jpa.ui/images/save-image-16.png
new file mode 100644
index 0000000000..eca4774fec
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/images/save-image-16.png
Binary files differ
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/plugin.properties b/jpa/plugins/org.eclipse.jpt.jpa.ui/plugin.properties
new file mode 100644
index 0000000000..e85a668a20
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/plugin.properties
@@ -0,0 +1,73 @@
+###############################################################################
+# Copyright (c) 2006, 2010 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
+###############################################################################
+
+# ====================================================================
+# To code developer:
+# Do NOT change the properties between this line and the
+# "%%% END OF TRANSLATED PROPERTIES %%%" line.
+# Make a new property name, append to the end of the file and change
+# the code to use the new property.
+# ====================================================================
+
+# ====================================================================
+# %%% END OF TRANSLATED PROPERTIES %%%
+# ====================================================================
+pluginName= Dali Java Persistence Tools - JPA UI
+providerName=Eclipse Web Tools Platform
+
+JPA_PLATFORM_UI="JPA Platform UI"
+
+jpaNavigatorContent=JPA Content
+
+jpaWizardCategoryName = JPA
+newJpaProjectWizardName = JPA Project
+newJpaProjectWizardDesc = Create a JPA project
+newJpaEntityWizardName = JPA Entity
+newJpaEntityWizardDesc = Create a JPA Entity
+newJpaMappingFileWizardName = JPA ORM Mapping File
+newJpaMappingFileWizardDesc = Create a JPA ORM Mapping File
+newJpaEntityFromTableWizardName = JPA Entities from Tables
+newJpaEntityFromTableWizardDesc = Create JPA Entities from database tables
+
+upgradeToLatestVersion = Upgrade Document Version
+jpaStructureViewCommandCategory = JPA Structure View
+addPersistentClass = Add Class...
+removePersistentClass = Remove Class
+addPersistentAttributeToXml = Add Attribute to XML
+addPersistentAttributeToXmlAndMap = Add Attribute to XML and Map...
+removePersistentAttributeFromXml = Remove Attribute from XML
+mapAs=Map As
+mapAsMnemonic=M
+mapAsParameterName=mapping key
+mapAsSpecifiedMappingParameterName=specified mapping key
+mapAsDefaultMappingParameterName=default mapping key
+convertJavaProjectToJpaCommandName=Convert to JPA Project...
+
+jpaMenuName = JPA Tools
+generateEntities = Generate Entities from Tables...
+generateDDL = Generate Tables from Entities...
+synchronizeClasses = Synchronize Class List
+makePersistent = Make Persistent...
+persistenceEditor=Persistence XML Editor
+
+javaPersistenceNode = Java Persistence
+jpaNode = JPA
+jpaProblemSeveritiesNode = Errors/Warnings
+
+jpaPerspective = JPA
+jpaPerspectiveDescription = This perspective is designed to support Java Persistence (JPA) development. It offers a Project Explorer, JPA Details, JPA Structure and a Data Source Explorer.
+jpaDetails = JPA Details
+jpaStructure = JPA Structure
+JpaProposalCategory = JPA Proposals
+
+JptCreationActionSet.label = Jpt Creation
+JptCreationActionSet.description = Jpt Creation Action Set
+
+NewEntityAction.label = New Entity \ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/plugin.xml b/jpa/plugins/org.eclipse.jpt.jpa.ui/plugin.xml
new file mode 100644
index 0000000000..709c60145a
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/plugin.xml
@@ -0,0 +1,1039 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.2"?>
+<!--
+ Copyright (c) 2007, 2010 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
+ -->
+
+<plugin>
+
+ <extension-point
+ id="jpaPlatformUis"
+ name="%JPA_PLATFORM_UI"
+ schema="schema/jpaPlatformUis.exsd"/>
+
+
+ <extension
+ point="org.eclipse.core.expressions.definitions">
+
+ <!--
+ A test for determining whether our current context is within the
+ JPA Structure View
+ -->
+ <definition
+ id="org.eclipse.jpt.jpa.ui.reference.inJpaStructureView">
+ <with
+ variable="activePartId">
+ <equals
+ value="org.eclipse.jpt.jpa.ui.jpaStructureView"/>
+ </with>
+ </definition>
+
+ </extension>
+
+
+ <extension
+ point="org.eclipse.core.runtime.adapters">
+
+ <factory
+ adaptableType="org.eclipse.ui.IWorkbenchPart"
+ class="org.eclipse.jpt.jpa.ui.internal.selection.WorkbenchPartAdapterFactory">
+ <adapter type="org.eclipse.jpt.jpa.ui.internal.selection.JpaSelectionParticipant"/>
+ </factory>
+
+ <factory
+ adaptableType="org.eclipse.ui.IEditorPart"
+ class="org.eclipse.jpt.jpa.ui.internal.EditorPartAdapterFactory">
+ <adapter type="org.eclipse.jpt.jpa.core.JpaFile"/>
+ </factory>
+
+ </extension>
+
+
+<!-- =================================================================================== -->
+<!-- Extension: Java Completion Proposal Computer -->
+<!-- =================================================================================== -->
+
+ <extension
+ point="org.eclipse.jdt.ui.javaCompletionProposalComputer"
+ id="JpaCompletionProposalComputer">
+
+ <javaCompletionProposalComputer
+ class="org.eclipse.jpt.jpa.ui.internal.JpaJavaCompletionProposalComputer"
+ categoryId="org.eclipse.jpt.jpa.ui.jpaProposalCategory">
+ <partition type="__dftl_partition_content_type"/>
+ <partition type="__java_string"/>
+ </javaCompletionProposalComputer>
+
+ </extension>
+
+
+ <extension
+ point="org.eclipse.jdt.ui.javaCompletionProposalComputer"
+ id="jpaProposalCategory"
+ name="%JpaProposalCategory">
+ <proposalCategory
+ icon="$nl$/icons/full/eview16/jpa_perspective.gif"/>
+ </extension>
+
+
+ <extension
+ point="org.eclipse.jpt.jpa.ui.jpaPlatformUis">
+
+ <jpaPlatformUi
+ id="generic.ui"
+ jpaPlatform="generic"
+ factoryClass="org.eclipse.jpt.jpa.ui.internal.platform.generic.GenericJpaPlatformUiFactory"/>
+
+ <jpaPlatformUi
+ id="generic2_0.ui"
+ jpaPlatform="generic2_0"
+ factoryClass="org.eclipse.jpt.jpa.ui.internal.jpa2.platform.generic.Generic2_0JpaPlatformUiFactory"/>
+
+ </extension>
+
+
+ <extension
+ point="org.eclipse.ui.actionSets">
+
+ <actionSet
+ description="%JptCreationActionSet.description"
+ id="org.eclipse.jpt.jpa.ui.JptCreationActionSet"
+ label="%JptCreationActionSet.label">
+ <action
+ class="org.eclipse.jpt.jpa.ui.internal.wizards.NewEntityDropDownAction"
+ disabledIcon="icons/full/etool16/new_entity_wiz.gif"
+ icon="icons/full/etool16/new_entity_wiz.gif"
+ id="org.eclipse.jpt.jpa.ui.NewEntityAction"
+ label="%NewEntityAction.label"
+ pulldown="true"
+ toolbarPath="Normal/JptWizards">
+ </action>
+ </actionSet>
+
+ </extension>
+
+
+ <extension
+ point="org.eclipse.ui.commands">
+
+ <command
+ id="org.eclipse.jpt.jpa.ui.convertJavaProjectToJpa"
+ name="%convertJavaProjectToJpaCommandName"
+ categoryId="org.eclipse.ui.category.file"
+ defaultHandler="org.eclipse.jpt.jpa.ui.internal.commands.ConvertJavaProjectToJpaCommandHandler"/>
+
+ <command
+ id="org.eclipse.jpt.jpa.ui.xmlFileUpgradeToLatestVersion"
+ name="%upgradeToLatestVersion"/>
+
+ <category
+ id="org.eclipse.jpt.jpa.ui.jpaStructureViewCommands"
+ name="%jpaStructureViewCommandCategory">
+ </category>
+
+ <command
+ id="org.eclipse.jpt.jpa.ui.entityMappingsAddPersistentClass"
+ name="%addPersistentClass"
+ categoryId="org.eclipse.jpt.jpa.ui.jpaStructureViewCommands">
+ </command>
+
+ <command
+ id="org.eclipse.jpt.jpa.ui.persistentTypeRemovePersistentClass"
+ name="%removePersistentClass"
+ categoryId="org.eclipse.jpt.jpa.ui.jpaStructureViewCommands">
+ </command>
+
+ <command
+ id="org.eclipse.jpt.jpa.ui.persistentAttributeAddToXml"
+ name="%addPersistentAttributeToXml"
+ categoryId="org.eclipse.jpt.jpa.ui.jpaStructureViewCommands">
+ </command>
+
+ <command
+ id="org.eclipse.jpt.jpa.ui.persistentAttributeAddToXmlAndMap"
+ name="%addPersistentAttributeToXmlAndMap"
+ categoryId="org.eclipse.jpt.jpa.ui.jpaStructureViewCommands">
+ </command>
+
+ <command
+ id="org.eclipse.jpt.jpa.ui.persistentAttributeRemoveFromXml"
+ name="%removePersistentAttributeFromXml"
+ categoryId="org.eclipse.jpt.jpa.ui.jpaStructureViewCommands">
+ </command>
+
+ <command
+ id="org.eclipse.jpt.jpa.ui.persistentTypeMapAs"
+ name="%mapAs"
+ categoryId="org.eclipse.jpt.jpa.ui.jpaStructureViewCommands">
+ <commandParameter
+ id="persistentTypeMappingKey"
+ name="%mapAsParameterName"
+ optional="false">
+ </commandParameter>
+ </command>
+
+ <command
+ id="org.eclipse.jpt.jpa.ui.persistentAttributeMapAs"
+ name="%mapAs"
+ categoryId="org.eclipse.jpt.jpa.ui.jpaStructureViewCommands">
+ <commandParameter
+ id="specifiedPersistentAttributeMappingKey"
+ name="%mapAsSpecifiedMappingParameterName"
+ optional="false">
+ </commandParameter>
+ <commandParameter
+ id="defaultPersistentAttributeMappingKey"
+ name="%mapAsDefaultMappingParameterName"
+ optional="false">
+ </commandParameter>
+ </command>
+
+ </extension>
+
+
+<!-- =================================================================================== -->
+<!-- Extension: Persistence Editor -->
+<!-- =================================================================================== -->
+
+ <extension
+ point="org.eclipse.ui.editors">
+
+ <editor
+ class="org.eclipse.jpt.jpa.ui.internal.editors.PersistenceEditor"
+ contributorClass="org.eclipse.jpt.jpa.ui.internal.editors.PersistenceContributor"
+ icon="$nl$/icons/full/obj16/jpa-file.gif"
+ id="org.eclipse.jpt.jpa.ui.internal.editors.PersistenceEditor"
+ name="%persistenceEditor">
+ <contentTypeBinding
+ contentTypeId="org.eclipse.jpt.jpa.core.content.persistence"/>
+ </editor>
+
+ </extension>
+
+
+ <extension
+ point="org.eclipse.ui.handlers">
+
+ <handler
+ commandId="org.eclipse.jpt.jpa.ui.xmlFileUpgradeToLatestVersion"
+ class="org.eclipse.jpt.jpa.ui.internal.commands.UpgradeXmlFileVersionHandler">
+ <enabledWhen>
+ <iterate>
+ <or>
+ <adapt
+ type="org.eclipse.jpt.jpa.core.context.XmlFile">
+ <test
+ property="org.eclipse.jpt.jpa.core.isLatestSupportedVersion"
+ value="false"/>
+ </adapt>
+ <adapt
+ type="org.eclipse.jpt.jpa.core.resource.xml.JpaXmlResource">
+ <test
+ property="org.eclipse.jpt.jpa.core.isLatestSupportedVersion"
+ value="false"/>
+ </adapt>
+ </or>
+ </iterate>
+ </enabledWhen>
+ </handler>
+
+ <handler
+ commandId="org.eclipse.jpt.jpa.ui.entityMappingsAddPersistentClass"
+ class="org.eclipse.jpt.jpa.ui.internal.commands.AddPersistentClassHandler">
+ <activeWhen>
+ <reference
+ definitionId="org.eclipse.jpt.jpa.ui.reference.inJpaStructureView">
+ </reference>
+ </activeWhen>
+ <enabledWhen>
+ <and>
+ <count value="1"/>
+ <iterate>
+ <instanceof value="org.eclipse.jpt.jpa.core.context.orm.EntityMappings"/>
+ </iterate>
+ </and>
+ </enabledWhen>
+ </handler>
+
+ <handler
+ commandId="org.eclipse.jpt.jpa.ui.persistentTypeRemovePersistentClass"
+ class="org.eclipse.jpt.jpa.ui.internal.commands.RemovePersistentClassHandler">
+ <activeWhen>
+ <reference
+ definitionId="org.eclipse.jpt.jpa.ui.reference.inJpaStructureView">
+ </reference>
+ </activeWhen>
+ <enabledWhen>
+ <iterate>
+ <instanceof value="org.eclipse.jpt.jpa.core.context.orm.OrmPersistentType"/>
+ </iterate>
+ </enabledWhen>
+ </handler>
+
+ <handler
+ commandId="org.eclipse.jpt.jpa.ui.persistentAttributeAddToXml"
+ class="org.eclipse.jpt.jpa.ui.internal.commands.AddPersistentAttributeToXmlHandler">
+ <activeWhen>
+ <reference
+ definitionId="org.eclipse.jpt.jpa.ui.reference.inJpaStructureView">
+ </reference>
+ </activeWhen>
+ <enabledWhen>
+ <iterate>
+ <and>
+ <instanceof value="org.eclipse.jpt.jpa.core.context.orm.OrmReadOnlyPersistentAttribute"/>
+ <test property="org.eclipse.jpt.jpa.core.isVirtual" value="true"/>
+ <test property="org.eclipse.jpt.jpa.core.isMapped" value="true"/>
+ </and>
+ </iterate>
+ </enabledWhen>
+ </handler>
+
+ <handler
+ commandId="org.eclipse.jpt.jpa.ui.persistentAttributeAddToXmlAndMap"
+ class="org.eclipse.jpt.jpa.ui.internal.commands.AddPersistentAttributeToXmlAndMapHandler">
+ <activeWhen>
+ <reference
+ definitionId="org.eclipse.jpt.jpa.ui.reference.inJpaStructureView">
+ </reference>
+ </activeWhen>
+ <enabledWhen>
+ <iterate>
+ <and>
+ <instanceof value="org.eclipse.jpt.jpa.core.context.orm.OrmReadOnlyPersistentAttribute"/>
+ <test property="org.eclipse.jpt.jpa.core.isVirtual" value="true"/>
+ </and>
+ </iterate>
+ </enabledWhen>
+ </handler>
+
+ <handler
+ commandId="org.eclipse.jpt.jpa.ui.persistentAttributeRemoveFromXml"
+ class="org.eclipse.jpt.jpa.ui.internal.commands.RemovePersistentAttributeFromXmlHandler">
+ <activeWhen>
+ <reference
+ definitionId="org.eclipse.jpt.jpa.ui.reference.inJpaStructureView">
+ </reference>
+ </activeWhen>
+ <enabledWhen>
+ <iterate>
+ <and>
+ <instanceof value="org.eclipse.jpt.jpa.core.context.orm.OrmReadOnlyPersistentAttribute"/>
+ <test property="org.eclipse.jpt.jpa.core.isVirtual" value="false"/>
+ </and>
+ </iterate>
+ </enabledWhen>
+ </handler>
+
+ <handler
+ commandId="org.eclipse.jpt.jpa.ui.persistentTypeMapAs"
+ class="org.eclipse.jpt.jpa.ui.internal.commands.PersistentTypeMapAsHandler">
+ <activeWhen>
+ <reference
+ definitionId="org.eclipse.jpt.jpa.ui.reference.inJpaStructureView"/>
+ </activeWhen>
+ <enabledWhen>
+ <iterate>
+ <instanceof value="org.eclipse.jpt.jpa.core.context.PersistentType"/>
+ </iterate>
+ </enabledWhen>
+ </handler>
+
+ <handler
+ commandId="org.eclipse.jpt.jpa.ui.persistentAttributeMapAs"
+ class="org.eclipse.jpt.jpa.ui.internal.commands.PersistentAttributeMapAsHandler">
+ <activeWhen>
+ <reference
+ definitionId="org.eclipse.jpt.jpa.ui.reference.inJpaStructureView"/>
+ </activeWhen>
+ <enabledWhen>
+ <iterate>
+ <and>
+ <instanceof value="org.eclipse.jpt.jpa.core.context.ReadOnlyPersistentAttribute"/>
+ <test property="org.eclipse.jpt.jpa.core.isVirtual" value="false"/>
+ </and>
+ </iterate>
+ </enabledWhen>
+ </handler>
+
+ </extension>
+
+
+ <extension
+ point="org.eclipse.ui.menus">
+
+ <!-- contributions for any popup -->
+ <menuContribution
+ locationURI="popup:org.eclipse.ui.popup.any">
+
+ <!-- "JPA Tools" submenu for
+ - anything that adapts to JpaXmlResource (IFile objects, mostly)
+ - anything that adapts to IProject and has a JPA facet -->
+ <menu
+ id="org.eclipse.jpt.jpa.ui.menu.JpaTools"
+ label="%jpaMenuName">
+ <visibleWhen>
+ <with
+ variable="selection">
+ <iterate ifEmpty="false">
+ <or>
+ <adapt
+ type="org.eclipse.jpt.jpa.core.resource.xml.JpaXmlResource"/>
+ <adapt
+ type="org.eclipse.core.resources.IProject">
+ <test
+ property="org.eclipse.wst.common.project.facet.core.projectFacet"
+ value="jpt.jpa"/>
+ </adapt>
+ <and>
+ <adapt
+ type="org.eclipse.core.resources.IResource">
+ <test
+ property="org.eclipse.wst.common.project.facet.core.projectFacet"
+ value="jpt.jpa"/>
+ </adapt>
+ <adapt
+ type="org.eclipse.jdt.core.IJavaElement"/>
+ </and>
+ </or>
+ </iterate>
+ </with>
+ </visibleWhen>
+ </menu>
+
+ <!-- commands for objects that don't need "JPA Tools" submenu -->
+ <command
+ commandId="org.eclipse.jpt.jpa.ui.xmlFileUpgradeToLatestVersion">
+ <visibleWhen>
+ <with
+ variable="selection">
+ <iterate ifEmpty="false">
+ <adapt
+ type="org.eclipse.jpt.jpa.core.context.XmlFile">
+ <test
+ property="org.eclipse.jpt.jpa.core.isLatestSupportedVersion"
+ value="false"/>
+ </adapt>
+ </iterate>
+ </with>
+ </visibleWhen>
+ </command>
+ </menuContribution>
+
+ <!-- contributions to the "JPA Tools" submenu -->
+ <menuContribution
+ locationURI="popup:org.eclipse.jpt.jpa.ui.menu.JpaTools">
+ <command
+ commandId="org.eclipse.jpt.jpa.ui.xmlFileUpgradeToLatestVersion">
+ <visibleWhen>
+ <with
+ variable="selection">
+ <iterate ifEmpty="false">
+ <adapt
+ type="org.eclipse.jpt.jpa.core.resource.xml.JpaXmlResource">
+ <test
+ property="org.eclipse.jpt.jpa.core.isLatestSupportedVersion"
+ value="false"/>
+ </adapt>
+ </iterate>
+ </with>
+ </visibleWhen>
+ </command>
+ </menuContribution>
+
+ <!-- contributions to the project configure menu -->
+ <menuContribution locationURI="popup:org.eclipse.ui.projectConfigure?after=additions">
+ <command commandId="org.eclipse.jpt.jpa.ui.convertJavaProjectToJpa" style="push">
+ <visibleWhen checkEnabled="false">
+ <and>
+ <count value="1"/>
+ <iterate ifEmpty="false" operator="and">
+ <adapt type="org.eclipse.core.resources.IProject">
+ <and>
+ <test
+ property="org.eclipse.core.resources.projectNature"
+ value="org.eclipse.jdt.core.javanature"/>
+ <not>
+ <test
+ property="org.eclipse.core.resources.projectNature"
+ value="org.eclipse.wst.common.project.facet.core.nature"/>
+ </not>
+ </and>
+ </adapt>
+ </iterate>
+ </and>
+ </visibleWhen>
+ </command>
+ </menuContribution>
+
+ <!-- contributions to objects in the JPA structure view -->
+ <menuContribution
+ locationURI="popup:org.eclipse.jpt.jpa.ui.jpaStructureView">
+ <command
+ commandId="org.eclipse.jpt.jpa.ui.entityMappingsAddPersistentClass">
+ <visibleWhen>
+ <with
+ variable="selection">
+ <iterate ifEmpty="false">
+ <instanceof value="org.eclipse.jpt.jpa.core.context.orm.EntityMappings"/>
+ </iterate>
+ </with>
+ </visibleWhen>
+ </command>
+ <command
+ commandId="org.eclipse.jpt.jpa.ui.persistentTypeRemovePersistentClass">
+ <visibleWhen>
+ <with
+ variable="selection">
+ <iterate ifEmpty="false">
+ <instanceof value="org.eclipse.jpt.jpa.core.context.orm.OrmPersistentType"/>
+ </iterate>
+ </with>
+ </visibleWhen>
+ </command>
+ <command
+ commandId="org.eclipse.jpt.jpa.ui.persistentAttributeAddToXml">
+ <visibleWhen>
+ <with
+ variable="selection">
+ <iterate ifEmpty="false">
+ <and>
+ <instanceof value="org.eclipse.jpt.jpa.core.context.orm.OrmReadOnlyPersistentAttribute"/>
+ <test property="org.eclipse.jpt.jpa.core.isVirtual" value="true"/>
+ </and>
+ </iterate>
+ </with>
+ </visibleWhen>
+ </command>
+ <command
+ commandId="org.eclipse.jpt.jpa.ui.persistentAttributeAddToXmlAndMap">
+ <visibleWhen>
+ <with
+ variable="selection">
+ <iterate ifEmpty="false">
+ <and>
+ <instanceof value="org.eclipse.jpt.jpa.core.context.orm.OrmReadOnlyPersistentAttribute"/>
+ <test property="org.eclipse.jpt.jpa.core.isVirtual" value="true"/>
+ </and>
+ </iterate>
+ </with>
+ </visibleWhen>
+ </command>
+ <command
+ commandId="org.eclipse.jpt.jpa.ui.persistentAttributeRemoveFromXml">
+ <visibleWhen>
+ <with
+ variable="selection">
+ <iterate ifEmpty="false">
+ <and>
+ <instanceof value="org.eclipse.jpt.jpa.core.context.orm.OrmReadOnlyPersistentAttribute"/>
+ <test property="org.eclipse.jpt.jpa.core.isVirtual" value="false"/>
+ </and>
+ </iterate>
+ </with>
+ </visibleWhen>
+ </command>
+
+ <menu
+ id="org.eclipse.jpt.jpa.ui.persistentTypeMapAs"
+ label="%mapAs"
+ mnemonic="%mapAsMnemonic">
+ <visibleWhen>
+ <with
+ variable="selection">
+ <iterate ifEmpty="false">
+ <instanceof value="org.eclipse.jpt.jpa.core.context.PersistentType"/>
+ </iterate>
+ </with>
+ </visibleWhen>
+ <dynamic
+ id="org.eclipse.jpt.jpa.ui.persistentTypeMapAs"
+ class="org.eclipse.jpt.jpa.ui.internal.menus.PersistentTypeMapAsContribution">
+ </dynamic>
+ </menu>
+
+ <menu
+ id="org.eclipse.jpt.jpa.ui.persistentAttributeMapAs"
+ label="%mapAs"
+ mnemonic="%mapAsMnemonic">
+ <visibleWhen>
+ <with
+ variable="selection">
+ <iterate ifEmpty="false">
+ <and>
+ <instanceof value="org.eclipse.jpt.jpa.core.context.ReadOnlyPersistentAttribute"/>
+ <test property="org.eclipse.jpt.jpa.core.isVirtual" value="false"/>
+ </and>
+ </iterate>
+ </with>
+ </visibleWhen>
+ <dynamic
+ id="org.eclipse.jpt.jpa.ui.persistentAttributeMapAs"
+ class="org.eclipse.jpt.jpa.ui.internal.menus.PersistentAttributeMapAsContribution">
+ </dynamic>
+ </menu>
+
+ </menuContribution>
+
+ </extension>
+
+
+ <extension
+ point="org.eclipse.ui.navigator.viewer">
+
+ <viewerContentBinding
+ viewerId="org.eclipse.ui.navigator.ProjectExplorer">
+ <includes>
+ <contentExtension pattern="org.eclipse.jpt.jpa.ui.*"/>
+ </includes>
+ </viewerContentBinding>
+
+ </extension>
+
+
+ <extension
+ point="org.eclipse.ui.navigator.navigatorContent">
+
+ <navigatorContent
+ id="org.eclipse.jpt.jpa.ui.jpaNavigatorContent"
+ name="%jpaNavigatorContent"
+ priority="higher"
+ appearsBefore="org.eclipse.jst.servlet.ui.EnhancedJavaRendering"
+ icon="icons/full/obj16/jpa-content.gif"
+ activeByDefault="true"
+ contentProvider="org.eclipse.jpt.jpa.ui.internal.navigator.JpaNavigatorContentProvider"
+ labelProvider="org.eclipse.jpt.jpa.ui.internal.navigator.JpaNavigatorLabelProvider">
+
+ <triggerPoints>
+ <or>
+ <instanceof
+ value="org.eclipse.jpt.jpa.core.context.JpaContextNode"/>
+ <and>
+ <adapt type="org.eclipse.core.resources.IProject">
+ <test
+ forcePluginActivation="true"
+ property="org.eclipse.wst.common.project.facet.core.projectFacet"
+ value="jpt.jpa" />
+ </adapt>
+ </and>
+ </or>
+ </triggerPoints>
+
+ <possibleChildren>
+ <instanceof
+ value="org.eclipse.jpt.jpa.core.context.JpaContextNode"/>
+ </possibleChildren>
+
+ <actionProvider
+ class="org.eclipse.jpt.jpa.ui.internal.navigator.JpaNavigatorActionProvider"
+ id="org.eclipse.jpt.jpa.ui.jpaActionProvider">
+ <enablement>
+ <and>
+ <instanceof
+ value="org.eclipse.jpt.jpa.core.context.JpaContextNode"/>
+ </and>
+ </enablement>
+ </actionProvider>
+
+ <commonWizard
+ menuGroupId="org.eclipse.jpt.jpa.ui"
+ type="new"
+ wizardId="org.eclipse.jpt.jpa.ui.wizard.newEntity">
+ <enablement>
+ <and>
+ <or>
+ <instanceof
+ value="org.eclipse.core.resources.IProject"/>
+ <instanceof
+ value="org.eclipse.jdt.core.IPackageFragment"/>
+ <instanceof
+ value="org.eclipse.jdt.core.IPackageFragmentRoot"/>
+ </or>
+ <adapt type="org.eclipse.core.resources.IResource">
+ <test
+ forcePluginActivation="true"
+ property="org.eclipse.wst.common.project.facet.core.projectFacet"
+ value="jpt.jpa" />
+ </adapt>
+ </and>
+ </enablement>
+ </commonWizard>
+
+ <commonWizard
+ menuGroupId="org.eclipse.jpt.jpa.ui"
+ type="new"
+ wizardId="org.eclipse.jpt.jpa.ui.wizard.newMappingFile">
+ <enablement>
+ <and>
+ <or>
+ <instanceof value="org.eclipse.core.resources.IProject"/>
+ <instanceof value="org.eclipse.core.resources.IFolder"/>
+ <instanceof value="org.eclipse.jdt.core.IPackageFragmentRoot"/>
+ <instanceof value="org.eclipse.jdt.core.IPackageFragment"/>
+ </or>
+ <adapt type="org.eclipse.core.resources.IResource">
+ <test
+ forcePluginActivation="true"
+ property="org.eclipse.wst.common.project.facet.core.projectFacet"
+ value="jpt.jpa" />
+ </adapt>
+ </and>
+ </enablement>
+ </commonWizard>
+
+ <!--
+
+ <commonSorter
+ id="org.eclipse.jst.j2ee.navigator.internal.J2EEViewerSorter"
+ class="org.eclipse.jst.j2ee.navigator.internal.J2EEViewerSorter" />
+
+ -->
+
+ <commonWizard
+ menuGroupId="org.eclipse.jpt.jpa.ui"
+ type="new"
+ wizardId="org.eclipse.jpt.jpa.ui.wizard.newEntitiesFromTables">
+ <enablement>
+ <and>
+ <or>
+ <instanceof
+ value="org.eclipse.core.resources.IProject"/>
+ <instanceof
+ value="org.eclipse.jdt.core.IPackageFragment"/>
+ <instanceof
+ value="org.eclipse.jdt.core.IPackageFragmentRoot"/>
+ </or>
+ <adapt type="org.eclipse.core.resources.IResource">
+ <test
+ forcePluginActivation="true"
+ property="org.eclipse.wst.common.project.facet.core.projectFacet"
+ value="jpt.jpa" />
+ </adapt>
+ </and>
+ </enablement>
+ </commonWizard>
+
+ </navigatorContent>
+
+ </extension>
+
+
+ <extension
+ point="org.eclipse.ui.newWizards">
+
+ <category
+ id="org.eclipse.jpt"
+ name="%jpaWizardCategoryName"/>
+
+ <wizard
+ id="org.eclipse.jpt.jpa.ui.wizard.newJpaProject"
+ name="%newJpaProjectWizardName"
+ icon="icons/full/etool16/new_jpaproject_wiz.gif"
+ category="org.eclipse.jpt.jpa"
+ project="true"
+ finalPerspective="org.eclipse.jpt.jpa.ui.jpaPerspective">
+ <description>%newJpaProjectWizardDesc</description>
+ <class class="org.eclipse.jpt.jpa.ui.internal.wizards.proj.JpaProjectWizard">
+ <parameter name="menuIndex" value="35"/>
+ </class>
+ </wizard>
+
+ <wizard
+ id="org.eclipse.jpt.jpa.ui.wizard.newEntity"
+ name="%newJpaEntityWizardName"
+ icon="icons/full/etool16/new_entity_wiz.gif"
+ category="org.eclipse.jpt.jpa">
+ <description>%newJpaEntityWizardDesc</description>
+ <class class="org.eclipse.jpt.jpa.ui.internal.wizards.entity.EntityWizard">
+ <parameter name="javaeeartifact" value="true"/>
+ <parameter name="menuIndex" value="38" />
+ <parameter name="jptartifact" value="true"/>
+ </class>
+ </wizard>
+
+ <wizard
+ category="org.eclipse.jpt.jpa"
+ class="org.eclipse.jpt.jpa.ui.internal.wizards.gen.GenerateEntitiesFromSchemaWizard"
+ icon="platform:/plugin/org.eclipse.jpt.jpa.ui/icons/full/etool16/new_entity_wiz.gif"
+ id="org.eclipse.jpt.jpa.ui.wizard.newEntitiesFromTables"
+ name="%newJpaEntityFromTableWizardName">
+ <description>%newJpaEntityFromTableWizardDesc</description>
+ <selection class="org.eclipse.core.resources.IResource"/>
+ </wizard>
+
+ <wizard
+ id="org.eclipse.jpt.jpa.ui.wizard.newMappingFile"
+ name="%newJpaMappingFileWizardName"
+ icon="icons/full/etool16/new_jpa_file_wiz.gif"
+ category="org.eclipse.jpt.jpa">
+ <description>%newJpaMappingFileWizardDesc</description>
+ <class class="org.eclipse.jpt.jpa.ui.internal.wizards.orm.MappingFileWizard">
+ <parameter name="javaeeartifact" value="true"/>
+ <parameter name="menuIndex" value="39" />
+ <parameter name="jptartifact" value="true"/>
+ </class>
+ </wizard>
+
+ </extension>
+
+
+<!-- =================================================================================== -->
+<!-- Extension: Persistence Perspective -->
+<!-- =================================================================================== -->
+
+ <extension
+ point="org.eclipse.ui.perspectives">
+
+ <perspective
+ class="org.eclipse.jpt.jpa.ui.internal.perspective.JpaPerspectiveFactory"
+ icon="icons/full/eview16/jpa_perspective.gif"
+ id="org.eclipse.jpt.jpa.ui.jpaPerspective"
+ name="%jpaPerspective">
+ <description>%jpaPerspectiveDescription</description>
+ </perspective>
+ </extension>
+
+
+ <extension
+ point="org.eclipse.ui.perspectiveExtensions">
+
+ <perspectiveExtension
+ targetID="org.eclipse.jpt.jpa.ui.jpaPerspective">
+
+ <newWizardShortcut id="org.eclipse.jpt.jpa.ui.wizard.newJpaProject"/>
+ <newWizardShortcut id="org.eclipse.jpt.jpa.ui.wizard.newEntity"/>
+ <newWizardShortcut id="org.eclipse.jpt.jpa.ui.wizard.newMappingFile"/>
+ <newWizardShortcut id="org.eclipse.jdt.ui.wizards.NewPackageCreationWizard"/>
+ <newWizardShortcut id="org.eclipse.jdt.ui.wizards.NewClassCreationWizard"/>
+ <newWizardShortcut id="org.eclipse.jdt.ui.wizards.NewInterfaceCreationWizard"/>
+ <newWizardShortcut id="org.eclipse.jdt.ui.wizards.NewEnumCreationWizard"/>
+ <newWizardShortcut id="org.eclipse.jdt.ui.wizards.NewAnnotationCreationWizard"/>
+ <newWizardShortcut id="org.eclipse.jdt.ui.wizards.NewSourceFolderCreationWizard"/>
+ <newWizardShortcut id="org.eclipse.jdt.ui.wizards.NewJavaWorkingSetWizard"/>
+ <newWizardShortcut id="org.eclipse.ui.wizards.new.file"/>
+ <newWizardShortcut id="org.eclipse.ui.wizards.new.folder"/>
+ <newWizardShortcut id="org.eclipse.ui.editors.wizards.UntitledTextFileWizard"/>
+
+ <perspectiveShortcut id="org.eclipse.jdt.ui.JavaPerspective"/>
+ <perspectiveShortcut id="org.eclipse.debug.ui.DebugPerspective"/>
+ <perspectiveShortcut id="org.eclipse.jst.j2ee.J2EEPerspective"/>
+ <perspectiveShortcut id="org.eclipse.jdt.ui.JavaBrowsingPerspective"/>
+
+ <actionSet id="org.eclipse.debug.ui.launchActionSet"/>
+ <actionSet id="org.eclipse.jdt.ui.JavaActionSet"/>
+ <actionSet id="org.eclipse.jdt.ui.JavaElementCreationActionSet"/>
+ <actionSet id="org.eclipse.ui.NavigateActionSet"/>
+ <actionSet id="org.eclipse.jpt.jpa.ui.JptCreationActionSet"/>
+
+ <viewShortcut id="org.eclipse.jdt.ui.PackageExplorer"/>
+ <viewShortcut id="org.eclipse.jdt.ui.TypeHierarchy"/>
+ <viewShortcut id="org.eclipse.jdt.ui.SourceView"/>
+ <viewShortcut id="org.eclipse.jdt.ui.JavadocView"/>
+ <viewShortcut id="org.eclipse.ui.navigator.ProjectExplorer"/>
+ <viewShortcut id="org.eclipse.ui.views.ContentOutline"/>
+ <viewShortcut id="org.eclipse.ui.views.ProblemView"/>
+ <viewShortcut id="org.eclipse.ui.views.ResourceNavigator"/>
+ <viewShortcut id="org.eclipse.jpt.jpa.ui.jpaStructureView"/>
+ <viewShortcut id="org.eclipse.jpt.jpa.ui.jpaDetailsView"/>
+ <viewShortcut id="org.eclipse.datatools.connectivity.DataSourceExplorerNavigator"/>
+
+ </perspectiveExtension>
+
+ <perspectiveExtension
+ targetID="org.eclipse.jst.j2ee.J2EEPerspective">
+ <newWizardShortcut id="org.eclipse.jpt.jpa.ui.wizard.newJpaProject"/>
+ <perspectiveShortcut id="org.eclipse.jpt.jpa.ui.jpaPerspective"/>
+ </perspectiveExtension>
+
+ </extension>
+
+
+ <extension
+ point="org.eclipse.ui.popupMenus">
+
+ <objectContribution
+ id="org.eclipse.jpt.jpa.ui.project.JPATools"
+ objectClass="org.eclipse.core.resources.IProject"
+ adaptable="true">
+
+ <enablement>
+ <test property="org.eclipse.wst.common.project.facet.core.projectFacet" value="jpt.jpa"/>
+ </enablement>
+
+ <action
+ id="org.eclipse.jpt.jpa.ui.generateEntities"
+ label="%generateEntities"
+ class="org.eclipse.jpt.jpa.ui.internal.actions.GenerateEntitiesAction"
+ enablesFor="1"
+ menubarPath="org.eclipse.jpt.jpa.ui.menu.JpaTools/content"/>
+
+ <action
+ id="org.eclipse.jpt.jpa.ui.generateDDL"
+ label="%generateDDL"
+ class="org.eclipse.jpt.jpa.ui.internal.actions.GenerateDDLAction"
+ enablesFor="1"
+ menubarPath="org.eclipse.jpt.jpa.ui.menu.JpaTools/content"/>
+
+ </objectContribution>
+
+ <objectContribution
+ id="org.eclipse.jpt.jpa.ui.MakePersistent"
+ objectClass="org.eclipse.jdt.core.IJavaElement"
+ adaptable="true">
+
+ <action
+ class="org.eclipse.jpt.jpa.ui.internal.actions.MakePersistentAction"
+ enablesFor="*"
+ id="org.eclipse.jpt.jpa.ui.generateEntities"
+ label="%makePersistent"
+ menubarPath="org.eclipse.jpt.jpa.ui.menu.JpaTools/content">
+ <enablement>
+ <or>
+ <objectClass name="org.eclipse.jdt.core.ICompilationUnit"/>
+ <objectClass name="org.eclipse.jdt.core.IType"/>
+ <objectClass name="org.eclipse.jdt.core.IPackageFragment"/>
+ <objectClass name="org.eclipse.jdt.core.IPackageFragmentRoot"/>
+ </or>
+ </enablement>
+ </action>
+ </objectContribution>
+
+ <objectContribution
+ id="org.eclipse.jpt.jpa.ui.persistenceXmlFileActions"
+ objectClass="org.eclipse.core.resources.IFile"
+ nameFilter="persistence.xml">
+
+ <action
+ id="synchClassesAction"
+ label="%synchronizeClasses"
+ menubarPath="org.eclipse.jpt.jpa.ui.menu.JpaTools/content"
+ class="org.eclipse.jpt.jpa.ui.internal.actions.SynchronizeClassesAction"
+ enablesFor="1"/>
+
+ </objectContribution>
+
+ <objectContribution
+ id="org.eclipse.jpt.jpa.ui.persistenceXmlActions"
+ objectClass="org.eclipse.jpt.jpa.core.context.persistence.PersistenceXml">
+ <action
+ id="synchClassesAction"
+ label="%synchronizeClasses"
+ menubarPath="content"
+ class="org.eclipse.jpt.jpa.ui.internal.actions.SynchronizeClassesAction"
+ enablesFor="1"/>
+ </objectContribution>
+
+ </extension>
+
+
+ <extension
+ point="org.eclipse.ui.preferencePages">
+
+ <page
+ id="org.eclipse.jpt.jpa.ui.preferences"
+ name="%javaPersistenceNode"
+ class="org.eclipse.ui.internal.dialogs.EmptyPreferencePage"/>
+
+ <page
+ id="org.eclipse.jpt.jpa.ui.jpaPreferences"
+ category="org.eclipse.jpt.jpa.ui.preferences"
+ class="org.eclipse.jpt.jpa.ui.internal.preferences.JpaPreferencesPage"
+ name="%jpaNode"/>
+
+ <page
+ id="org.eclipse.jpt.jpa.ui.jpaProblemSeveritiesPreferences"
+ category="org.eclipse.jpt.jpa.ui.jpaPreferences"
+ class="org.eclipse.jpt.jpa.ui.internal.preferences.JpaProblemSeveritiesPage"
+ name="%jpaProblemSeveritiesNode">
+ </page>
+
+ </extension>
+
+
+ <extension
+ point="org.eclipse.ui.propertyPages">
+
+ <page
+ id="org.eclipse.jpt.jpa.ui.jpaProjectProperties"
+ name="%jpaNode"
+ class="org.eclipse.jpt.jpa.ui.internal.properties.JpaProjectPropertiesPage">
+ <enabledWhen>
+ <adapt type="org.eclipse.core.resources.IProject">
+ <test
+ forcePluginActivation="true"
+ property="org.eclipse.wst.common.project.facet.core.projectFacet"
+ value="jpt.jpa"/>
+ </adapt>
+ </enabledWhen>
+ </page>
+
+ <page
+ id="org.eclipse.jpt.jpa.ui.jpaProblemSeveritiesProperties"
+ name="%jpaProblemSeveritiesNode"
+ category="org.eclipse.jpt.jpa.ui.jpaProjectProperties"
+ class="org.eclipse.jpt.jpa.ui.internal.preferences.JpaProblemSeveritiesPage">
+ <enabledWhen>
+ <adapt type="org.eclipse.core.resources.IProject">
+ <test
+ forcePluginActivation="true"
+ property="org.eclipse.wst.common.project.facet.core.projectFacet"
+ value="jpt.jpa"/>
+ </adapt>
+ </enabledWhen>
+ </page>
+
+ </extension>
+
+
+ <extension
+ point="org.eclipse.ui.views">
+
+ <category
+ id="org.eclipse.jpt.jpa.ui"
+ name="%jpaPerspective"/>
+
+ <view
+ id="org.eclipse.jpt.jpa.ui.jpaStructureView"
+ category="org.eclipse.jpt.jpa.ui"
+ class="org.eclipse.jpt.jpa.ui.internal.views.structure.JpaStructureView"
+ icon="icons/full/eview16/jpa_structure.gif"
+ name="%jpaStructure"/>
+
+ <view
+ id="org.eclipse.jpt.jpa.ui.jpaDetailsView"
+ category="org.eclipse.jpt.jpa.ui"
+ class="org.eclipse.jpt.jpa.ui.internal.views.JpaDetailsView"
+ icon="icons/full/eview16/jpa_details.gif"
+ name="%jpaDetails"/>
+
+ </extension>
+
+
+ <extension
+ point="org.eclipse.wst.common.project.facet.ui.images">
+
+ <image facet="jpt.jpa" path="icons/full/etool16/jpa_facet.gif"/>
+
+ </extension>
+
+
+ <extension
+ point="org.eclipse.wst.common.project.facet.ui.wizardPages">
+
+ <wizard-pages action="jpt.jpa.install">
+ <page class="org.eclipse.jpt.jpa.ui.internal.wizards.JpaFacetInstallPage"/>
+ </wizard-pages>
+
+ <wizard-pages action="jpt.jpa.version-change">
+ <page class="org.eclipse.jpt.jpa.ui.internal.wizards.JpaFacetVersionChangePage"/>
+ </wizard-pages>
+
+ </extension>
+
+</plugin>
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/property_files/jpt_ui.properties b/jpa/plugins/org.eclipse.jpt.jpa.ui/property_files/jpt_ui.properties
new file mode 100644
index 0000000000..52139c49d8
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/property_files/jpt_ui.properties
@@ -0,0 +1,155 @@
+################################################################################
+# 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
+################################################################################
+
+AccessTypeComposite_access=Access:
+AccessTypeComposite_field=Field
+AccessTypeComposite_property=Property
+
+AddToEarComposite_earMemberShip=EAR membership
+AddToEarComposite_addToEarLabel=&Add project to an EAR
+AddToEarComposite_earProjectLabel=EAR pr&oject name:
+AddToEarComposite_newButtonLabel=New &Project ...
+
+AddPersistentAttributeDialog_title=Add Attribute
+AddPersistentAttributeDialog_attributeLabel=Attribute:
+AddPersistentAttributeDialog_mappingLabel=Map as:
+AddPersistentAttributeDialog_noMappingKeyError=You must specify a mapping type
+
+AddPersistentClassDialog_title=Add Class
+AddPersistentClassDialog_classLabel=Class:
+AddPersistentClassDialog_classDialog_title=Persistent Class Selection
+AddPersistentClassDialog_classDialog_message=Choose a class:
+AddPersistentClassDialog_mappingLabel=Map as:
+AddPersistentClassDialog_noClassError=You must specify a class
+AddPersistentClassDialog_duplicateClassWarning=File already contains that persistent class
+AddPersistentClassDialog_classNotFoundWarning=Cannot resolve class
+AddPersistentClassDialog_noMappingKeyError=You must specify a mapping type
+
+convertToJpa_convertingProject="Converting project to faceted form..."
+convertToJpa_detectingTechnologies="Detecting existing technologies..."
+
+DatabaseSchemaWizardPage_title=Database Schema
+DatabaseSchemaWizardPage_desc=Select a database schema
+DatabaseSchemaWizardPage_schemaSettings=Schema settings
+DatabaseSchemaWizardPage_addConnectionToProject=<a>Add a connection to JPA project...</a>
+DatabaseSchemaWizardPage_connectLink=<a>Connect</a>
+DatabaseSchemaWizardPage_schema=Schema:
+DatabaseSchemaWizardPage_connectionInfo=(Note: JPA project must have a connection and it must be active to select a schema)
+DatabaseSchemaWizardPage_schemaInfo=(Note: Must have active connection to select schema)
+
+Error_openingEditor=Error Opening Editor
+
+General_browse=Br&owse...
+General_revert=Revert
+General_deselectAll=Deselect All
+General_selectAll=Select All
+
+GenerateDDLWizard_title=DDL Generation
+
+GenerateEntitiesWizard_generateEntities=Generate Entities
+GenerateEntitiesWizardPage_chooseEntityTable=Choose tables to generate entities from.
+GenerateEntitiesWizardPage_generateEntities=Generate Entities from Tables
+GenerateEntitiesWizardPage_synchronizeClasses=Synchronize classes in persistence.xml
+GenerateEntitiesWizardPage_tables=Tables:
+GenerateEntitiesWizardPage_tableColumn=Table
+GenerateEntitiesWizardPage_entityNameColumn=Entity Name
+
+EntitiesGenerator_jobName=Generating Entities
+
+GenericPlatformUiDialog_notSupportedMessageTitle=DDL Generation
+GenericPlatformUiDialog_notSupportedMessageText=DDL Generation is not supported by the Generic Platform.
+
+JpaContent_label=JPA Content
+
+JpaStructureView_structureNotAvailable=JPA structure is not available.
+JpaStructureView_linkWithEditorText=Link with Editor
+JpaStructureView_linkWithEditorDesc=Link with Active Editor
+JpaStructureView_linkWithEditorTooltip=Link with Editor
+JpaStructureView_numItemsSelected={0} items selected
+
+JpaDetailsView_viewNotAvailable=Details are not available for the current selection.
+
+JpaFacetWizardPage_title=JPA Facet
+JpaFacetWizardPage_description=Configure JPA settings.
+JpaFacetWizardPage_platformLabel=&Platform
+JpaFacetWizardPage_connectionLabel=&Connection
+JpaFacetWizardPage_connectionLink=<a>Add connection...</a>
+JpaFacetWizardPage_connectLink=<a>Connect</a>
+JpaFacetWizardPage_connectedText=<a>Connected</a>
+JpaFacetWizardPage_addDriverLibraryLabel=&Add driver library to build path
+JpaFacetWizardPage_driverLibraryLabel=&Driver:
+JpaFacetWizardPage_overrideDefaultCatalogLabel=&Override default catalog from connection
+JpaFacetWizardPage_defaultCatalogLabel=Catalo&g:
+JpaFacetWizardPage_overrideDefaultSchemaLabel=O&verride default schema from connection
+JpaFacetWizardPage_defaultSchemaLabel=&Schema:
+JpaFacetWizardPage_facetsPageLink=<a>Change JPA version...</a>
+JpaFacetWizardPage_jpaImplementationLabel=JPA implementation
+JpaFacetWizardPage_userServerLibLabel=Implementation provided by server runtime
+JpaFacetWizardPage_specifyLibLabel=Implementation library:
+JpaFacetWizardPage_jpaPrefsLink=<a>Configure default JPA implementation library...</a>
+JpaFacetWizardPage_userLibsLink=<a>Configure user libraries...</a>
+JpaFacetWizardPage_persistentClassManagementLabel=Persistent class management
+JpaFacetWizardPage_discoverClassesButton=Discover annotated classes a&utomatically
+JpaFacetWizardPage_listClassesButton=Annotated classes must be &listed in persistence.xml
+JpaFacetWizardPage_createOrmXmlButton=Create &mapping file (orm.xml)
+JpaFacetWizardPage_metamodelLabel=Canonical metamodel (JPA 2.0)
+JpaFacetWizardPage_metamodelSourceFolderLink=<a>Source fol&der:</a>
+JpaFacetWizardPage_none=<None>
+
+JpaLibraryProviderInstallPanel_includeLibraries=&Include libraries with this application
+
+JpaMakePersistentWizardPage_title=Make Persistent
+JpaMakePersistentWizardPage_message=Make the selected Java classes persistent by selecting Java annotations or mapping file
+JpaMakePersistentWizardPage_annotateInJavaRadioButton=Annotate in &Java
+JpaMakePersistentWizardPage_mappingFileRadioButton=Add to &XML mapping file
+JpaMakePersistentWizardPage_mappingFileLink=<a>&Mapping file:</a>
+JpaMakePersistentWizardPage_mappingFileBrowseButton=B&rowse...
+JpaMakePersistentWizardPage_typeTableColumn=Type
+JpaMakePersistentWizardPage_mappingTableColumn=Mapping
+JpaMakePersistentWizardPage_listInPersistenceXmlCheckBox=&List in persistence.xml
+JpaMakePersistentWizardPage_selectedTypesPersistentError=All selected types are already persistent
+JpaMakePersistentWizardPage_mappingFileDoesNotExistError=The XML mapping file does not exist
+JpaMakePersistentWizardPage_mappingFileNotListedInPersistenceXmlError=The XML mapping file is not listed in the persistence.xml
+
+JpaPreferencesPage_Description=Expand the tree to edit preferences for a particular JPA feature.
+
+JpaProblemSeveritiesPage_Description=Select the severity level for the following optional Java Persistence validation problems:
+JpaProblemSeveritiesPage_Error=Error
+JpaProblemSeveritiesPage_Ignore=Ignore
+JpaProblemSeveritiesPage_Info=Info
+JpaProblemSeveritiesPage_Warning=Warning
+
+MappingFileWizard_title=New Mapping File
+MappingFileWizardPage_newFile_title=Mapping file
+MappingFileWizardPage_newFile_desc=Specify mapping file name and location
+MappingFileWizardPage_options_title=Mapping file
+MappingFileWizardPage_options_desc=Specify mapping file options
+MappingFileWizardPage_projectLabel=&Project:
+MappingFileWizardPage_sourceFolderLabel=Source fol&der:
+MappingFileWizardPage_filePathLabel=File pat&h:
+MappingFileWizardPage_accessLabel=Default a&ccess:
+MappingFileWizardPage_addToPersistenceUnitButton=&Add to persistence unit
+MappingFileWizardPage_persistenceUnitLabel=Persistence &unit:
+MappingFileWizardPage_incorrectSourceFolderError=Selection must be a valid source folder
+MappingFileWizardPage_accessLabel_sourceFolderDialogTitle=Source Folder Selection
+MappingFileWizardPage_accessLabel_sourceFolderDialogDesc=Choose a source folder:
+
+JpaProjectWizard_title=New JPA Project
+NewJpaProjectWizard_firstPage_title=JPA Project
+NewJpaProjectWizard_firstPage_description=Configure JPA project settings.
+
+OrmItemLabelProviderFactory_entityMappingsLabel=Entity Mappings
+
+PersistenceItemLabelProviderFactory_persistenceLabel=Persistence
+
+OverwriteConfirmerDialog_title=Overwrite Existing Class
+OverwriteConfirmerDialog_text=Overwrite source code for the class ''{0}''?
+
+SelectJpaOrmMappingFileDialog_newButton=New...
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/property_files/jpt_ui_details.properties b/jpa/plugins/org.eclipse.jpt.jpa.ui/property_files/jpt_ui_details.properties
new file mode 100644
index 0000000000..bb4190bab5
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/property_files/jpt_ui_details.properties
@@ -0,0 +1,323 @@
+################################################################################
+# 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
+################################################################################
+
+ProviderDefault=Default (<Provider-Specific>)
+NoNameSet=<No name set>
+
+MapAsComposite_changeMappingType=here
+MapAsComposite_default=Default
+MapAsComposite_dialogTitle=Mapping Type Selection
+MapAsComposite_labelText=&Enter mapping type or pattern (*, ?, or camel case):
+MapAsComposite_mappedAttributeText=Attribute ''{0}'' is mapped as {1}.
+MapAsComposite_mappedTypeText=Type ''{0}'' is mapped as {1}.
+MapAsComposite_unmappedAttributeText=Attribute ''{0}'' is not mapped, click here to change the mapping type.
+MapAsComposite_unmappedTypeText=Type ''{0}'' is not mapped, click here to change the mapping type.
+MapAsComposite_virtualAttributeText=Attribute ''{0}'' is not mapped.
+
+BasicSection_title=Basic
+EmbeddedSection_title=Embedded
+EmbeddedIdSection_title=Embedded ID
+EmbeddableSection_title=Embeddable
+EntitySection_title=Entity
+IdSection_title=ID
+ManyToManySection_title=Many to Many
+ManyToOneSection_title=Many to One
+MappedSuperclassSection_title=Mapped Superclass
+OneToManySection_title=One to Many
+OneToOneSection_title=One to One
+VersionSection_title=Version
+
+BasicMappingUiProvider_label=Basic
+EmbeddedMappingUiProvider_label=Embedded
+EmbeddedIdMappingUiProvider_label=Embedded ID
+IdMappingUiProvider_label=ID
+OneToManyMappingUiProvider_label=One to Many
+OneToOneMappingUiProvider_label=One to One
+ManyToManyMappingUiProvider_label=Many to Many
+ManyToOneMappingUiProvider_label=Many to One
+TransientMappingUiProvider_label=Transient
+VersionMappingUiProvider_label=Version
+BasicMappingUiProvider_linkLabel=basic
+EmbeddedMappingUiProvider_linkLabel=embedded
+EmbeddedIdMappingUiProvider_linkLabel=embedded ID
+IdMappingUiProvider_linkLabel=ID
+OneToManyMappingUiProvider_linkLabel=one to many
+OneToOneMappingUiProvider_linkLabel=one to one
+ManyToManyMappingUiProvider_linkLabel=many to many
+ManyToOneMappingUiProvider_linkLabel=many to one
+TransientMappingUiProvider_linkLabel=transient
+VersionMappingUiProvider_linkLabel=version
+
+DefaultBasicMappingUiProvider_label=Default (Basic)
+DefaultEmbeddedMappingUiProvider_label=Default (Embedded)
+DefaultBasicMappingUiProvider_linkLabel=default (basic)
+DefaultEmbeddedMappingUiProvider_linkLabel=default (embedded)
+
+EmbeddableUiProvider_label=Embeddable
+EntityUiProvider_label=Entity
+MappedSuperclassUiProvider_label=Mapped Superclass
+NullTypeMappingUiProvider_label=Unmapped
+
+EmbeddableUiProvider_linkLabel=embeddable
+EntityUiProvider_linkLabel=entity
+MappedSuperclassUiProvider_linkLabel=mapped superclass
+
+
+AddQueryDialog_title=Add Query
+AddQueryDialog_descriptionTitle=Create new query
+AddQueryDialog_namedQuery=Named Query
+AddQueryDialog_namedNativeQuery= Named Native Query
+AddQueryDialog_description=Create a new query setting both the 'name' and the 'type'
+AddQueryDialog_nameExists=The given name exists. This query may be overridden by or override the one(s) with the same name.
+QueryStateObject_nameMustBeSpecified=A name must be specified.
+QueryStateObject_typeMustBeSpecified=A query type must be specified
+AddQueryDialog_name=Name:
+AddQueryDialog_queryType=Type:
+NamedQueryComposite_nameTextLabel=Name:
+
+EntityComposite_inheritance=Inheritance
+EntityComposite_queries=Queries
+EntityComposite_tableDefault=Default ({0})
+EntityComposite_tableNoDefaultSpecified=Default ()
+
+EntityGeneralSection_name=Name:
+
+EntityNameComposite_name=Name:
+
+BasicGeneralSection_name=Name:
+BasicGeneralSection_nameDefault=Default ({0})
+BasicGeneralSection_fetchLabel=Fetch:
+BasicGeneralSection_optionalLabel=Optional
+BasicGeneralSection_optionalLabelDefault=Optional ({0})
+BasicGeneralSection_lobLabel=Lob
+BasicGeneralSection_temporalLabel=Temporal:
+BasicGeneralSection_enumeratedLabel=Enumerated:
+TypeSection_type=Type
+TypeSection_default=Default
+TypeSection_lob=Lob
+TypeSection_temporal=Temporal:
+TypeSection_enumerated=Enumerated:
+
+TableChooser_label=Name:
+CatalogChooser_label=Catalog:
+SchemaChooser_label=Schema:
+TableComposite_tableSection=Table
+
+TargetEntityChooser_label=Target entity:
+TargetEntityChooser_browse=Browse...
+TargetEntityChooser_selectTypeTitle=Select Type
+
+IdClassComposite_label=ID class:
+
+Joining_title=Joining Strategy
+Joining_mappedByLabel=Mapped by
+Joining_mappedByAttributeLabel=Attribute:
+Joining_joinColumnJoiningLabel=Join columns
+Joining_primaryKeyJoinColumnJoiningLabel=Primary key join columns
+Joining_joinTableJoiningLabel=Join table
+
+JoinTableComposite_inverseJoinColumn=Inverse join columns
+JoinTableComposite_joinColumn=Join columns
+JoinTableComposite_name=Name:
+JoinTableComposite_schema=Schema:
+JoinTableComposite_catalog=Catalog:
+JoinTableComposite_overrideDefaultJoinColumns=Override default
+JoinTableComposite_overrideDefaultInverseJoinColumns=Override default
+
+MultiRelationshipMappingComposite_general=General
+MultiRelationshipMappingComposite_joinTable=Join Table
+MultiRelationshipMappingComposite_targetEntity=Target entity:
+MultiRelationshipMappingComposite_cascadeType=Cascade type:
+MultiRelationshipMappingComposite_fetchType=Fetch type:
+MultiRelationshipMappingComposite_mappedBy=Mapped by:
+
+ColumnComposite_columnDefinition=Column definition:
+ColumnComposite_columnSection=Column
+ColumnComposite_details=Details
+ColumnComposite_insertable=Insertable
+ColumnComposite_insertableWithDefault=Insertable ({0})
+ColumnComposite_length=Length:
+ColumnComposite_name=Name:
+ColumnComposite_nullable=Nullable
+ColumnComposite_nullableWithDefault=Nullable ({0})
+ColumnComposite_precision=Precision:
+ColumnComposite_scale=Scale:
+ColumnComposite_table=Table:
+ColumnComposite_unique=Unique
+ColumnComposite_uniqueWithDefault=Unique ({0})
+ColumnComposite_updatable=Updatable
+ColumnComposite_updatableWithDefault=Updatable ({0})
+
+JoinColumnsComposite_edit=Edit...
+JoinColumnsComposite_mappingBetweenTwoParams={0} -> {1}
+JoinColumnsComposite_mappingBetweenTwoParamsDefault=Default ({0} -> {1})
+JoinColumnsComposite_mappingBetweenTwoParamsBothDefault=Default ({0}) -> Default ({1})
+JoinColumnsComposite_mappingBetweenTwoParamsFirstDefault=Default ({0}) -> {1}
+JoinColumnsComposite_mappingBetweenTwoParamsSecDefault={0} -> Default ({1})
+JoiningStrategyJoinColumnsComposite_overrideDefaultJoinColumns=Override default
+
+PrimaryKeyJoinColumnsComposite_overrideDefaultPrimaryKeyJoinColumns=Override default
+PrimaryKeyJoinColumnsComposite_edit=Edit...
+PrimaryKeyJoinColumnsComposite_primaryKeyJoinColumn=Primary key join columns
+PrimaryKeyJoinColumnsComposite_mappingBetweenTwoParams={0} -> {1}
+PrimaryKeyJoinColumnsComposite_mappingBetweenTwoParamsDefault=Default ({0} -> {1})
+PrimaryKeyJoinColumnsComposite_mappingBetweenTwoParamsBothDefault=Default ({0}) -> Default ({1})
+PrimaryKeyJoinColumnsComposite_mappingBetweenTwoParamsFirstDefault=Default ({0}) -> {1}
+PrimaryKeyJoinColumnsComposite_mappingBetweenTwoParamsSecDefault={0} -> Default ({1})
+
+JoinColumnDialog_addJoinColumnDescriptionTitle=Create New Join Column
+JoinColumnDialog_addJoinColumnTitle=Add Join Column
+JoinColumnDialog_description=Specify a mapped column for joining an entity association.
+JoinColumnDialog_editJoinColumnDescriptionTitle=Edit Join Column
+JoinColumnDialog_editJoinColumnTitle=Edit Join Column
+JoinColumnDialog_name=&Name:
+JoinColumnDialog_referencedColumnName=&Referenced column name:
+
+JoinColumnDialogPane_columnDefinition=&Column definition:
+JoinColumnDialogPane_insertable=&Insertable
+JoinColumnDialogPane_insertableWithDefault=&Insertable ({0})
+JoinColumnDialogPane_nullable=&Nullable
+JoinColumnDialogPane_nullableWithDefault=&Nullable ({0})
+JoinColumnDialogPane_table=&Table:
+JoinColumnDialogPane_unique=&Unique
+JoinColumnDialogPane_uniqueWithDefault=&Unique ({0})
+JoinColumnDialogPane_updatable=&Updatable
+JoinColumnDialogPane_updatableWithDefault=&Updatable ({0})
+
+InverseJoinColumnDialog_editInverseJoinColumnTitle=Edit Inverse Join Column
+
+PrimaryKeyJoinColumnInSecondaryTableDialog_addDescriptionTitle=Create New Primary Key Join Column
+PrimaryKeyJoinColumnInSecondaryTableDialog_addTitle=Add Primary Key Join Column
+PrimaryKeyJoinColumnInSecondaryTableDialog_editDescriptionTitle=Edit Primary Key Join Column
+PrimaryKeyJoinColumnInSecondaryTableDialog_editTitle=Edit Primary Key Join Column
+
+PrimaryKeyJoinColumnDialog_addDescriptionTitle=Create New Primary Key Join Column
+PrimaryKeyJoinColumnDialog_addTitle=Add Primary Key Join Column
+PrimaryKeyJoinColumnDialog_editDescriptionTitle=Edit Primary Key Join Column
+PrimaryKeyJoinColumnDialog_editTitle=Edit Primary Key Join Column
+
+OverridesComposite_attributeOverridesSection=Attribute Overrides
+OverridesComposite_attributeOverridesGroup=Attribute overrides
+OverridesComposite_overrideDefault=Override default
+
+OverridesComposite_association=Association Override
+OverridesComposite_attribute=Attribute Override
+OverridesComposite_noName=<Name not set>
+AssociationOverridesComposite_joinColumn=Join columns
+
+InheritanceComposite_detailsGroupBox=Details
+InheritanceComposite_discriminatorColumnGroupBox=Discriminator column
+InheritanceComposite_discriminatorValue=Discriminator value:
+AbstractInheritanceComposite_joined=Joined
+AbstractInheritanceComposite_single_table=Single Table
+InheritanceComposite_strategy=Strategy:
+AbstractInheritanceComposite_table_per_class=Table per Class
+
+DiscriminatorColumnComposite_discriminatorType=Type:
+DiscriminatorColumnComposite_name=Name:
+DiscriminatorColumnComposite_char=Character
+DiscriminatorColumnComposite_integer=Integer
+DiscriminatorColumnComposite_string=String
+
+GeneratorsComposite_sequenceGeneratorCheckBox=Sequence generator
+GeneratorsComposite_sequenceGeneratorSection=Sequence Generator
+GeneratorsComposite_tableGeneratorCheckBox=Table generator
+GeneratorsComposite_tableGeneratorSection=Table Generator
+
+IdMappingComposite_pk_generation=PK Generation
+IdMappingComposite_primaryKeyGenerationCheckBox=Primary key generation
+IdMappingComposite_primaryKeyGenerationSection=Primary Key Generation
+IdMappingComposite_tableGeneratorCheckBox=Table generator
+IdMappingComposite_tableGeneratorSection=Table Generator
+IdMappingComposite_sequenceGeneratorCheckBox=Sequence generator
+IdMappingComposite_sequenceGeneratorSection=Sequence Generator
+
+GeneratedValueComposite_generatedValue=Generated Value
+GeneratedValueComposite_generatorName=Generator name:
+GeneratedValueComposite_strategy=Strategy:
+GeneratedValueComposite_auto=Auto
+GeneratedValueComposite_identity=Identity
+GeneratedValueComposite_sequence=Sequence
+GeneratedValueComposite_table=Table
+
+SequenceGeneratorComposite_catalog=Catalog:
+SequenceGeneratorComposite_default=Default
+SequenceGeneratorComposite_name=Name:
+SequenceGeneratorComposite_schema=Schema:
+SequenceGeneratorComposite_sequence=Sequence:
+SequenceGeneratorComposite_sequenceGenerator=Sequence Generator
+
+TableGeneratorComposite_catalog=Catalog:
+TableGeneratorComposite_default=Default
+TableGeneratorComposite_name=Name:
+TableGeneratorComposite_pkColumn=Primary key column:
+TableGeneratorComposite_pkColumnValue=Primary key column value:
+TableGeneratorComposite_schema=Schema:
+TableGeneratorComposite_table=Table:
+TableGeneratorComposite_tableGenerator=Table Generator
+TableGeneratorComposite_valueColumn=Value column:
+
+GeneratorComposite_allocationSize=Allocation size:
+GeneratorComposite_initialValue=Initial value:
+
+OrderingComposite_orderingGroup=Ordering
+OrderingComposite_none=None
+OrderingComposite_primaryKey=Primary key
+OrderingComposite_custom=Custom
+
+SecondaryTablesComposite_secondaryTables=Secondary Tables
+SecondaryTablesComposite_edit=Edit...
+
+SecondaryTableDialog_addSecondaryTable=Add Secondary Table
+SecondaryTableDialog_editSecondaryTable=Edit Secondary Table
+SecondaryTableDialog_name=Name:
+SecondaryTableDialog_catalog=Catalog:
+SecondaryTableDialog_schema=Schema:
+SecondaryTableDialog_defaultSchema=Default ({0})
+SecondaryTableDialog_defaultCatalog=Default ({0})
+
+AccessTypeCombo_default=Default
+MetaDataCompleteCombo_Default=Default ({0})
+
+OptionalComposite_false=False
+OptionalComposite_true=True
+
+EnumTypeComposite_ordinal=Ordinal
+EnumTypeComposite_string=String
+
+FetchTypeComposite_eager=Eager
+FetchTypeComposite_lazy=Lazy
+
+TemporalTypeComposite_date=Date
+TemporalTypeComposite_time=Time
+TemporalTypeComposite_timestamp=Timestamp
+
+CascadeComposite_all=All
+CascadeComposite_cascadeTitle=Cascade
+CascadeComposite_merge=Merge
+CascadeComposite_persist=Persist
+CascadeComposite_refresh=Refresh
+CascadeComposite_remove=Remove
+
+QueriesComposite_displayString=<Name not set> {0}
+
+NamedNativeQueryPropertyComposite_query=Query:
+NamedNativeQueryPropertyComposite_queryHintsGroupBox=Query hints
+NamedNativeQueryPropertyComposite_resultClass=Result class:
+
+NamedQueryPropertyComposite_query=Query:
+NamedQueryPropertyComposite_queryHintsGroupBox=Query hints
+
+QueryHintsComposite_nameColumn=Name
+QueryHintsComposite_valueColumn=Value
+
+OrmSecondaryTablesComposite_defineInXml=Define in XML
+
+NullAttributeMappingUiProvider_label=Unmapped
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/property_files/jpt_ui_details2_0.properties b/jpa/plugins/org.eclipse.jpt.jpa.ui/property_files/jpt_ui_details2_0.properties
new file mode 100644
index 0000000000..6114fe4d25
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/property_files/jpt_ui_details2_0.properties
@@ -0,0 +1,52 @@
+################################################################################
+# Copyright (c) 2009, 2010 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
+################################################################################
+
+CascadePane2_0_detach=Detach
+
+CollectionTable2_0Composite_title=Collection Table
+CollectionTable2_0Composite_joinColumn=Join columns
+CollectionTable2_0Composite_name=Name:
+CollectionTable2_0Composite_schema=Schema:
+CollectionTable2_0Composite_catalog=Catalog:
+CollectionTable2_0Composite_overrideDefaultJoinColumns=Override default
+
+DerivedIdentity_title=Derived Identity
+DerivedIdentity_nullDerivedIdentity=None
+DerivedIdentity_idDerivedIdentity=Id
+DerivedIdentity_mapsIdDerivedIdentity=Maps id:
+DerivedIdentity_mapsIdUnspecifiedValue=<undetermined value>
+
+ElementCollectionMapping2_0_label=Element Collection
+ElementCollectionMapping2_0_linkLabel=element collection
+ElementCollectionSection_title=Element Collection
+AbstractElementCollectionMapping2_0_Composite_valueSectionTitle=Value
+Entity_cacheableLabel=Cacheable
+Entity_cacheableWithDefaultLabel=Cacheable ({0})
+
+EmbeddedIdMapping2_0MappedByRelationshipPane_label=Embedded ID is mapped by a relationship.
+IdMapping2_0MappedByRelationshipPane_label=ID is mapped by a relationship.
+
+OrderingComposite_orderColumn=Order column
+
+OrphanRemoval2_0Composite_orphanRemovalLabel=Orphan removal
+OrphanRemoval2_0Composite_orphanRemovalLabelDefault=Orphan removal ({0})
+
+LockModeComposite_lockModeLabel = Lock mode:
+
+LockModeComposite_read = Read
+LockModeComposite_write = Write
+LockModeComposite_optimistic = Optimistic
+LockModeComposite_optimistic_force_increment = Optimistic Force Increment
+LockModeComposite_pessimistic_read = Pessimistic Read
+LockModeComposite_pessimistic_write = Pessimistic Write
+LockModeComposite_pessimistic_force_increment = Pessimistic Force Increment
+LockModeComposite_none = None
+
+TargetClassComposite_label=Target class: \ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/property_files/jpt_ui_details_orm.properties b/jpa/plugins/org.eclipse.jpt.jpa.ui/property_files/jpt_ui_details_orm.properties
new file mode 100644
index 0000000000..139fc179e3
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/property_files/jpt_ui_details_orm.properties
@@ -0,0 +1,55 @@
+################################################################################
+# Copyright (c) 2006, 2010 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
+################################################################################
+
+EntityMappingsSection_title=Entity Mappings
+EntityMappingsDetailsPage_access=Access:
+EntityMappingsDetailsPage_catalog=Catalog:
+EntityMappingsDetailsPage_field=Field
+EntityMappingsDetailsPage_package=Package:
+EntityMappingsDetailsPage_property=Property
+EntityMappingsDetailsPage_schema=Schema:
+EntityMappingsPage_catalogDefault=Default ({0}
+EntityMappingsPage_catalogNoDefaultSpecified=Default
+EntityMappingsPage_schemaDefault=Default ({0})
+EntityMappingsPage_schemaNoDefaultSpecified=Default
+MetadataCompleteComposite_metadataComplete=Metadata complete
+MetadataCompleteComposite_metadataCompleteWithDefault=Metadata complete ({0})
+OrmGeneratorsComposite_displayString=<Name not set> {0}
+OrmGeneratorsComposite_groupBox=Generators
+OrmMappingNameChooser_name=Name:
+OrmJavaClassChooser_javaClass=Java class:
+OrmQueriesComposite_groupBox=Queries
+PersistenceUnitMetadataComposite_access=Access:
+PersistenceUnitMetadataComposite_delimitedIdentifiersCheckBox=Delimited identifiers
+PersistenceUnitMetadataComposite_cascadePersistCheckBox=Cascade persist
+PersistenceUnitMetadataComposite_catalog=Catalog:
+PersistenceUnitMetadataComposite_field=Field
+PersistenceUnitMetadataComposite_persistenceUnitSection=Persistence Unit
+PersistenceUnitMetadataComposite_property=Property
+PersistenceUnitMetadataComposite_schema=Schema:
+PersistenceUnitMetadataComposite_xmlMappingMetadataCompleteCheckBox=XML mapping metadata complete
+PersistenceUnitMetadataSection_catalogDefault=Default ({0})
+PersistenceUnitMetadataSection_schemaDefault=Default ({0})
+
+AddGeneratorDialog_name=Name:
+AddGeneratorDialog_generatorType=Type:
+AddGeneratorDialog_title=Add Generator
+AddGeneratorDialog_descriptionTitle=Create new generator
+AddGeneratorDialog_description=Create a new generator setting both the 'name' and the 'type'
+AddGeneratorDialog_tableGenerator=Table Generator
+AddGeneratorDialog_sequenceGenerator=Sequence Generator
+GeneratorStateObject_nameExists=The given name already exists. This generator may override the existing one(s) with the same name.
+GeneratorStateObject_nameMustBeSpecified=A name must be specified.
+GeneratorStateObject_typeMustBeSpecified=A generator type must be specified.
+
+
+UnsupportedOrmMappingUiProvider_label=Unsupported
+
+UnsupportedOrmMappingUiProvider_linkLabel=unsupported \ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/property_files/jpt_ui_entity_gen.properties b/jpa/plugins/org.eclipse.jpt.jpa.ui/property_files/jpt_ui_entity_gen.properties
new file mode 100644
index 0000000000..b5b18ec42a
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/property_files/jpt_ui_entity_gen.properties
@@ -0,0 +1,111 @@
+###############################################################################
+# Copyright (c) 2006, 2010 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
+###############################################################################
+
+cardinality=Car&dinality:
+property=P&roperty:
+cascade=&Cascade:
+connection=&Connection:
+schema=&Schema:
+schemaInfo=(Note: You must have an active connection to select schema.)
+addConnectionLink=Add connections...
+connectLink=Connect
+connectingToDatabase=Connecting to database
+manyToOne=&Many to one
+manyToMany=Man&y to many
+oneToMany=&One to many
+oneToOne=&One to one
+manyToOneDesc=Each %s has many %s.
+oneToOneDesc=There is one %s per %s.
+manyToManyDesc=Each %s has many %s, and each %s has many %s.
+
+add=&Add
+remove=&Remove
+
+GenerateEntitiesWizard_generateEntities=Generate Custom Entities
+
+GenerateEntitiesWizard_selectJPAProject=JPA Project Selection
+GenerateEntitiesWizard_selectJPAProject_msg=Select a JPA project.
+
+GenerateEntitiesWizard_tableSelectPage_selectTable=Select Tables
+GenerateEntitiesWizard_tableSelectPage_chooseEntityTable=Select tables to generate entities from.
+GenerateEntitiesWizard_tableSelectPage_updatePersistenceXml=Update class list in persistence.xml
+GenerateEntitiesWizard_tableSelectPage_tables=&Tables:
+GenerateEntitiesWizard_tableSelectPage_tableColumn=Table
+GenerateEntitiesWizard_tableSelectPage_Restore_Defaults=Restore Defaults
+
+GenerateEntitiesWizard_assocPage_title=Table Associations
+GenerateEntitiesWizard_assocPage_label=Table &associations
+GenerateEntitiesWizard_assocPage_desc=Edit a table association by selecting it and modifying the controls in the editing panel.
+GenerateEntitiesWizard_assocPage_newAssoc=New Association
+GenerateEntitiesWizard_assocPage_delAssoc=Delete Selected Association
+
+
+GenerateEntitiesWizard_defaultTablePage_title=Customize Default Entity Generation
+GenerateEntitiesWizard_defaultTablePage_tableMapping=Table mapping
+GenerateEntitiesWizard_defaultTablePage_domainJavaClass=Domain java class
+
+GenerateEntitiesWizard_defaultTablePage_desc=Optionally customize aspects of entities that will be generated by default from database tables. A Java package should be specified.
+GenerateEntitiesWizard_defaultTablePage_access=Entity &access:
+GenerateEntitiesWizard_defaultTablePage_fetch=Associations &fetch:
+GenerateEntitiesWizard_defaultTablePage_collType=Collection properties &type:
+GenerateEntitiesWizard_defaultTablePage_genOptionalAnnotations = Always generate optional JPA annotations and DDL parameters
+GenerateEntitiesWizard_defaultTablePage_genOptionalAnnotations_desc = Generate optional JPA annotations and DDL parameters like 'unique', 'nullable', 'length', 'precision' and 'scale', which are optional and only used by automatic table creation to specify table creation data.
+GenerateEntitiesWizard_defaultTablePage_keyGen=Key &generator:
+GenerateEntitiesWizard_defaultTablePage_sequence=Sequence &name:
+GenerateEntitiesWizard_defaultTablePage_sequenceNote=You can use the patterns %s and/or %s in the sequence name.\n\
+ These patterns will be replaced by the table name and the primary key \n\
+ column name when a table mapping is generated.
+
+
+GenerateEntitiesWizard_tablesAndColumnsPage_title=Customize Individual Entities
+GenerateEntitiesWizard_tablesAndColumnsPage_desc=Customize detail of individual entities by selecting the associated tables or columns and changing values in the editing panel.
+GenerateEntitiesWizard_tablesAndColumnsPage_labelTableAndColumns=&Tables and columns
+
+GenerateEntitiesWizard_tablePanel_className=&Class name:
+GenerateEntitiesWizard_colPanel_genProp=Generate this property
+GenerateEntitiesWizard_colPanel_colMapping=Column mapping
+GenerateEntitiesWizard_colPanel_propName=Property &name:
+GenerateEntitiesWizard_colPanel_propType=Mapping t&ype:
+GenerateEntitiesWizard_colPanel_mapKind=Mapping &kind:
+GenerateEntitiesWizard_colPanel_beanProp=Domain Java Class
+GenerateEntitiesWizard_colPanel_getterScope=Getter scope:
+GenerateEntitiesWizard_colPanel_setterScope=Setter scope:
+GenerateEntitiesWizard_colPanel_colUpdateable=Column is &updatable
+GenerateEntitiesWizard_colPanel_colInsertable=Column is &insertable
+
+GenerateEntitiesWizard_newAssoc_title=Create New Association
+
+GenerateEntitiesWizard_newAssoc_tablesPage_title=Association Tables
+GenerateEntitiesWizard_newAssoc_tablesPage_desc=Specify the association tables.
+GenerateEntitiesWizard_newAssoc_tablesPage_assocKind=Association kind
+GenerateEntitiesWizard_newAssoc_tablesPage_assocTables=Association &tables:
+GenerateEntitiesWizard_newAssoc_tablesPage_table1=Table &1:
+GenerateEntitiesWizard_newAssoc_tablesPage_table2=Table &2:
+GenerateEntitiesWizard_newAssoc_tablesPage_intermediateTable=Join table:
+GenerateEntitiesWizard_newAssoc_tablesPage_simpleAssoc=&Simple association
+GenerateEntitiesWizard_newAssoc_tablesPage_m2mAssoc=&Many to many association
+
+GenerateEntitiesWizard_newAssoc_cardinalityPage_title=Association Cardinality
+GenerateEntitiesWizard_newAssoc_cardinalityPage_desc=Specify the association cardinality.
+
+GenerateEntitiesWizard_newAssoc_colsPage_title=Join Columns
+GenerateEntitiesWizard_newAssoc_colsPage_desc=Specify the join columns.
+GenerateEntitiesWizard_newAssoc_colsPage_label=Specify the join columns between the %s and %s tables:
+
+GenerateEntitiesWizard_assocEditor_entityRef=Generate a reference to %s in %s
+GenerateEntitiesWizard_assocEditor_setRef=Generate a reference to a collection of %s in %s
+GenerateEntitiesWizard_assocEditor_tableJoin=Table &join:
+GenerateEntitiesWizard_assocEditor_joinedWhen=The table rows are joined when:\n%s
+GenerateEntitiesWizard_assocEditor_genAssoc=Generate &this association
+GenerateEntitiesWizard_doNotShowWarning = Don't show me this warning again
+
+selectCascadeDlgTitle=Select Cascade
+selectTableDlgTitle=Table Selection
+selectTableDlgDesc=&Select a table:
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/property_files/jpt_ui_entity_wizard.properties b/jpa/plugins/org.eclipse.jpt.jpa.ui/property_files/jpt_ui_entity_wizard.properties
new file mode 100644
index 0000000000..064f3847eb
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/property_files/jpt_ui_entity_wizard.properties
@@ -0,0 +1,57 @@
+################################################################################
+# Copyright (c) 2008, 2010 by SAP AG, Walldorf.
+# 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:
+# SAP AG - initial API and implementation
+# Dimiter Dimitrov, d.dimitrov@sap.com - initial API and implementation
+################################################################################
+
+ENTITY_WIZARD_TITLE=New JPA Entity
+ENTITY_WIZARD_PAGE_TITLE=Entity class
+ENTITY_WIZARD_PAGE_DESCRIPTION=Create a new JPA entity. Only JPA enabled projects may be selected.
+DEFAULT_PACKAGE_WARNING=The usage of the default package is not recommended.
+ENTITY_PROPERTIES_TITLE=Entity Properties
+ENTITY_PROPERTIES_DESCRIPTION=Set entity name, table name, fields, and access type.
+ENTITY=Entit&y
+MAPPED_AS_SUPERCLASS=Mapped super&class
+INHERITANCE_GROUP=Inheritance
+INHERITANCE_CHECK_BOX=&Inheritance:
+XML_STORAGE_GROUP=XML entity mappings
+XML_SUPPORT=Add to entity mappings in &XML
+CHOOSE_XML=M&apping file:
+MAPPING_XML_TITLE=Mapping File
+XML_NAME_TITLE=XML name:
+CHOOSE_MAPPING_XML_MESSAGE=Choose mapping XML
+INVALID_XML_NAME=The mapping file does not exist
+TYPE_DIALOG_TITLE=Choose Type
+TYPE_DIALOG_DESCRIPTION=Choose the type of the entity field.
+ENTITY_NAME=Entity na&me:
+TABLE_NAME_GROUP=Table name
+TABLE_NAME=&Table name:
+USE_DEFAULT=&Use default
+ENTITY_FIELDS_GROUP=Entity field&s
+ENTITY_FIELDS_DIALOG_TITLE=Entity Fields
+KEY=Key
+NAME_COLUMN=Name
+TYPE_COLUMN=Type
+NAME_TEXT_FIELD=Na&me:
+TYPE_TEXT_FIELD=&Type:
+BROWSE_BUTTON_LABEL=B&rowse...
+ADD_BUTTON_LABEL=&Add...
+EDIT_BUTTON_LABEL=&Edit...
+REMOVE_BUTTON_LABEL=&Remove
+DUPLICATED_ENTITY_NAMES_MESSAGE=There are duplicate names on created entity fields. Please resolve the duplication.
+ACCESS_TYPE=Access type
+FIELD_BASED=Fiel&d
+PROPERTY_BASED=&Property
+NO_JPA_PROJECTS=No JPA projects in the workspace
+APPLY_CHANGES_TO_PERSISTENCE_XML=Apply changes to persistence XML
+ADD_MAPPED_SUPERCLASS_TO_XML=Add mapped superclass to XML
+ADD_ENTITY_TO_XML=Add entity to XML
+EntityDataModelProvider_typeNotInProjectClasspath=''{0}'' does not exist on the project classpath
+EntityDataModelProvider_invalidPKType=''{0}'' is not a valid simple primary key type
+EntityDataModelProvider_invalidArgument=Invalid argument ''{0}''
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/property_files/jpt_ui_persistence.properties b/jpa/plugins/org.eclipse.jpt.jpa.ui/property_files/jpt_ui_persistence.properties
new file mode 100644
index 0000000000..f9cdc7ad3f
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/property_files/jpt_ui_persistence.properties
@@ -0,0 +1,56 @@
+################################################################################
+# Copyright (c) 2006, 2009 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
+################################################################################
+
+ArchiveFileSelectionDialog_jarPathHelpLabel=The correct path to the JAR file selected will vary on your runtime environment. You may alter it here to correctly reflect your particular environment.
+ArchiveFileSelectionDialog_jarPathLabel=JAR file path:
+
+PersistenceEditor_page_help=Help
+PersistenceEditor_sourceTab=Source
+
+PersistenceUnitClassesComposite_description=Specify the list of classes to be managed in this persistence unit.
+PersistenceUnitClassesComposite_excludeUnlistedMappedClasses=Exclude unlisted classes
+PersistenceUnitClassesComposite_excludeUnlistedMappedClassesWithDefault=Exclude unlisted classes ({0})
+PersistenceUnitClassesComposite_mappedClassesNoName=<name not set>
+PersistenceUnitClassesComposite_open=Open
+
+PersistenceUnitConnectionGeneralComposite_default=Default(JTA)
+PersistenceUnitConnectionGeneralComposite_jta=JTA
+PersistenceUnitConnectionGeneralComposite_resource_local=Resource Local
+
+PersistenceUnitConnectionComposite_connection=Connection
+PersistenceUnitConnectionComposite_database=Database
+PersistenceUnitConnectionComposite_general=General
+
+PersistenceUnitConnectionDatabaseComposite_jtaDatasourceName=JTA data source name:
+PersistenceUnitConnectionDatabaseComposite_nonJtaDatasourceName=Non-JTA data source name:
+
+PersistenceUnitConnectionGeneralComposite_transactionType=Transaction type:
+
+PersistenceUnitGeneralComposite_general=General
+PersistenceUnitGeneralComposite_jarFiles=JAR Files
+PersistenceUnitGeneralComposite_jpaMappingDescriptors=XML Mapping Files
+PersistenceUnitGeneralComposite_jpaMappingDescriptors_description=Specify the XML mapping files for this persistence unit.
+PersistenceUnitGeneralComposite_mappedClasses=Managed Classes
+PersistenceUnitGeneralComposite_name=Name:
+PersistenceUnitGeneralComposite_persistenceProvider=Persistence provider:
+PersistenceUnitGeneralComposite_description=Description:
+
+PersistenceUnitJarFilesComposite_noFileName=<File name not set>
+PersistenceUnitMappingFilesComposite_jarFileDialog_title=JAR File Selection
+PersistenceUnitMappingFilesComposite_jarFileDialog_message=Choose a JAR file to be added to the persistence unit.
+
+PersistenceUnitMappingFilesComposite_mappingFileDialog_message=Choose the XML mapping files to be added to the persistence unit.
+PersistenceUnitMappingFilesComposite_mappingFileDialog_title=JPA XML Mapping File Selection
+PersistenceUnitMappingFilesComposite_ormNoName=<name not set>
+
+PersistenceUnitPropertiesComposite_nameColumn=Name
+PersistenceUnitPropertiesComposite_properties=Properties
+PersistenceUnitPropertiesComposite_properties_description=This table lists all properties that are defined for this persistence unit.
+PersistenceUnitPropertiesComposite_valueColumn=Value \ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/property_files/jpt_ui_persistence2_0.properties b/jpa/plugins/org.eclipse.jpt.jpa.ui/property_files/jpt_ui_persistence2_0.properties
new file mode 100644
index 0000000000..49a4408d61
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/property_files/jpt_ui_persistence2_0.properties
@@ -0,0 +1,60 @@
+################################################################################
+# Copyright (c) 2009, 2010 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
+################################################################################
+
+ConnectionPropertiesComposite_Database_GroupBox = Database
+
+DataSourcePropertiesComposite_jtaDataSourceLabel = JTA data source:
+DataSourcePropertiesComposite_nonJtaDataSourceLabel = Non-JTA data source:
+
+GenericPersistenceUnit2_0ConnectionComposite_sectionTitle = Persistence Unit Connection
+GenericPersistenceUnit2_0ConnectionComposite_sectionDescription = Configure the data source or JDBC connection properties.
+
+JdbcConnectionPropertiesComposite_ConnectionDialog_Message = &Enter connection name or pattern (*, ?, or camel case):
+JdbcConnectionPropertiesComposite_ConnectionDialog_Title = Connection Selection
+GenericPersistenceUnit2_0ConnectionTab_title = Connection
+
+GenericPersistenceUnit2_0OptionsComposite_miscellaneousSectionTitle = Miscellaneous Options
+GenericPersistenceUnit2_0OptionsComposite_miscellaneousSectionDescription = Configure the miscellaneous options.
+GenericPersistenceUnit2_0OptionsTab_title = Options
+GenericPersistenceUnit2_0OptionsTab_noName = <name not set>
+
+JdbcConnectionPropertiesComposite_populateFromConnectionHyperLink = Populate from connection...
+JdbcConnectionPropertiesComposite_driverLabel = Driver:
+JdbcConnectionPropertiesComposite_urlLabel = URL:
+JdbcConnectionPropertiesComposite_userLabel = User:
+JdbcConnectionPropertiesComposite_passwordLabel = Password:
+
+JdbcPropertiesComposite_JdbcConnectionProperties_GroupBox = JDBC connection properties
+
+LockingConfigurationComposite_lockTimeoutLabel = Lock timeout:
+QueryConfigurationComposite_queryTimeoutLabel = Query timeout:
+
+TransactionTypeComposite_transactionTypeLabel = Transaction type:
+
+TransactionTypeComposite_jta = JTA
+TransactionTypeComposite_resource_local = Resource Local
+
+SharedCacheModeComposite_sharedCacheModeLabel = Shared cache mode:
+
+SharedCacheModeComposite_all = All
+SharedCacheModeComposite_none = None
+SharedCacheModeComposite_enable_selective = Enable Selective
+SharedCacheModeComposite_disable_selective = Disable Selective
+SharedCacheModeComposite_unspecified = Unspecified
+
+ValidationModeComposite_validationModeLabel = Validation mode:
+
+ValidationModeComposite_auto = Auto
+ValidationModeComposite_callback = Callback
+ValidationModeComposite_none = None
+
+ValidationConfigurationComposite_groupPrePersistLabel = Validate pre-persist group:
+ValidationConfigurationComposite_groupPreUpdateLabel = Validate pre-update group:
+ValidationConfigurationComposite_groupPreRemoveLabel = Validate pre-remove group:
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/property_files/jpt_ui_validation_preferences.properties b/jpa/plugins/org.eclipse.jpt.jpa.ui/property_files/jpt_ui_validation_preferences.properties
new file mode 100644
index 0000000000..488604638c
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/property_files/jpt_ui_validation_preferences.properties
@@ -0,0 +1,211 @@
+################################################################################
+# Copyright (c) 2009, 2010 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
+################################################################################
+PROJECT_LEVEL_CATEGORY=Project
+
+NO_JPA_PROJECT=Project has JPA facet, but JPA project couldn't be created:
+PROJECT_NO_CONNECTION=No connection specified for project:
+PROJECT_INVALID_CONNECTION=Connection does not exist:
+PROJECT_INACTIVE_CONNECTION=Connection is not active:
+PROJECT_NO_PERSISTENCE_XML=No persistence.xml file found in project:
+PROJECT_MULTIPLE_PERSISTENCE_XML=Multiple persistence.xml files in project:
+
+XML_VERSION_NOT_LATEST=XML document version not most recent:
+
+PERSISTENCE_NO_PERSISTENCE_UNIT=No persistence unit defined:
+PERSISTENCE_MULTIPLE_PERSISTENCE_UNITS=Multiple persistence units defined:
+PERSISTENCE_XML_INVALID_CONTENT=Invalid content (no root node):
+
+PERSISTENCE_UNIT_LEVEL_CATEGORY=Persistence unit
+
+PERSISTENCE_UNIT_UNSPECIFIED_MAPPING_FILE=Unspecified mapping file:
+PERSISTENCE_UNIT_UNSUPPORTED_MAPPING_FILE_CONTENT=Mapping file does not have supported content:
+PERSISTENCE_UNIT_NONEXISTENT_MAPPING_FILE=Mapping file cannot be resolved:
+PERSISTENCE_UNIT_INVALID_MAPPING_FILE=Mapping file does not have ORM content:
+PERSISTENCE_UNIT_DUPLICATE_MAPPING_FILE=Duplicate mapping file:
+PERSISTENCE_UNIT_UNSPECIFIED_CLASS=Unspecified class:
+PERSISTENCE_UNIT_NONEXISTENT_CLASS=Class cannot be resolved:
+PERSISTENCE_UNIT_INVALID_CLASS=Class is included in a persistence unit but is not mapped:
+PERSISTENCE_UNIT_DUPLICATE_CLASS=Duplicate class:
+PERSISTENCE_UNIT_REDUNDANT_CLASS=Class is already specified in mapping file:
+PERSISTENCE_UNIT_DUPLICATE_JAR_FILE=Duplicate JAR file:
+PERSISTENCE_UNIT_UNSPECIFIED_JAR_FILE=Unspecified JAR file:
+PERSISTENCE_UNIT_JAR_FILE_DEPLOYMENT_PATH_WARNING=The path to the JAR file will vary:
+PERSISTENCE_UNIT_NONEXISTENT_JAR_FILE=JAR file cannot be resolved:
+MAPPING_FILE_EXTRANEOUS_PERSISTENCE_UNIT_METADATA=Extraneous persistence unit metadata found:
+PERSISTENT_TYPE_MAPPED_BUT_NOT_INCLUDED_IN_PERSISTENCE_UNIT=Class is mapped, but is not in a persistence unit:
+PERSISTENT_TYPE_ANNOTATED_BUT_NOT_INCLUDED_IN_PERSISTENCE_UNIT=Class is annotated, but is not in a persistence unit:
+
+TYPE_LEVEL_CATEGORY=Type
+
+PERSISTENT_TYPE_UNSPECIFIED_CLASS=Class is unspecified in orm.xml:
+PERSISTENT_TYPE_UNRESOLVED_CLASS=Class in orm.xml cannot be resolved to a java class:
+ENTITY_NO_PK=Entity has no primary key:
+ENTITY_SINGLE_TABLE_DESCENDANT_DEFINES_TABLE=No table should be defined for non-root entity using single-table inheritance:
+ENTITY_ABSTRACT_TABLE_PER_CLASS_DEFINES_TABLE=No table should be defined for abstract entity using table-per-concrete-class inheritance:
+ENTITY_ABSTRACT_DISCRIMINATOR_VALUE_DEFINED=No discriminator value should be defined for abstract entity:
+ENTITY_TABLE_PER_CLASS_DISCRIMINATOR_VALUE_DEFINED=No discriminator value should be defined for entity using table-per-concrete-class inheritance:
+ENTITY_NON_ROOT_DISCRIMINATOR_COLUMN_DEFINED=No discriminator column should be defined for non-root entity:
+ENTITY_TABLE_PER_CLASS_DISCRIMINATOR_COLUMN_DEFINED=No discriminator column should be defined for entity using table-per-concrete-class inheritance:
+TYPE_MAPPING_FINAL_CLASS=Mapped Java class is final:
+TYPE_MAPPING_MEMBER_CLASS=Mapped Java class is a member class:
+TYPE_MAPPING_CLASS_MISSING_NO_ARG_CONSTRUCTOR=Mapped Java class has no no-arg constructor:
+TYPE_MAPPING_CLASS_PRIVATE_NO_ARG_CONSTRUCTOR=Mapped Java class has a private no-arg constructor:
+
+ATTRIBUTE_LEVEL_CATEGORY=Attribute
+
+PERSISTENT_ATTRIBUTE_UNSPECIFIED_NAME=Attribute in orm.xml has unspecified name:
+PERSISTENT_ATTRIBUTE_UNRESOLVED_NAME=Attribute in orm.xml cannot be resolved in the java class:
+PERSISTENT_ATTRIBUTE_INHERITED_ATTRIBUTES_NOT_SUPPORTED=In orm.xml referenced inherited attribute may not be supported:
+PERSISTENT_ATTRIBUTE_INVALID_MAPPING=Attribute has invalid mapping type:
+PERSISTENT_ATTRIBUTE_FINAL_FIELD=The java field for attribute is final:
+PERSISTENT_ATTRIBUTE_FINAL_GETTER=The java getter for attribute is final:
+PERSISTENT_ATTRIBUTE_PUBLIC_FIELD=The java field for attribute is public:
+MAPPING_UNRESOLVED_MAPPED_BY=Cannot resolve attribute name:
+MAPPING_INVALID_MAPPED_BY=Attribute has invalid mapping for this relationship:
+MAPPING_MAPPED_BY_WITH_JOIN_TABLE=Cannot specify join table if attribute is mapped by another attribute:
+MAPPING_MAPPED_BY_ON_BOTH_SIDES=Relationship must have an owner:
+TARGET_ENTITY_NOT_DEFINED=Target entity is not defined:
+TARGET_ENTITY_IS_NOT_AN_ENTITY=Target entity is not an Entity:
+MAPS_ID_VALUE_NOT_SPECIFIED="Maps ID" attribute value not specified:
+MAPS_ID_VALUE_NOT_RESOLVED="Maps ID" attribute value not resolved:
+MAPS_ID_VALUE_INVALID="Maps ID" attribute value invalid:
+ORDER_COLUMN_AND_ORDER_BY_BOTH_SPECIFIED=OrderColumn and OrderBy annotations are both specified:
+ELEMENT_COLLECTION_TARGET_CLASS_NOT_DEFINED=Element collection target class not defined:
+ELEMENT_COLLECTION_TARGET_CLASS_MUST_BE_EMBEDDABLE_OR_BASIC_TYPE=Element collection target class is not embeddable or basic type:
+ELEMENT_COLLECTION_MAP_KEY_CLASS_NOT_DEFINED=Element collection map key class not defined:
+
+DATABASE_CATEGORY=Database
+TABLE_CATEGORY=Table
+
+TABLE_UNRESOLVED_CATALOG=Catalog cannot be resolved for table:
+TABLE_UNRESOLVED_SCHEMA=Schema cannot be resolved for table:
+TABLE_UNRESOLVED_NAME=Table cannot be resolved:
+SECONDARY_TABLE_UNRESOLVED_CATALOG=Catalog cannot be resolved for secondary table:
+SECONDARY_TABLE_UNRESOLVED_SCHEMA=Schema cannot be resolved for secondary table:
+SECONDARY_TABLE_UNRESOLVED_NAME=Secondary table cannot be resolved:
+JOIN_TABLE_UNRESOLVED_CATALOG=Catalog cannot be resolved for join table:
+JOIN_TABLE_UNRESOLVED_SCHEMA=Schema cannot be resolved for join table:
+JOIN_TABLE_UNRESOLVED_NAME=Join table cannot be resolved:
+VIRTUAL_SECONDARY_TABLE_PRIMARY_KEY_JOIN_COLUMN_UNRESOLVED_NAME=Implied secondary table primary key join column cannot be resolved:
+VIRTUAL_SECONDARY_TABLE_PRIMARY_KEY_JOIN_COLUMN_UNRESOLVED_REFERENCED_COLUMN_NAME=Implied secondary table primary key join column referenced column name cannot be resolved:
+VIRTUAL_SECONDARY_TABLE_PRIMARY_KEY_JOIN_COLUMN_NAME_MUST_BE_SPECIFIED_MULTIPLE_JOIN_COLUMNS=Implied secondary table primary key join column name must be specified when there are multiples:
+VIRTUAL_SECONDARY_TABLE_PRIMARY_KEY_JOIN_COLUMN_REFERENCED_COLUMN_NAME_MUST_BE_SPECIFIED_MULTIPLE_JOIN_COLUMNS=Implied secondary table primary key join column referenced column name must be specified when there are multiples:
+COLLECTION_TABLE_UNRESOLVED_CATALOG=Catalog cannot be resolved for collection table:
+COLLECTION_TABLE_UNRESOLVED_SCHEMA=Schema cannot be resolved for collection table:
+COLLECTION_TABLE_UNRESOLVED_NAME=Collection table cannot be resolved:
+
+COLUMN_CATEGORY=Column
+
+COLUMN_UNRESOLVED_TABLE=Table for column cannot be resolved:
+COLUMN_UNRESOLVED_NAME=Column cannot be resolved:
+COLUMN_TABLE_NOT_VALID=Table for column not valid given the context:
+JOIN_COLUMN_TABLE_NOT_VALID=Table for join column is not valid:
+JOIN_COLUMN_UNRESOLVED_NAME=Join column cannot be resolved:
+JOIN_COLUMN_NAME_MUST_BE_SPECIFIED_MULTIPLE_JOIN_COLUMNS=Join column name must be specified when there are multiples:
+JOIN_COLUMN_UNRESOLVED_REFERENCED_COLUMN_NAME=Referenced column in join column cannot be resolved:
+JOIN_COLUMN_REFERENCED_COLUMN_NAME_MUST_BE_SPECIFIED_MULTIPLE_JOIN_COLUMNS=Join column referenced column name must be specified when there are multiples:
+INVERSE_JOIN_COLUMN_TABLE_NOT_VALID=Table for inverse join column is not valid:
+INVERSE_JOIN_COLUMN_UNRESOLVED_NAME=Inverse join column cannot be resolved:
+INVERSE_JOIN_COLUMN_NAME_MUST_BE_SPECIFIED_MULTIPLE_JOIN_COLUMNS=Inverse join column name must be specified when there are multiples:
+INVERSE_JOIN_COLUMN_UNRESOLVED_REFERENCED_COLUMN_NAME=Referenced column in inverse join column cannot be resolved:
+INVERSE_JOIN_COLUMN_REFERENCED_COLUMN_NAME_MUST_BE_SPECIFIED_MULTIPLE_JOIN_COLUMNS=Inverse join column referenced column name must be specified when there are multiples:
+PRIMARY_KEY_JOIN_COLUMN_UNRESOLVED_NAME=Primary key join column cannot be resolved:
+PRIMARY_KEY_JOIN_COLUMN_UNRESOLVED_REFERENCED_COLUMN_NAME=Referenced column in primary key join column cannot be resolved:
+PRIMARY_KEY_JOIN_COLUMN_NAME_MUST_BE_SPECIFIED_MULTIPLE_JOIN_COLUMNS=Primary key join column name must be specified when there are multiples:
+PRIMARY_KEY_JOIN_COLUMN_REFERENCED_COLUMN_NAME_MUST_BE_SPECIFIED_MULTIPLE_JOIN_COLUMNS=Primary key join column referenced column name must be specified when there are multiples:
+MAP_KEY_COLUMN_TABLE_NOT_VALID=Table for map key column is not valid:
+ORDER_COLUMN_UNRESOLVED_NAME=Order column cannot be resolved:
+VIRTUAL_PRIMARY_KEY_JOIN_COLUMN_UNRESOLVED_NAME=Implied primary key join column cannot be resolved:
+VIRTUAL_PRIMARY_KEY_JOIN_COLUMN_NAME_MUST_BE_SPECIFIED_MULTIPLE_JOIN_COLUMNS=Implied primary key join column name must be specified when there are multiples:
+VIRTUAL_PRIMARY_KEY_JOIN_COLUMN_UNRESOLVED_REFERENCED_COLUMN_NAME=Implied primary key join column referenced column name cannot be resolved:
+VIRTUAL_PRIMARY_KEY_JOIN_COLUMN_REFERENCED_COLUMN_NAME_MUST_BE_SPECIFIED_MULTIPLE_JOIN_COLUMNS=Implied primary key join column referenced column name must be specified when there are multiples:
+
+OVERRIDES_CATEGORY=Attribute/association overrides
+IMPLIED_ATTRIBUTE_LEVEL_CATEGORY=Implied attributes
+
+ATTRIBUTE_OVERRIDE_INVALID_NAME=Attribute override name cannot be resolved to an attribute
+ASSOCIATION_OVERRIDE_INVALID_NAME=Association override name cannot be resolved to an attribute
+VIRTUAL_ATTRIBUTE_OVERRIDE_INVALID_NAME=Implied attribute override name cannot be resolved to an attribute
+VIRTUAL_ASSOCIATION_OVERRIDE_INVALID_NAME=Implied association override name cannot be resolved to an attribute
+VIRTUAL_MAP_KEY_ATTRIBUTE_OVERRIDE_INVALID_NAME=Implied map key attribute override name cannot be resolved to an attribute
+VIRTUAL_ATTRIBUTE_ATTRIBUTE_OVERRIDE_INVALID_NAME=Attribute override name cannot be resolved to an attribute
+VIRTUAL_ATTRIBUTE_ASSOCIATION_OVERRIDE_INVALID_NAME=Association override name cannot be resolved to an attribute
+VIRTUAL_ATTRIBUTE_MAP_KEY_ATTRIBUTE_OVERRIDE_INVALID_NAME=Map key attribute override cannot be resolved to an attribute
+VIRTUAL_MAP_KEY_ATTRIBUTE_OVERRIDE_COLUMN_TABLE_NOT_VALID=Implied map key attribute override table for column is not valid:
+VIRTUAL_ATTRIBUTE_OVERRIDE_COLUMN_UNRESOLVED_NAME=Implied attribute override column cannot be resolved:
+VIRTUAL_ATTRIBUTE_OVERRIDE_COLUMN_TABLE_NOT_VALID=Implied attribute override table for column not valid:
+VIRTUAL_ASSOCIATION_OVERRIDE_JOIN_TABLE_UNRESOLVED_CATALOG=Implied association catalog cannot be resolved for join table:
+VIRTUAL_ASSOCIATION_OVERRIDE_JOIN_TABLE_UNRESOLVED_SCHEMA=Implied association schema cannot be resolved join table:
+VIRTUAL_ASSOCIATION_OVERRIDE_JOIN_TABLE_UNRESOLVED_NAME=Implied association cannot be resolved join table:
+VIRTUAL_ASSOCIATION_OVERRIDE_JOIN_COLUMN_TABLE_NOT_VALID=Implied association override table for join column is not valid:
+VIRTUAL_ASSOCIATION_OVERRIDE_JOIN_COLUMN_UNRESOLVED_NAME=Implied association override join column cannot be resolved:
+VIRTUAL_ASSOCIATION_OVERRIDE_JOIN_COLUMN_UNRESOLVED_REFERENCED_COLUMN_NAME=Implied association override referenced column in join column cannot be resolved:
+VIRTUAL_ASSOCIATION_OVERRIDE_JOIN_COLUMN_NAME_MUST_BE_SPECIFIED_MULTIPLE_JOIN_COLUMNS=Implied association override join column name must be specified when there are multiples:
+VIRTUAL_ASSOCIATION_OVERRIDE_JOIN_COLUMN_REFERENCED_COLUMN_NAME_MUST_BE_SPECIFIED_MULTIPLE_JOIN_COLUMNS=Implied association override join column referenced column name must be specified when there are multiples:
+VIRTUAL_ASSOCIATION_OVERRIDE_INVERSE_JOIN_COLUMN_TABLE_NOT_VALID=Implied association override table for inverse join column is not valid:
+VIRTUAL_ASSOCIATION_OVERRIDE_INVERSE_JOIN_COLUMN_UNRESOLVED_NAME=Implied association override inverse join column cannot be resolved:
+VIRTUAL_ASSOCIATION_OVERRIDE_INVERSE_JOIN_COLUMN_UNRESOLVED_REFERENCED_COLUMN_NAME=Implied association override referenced column in inverse join column cannot be resolved:
+VIRTUAL_ASSOCIATION_OVERRIDE_INVERSE_JOIN_COLUMN_NAME_MUST_BE_SPECIFIED_MULTIPLE_INVERSE_JOIN_COLUMNS=Implied association override inverse join column name must be specified when there are multiples:
+VIRTUAL_ASSOCIATION_OVERRIDE_INVERSE_JOIN_COLUMN_REFERENCED_COLUMN_NAME_MUST_BE_SPECIFIED_MULTIPLE_INVERSE_JOIN_COLUMNS=Implied association override inverse join column referenced column name must be specified when there are multiples:
+
+VIRTUAL_ATTRIBUTE_JOIN_TABLE_UNRESOLVED_CATALOG=Catalog cannot be resolved for join table:
+VIRTUAL_ATTRIBUTE_JOIN_TABLE_UNRESOLVED_SCHEMA=Schema cannot be resolved for join table:
+VIRTUAL_ATTRIBUTE_JOIN_TABLE_UNRESOLVED_NAME=Join table cannot be resolved:
+VIRTUAL_ATTRIBUTE_ATTRIBUTE_OVERRIDE_COLUMN_TABLE_NOT_VALID=Attribute override table for column not valid:
+VIRTUAL_ATTRIBUTE_COLUMN_TABLE_NOT_VALID=Table for column not valid:
+VIRTUAL_ATTRIBUTE_ATTRIBUTE_OVERRIDE_COLUMN_UNRESOLVED_NAME=Attribute override column cannot be resolved:
+VIRTUAL_ATTRIBUTE_COLUMN_UNRESOLVED_NAME=Column cannot be resolved:
+VIRTUAL_ATTRIBUTE_JOIN_COLUMN_UNRESOLVED_TABLE=Table for join column cannot be resolved:
+VIRTUAL_ATTRIBUTE_JOIN_COLUMN_UNRESOLVED_NAME=Join column cannot be resolved:
+VIRTUAL_ATTRIBUTE_JOIN_COLUMN_NAME_MUST_BE_SPECIFIED_MULTIPLE_JOIN_COLUMNS=Join column name must be specified when there are multiples:
+VIRTUAL_ATTRIBUTE_JOIN_COLUMN_UNRESOLVED_REFERENCED_COLUMN_NAME=Referenced column in join column cannot be resolved:
+VIRTUAL_ATTRIBUTE_JOIN_COLUMN_REFERENCED_COLUMN_NAME_MUST_BE_SPECIFIED_MULTIPLE_JOIN_COLUMNS=Join column referenced column name must be specified when there are multiples:
+VIRTUAL_ATTRIBUTE_TARGET_ENTITY_IS_NOT_AN_ENTITY=Target entity is not an Entity:
+VIRTUAL_ATTRIBUTE_TARGET_ENTITY_NOT_DEFINED=Target entity is not defined:
+VIRTUAL_ATTRIBUTE_COLLECTION_TABLE_UNRESOLVED_CATALOG=Catalog cannot be resolved for collection table:
+VIRTUAL_ATTRIBUTE_COLLECTION_TABLE_UNRESOLVED_SCHEMA=Schema cannot be resolved for collection table:
+VIRTUAL_ATTRIBUTE_COLLECTION_TABLE_UNRESOLVED_NAME=Collection table cannot be resolved:
+VIRTUAL_ATTRIBUTE_ORDER_COLUMN_UNRESOLVED_NAME=Order column cannot be resolved:
+VIRTUAL_ATTRIBUTE_ELEMENT_COLLECTION_TARGET_CLASS_NOT_DEFINED=Element collection target class not defined:
+VIRTUAL_ATTRIBUTE_ELEMENT_COLLECTION_TARGET_CLASS_MUST_BE_EMBEDDABLE_OR_BASIC_TYPE=Element collection target class is not embeddable or basic type:
+VIRTUAL_ATTRIBUTE_ELEMENT_COLLECTION_MAP_KEY_CLASS_NOT_DEFINED=Element collection map key class not defined:
+VIRTUAL_ATTRIBUTE_JOIN_COLUMN_TABLE_NOT_VALID=Table for join column is not valid:
+VIRTUAL_ATTRIBUTE_INVERSE_JOIN_COLUMN_TABLE_NOT_VALID=Table for inverse join column is not valid:
+VIRTUAL_ATTRIBUTE_INVERSE_JOIN_COLUMN_UNRESOLVED_NAME=Inverse join column cannot be resolved:
+VIRTUAL_ATTRIBUTE_INVERSE_JOIN_COLUMN_NAME_MUST_BE_SPECIFIED_MULTIPLE_JOIN_COLUMNS=Inverse join column name must be specified when there are multiples:
+VIRTUAL_ATTRIBUTE_INVERSE_JOIN_COLUMN_UNRESOLVED_REFERENCED_COLUMN_NAME=Referenced column in inverse join column cannot be resolved:
+VIRTUAL_ATTRIBUTE_INVERSE_JOIN_COLUMN_REFERENCED_COLUMN_NAME_MUST_BE_SPECIFIED_MULTIPLE_JOIN_COLUMNS=Inverse join column referenced column name must be specified when there are multiples:
+VIRTUAL_ATTRIBUTE_MAP_KEY_COLUMN_TABLE_NOT_VALID=Table for map key column is not valid:
+VIRTUAL_ATTRIBUTE_MAP_KEY_ATTRIBUTE_OVERRIDE_COLUMN_TABLE_NOT_VALID=Map key attribute override table for column not valid:
+
+
+VIRTUAL_ATTRIBUTE_ASSOCIATION_OVERRIDE_JOIN_COLUMN_TABLE_NOT_VALID=Association override table for join column is not valid:
+VIRTUAL_ATTRIBUTE_ASSOCIATION_OVERRIDE_JOIN_COLUMN_UNRESOLVED_NAME=Association override join column cannot be resolved:
+VIRTUAL_ATTRIBUTE_ASSOCIATION_OVERRIDE_JOIN_COLUMN_REFERENCED_COLUMN_UNRESOLVED_NAME=Association override join column referenced column name cannot be resolved:
+VIRTUAL_ATTRIBUTE_ASSOCIATION_OVERRIDE_JOIN_COLUMN_NAME_MUST_BE_SPECIFIED_MULTIPLE_JOIN_COLUMNS=Association override join column name must be specified when there are multiples:
+VIRTUAL_ATTRIBUTE_ASSOCIATION_OVERRIDE_JOIN_COLUMN_REFERENCED_COLUMN_NAME_MUST_BE_SPECIFIED_MULTIPLE_JOIN_COLUMNS=Association override join column referenced column name must be specified when there are multiples:
+VIRTUAL_ATTRIBUTE_ASSOCIATION_OVERRIDE_INVERSE_JOIN_COLUMN_TABLE_NOT_VALID=Association override table for inverse join column is not valid:
+VIRTUAL_ATTRIBUTE_ASSOCIATION_OVERRIDE_INVERSE_JOIN_COLUMN_UNRESOLVED_NAME=Association override inverse join column cannot be resolved:
+VIRTUAL_ATTRIBUTE_ASSOCIATION_OVERRIDE_INVERSE_JOIN_COLUMN_REFERENCED_COLUMN_UNRESOLVED_NAME=Association override inverse join column referenced column name cannot be resolved:
+VIRTUAL_ATTRIBUTE_ASSOCIATION_OVERRIDE_INVERSE_JOIN_COLUMN_NAME_MUST_BE_SPECIFIED_MULTIPLE_INVERSE_JOIN_COLUMNS=Association override inverse join column name must be specified when there are multiples:
+VIRTUAL_ATTRIBUTE_ASSOCIATION_OVERRIDE_INVERSE_JOIN_COLUMN_REFERENCED_COLUMN_NAME_MUST_BE_SPECIFIED_MULTIPLE_INVERSE_JOIN_COLUMNS=Association override inverse join column referenced column name must be specified when there are multiples:
+
+INHERITANCE_CATEGORY=Inheritance
+
+DISCRIMINATOR_COLUMN_UNRESOLVED_NAME=Discriminator column cannot be resolved:
+ENTITY_TABLE_PER_CLASS_NOT_SUPPORTED_ON_PLATFORM=Entity cannot use table-per-concrete-class inheritance:
+ENTITY_TABLE_PER_CLASS_NOT_PORTABLE_ON_PLATFORM=Entity uses table-per-concrete-class inheritance which is not portable:
+
+QUERIES_GENERATORS_CATEGORY=Queries and generators
+
+GENERATOR_DUPLICATE_NAME=Duplicate generator defined:
+ID_MAPPING_UNRESOLVED_GENERATOR_NAME=Unresolved generator name:
+GENERATED_VALUE_UNRESOLVED_GENERATOR=Generator is not defined in the persistence unit:
+QUERY_DUPLICATE_NAME=Duplicate query defined:
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/schema/jpaPlatformUis.exsd b/jpa/plugins/org.eclipse.jpt.jpa.ui/schema/jpaPlatformUis.exsd
new file mode 100644
index 0000000000..caf515c987
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/schema/jpaPlatformUis.exsd
@@ -0,0 +1,139 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.jpt.jpa.ui" xmlns="http://www.w3.org/2001/XMLSchema">
+<annotation>
+ <appinfo>
+ <meta.schema plugin="org.eclipse.jpt.jpa.ui" id="jpaPlatforms" name="JPA Platform UIs"/>
+ </appinfo>
+ <documentation>
+ [Enter description of this extension point.]
+ </documentation>
+ </annotation>
+
+ <element name="extension">
+ <annotation>
+ <appinfo>
+ <meta.element />
+ </appinfo>
+ </annotation>
+ <complexType>
+ <sequence>
+ <element ref="jpaPlatformUi" minOccurs="1" maxOccurs="unbounded"/>
+ </sequence>
+ <attribute name="point" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="id" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="name" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appinfo>
+ <meta.attribute translatable="true"/>
+ </appinfo>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <element name="jpaPlatformUi">
+ <annotation>
+ <documentation>
+ Extend this extension point and you must also extend the org.eclipse.jpt.jpa.core.jpaPlatforms extension point. The jpaPlatformId must match the id of a core.jpaPlatform extension. One jpaPlatform will be chosen per JpaProject. The possible jpaPlatforms will be displayed to the user as a project property.
+ </documentation>
+ </annotation>
+ <complexType>
+ <attribute name="id" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="jpaPlatform" type="string" use="required">
+ <annotation>
+ <documentation>
+ The jpaPlatformId must match the corresponding org.eclipse.jpt.jpa.core.jpaPlatform extension id.
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="factoryClass" type="string" use="required">
+ <annotation>
+ <documentation>
+ The class that implements &lt;samp&gt;org.eclipse.jpt.jpa.ui.JpaPlatformUiFactory&lt;/samp&gt;.
+ </documentation>
+ <appinfo>
+ <meta.attribute kind="java" basedOn=":org.eclipse.jpt.jpa.ui.JpaPlatformUiFactory"/>
+ </appinfo>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <annotation>
+ <appinfo>
+ <meta.section type="since"/>
+ </appinfo>
+ <documentation>
+ 2.2
+ </documentation>
+ </annotation>
+
+ <annotation>
+ <appinfo>
+ <meta.section type="examples"/>
+ </appinfo>
+ <documentation>
+ [Enter extension point usage example here.]
+ </documentation>
+ </annotation>
+
+ <annotation>
+ <appinfo>
+ <meta.section type="apiinfo"/>
+ </appinfo>
+ <documentation>
+ Provisional API: This interface is part of an interim API that is still
+under development and expected to change significantly before reaching
+stability. It is available at this early stage to solicit feedback from
+pioneering adopters on the understanding that any code that uses this API
+will almost certainly be broken (repeatedly) as the API evolves.
+ </documentation>
+ </annotation>
+
+ <annotation>
+ <appinfo>
+ <meta.section type="implementation"/>
+ </appinfo>
+ <documentation>
+ [Enter information about supplied implementation of this extension point.]
+ </documentation>
+ </annotation>
+
+ <annotation>
+ <appinfo>
+ <meta.section type="copyright"/>
+ </appinfo>
+ <documentation>
+ Copyright (c) 2006, 2009 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
+ </documentation>
+ </annotation>
+
+</schema>
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/JpaPlatformUi.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/JpaPlatformUi.java
new file mode 100644
index 0000000000..44e2db91fc
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/JpaPlatformUi.java
@@ -0,0 +1,126 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 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.ui;
+
+import java.util.Iterator;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jpt.common.core.JptResourceType;
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.JpaFile;
+import org.eclipse.jpt.jpa.core.JpaPlatform;
+import org.eclipse.jpt.jpa.core.JpaProject;
+import org.eclipse.jpt.jpa.core.JpaStructureNode;
+import org.eclipse.jpt.jpa.core.context.AttributeMapping;
+import org.eclipse.jpt.jpa.core.context.PersistentType;
+import org.eclipse.jpt.jpa.core.context.ReadOnlyPersistentAttribute;
+import org.eclipse.jpt.jpa.core.context.TypeMapping;
+import org.eclipse.jpt.jpa.ui.details.DefaultMappingUiDefinition;
+import org.eclipse.jpt.jpa.ui.details.JpaComposite;
+import org.eclipse.jpt.jpa.ui.details.JpaDetailsPage;
+import org.eclipse.jpt.jpa.ui.details.MappingUiDefinition;
+import org.eclipse.jpt.jpa.ui.navigator.JpaNavigatorProvider;
+import org.eclipse.jpt.jpa.ui.structure.JpaStructureProvider;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * This interface is to be implemented by a JPA vendor to provide extensions to
+ * JPA UI functionality. This is intended to work in conjunction with a core
+ * JPA platform ({@link JpaPlatform}) implementation with the same ID.
+ * <p>
+ * Any implementation should be <em>stateless</em> in nature.
+ * <p>
+ * The "generic" extension supplies UI for the core platform extension with the same
+ * ID.
+ *
+ * See the extension point: org.eclipse.jpt.jpa.ui.jpaPlatform
+ *
+ * Provisional API: This interface is part of an interim API that is still
+ * under development and expected to change significantly before reaching
+ * stability. It is available at this early stage to solicit feedback from
+ * pioneering adopters on the understanding that any code that uses this API
+ * will almost certainly be broken (repeatedly) as the API evolves.
+ */
+public interface JpaPlatformUi
+{
+ // ********** navigator provider **********
+
+ /**
+ * Return the {@link JpaNavigatorProvider} for this platform,
+ * which determines Project Explorer content and look
+ */
+ JpaNavigatorProvider getNavigatorProvider();
+
+
+ // ********** structure providers **********
+
+ /**
+ * Return a structure provider for the specified JPA file.
+ */
+ JpaStructureProvider getStructureProvider(JpaFile jpaFile);
+
+
+ // ********** details providers **********
+
+ JpaDetailsPage<? extends JpaStructureNode> buildJpaDetailsPage(
+ Composite parent,
+ JpaStructureNode structureNode,
+ WidgetFactory widgetFactory);
+
+
+ // ********** file ui definitions **********
+
+ /**
+ * Return a resource ui definition for the specified resource type.
+ */
+ ResourceUiDefinition getResourceUiDefinition(JptResourceType resourceType);
+
+
+ // ********** type mappings **********
+
+ JpaComposite buildTypeMappingComposite(
+ JptResourceType resourceType,
+ String mappingKey,
+ Composite parent,
+ PropertyValueModel<TypeMapping> mappingHolder,
+ WidgetFactory widgetFactory);
+
+ DefaultMappingUiDefinition<PersistentType, ? extends TypeMapping>
+ getDefaultTypeMappingUiDefinition(JptResourceType resourceType);
+
+ Iterator<MappingUiDefinition<PersistentType, ? extends TypeMapping>>
+ typeMappingUiDefinitions(JptResourceType resourceType);
+
+
+ // ********** attribute mappings **********
+
+ JpaComposite buildAttributeMappingComposite(
+ JptResourceType resourceType,
+ String mappingKey,
+ Composite parent,
+ PropertyValueModel<AttributeMapping> mappingHolder,
+ WidgetFactory widgetFactory);
+
+ DefaultMappingUiDefinition<ReadOnlyPersistentAttribute, ? extends AttributeMapping>
+ getDefaultAttributeMappingUiDefinition(JptResourceType resourceType, String mappingKey);
+
+ Iterator<MappingUiDefinition<ReadOnlyPersistentAttribute, ? extends AttributeMapping>>
+ attributeMappingUiDefinitions(JptResourceType resourceType);
+
+
+ // ********** entity generation **********
+
+ void generateEntities(JpaProject project, IStructuredSelection selection);
+
+
+ // ********** DDL generation **********
+
+ void generateDDL(JpaProject project, IStructuredSelection selection);
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/JpaPlatformUiFactory.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/JpaPlatformUiFactory.java
new file mode 100644
index 0000000000..02efd79aae
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/JpaPlatformUiFactory.java
@@ -0,0 +1,26 @@
+/*******************************************************************************
+ * Copyright (c) 2009 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.ui;
+
+/**
+ * This interface is to be implemented by a JPA vendor to build a JpaPlatformUi.
+ *
+ * See the extension point: org.eclipse.jpt.jpa.ui.jpaPlatform
+ *
+ * Provisional API: This interface is part of an interim API that is still
+ * under development and expected to change significantly before reaching
+ * stability. It is available at this early stage to solicit feedback from
+ * pioneering adopters on the understanding that any code that uses this API
+ * will almost certainly be broken (repeatedly) as the API evolves.
+ */
+public interface JpaPlatformUiFactory
+{
+ JpaPlatformUi buildJpaPlatformUi();
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/JpaPlatformUiProvider.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/JpaPlatformUiProvider.java
new file mode 100644
index 0000000000..a1a064d1b4
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/JpaPlatformUiProvider.java
@@ -0,0 +1,46 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 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.ui;
+
+import java.util.ListIterator;
+import org.eclipse.jpt.jpa.core.JpaPlatform;
+import org.eclipse.jpt.jpa.ui.details.JpaDetailsProvider;
+
+/**
+ * This interface is to be implemented by a JPA vendor to provide extensions to
+ * JPA UI functionality. This is intended to work in conjunction with a core
+ * JPA platform ({@link JpaPlatform}) implementation with the same ID.
+ * <p>
+ * Any implementation should be <em>stateless</em> in nature.
+ * <p>
+ * The "generic" extension supplies UI for the core platform extension with the same
+ * ID.
+ *
+ * See the extension point: org.eclipse.jpt.jpa.ui.jpaPlatformUis
+ *
+ * Provisional API: This interface is part of an interim API that is still
+ * under development and expected to change significantly before reaching
+ * stability. It is available at this early stage to solicit feedback from
+ * pioneering adopters on the understanding that any code that uses this API
+ * will almost certainly be broken (repeatedly) as the API evolves.
+ */
+public interface JpaPlatformUiProvider
+{
+ /**
+ * Return the details providers that apply to this platform.
+ */
+ ListIterator<JpaDetailsProvider> detailsProviders();
+
+ /**
+ * Return the resource ui definitions that apply to this platform.
+ */
+ ListIterator<ResourceUiDefinition> resourceUiDefinitions();
+
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/JptJpaUiPlugin.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/JptJpaUiPlugin.java
new file mode 100644
index 0000000000..5bda78f05b
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/JptJpaUiPlugin.java
@@ -0,0 +1,236 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2010 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.ui;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.resource.ImageRegistry;
+import org.eclipse.jpt.jpa.core.JpaPlatform;
+import org.eclipse.jpt.jpa.core.JptJpaCorePlugin;
+import org.eclipse.jpt.jpa.ui.internal.platform.JpaPlatformUiRegistry;
+import org.eclipse.jpt.jpa.ui.navigator.JpaNavigatorProvider;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.osgi.framework.BundleContext;
+
+/**
+ * Dali UI plug-in.
+ * <p>
+ * Provisional API: This interface is part of an interim API that is still
+ * under development and expected to change significantly before reaching
+ * stability. It is available at this early stage to solicit feedback from
+ * pioneering adopters on the understanding that any code that uses this API
+ * will almost certainly be broken (repeatedly) as the API evolves.
+ */
+@SuppressWarnings("nls")
+public class JptJpaUiPlugin
+ extends AbstractUIPlugin
+{
+ private final Listener focusListener;
+
+
+ // ********** constants **********
+
+ /**
+ * The plug-in identifier of JPA UI support (value {@value}).
+ */
+ public static final String PLUGIN_ID = "org.eclipse.jpt.jpa.ui";
+ public static final String PLUGIN_ID_ = PLUGIN_ID + '.';
+
+ private static final String FOCUS_DATA_KEY = PLUGIN_ID_ + "focus";
+ private static final Object FOCUS_DATA = new Object();
+
+
+ // ********** singleton **********
+
+ private static JptJpaUiPlugin INSTANCE;
+
+ /**
+ * Returns the singleton JPT UI plug-in.
+ */
+ public static JptJpaUiPlugin instance() {
+ return INSTANCE;
+ }
+
+
+ // ********** logging **********
+
+ public static void log(IStatus status) {
+ INSTANCE.getLog().log(status);
+ }
+
+ public static void log(String msg) {
+ log(new Status(IStatus.ERROR, PLUGIN_ID, IStatus.OK, msg, null));
+ }
+
+ public static void log(Throwable throwable) {
+ log(new Status(IStatus.ERROR, PLUGIN_ID, IStatus.OK, throwable.getLocalizedMessage(), throwable));
+ }
+
+
+ // ********** images **********
+
+ /**
+ * Return an image descriptor for the specified <code>.gif<code>
+ * file in the icons folder.
+ */
+ public static ImageDescriptor getImageDescriptor(String key) {
+ if ( ! key.startsWith("icons/")) {
+ key = "icons/" + key;
+ }
+ if ( ! key.endsWith(".gif")) {
+ key = key + ".gif";
+ }
+ return imageDescriptorFromPlugin(PLUGIN_ID, key);
+ }
+
+ /**
+ * Return an image for the specified <code>.gif<code>
+ * file in the icons folder.
+ */
+ //TODO we are using the ImageRegistry here and storing all our icons for the life of the plugin,
+ //which means until the workspace is closed. This is better than before where we constantly
+ //created new images. Bug 306437 is about cleaning this up and using Local Resource Managers
+ //on our views so that closing the JPA perspective would mean our icons are disposed.
+ public static Image getImage(String key) {
+ ImageRegistry imageRegistry = instance().getImageRegistry();
+ Image image = imageRegistry.get(key);
+ if (image == null) {
+ imageRegistry.put(key, getImageDescriptor(key));
+ image = imageRegistry.get(key);
+ }
+ return image;
+ }
+
+
+ // ********** construction **********
+
+ public JptJpaUiPlugin() {
+ super();
+ this.focusListener = this.buildFocusListener();
+ if (INSTANCE != null) {
+ throw new IllegalStateException();
+ }
+ INSTANCE = this;
+ }
+
+ /**
+ * We are registered to receive only {@link SWT#FocusIn} events
+ */
+ private Listener buildFocusListener() {
+ return new Listener() {
+ public void handleEvent(Event event) {
+ JptJpaUiPlugin.this.focusIn((Control) event.widget);
+ }
+ };
+ }
+
+
+ // ********** focus handling **********
+
+ /**
+ * This method is called whenever a "focus in" event is generated.
+ * If the control gaining focus is part of one of our composites (typically
+ * a JPA Details View), we stop listening to Java change events
+ * (and assume all changes to the Java model are generated by us).
+ * If the control gaining focus is *not* part of one of our composites,
+ * we start listening to the Java change events again.
+ */
+ void focusIn(Control control) {
+ while (control != null) {
+ if (control.getData(FOCUS_DATA_KEY) == FOCUS_DATA) {
+ this.focusIn();
+ return;
+ }
+ control = control.getParent();
+ }
+ this.focusOut();
+ }
+
+ /**
+ * This method is called whenever a Dali UI control that affects Java
+ * source code gains the UI focus. When this happens we deactivate
+ * the Dali Java change listener so we ignore any changes to the Java
+ * source code that probably originated from Dali. This means we will miss
+ * any changes to the Java source code that is caused by non-UI activity;
+ * but, we hope, these changes are unrelated to JPA annotations etc.
+ * @see #focusOut()
+ */
+ private void focusIn() {
+ JptJpaCorePlugin.setJavaElementChangeListenerIsActive(false);
+ }
+
+ /**
+ * This method is called whenever a non-Dali UI control gains the UI focus.
+ * When this happens we activate the Dali Java change listener so that we
+ * begin to keep the Dali model synchronized with the Java source code.
+ * @see #focusIn()
+ */
+ private void focusOut() {
+ JptJpaCorePlugin.setJavaElementChangeListenerIsActive(true);
+ }
+
+ /**
+ * Tag the specified control so that whenever it (or any of its children,
+ * grandchildren, etc.) has the focus, the Dali model ignores any Java
+ * change events. This method is to be called when the control is first
+ * constructed.
+ */
+ public void controlAffectsJavaSource(Control control) {
+ control.setData(FOCUS_DATA_KEY, FOCUS_DATA);
+ }
+
+
+ // ********** platform **********
+
+ /**
+ * Return the JPA platform UI corresponding to the specified JPA platform.
+ */
+ public JpaPlatformUi getJpaPlatformUi(JpaPlatform jpaPlatform) {
+ return JpaPlatformUiRegistry.instance().getJpaPlatformUi(jpaPlatform.getId());
+ }
+
+ public JpaNavigatorProvider getJpaNavigatorProvider(JpaPlatform jpaPlatform) {
+ JpaPlatformUi platform = this.getJpaPlatformUi(jpaPlatform);
+ return (platform == null) ? null : platform.getNavigatorProvider();
+ }
+
+
+ // ********** plug-in implementation **********
+
+ /**
+ * Register our SWT listener with the display so we receive notification
+ * of every "focus in" event.
+ */
+ @Override
+ public void start(BundleContext context) throws Exception {
+ super.start(context);
+ Display.getDefault().addFilter(SWT.FocusIn, this.focusListener);
+ }
+
+ /**
+ * Unregister our SWT listener with the display.
+ */
+ @Override
+ public void stop(BundleContext context) throws Exception {
+ try {
+ Display.getDefault().removeFilter(SWT.FocusIn, this.focusListener);
+ } finally {
+ super.stop(context);
+ }
+ }
+
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/MappingResourceUiDefinition.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/MappingResourceUiDefinition.java
new file mode 100644
index 0000000000..3f18490732
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/MappingResourceUiDefinition.java
@@ -0,0 +1,73 @@
+/*******************************************************************************
+ * Copyright (c) 2009 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.ui;
+
+import java.util.Iterator;
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.AttributeMapping;
+import org.eclipse.jpt.jpa.core.context.PersistentType;
+import org.eclipse.jpt.jpa.core.context.ReadOnlyPersistentAttribute;
+import org.eclipse.jpt.jpa.core.context.TypeMapping;
+import org.eclipse.jpt.jpa.ui.details.DefaultMappingUiDefinition;
+import org.eclipse.jpt.jpa.ui.details.JpaComposite;
+import org.eclipse.jpt.jpa.ui.details.MappingUiDefinition;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ *
+ * Provisional API: This interface is part of an interim API that is still
+ * under development and expected to change significantly before reaching
+ * stability. It is available at this early stage to solicit feedback from
+ * pioneering adopters on the understanding that any code that uses this API
+ * will almost certainly be broken (repeatedly) as the API evolves.
+ */
+public interface MappingResourceUiDefinition extends ResourceUiDefinition
+{
+ /**
+ *
+ */
+ JpaComposite buildAttributeMappingComposite(
+ String key,
+ PropertyValueModel<AttributeMapping> mappingHolder,
+ Composite parent, WidgetFactory widgetFactory);
+
+ /**
+ * Return an iterator of attribute mapping ui definitions appropriate for this file type
+ */
+ Iterator<MappingUiDefinition<ReadOnlyPersistentAttribute, ? extends AttributeMapping>>
+ attributeMappingUiDefinitions();
+
+ /**
+ * Return a default attribute mapping ui definition for the given key or null
+ */
+ DefaultMappingUiDefinition<ReadOnlyPersistentAttribute, ? extends AttributeMapping>
+ getDefaultAttributeMappingUiDefinition(String key);
+
+ /**
+ *
+ */
+ JpaComposite buildTypeMappingComposite(
+ String key,
+ PropertyValueModel<TypeMapping> mappingHolder,
+ Composite parent, WidgetFactory widgetFactory);
+
+ /**
+ *
+ */
+ Iterator<MappingUiDefinition<PersistentType, ? extends TypeMapping>>
+ typeMappingUiDefinitions();
+
+ /**
+ * Return a default type mapping ui provider or null
+ */
+ DefaultMappingUiDefinition<PersistentType, ? extends TypeMapping>
+ getDefaultTypeMappingUiDefinition();
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/PersistenceXmlResourceUiDefinition.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/PersistenceXmlResourceUiDefinition.java
new file mode 100644
index 0000000000..c1d4ab6225
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/PersistenceXmlResourceUiDefinition.java
@@ -0,0 +1,34 @@
+/*******************************************************************************
+ * Copyright (c) 2009 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.ui;
+
+import java.util.ListIterator;
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.persistence.PersistenceUnit;
+import org.eclipse.jpt.jpa.ui.details.JpaPageComposite;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ *
+ * Provisional API: This interface is part of an interim API that is still
+ * under development and expected to change significantly before reaching
+ * stability. It is available at this early stage to solicit feedback from
+ * pioneering adopters on the understanding that any code that uses this API
+ * will almost certainly be broken (repeatedly) as the API evolves.
+ */
+public interface PersistenceXmlResourceUiDefinition extends ResourceUiDefinition
+{
+ ListIterator<JpaPageComposite> buildPersistenceUnitComposites(
+ PropertyValueModel<PersistenceUnit> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory);
+
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/ResourceUiDefinition.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/ResourceUiDefinition.java
new file mode 100644
index 0000000000..6f7a2e817b
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/ResourceUiDefinition.java
@@ -0,0 +1,34 @@
+/*******************************************************************************
+ * Copyright (c) 2009 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.ui;
+
+import org.eclipse.jpt.common.core.JptResourceType;
+import org.eclipse.jpt.jpa.ui.structure.JpaStructureProvider;
+
+/**
+ *
+ * Provisional API: This interface is part of an interim API that is still
+ * under development and expected to change significantly before reaching
+ * stability. It is available at this early stage to solicit feedback from
+ * pioneering adopters on the understanding that any code that uses this API
+ * will almost certainly be broken (repeatedly) as the API evolves.
+ */
+public interface ResourceUiDefinition
+{
+ /**
+ * Return whether this definition provides UI for resource of the given type
+ */
+ boolean providesUi(JptResourceType resourceType);
+
+ /**
+ * Return the structure provider association with this mapping file type.
+ */
+ JpaStructureProvider getStructureProvider();
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/details/DefaultMappingUiDefinition.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/details/DefaultMappingUiDefinition.java
new file mode 100644
index 0000000000..1706c2a908
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/details/DefaultMappingUiDefinition.java
@@ -0,0 +1,28 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2009 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.ui.details;
+
+/**
+ * Provisional API: This interface is part of an interim API that is still
+ * under development and expected to change significantly before reaching
+ * stability. It is available at this early stage to solicit feedback from
+ * pioneering adopters on the understanding that any code that uses this API
+ * will almost certainly be broken (repeatedly) as the API evolves.
+ */
+public interface DefaultMappingUiDefinition<M, T>
+ extends MappingUiDefinition<M, T>
+{
+ /**
+ * Returns a unique string that corresponds to the key of the mapping in the
+ * core. For a default mapping the method getKey() will return null since
+ * that is for the specified mapping. This will return the default mapping key, not null
+ */
+ String getDefaultKey();
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/details/JpaComposite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/details/JpaComposite.java
new file mode 100644
index 0000000000..45a34c1b6c
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/details/JpaComposite.java
@@ -0,0 +1,45 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2009 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.ui.details;
+
+import org.eclipse.swt.widgets.Control;
+
+/**
+ * A {@link JpaComposite} defines the common behavior of the JPA related
+ * widgets.
+ *
+ * Provisional API: This interface is part of an interim API that is still
+ * under development and expected to change significantly before reaching
+ * stability. It is available at this early stage to solicit feedback from
+ * pioneering adopters on the understanding that any code that uses this API
+ * will almost certainly be broken (repeatedly) as the API evolves.
+ */
+public interface JpaComposite {
+
+ /**
+ * Returns the actual <code>Composite</code>.
+ *
+ * @return This composite's actual widget
+ */
+ Control getControl();
+
+ /**
+ * Changes the enablement state of the widgets of this pane.
+ *
+ * @param enabled <code>true</code> to enable the widgets or <code>false</code>
+ * to disable them
+ */
+ void enableWidgets(boolean enabled);
+
+ /**
+ * Notifies this composite it should dispose any resources.
+ */
+ void dispose();
+} \ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/details/JpaDetailsPage.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/details/JpaDetailsPage.java
new file mode 100644
index 0000000000..b24d4d9a3e
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/details/JpaDetailsPage.java
@@ -0,0 +1,51 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2009 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.ui.details;
+
+import org.eclipse.jpt.jpa.core.JpaStructureNode;
+import org.eclipse.swt.widgets.Control;
+
+/**
+ * A details page is used to show the property pane for a given context node. The
+ * {@link JpaDetailsProvider} is responsible for creating the pane.
+ *
+ * @see JpaDetailsProvider
+ *
+ * @version 2.0
+ * @since 2.0
+ *
+ * Provisional API: This interface is part of an interim API that is still
+ * under development and expected to change significantly before reaching
+ * stability. It is available at this early stage to solicit feedback from
+ * pioneering adopters on the understanding that any code that uses this API
+ * will almost certainly be broken (repeatedly) as the API evolves.
+ */
+public interface JpaDetailsPage<T extends JpaStructureNode>
+{
+ /**
+ * Returns this details' page's widget.
+ *
+ * @return The container of the widgets shown by this details page
+ */
+ Control getControl();
+
+ /**
+ * Sets the subject for this details page.
+ *
+ * @param subject Either the new subject or <code>null</code> if the subject
+ * needs to be removed
+ */
+ void setSubject(T subject);
+
+ /**
+ * Dispose the details page and any resources it holds.
+ */
+ void dispose();
+} \ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/details/JpaDetailsProvider.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/details/JpaDetailsProvider.java
new file mode 100644
index 0000000000..a7c11cf787
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/details/JpaDetailsProvider.java
@@ -0,0 +1,50 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2009 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.ui.details;
+
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.jpa.core.JpaStructureNode;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * This provider is responsible to create the {@link JpaDetailsPage}
+ * responsible to show the information for a given content node id.
+ *
+ * @see JpaDetailsPage
+ *
+ * @version 3.0
+ * @since 2.0
+ *
+ * Provisional API: This interface is part of an interim API that is still
+ * under development and expected to change significantly before reaching
+ * stability. It is available at this early stage to solicit feedback from
+ * pioneering adopters on the understanding that any code that uses this API
+ * will almost certainly be broken (repeatedly) as the API evolves.
+ */
+public interface JpaDetailsProvider
+{
+ /**
+ * Return whether this provider returns a details page for the given structure node
+ */
+ boolean providesDetails(JpaStructureNode structureNode);
+
+ /**
+ * Creates a new details page based on the given content node id.
+ *
+ * @param parent The parent container
+ * @param contentNodeId The unique identifier used to determine which details
+ * page to create
+ * @param widgetFactory The factory used to create various widgets
+ */
+ //TODO Should we pass in JpaUiFactory so these pages can be built using the factory and overriden?
+ JpaDetailsPage<? extends JpaStructureNode> buildDetailsPage(
+ Composite parent,
+ WidgetFactory widgetFactory);
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/details/JpaPageComposite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/details/JpaPageComposite.java
new file mode 100644
index 0000000000..7a28e81d88
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/details/JpaPageComposite.java
@@ -0,0 +1,47 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2010 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.ui.details;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+
+/**
+ * A {@link JpaPageComposite} defines the common behavior of the JPA
+ * related widgets that is shown as a page within an editor.
+ * <p>
+ * Provisional API: This interface is part of an interim API that is still
+ * under development and expected to change significantly before reaching
+ * stability. It is available at this early stage to solicit feedback from
+ * pioneering adopters on the understanding that any code that uses this API
+ * will almost certainly be broken (repeatedly) as the API evolves.
+ */
+public interface JpaPageComposite extends JpaComposite {
+
+ /**
+ * Returns the help ID. This ID will be used if the help button is invoked.
+ *
+ * @return Either the help ID of this page or <code>null</code> if no help
+ * is required
+ */
+ String getHelpID();
+
+ /**
+ * The image of the tab showing this page.
+ *
+ * @return The page's image
+ */
+ ImageDescriptor getPageImageDescriptor();
+
+ /**
+ * The text of the tab showing this page.
+ *
+ * @return The page's text
+ */
+ String getPageText();
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/details/MappingUiDefinition.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/details/MappingUiDefinition.java
new file mode 100644
index 0000000000..01d27f0444
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/details/MappingUiDefinition.java
@@ -0,0 +1,69 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 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.ui.details;
+
+import org.eclipse.swt.graphics.Image;
+
+/**
+ * A UI provider is responsible to provide the support for displaying the
+ * information for a certain mapping type.
+ *
+ * T represents the type of the mapping the definition represents
+ * M represents the type of the object being mapped
+ *
+ * @version 2.3
+ * @since 2.0
+ *
+ * Provisional API: This interface is part of an interim API that is still
+ * under development and expected to change significantly before reaching
+ * stability. It is available at this early stage to solicit feedback from
+ * pioneering adopters on the understanding that any code that uses this API
+ * will almost certainly be broken (repeatedly) as the API evolves.
+ */
+public interface MappingUiDefinition<M, T>
+{
+ /**
+ * Returns a unique string that corresponds to the key of the mapping in the
+ * core (JavaAttributeMappingDefinition and/or OrmAttributeMappingProvider).
+ *
+ * @return The key representing the mapping
+ */
+ String getKey();
+
+ /**
+ * Returns a human readable text of the mapping type.
+ *
+ * @return A display string for the mapping type
+ */
+ String getLabel();
+
+ /**
+ * Returns a human readable text of the mapping type to be used in the mapping change link label
+ */
+ String getLinkLabel();
+
+ /**
+ * Returns an image that represents the mapping type defined by this provider.
+ *
+ * @return An image representing a mapping or <code>null</code> if no image
+ * is required
+ */
+ Image getImage();
+
+ /**
+ * Return whether the mapping type represented by this definition is enabled for the given
+ * mappable object. This is almost always true.
+ */
+ // TODO bjv remove this; either
+ // - delegate to whatever controls the list of UI definitions so it can be overridden by EclipseLink
+ // or
+ // - delegate to the model definitions (if we think there are more extends that need this...)
+ boolean isEnabledFor(M mappableObject);
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/details/java/DefaultJavaAttributeMappingUiDefinition.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/details/java/DefaultJavaAttributeMappingUiDefinition.java
new file mode 100644
index 0000000000..98f781bea6
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/details/java/DefaultJavaAttributeMappingUiDefinition.java
@@ -0,0 +1,27 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2009 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.ui.details.java;
+
+import org.eclipse.jpt.jpa.core.context.AttributeMapping;
+import org.eclipse.jpt.jpa.core.context.ReadOnlyPersistentAttribute;
+import org.eclipse.jpt.jpa.ui.details.DefaultMappingUiDefinition;
+
+/**
+ * Provisional API: This interface is part of an interim API that is still
+ * under development and expected to change significantly before reaching
+ * stability. It is available at this early stage to solicit feedback from
+ * pioneering adopters on the understanding that any code that uses this API
+ * will almost certainly be broken (repeatedly) as the API evolves.
+ */
+public interface DefaultJavaAttributeMappingUiDefinition<T extends AttributeMapping>
+ extends JavaAttributeMappingUiDefinition<T>, DefaultMappingUiDefinition<ReadOnlyPersistentAttribute, T>
+{
+
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/details/java/DefaultJavaTypeMappingUiDefinition.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/details/java/DefaultJavaTypeMappingUiDefinition.java
new file mode 100644
index 0000000000..0336b9e18d
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/details/java/DefaultJavaTypeMappingUiDefinition.java
@@ -0,0 +1,27 @@
+/*******************************************************************************
+ * Copyright (c) 2009 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.ui.details.java;
+
+import org.eclipse.jpt.jpa.core.context.PersistentType;
+import org.eclipse.jpt.jpa.core.context.TypeMapping;
+import org.eclipse.jpt.jpa.ui.details.DefaultMappingUiDefinition;
+
+/**
+ * Provisional API: This interface is part of an interim API that is still
+ * under development and expected to change significantly before reaching
+ * stability. It is available at this early stage to solicit feedback from
+ * pioneering adopters on the understanding that any code that uses this API
+ * will almost certainly be broken (repeatedly) as the API evolves.
+ */
+public interface DefaultJavaTypeMappingUiDefinition<T extends TypeMapping>
+ extends JavaTypeMappingUiDefinition<T>, DefaultMappingUiDefinition<PersistentType, T>
+{
+
+} \ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/details/java/JavaAttributeMappingUiDefinition.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/details/java/JavaAttributeMappingUiDefinition.java
new file mode 100644
index 0000000000..eca73a692a
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/details/java/JavaAttributeMappingUiDefinition.java
@@ -0,0 +1,48 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2009 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.ui.details.java;
+
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.AttributeMapping;
+import org.eclipse.jpt.jpa.core.context.ReadOnlyPersistentAttribute;
+import org.eclipse.jpt.jpa.ui.details.JpaComposite;
+import org.eclipse.jpt.jpa.ui.details.MappingUiDefinition;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * Provisional API: This interface is part of an interim API that is still
+ * under development and expected to change significantly before reaching
+ * stability. It is available at this early stage to solicit feedback from
+ * pioneering adopters on the understanding that any code that uses this API
+ * will almost certainly be broken (repeatedly) as the API evolves.
+ */
+public interface JavaAttributeMappingUiDefinition<T extends AttributeMapping>
+ extends MappingUiDefinition<ReadOnlyPersistentAttribute, T>
+{
+ /**
+ * Creates <code>JpaComposite</code> that corresponds to this mapping type.
+ * This will be displayed by the <code>PersistentAttributeDetailsPage</code>
+ * when the mapping key matches the key given by this provider. The
+ * composites will be stored in a Map with the mapping key as the key.
+ *
+ * @param factory The UI factory responsible to create the right composite
+ * for any mapping type
+ * @param subjectHolder The holder of the subject being displayed
+ * @param parent The parent container
+ * @param widgetFactory The factory used to create the various widgets
+ * @return The composite displaying the information for a certain mapping
+ */
+ JpaComposite buildAttributeMappingComposite(
+ JavaUiFactory factory,
+ PropertyValueModel<T> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory);
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/details/java/JavaTypeMappingUiDefinition.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/details/java/JavaTypeMappingUiDefinition.java
new file mode 100644
index 0000000000..9583a4809f
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/details/java/JavaTypeMappingUiDefinition.java
@@ -0,0 +1,48 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2009 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.ui.details.java;
+
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.PersistentType;
+import org.eclipse.jpt.jpa.core.context.TypeMapping;
+import org.eclipse.jpt.jpa.ui.details.JpaComposite;
+import org.eclipse.jpt.jpa.ui.details.MappingUiDefinition;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * Provisional API: This interface is part of an interim API that is still
+ * under development and expected to change significantly before reaching
+ * stability. It is available at this early stage to solicit feedback from
+ * pioneering adopters on the understanding that any code that uses this API
+ * will almost certainly be broken (repeatedly) as the API evolves.
+ */
+public interface JavaTypeMappingUiDefinition<T extends TypeMapping>
+ extends MappingUiDefinition<PersistentType, T>
+{
+ /**
+ * Creates <code>JpaComposite</code> that corresponds to this mapping type.
+ * This will be displayed by the <code>PersistentTypeDetailsPage</code> when
+ * the mapping key matches the key given by this provider. The composites
+ * will be stored in a Map with the mapping key as the key.
+ *
+ * @param factory The UI factory responsible to create the right composite
+ * for any mapping type
+ * @param subjectHolder The holder of the subject being displayed
+ * @param parent The parent container
+ * @param widgetFactory The factory used to create the various widgets
+ * @return The composite displaying the information for a certain mapping
+ */
+ JpaComposite buildTypeMappingComposite(
+ JavaUiFactory factory,
+ PropertyValueModel<T> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory);
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/details/java/JavaUiFactory.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/details/java/JavaUiFactory.java
new file mode 100644
index 0000000000..f3f86666af
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/details/java/JavaUiFactory.java
@@ -0,0 +1,265 @@
+/*******************************************************************************
+ * Copyright (c) 2009 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.ui.details.java;
+
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.java.JavaBasicMapping;
+import org.eclipse.jpt.jpa.core.context.java.JavaEmbeddable;
+import org.eclipse.jpt.jpa.core.context.java.JavaEmbeddedIdMapping;
+import org.eclipse.jpt.jpa.core.context.java.JavaEmbeddedMapping;
+import org.eclipse.jpt.jpa.core.context.java.JavaEntity;
+import org.eclipse.jpt.jpa.core.context.java.JavaIdMapping;
+import org.eclipse.jpt.jpa.core.context.java.JavaManyToManyMapping;
+import org.eclipse.jpt.jpa.core.context.java.JavaManyToOneMapping;
+import org.eclipse.jpt.jpa.core.context.java.JavaMappedSuperclass;
+import org.eclipse.jpt.jpa.core.context.java.JavaOneToManyMapping;
+import org.eclipse.jpt.jpa.core.context.java.JavaOneToOneMapping;
+import org.eclipse.jpt.jpa.core.context.java.JavaTransientMapping;
+import org.eclipse.jpt.jpa.core.context.java.JavaVersionMapping;
+import org.eclipse.jpt.jpa.core.context.orm.OrmEmbeddable;
+import org.eclipse.jpt.jpa.core.context.orm.OrmEntity;
+import org.eclipse.jpt.jpa.core.context.orm.OrmMappedSuperclass;
+import org.eclipse.jpt.jpa.ui.details.JpaComposite;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * Use {@link JavaUiFactory} to create any java JPA composites
+ * <p>
+ * Provisional API: This interface is part of an interim API that is still under
+ * development and expected to change significantly before reaching stability.
+ * It is available at this early stage to solicit feedback from pioneering
+ * adopters on the understanding that any code that uses this API will almost
+ * certainly be broken (repeatedly) as the API evolves.
+ *
+ *
+ * @version 3.0
+ * @since 3.0
+ */
+public interface JavaUiFactory
+{
+
+ // **************** java type mapping composites ***************************
+
+ /**
+ * Creates a new <code>JpaComposite</code> used to edit a <code>JavaMappedSuperclass</code>.
+ *
+ * @param subjectHolder The holder of the mapped superclass
+ * @param parent The parent container
+ * @param widgetFactory The factory used to create the widgets
+ * @return A new <code>JpaComposite</code>
+ */
+ JpaComposite createJavaMappedSuperclassComposite(
+ PropertyValueModel<JavaMappedSuperclass> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory);
+
+ /**
+ * Creates a new <code>JpaComposite</code> used to edit an <code>JavaEntity</code>.
+ *
+ * @param subjectHolder The holder of the java entity
+ * @param parent The parent container
+ * @param widgetFactory The factory used to create the widgets
+ * @return A new <code>JpaComposite</code>
+ */
+ JpaComposite createJavaEntityComposite(
+ PropertyValueModel<JavaEntity> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory);
+
+ /**
+ * Creates a new <code>JpaComposite</code> used to edit a <code>JavaEmbeddable</code>.
+ *
+ * @param subjectHolder The holder of the embeddable
+ * @param parent The parent container
+ * @param widgetFactory The factory used to create the widgets
+ * @return A new <code>JpaComposite</code>
+ */
+ JpaComposite createJavaEmbeddableComposite(
+ PropertyValueModel<JavaEmbeddable> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory);
+
+
+ // **************** orm type mapping composites ****************************
+
+ /**
+ * Creates a new <code>JpaComposite</code> used to edit an <code>OrmMappedSuperclass</code>.
+ *
+ * @param subjectHolder The holder of the mapped superclass
+ * @param parent The parent container
+ * @param widgetFactory The factory used to create the widgets
+ * @return A new <code>JpaComposite</code>
+ */
+ JpaComposite createOrmMappedSuperclassComposite(
+ PropertyValueModel<OrmMappedSuperclass> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory);
+
+ /**
+ * Creates a new <code>JpaComposite</code> used to edit an <code>OrmEntity</code>.
+ *
+ * @param subjectHolder The holder of the orm entity
+ * @param parent The parent container
+ * @param widgetFactory The factory used to create the widgets
+ * @return A new <code>JpaComposite</code>
+ */
+ JpaComposite createOrmEntityComposite(
+ PropertyValueModel<OrmEntity> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory);
+
+ /**
+ * Creates a new <code>JpaComposite</code> used to edit an <code>OrmEmbeddable</code>.
+ *
+ * @param subjectHolder The holder of the embeddable
+ * @param parent The parent container
+ * @param widgetFactory The factory used to create the widgets
+ * @return A new <code>JpaComposite</code>
+ */
+ JpaComposite createOrmEmbeddableComposite(
+ PropertyValueModel<OrmEmbeddable> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory);
+
+
+ // **************** java attribute mapping composites **********************
+
+ /**
+ * Creates a new <code>JpaComposite</code> used to edit a <code>JavaIdMapping</code>.
+ *
+ * @param subjectHolder The holder of the ID mapping
+ * @param parent The parent container
+ * @param widgetFactory The factory used to create the widgets
+ * @return A new <code>JpaComposite</code>
+ */
+ JpaComposite createJavaIdMappingComposite(
+ PropertyValueModel<JavaIdMapping> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory);
+
+ /**
+ * Creates a new <code>JpaComposite</code> used to edit a <code>JavaEmbeddedIdMapping</code>.
+ *
+ * @param subjectHolder The holder of the embedded ID mapping
+ * @param parent The parent container
+ * @param widgetFactory The factory used to create the widgets
+ * @return A new <code>JpaComposite</code>
+ */
+ JpaComposite createJavaEmbeddedIdMappingComposite(
+ PropertyValueModel<JavaEmbeddedIdMapping> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory);
+
+ /**
+ * Creates a new <code>JpaComposite</code> used to edit a <code>JavaBasicMapping</code>.
+ *
+ * @param subjectHolder The holder of the basic mapping
+ * @param parent The parent container
+ * @param widgetFactory The factory used to create the widgets
+ * @return A new <code>JpaComposite</code>
+ */
+ JpaComposite createJavaBasicMappingComposite(
+ PropertyValueModel<JavaBasicMapping> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory);
+
+ /**
+ * Creates a new <code>JpaComposite</code> used to edit a <code>JavaVersionMapping</code>.
+ *
+ * @param subjectHolder The holder of the version mapping
+ * @param parent The parent container
+ * @param widgetFactory The factory used to create the widgets
+ * @return A new <code>JpaComposite</code>
+ */
+ JpaComposite createJavaVersionMappingComposite(
+ PropertyValueModel<JavaVersionMapping> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory);
+
+ /**
+ * Creates a new <code>JpaComposite</code> used to edit a <code>JavaManyToOneMapping</code>.
+ *
+ * @param subjectHolder The holder of the many to one mapping
+ * @param parent The parent container
+ * @param widgetFactory The factory used to create the widgets
+ * @return A new <code>JpaComposite</code>
+ */
+ JpaComposite createJavaManyToOneMappingComposite(
+ PropertyValueModel<JavaManyToOneMapping> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory);
+
+ /**
+ * Creates a new <code>JpaComposite</code> used to edit a <code>JavaOneToManyMapping</code>.
+ *
+ * @param subjectHolder The holder of the one to many mapping
+ * @param parent The parent container
+ * @param widgetFactory The factory used to create the widgets
+ * @return A new <code>JpaComposite</code>
+ */
+ JpaComposite createJavaOneToManyMappingComposite(
+ PropertyValueModel<JavaOneToManyMapping> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory);
+
+ /**
+ * Creates a new <code>JpaComposite</code> used to edit a <code>JavaOneToOneMapping</code>.
+ *
+ * @param subjectHolder The holder of the one to one mapping
+ * @param parent The parent container
+ * @param widgetFactory The factory used to create the widgets
+ * @return A new <code>JpaComposite</code>
+ */
+ JpaComposite createJavaOneToOneMappingComposite(
+ PropertyValueModel<JavaOneToOneMapping> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory);
+
+ /**
+ * Creates a new <code>JpaComposite</code> used to edit a <code>JavaManyToManyMapping</code>.
+ *
+ * @param subjectHolder The holder of the many to many mapping
+ * @param parent The parent container
+ * @param widgetFactory The factory used to create the widgets
+ * @return A new <code>JpaComposite</code>
+ */
+ JpaComposite createJavaManyToManyMappingComposite(
+ PropertyValueModel<JavaManyToManyMapping> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory);
+
+ /**
+ * Creates a new <code>JpaComposite</code> used to edit a <code>JavaEmbeddedMapping</code>.
+ *
+ * @param subjectHolder The holder of the embedded mapping
+ * @param parent The parent container
+ * @param widgetFactory The factory used to create the widgets
+ * @return A new <code>JpaComposite</code>
+ */
+ JpaComposite createJavaEmbeddedMappingComposite(
+ PropertyValueModel<JavaEmbeddedMapping> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory);
+
+ /**
+ * Creates a new <code>JpaComposite</code> used to edit a <code>JavaTransientMapping</code>.
+ *
+ * @param subjectHolder The holder of the transient mapping
+ * @param parent The parent container
+ * @param widgetFactory The factory used to create the widgets
+ * @return A new <code>JpaComposite</code>
+ */
+ JpaComposite createJavaTransientMappingComposite(
+ PropertyValueModel<JavaTransientMapping> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory);
+
+} \ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/details/orm/OrmAttributeMappingUiDefinition.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/details/orm/OrmAttributeMappingUiDefinition.java
new file mode 100644
index 0000000000..2c5861fbe6
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/details/orm/OrmAttributeMappingUiDefinition.java
@@ -0,0 +1,48 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2009 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.ui.details.orm;
+
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.AttributeMapping;
+import org.eclipse.jpt.jpa.core.context.ReadOnlyPersistentAttribute;
+import org.eclipse.jpt.jpa.ui.details.JpaComposite;
+import org.eclipse.jpt.jpa.ui.details.MappingUiDefinition;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * Provisional API: This interface is part of an interim API that is still
+ * under development and expected to change significantly before reaching
+ * stability. It is available at this early stage to solicit feedback from
+ * pioneering adopters on the understanding that any code that uses this API
+ * will almost certainly be broken (repeatedly) as the API evolves.
+ */
+public interface OrmAttributeMappingUiDefinition<T extends AttributeMapping>
+ extends MappingUiDefinition<ReadOnlyPersistentAttribute, T>
+{
+ /**
+ * Creates <code>JpaComposite</code> that corresponds to this mapping type.
+ * This will be displayed by the <code>PersistentAttributeDetailsPage</code>
+ * when the mapping key matches the key given by this provider. The
+ * composites will be stored in a Map with the mapping key as the key.
+ *
+ * @param factory The UI factory responsible to create the right composite
+ * for any mapping type
+ * @param subjectHolder The holder of the subject being displayed
+ * @param parent The parent container
+ * @param widgetFactory The factory used to create the various widgets
+ * @return The composite displaying the information for a certain mapping
+ */
+ JpaComposite buildAttributeMappingComposite(
+ OrmXmlUiFactory factory,
+ PropertyValueModel<T> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory);
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/details/orm/OrmTypeMappingUiDefinition.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/details/orm/OrmTypeMappingUiDefinition.java
new file mode 100644
index 0000000000..f9f918bb6b
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/details/orm/OrmTypeMappingUiDefinition.java
@@ -0,0 +1,48 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2009 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.ui.details.orm;
+
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.PersistentType;
+import org.eclipse.jpt.jpa.core.context.TypeMapping;
+import org.eclipse.jpt.jpa.ui.details.JpaComposite;
+import org.eclipse.jpt.jpa.ui.details.MappingUiDefinition;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * Provisional API: This interface is part of an interim API that is still
+ * under development and expected to change significantly before reaching
+ * stability. It is available at this early stage to solicit feedback from
+ * pioneering adopters on the understanding that any code that uses this API
+ * will almost certainly be broken (repeatedly) as the API evolves.
+ */
+public interface OrmTypeMappingUiDefinition<T extends TypeMapping>
+ extends MappingUiDefinition<PersistentType, T>
+{
+ /**
+ * Creates <code>JpaComposite</code> that correponds to this mapping type.
+ * This will be displayed by the <code>PersistentTypeDetailsPage</code> when
+ * the mapping key matches the key given by this provider. The composites
+ * will be stored in a Map with the mapping key as the key.
+ *
+ * @param factory The UI factory responsible to create the right composite
+ * for any mapping type
+ * @param subjectHolder The holder of the subject being displayed
+ * @param parent The parent container
+ * @param widgetFactory The factory used to create the various widgets
+ * @return The composite displaying the information for a certain mapping
+ */
+ JpaComposite buildTypeMappingComposite(
+ OrmXmlUiFactory factory,
+ PropertyValueModel<T> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory);
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/details/orm/OrmXmlUiFactory.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/details/orm/OrmXmlUiFactory.java
new file mode 100644
index 0000000000..6c1eaf975e
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/details/orm/OrmXmlUiFactory.java
@@ -0,0 +1,220 @@
+/*******************************************************************************
+ * Copyright (c) 2009 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.ui.details.orm;
+
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.orm.OrmBasicMapping;
+import org.eclipse.jpt.jpa.core.context.orm.OrmEmbeddable;
+import org.eclipse.jpt.jpa.core.context.orm.OrmEmbeddedIdMapping;
+import org.eclipse.jpt.jpa.core.context.orm.OrmEmbeddedMapping;
+import org.eclipse.jpt.jpa.core.context.orm.OrmEntity;
+import org.eclipse.jpt.jpa.core.context.orm.OrmIdMapping;
+import org.eclipse.jpt.jpa.core.context.orm.OrmManyToManyMapping;
+import org.eclipse.jpt.jpa.core.context.orm.OrmManyToOneMapping;
+import org.eclipse.jpt.jpa.core.context.orm.OrmMappedSuperclass;
+import org.eclipse.jpt.jpa.core.context.orm.OrmOneToManyMapping;
+import org.eclipse.jpt.jpa.core.context.orm.OrmOneToOneMapping;
+import org.eclipse.jpt.jpa.core.context.orm.OrmTransientMapping;
+import org.eclipse.jpt.jpa.core.context.orm.OrmVersionMapping;
+import org.eclipse.jpt.jpa.ui.details.JpaComposite;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * Use {@link OrmXmlUiFactory} to create any ORM JPA composites
+ * <p>
+ * Provisional API: This interface is part of an interim API that is still under
+ * development and expected to change significantly before reaching stability.
+ * It is available at this early stage to solicit feedback from pioneering
+ * adopters on the understanding that any code that uses this API will almost
+ * certainly be broken (repeatedly) as the API evolves.
+ *
+ * @see org.eclipse.jpt.jpa.ui.internal.BaseJpaUiFactory
+ *
+ * @version 2.0
+ * @since 1.0
+ */
+public interface OrmXmlUiFactory
+{
+
+ // **************** orm type mapping composites ****************************
+
+ /**
+ * Creates a new <code>JpaComposite</code> used to edit an <code>OrmMappedSuperclass</code>.
+ *
+ * @param subjectHolder The holder of the mapped superclass
+ * @param parent The parent container
+ * @param widgetFactory The factory used to create the widgets
+ * @return A new <code>JpaComposite</code>
+ */
+ JpaComposite createOrmMappedSuperclassComposite(
+ PropertyValueModel<OrmMappedSuperclass> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory);
+
+ /**
+ * Creates a new <code>JpaComposite</code> used to edit an <code>OrmEntity</code>.
+ *
+ * @param subjectHolder The holder of the orm entity
+ * @param parent The parent container
+ * @param widgetFactory The factory used to create the widgets
+ * @return A new <code>JpaComposite</code>
+ */
+ JpaComposite createOrmEntityComposite(
+ PropertyValueModel<OrmEntity> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory);
+
+ /**
+ * Creates a new <code>JpaComposite</code> used to edit an <code>OrmEmbeddable</code>.
+ *
+ * @param subjectHolder The holder of the embeddable
+ * @param parent The parent container
+ * @param widgetFactory The factory used to create the widgets
+ * @return A new <code>JpaComposite</code>
+ */
+ JpaComposite createOrmEmbeddableComposite(
+ PropertyValueModel<OrmEmbeddable> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory);
+
+
+ // **************** orm attribute mapping composites ***********************
+
+ /**
+ * Creates a new <code>JpaComposite</code> used to edit an <code>OrmIdMapping</code>.
+ *
+ * @param subjectHolder The holder of the ID mapping
+ * @param parent The parent container
+ * @param widgetFactory The factory used to create the widgets
+ * @return A new <code>JpaComposite</code>
+ */
+ JpaComposite createOrmIdMappingComposite(
+ PropertyValueModel<OrmIdMapping> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory);
+
+ /**
+ * Creates a new <code>JpaComposite</code> used to edit an <code>OrmEmbeddedIdMapping</code>.
+ *
+ * @param subjectHolder The holder of the embedded ID mapping
+ * @param parent The parent container
+ * @param widgetFactory The factory used to create the widgets
+ * @return A new <code>JpaComposite</code>
+ */
+ JpaComposite createOrmEmbeddedIdMappingComposite(
+ PropertyValueModel<OrmEmbeddedIdMapping> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory);
+
+ /**
+ * Creates a new <code>JpaComposite</code> used to edit an <code>OrmBasicMapping</code>.
+ *
+ * @param subjectHolder The holder of the basic mapping
+ * @param parent The parent container
+ * @param widgetFactory The factory used to create the widgets
+ * @return A new <code>JpaComposite</code>
+ */
+ JpaComposite createOrmBasicMappingComposite(
+ PropertyValueModel<OrmBasicMapping> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory);
+
+ /**
+ * Creates a new <code>JpaComposite</code> used to edit an <code>OrmVersionMapping</code>.
+ *
+ * @param subjectHolder The holder of the version mapping
+ * @param parent The parent container
+ * @param widgetFactory The factory used to create the widgets
+ * @return A new <code>JpaComposite</code>
+ */
+ JpaComposite createOrmVersionMappingComposite(
+ PropertyValueModel<OrmVersionMapping> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory);
+
+ /**
+ * Creates a new <code>JpaComposite</code> used to edit an <code>OrmManyToOneMapping</code>.
+ *
+ * @param subjectHolder The holder of the many to one mapping
+ * @param parent The parent container
+ * @param widgetFactory The factory used to create the widgets
+ * @return A new <code>JpaComposite</code>
+ */
+ JpaComposite createOrmManyToOneMappingComposite(
+ PropertyValueModel<OrmManyToOneMapping> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory);
+
+ /**
+ * Creates a new <code>JpaComposite</code> used to edit an <code>OrmOneToManyMapping</code>.
+ *
+ * @param subjectHolder The holder of the one to many mapping
+ * @param parent The parent container
+ * @param widgetFactory The factory used to create the widgets
+ * @return A new <code>JpaComposite</code>
+ */
+ JpaComposite createOrmOneToManyMappingComposite(
+ PropertyValueModel<OrmOneToManyMapping> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory);
+
+ /**
+ * Creates a new <code>JpaComposite</code> used to edit an <code>OrmOneToOneMapping</code>.
+ *
+ * @param subjectHolder The holder of the one to one mapping
+ * @param parent The parent container
+ * @param widgetFactory The factory used to create the widgets
+ * @return A new <code>JpaComposite</code>
+ */
+ JpaComposite createOrmOneToOneMappingComposite(
+ PropertyValueModel<OrmOneToOneMapping> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory);
+
+ /**
+ * Creates a new <code>JpaComposite</code> used to edit an <code>OrmManyToManyMapping</code>.
+ *
+ * @param subjectHolder The holder of the many to many mapping
+ * @param parent The parent container
+ * @param widgetFactory The factory used to create the widgets
+ * @return A new <code>JpaComposite</code>
+ */
+ JpaComposite createOrmManyToManyMappingComposite(
+ PropertyValueModel<OrmManyToManyMapping> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory);
+
+ /**
+ * Creates a new <code>JpaComposite</code> used to edit an <code>OrmEmbeddedMapping</code>.
+ *
+ * @param subjectHolder The holder of the embedded mapping
+ * @param parent The parent container
+ * @param widgetFactory The factory used to create the widgets
+ * @return A new <code>JpaComposite</code>
+ */
+ JpaComposite createOrmEmbeddedMappingComposite(
+ PropertyValueModel<OrmEmbeddedMapping> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory);
+
+ /**
+ * Creates a new <code>JpaComposite</code> used to edit an <code>OrmTransientMapping</code>.
+ *
+ * @param subjectHolder The holder of the transient mapping
+ * @param parent The parent container
+ * @param widgetFactory The factory used to create the widgets
+ * @return A new <code>JpaComposite</code>
+ */
+ JpaComposite createOrmTransientMappingComposite(
+ PropertyValueModel<OrmTransientMapping> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory);
+} \ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/AbstractJpaPlatformUiProvider.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/AbstractJpaPlatformUiProvider.java
new file mode 100644
index 0000000000..555910e877
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/AbstractJpaPlatformUiProvider.java
@@ -0,0 +1,88 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 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.ui.internal;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.ListIterator;
+import org.eclipse.jpt.common.utility.internal.iterators.ArrayListIterator;
+import org.eclipse.jpt.jpa.ui.JpaPlatformUiProvider;
+import org.eclipse.jpt.jpa.ui.ResourceUiDefinition;
+import org.eclipse.jpt.jpa.ui.details.JpaDetailsProvider;
+
+/**
+ * All the state in the JPA platform ui provider should be "static" (i.e. unchanging once
+ * it is initialized).
+ */
+public abstract class AbstractJpaPlatformUiProvider implements JpaPlatformUiProvider
+{
+ private JpaDetailsProvider[] detailsProviders;
+
+ private ResourceUiDefinition[] resourceUiDefinitions;
+
+ /**
+ * zero-argument constructor
+ */
+ public AbstractJpaPlatformUiProvider() {
+ super();
+ }
+
+
+ // ********** details providers **********
+
+ public ListIterator<JpaDetailsProvider> detailsProviders() {
+ return new ArrayListIterator<JpaDetailsProvider>(getDetailsProviders());
+ }
+
+ protected synchronized JpaDetailsProvider[] getDetailsProviders() {
+ if (this.detailsProviders == null) {
+ this.detailsProviders = this.buildDetailsProviders();
+ }
+ return this.detailsProviders;
+ }
+
+ protected JpaDetailsProvider[] buildDetailsProviders() {
+ ArrayList<JpaDetailsProvider> providers = new ArrayList<JpaDetailsProvider>();
+ this.addDetailsProvidersTo(providers);
+ return providers.toArray(new JpaDetailsProvider[providers.size()]);
+ }
+
+ /**
+ * Implement this to specify JPA details providers.
+ */
+ protected abstract void addDetailsProvidersTo(List<JpaDetailsProvider> providers);
+
+
+
+ // ********** structure providers **********
+
+ public ListIterator<ResourceUiDefinition> resourceUiDefinitions() {
+ return new ArrayListIterator<ResourceUiDefinition>(getResourceUiDefinitions());
+ }
+
+ protected synchronized ResourceUiDefinition[] getResourceUiDefinitions() {
+ if (this.resourceUiDefinitions == null) {
+ this.resourceUiDefinitions = this.buildResourceUiDefinitions();
+ }
+ return this.resourceUiDefinitions;
+ }
+
+ protected ResourceUiDefinition[] buildResourceUiDefinitions() {
+ ArrayList<ResourceUiDefinition> definitions = new ArrayList<ResourceUiDefinition>();
+ this.addResourceUiDefinitionsTo(definitions);
+ return definitions.toArray(new ResourceUiDefinition[definitions.size()]);
+ }
+
+ /**
+ * Implement this to specify JPA mapping file ui definitions.
+ */
+ protected abstract void addResourceUiDefinitionsTo(List<ResourceUiDefinition> definitions);
+
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/EditorPartAdapterFactory.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/EditorPartAdapterFactory.java
new file mode 100644
index 0000000000..f17567c28c
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/EditorPartAdapterFactory.java
@@ -0,0 +1,65 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 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.ui.internal;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.runtime.IAdapterFactory;
+import org.eclipse.jpt.jpa.core.JpaFile;
+import org.eclipse.jpt.jpa.core.JptJpaCorePlugin;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IFileEditorInput;
+
+/**
+ * Factory to build adapters for a editor part:
+ * - JPA file (if the editor part is a file editor etc.)
+ *
+ * See org.eclipse.jpt.jpa.ui plugin.xml.
+ */
+public class EditorPartAdapterFactory
+ implements IAdapterFactory
+{
+ private static final Class<?>[] ADAPTER_LIST = new Class[] { JpaFile.class };
+
+ public Class<?>[] getAdapterList() {
+ return ADAPTER_LIST;
+ }
+
+ public Object getAdapter(Object adaptableObject, @SuppressWarnings("unchecked") Class adapterType) {
+ if (adaptableObject instanceof IEditorPart) {
+ return this.getAdapter((IEditorPart) adaptableObject, adapterType);
+ }
+ return null;
+ }
+
+ private Object getAdapter(IEditorPart editorPart, Class<?> adapterType) {
+ if (adapterType == JpaFile.class) {
+ return this.getJpaFile(editorPart);
+ }
+ return null;
+ }
+
+ private JpaFile getJpaFile(IEditorPart editorPart) {
+ IEditorInput editorInput = editorPart.getEditorInput();
+ if (editorInput instanceof IFileEditorInput) {
+ return this.getJpaFile((IFileEditorInput) editorInput);
+ }
+ return null;
+ }
+
+ private JpaFile getJpaFile(IFileEditorInput fileEditorInput) {
+ return this.getJpaFile(fileEditorInput.getFile());
+ }
+
+ private JpaFile getJpaFile(IFile file) {
+ return JptJpaCorePlugin.getJpaFile(file);
+ }
+
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/GenericJpaPlatformUiProvider.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/GenericJpaPlatformUiProvider.java
new file mode 100644
index 0000000000..03077a3de2
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/GenericJpaPlatformUiProvider.java
@@ -0,0 +1,70 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 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.ui.internal;
+
+import java.util.List;
+import org.eclipse.jpt.jpa.ui.JpaPlatformUiProvider;
+import org.eclipse.jpt.jpa.ui.ResourceUiDefinition;
+import org.eclipse.jpt.jpa.ui.details.JpaDetailsProvider;
+import org.eclipse.jpt.jpa.ui.internal.details.java.GenericJavaResourceUiDefinition;
+import org.eclipse.jpt.jpa.ui.internal.details.java.JavaPersistentAttributeDetailsProvider;
+import org.eclipse.jpt.jpa.ui.internal.details.java.JavaPersistentTypeDetailsProvider;
+import org.eclipse.jpt.jpa.ui.internal.details.orm.EntityMappingsDetailsProvider;
+import org.eclipse.jpt.jpa.ui.internal.details.orm.OrmPersistentAttributeDetailsProvider;
+import org.eclipse.jpt.jpa.ui.internal.details.orm.OrmPersistentTypeDetailsProvider;
+import org.eclipse.jpt.jpa.ui.internal.details.orm.OrmXmlUiDefinition;
+import org.eclipse.jpt.jpa.ui.internal.persistence.details.PersistenceXmlUiDefinition;
+
+/**
+ * All the state in the JPA platform should be "static" (i.e. unchanging once
+ * it is initialized).
+ */
+public class GenericJpaPlatformUiProvider extends AbstractJpaPlatformUiProvider
+{
+
+ // singleton
+ private static final JpaPlatformUiProvider INSTANCE = new GenericJpaPlatformUiProvider();
+
+ /**
+ * Return the singleton.
+ */
+ public static JpaPlatformUiProvider instance() {
+ return INSTANCE;
+ }
+
+ /**
+ * Ensure single instance.
+ */
+ private GenericJpaPlatformUiProvider() {
+ super();
+ }
+
+
+ // ********** details providers **********
+
+ @Override
+ protected void addDetailsProvidersTo(List<JpaDetailsProvider> providers) {
+ providers.add(JavaPersistentTypeDetailsProvider.instance());
+ providers.add(JavaPersistentAttributeDetailsProvider.instance());
+ providers.add(EntityMappingsDetailsProvider.instance());
+ providers.add(OrmPersistentTypeDetailsProvider.instance());
+ providers.add(OrmPersistentAttributeDetailsProvider.instance());
+ }
+
+
+ // ********** resource ui definitions **********
+
+ @Override
+ protected void addResourceUiDefinitionsTo(List<ResourceUiDefinition> definitions) {
+ definitions.add(GenericJavaResourceUiDefinition.instance());
+ definitions.add(OrmXmlUiDefinition.instance());
+ definitions.add(PersistenceXmlUiDefinition.instance());
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/ImageRepository.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/ImageRepository.java
new file mode 100644
index 0000000000..b9a5085f86
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/ImageRepository.java
@@ -0,0 +1,149 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2010 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.ui.internal;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.resource.ResourceManager;
+import org.eclipse.jpt.jpa.ui.JptJpaUiPlugin;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+
+@SuppressWarnings("nls")
+public final class ImageRepository {
+
+ // ***** overlays *****
+ public static Image getErrorOverlayImage(ResourceManager resourceManager) {
+ return getImage(resourceManager, ERROR_OVERLAY_DESCRIPTOR);
+ }
+ private static final ImageDescriptor ERROR_OVERLAY_DESCRIPTOR = buildImageDescriptor("overlays/error.gif");
+
+ public static Image getWarningOverlayImage(ResourceManager resourceManager) {
+ return getImage(resourceManager, WARNING_OVERLAY_DESCRIPTOR);
+ }
+ private static final ImageDescriptor WARNING_OVERLAY_DESCRIPTOR = buildImageDescriptor("overlays/warning.png");
+
+ // ***** buttons *****
+ public static Image getAddButtonImage(ResourceManager resourceManager) {
+ return getImage(resourceManager, ADD_BUTTON_DESCRIPTOR);
+ }
+ private static final ImageDescriptor ADD_BUTTON_DESCRIPTOR = buildImageDescriptor("buttons/add.png");
+
+ public static Image getEditButtonImage(ResourceManager resourceManager) {
+ return getImage(resourceManager, EDIT_BUTTON_DESCRIPTOR);
+ }
+ private static final ImageDescriptor EDIT_BUTTON_DESCRIPTOR = buildImageDescriptor("buttons/edit.png");
+
+ public static Image getDeleteButtonImage(ResourceManager resourceManager) {
+ return getImage(resourceManager, DELETE_BUTTON_DESCRIPTOR);
+ }
+ private static final ImageDescriptor DELETE_BUTTON_DESCRIPTOR = buildImageDescriptor("buttons/delete.png");
+
+ public static Image getMoveUpButtonImage(ResourceManager resourceManager) {
+ return getImage(resourceManager, MOVE_UP_BUTTON_DESCRIPTOR);
+ }
+ private static final ImageDescriptor MOVE_UP_BUTTON_DESCRIPTOR = buildImageDescriptor("buttons/move-up.png");
+
+ public static Image getMoveDownButtonImage(ResourceManager resourceManager) {
+ return getImage(resourceManager, MOVE_DOWN_BUTTON_DESCRIPTOR);
+ }
+ private static final ImageDescriptor MOVE_DOWN_BUTTON_DESCRIPTOR = buildImageDescriptor("buttons/move-down.png");
+
+ public static Image getExpandAllButtonImage(ResourceManager resourceManager) {
+ return getImage(resourceManager, EXPAND_ALL_BUTTON_DESCRIPTOR);
+ }
+ private static final ImageDescriptor EXPAND_ALL_BUTTON_DESCRIPTOR = buildImageDescriptor("buttons/expand-all.png");
+
+ public static Image getCollapseAllButtonImage(ResourceManager resourceManager) {
+ return getImage(resourceManager, COLLAPSE_ALL_BUTTON_DESCRIPTOR);
+ }
+ private static final ImageDescriptor COLLAPSE_ALL_BUTTON_DESCRIPTOR = buildImageDescriptor("buttons/collapse-all.png");
+
+ public static Image getRestoreDefaultsButtonImage(ResourceManager resourceManager) {
+ return getImage(resourceManager, RESTORE_DEFAULTS_BUTTON_DESCRIPTOR);
+ }
+ private static final ImageDescriptor RESTORE_DEFAULTS_BUTTON_DESCRIPTOR = buildImageDescriptor("buttons/restore-defaults.png");
+
+ public static Image getBrowseButtonImage(ResourceManager resourceManager) {
+ return getImage(resourceManager, BROWSE_BUTTON_DESCRIPTOR);
+ }
+ private static final ImageDescriptor BROWSE_BUTTON_DESCRIPTOR = buildImageDescriptor("buttons/browse.png");
+
+ public static Image getMiniBrowseButtonImage(ResourceManager resourceManager) {
+ return getImage(resourceManager, MINI_BROWSE_BUTTON_DESCRIPTOR);
+ }
+ private static final ImageDescriptor MINI_BROWSE_BUTTON_DESCRIPTOR = buildImageDescriptor("buttons/browse-mini.png");
+
+ public static Image getSelectAllButtonImage(ResourceManager resourceManager) {
+ return getImage(resourceManager, SELECT_ALL_BUTTON_DESCRIPTOR);
+ }
+ private static final ImageDescriptor SELECT_ALL_BUTTON_DESCRIPTOR = buildImageDescriptor("buttons/select-all.png");
+
+ public static Image getDeselectAllButtonImage(ResourceManager resourceManager) {
+ return getImage(resourceManager, DESELECT_ALL_BUTTON_DESCRIPTOR);
+ }
+ private static final ImageDescriptor DESELECT_ALL_BUTTON_DESCRIPTOR = buildImageDescriptor("buttons/deselect-all.png");
+
+ public static Image getAddConnectionButtonImage(ResourceManager resourceManager) {
+ return getImage(resourceManager, ADD_CONNECTION_BUTTON_DESCRIPTOR);
+ }
+ private static final ImageDescriptor ADD_CONNECTION_BUTTON_DESCRIPTOR = buildImageDescriptor("buttons/add-connection.gif");
+
+ public static Image getReconnectButtonImage(ResourceManager resourceManager) {
+ return getImage(resourceManager, RECONNECT_BUTTON_DESCRIPTOR);
+ }
+ private static final ImageDescriptor RECONNECT_BUTTON_DESCRIPTOR = buildImageDescriptor("buttons/reconnect.png");
+
+ // ***** objects *****
+ public static Image getFileImage(ResourceManager resourceManager) {
+ return getImage(resourceManager, FILE_DESCRIPTOR);
+ }
+ private static final ImageDescriptor FILE_DESCRIPTOR = buildImageDescriptor("objects/file.png");
+
+ public static Image getFolderImage(ResourceManager resourceManager) {
+ return getImage(resourceManager, FOLDER_DESCRIPTOR);
+ }
+ private static final ImageDescriptor FOLDER_DESCRIPTOR = buildImageDescriptor("objects/folder.png");
+
+ public static Image getPackageImage(ResourceManager resourceManager) {
+ return getImage(resourceManager, PACKAGE_DESCRIPTOR);
+ }
+ private static final ImageDescriptor PACKAGE_DESCRIPTOR = buildImageDescriptor("objects/package.png");
+
+ public static Image getTableImage(ResourceManager resourceManager) {
+ return getImage(resourceManager, TABLE_DESCRIPTOR);
+ }
+ private static final ImageDescriptor TABLE_DESCRIPTOR = buildImageDescriptor("objects/table.gif");
+
+ public static Image getTableObjImage(ResourceManager resourceManager) {
+ return getImage(resourceManager, TABLE_OBJ_DESCRIPTOR);
+ }
+ private static final ImageDescriptor TABLE_OBJ_DESCRIPTOR = buildImageDescriptor("objects/table_obj.gif");
+
+ public static Image getColumnImage(ResourceManager resourceManager) {
+ return getImage(resourceManager, COLUMN_DESCRIPTOR);
+ }
+ private static final ImageDescriptor COLUMN_DESCRIPTOR = buildImageDescriptor("objects/column.gif");
+
+ public static Image getKeyColumnImage(ResourceManager resourceManager) {
+ return getImage(resourceManager, KEY_COLUMN_DESCRIPTOR);
+ }
+ private static final ImageDescriptor KEY_COLUMN_DESCRIPTOR = buildImageDescriptor("objects/columnKey.gif");
+
+
+ private static ImageDescriptor buildImageDescriptor(String fileName) {
+ return AbstractUIPlugin.imageDescriptorFromPlugin(JptJpaUiPlugin.PLUGIN_ID, "images/" + fileName);
+ }
+
+
+ private static Image getImage(ResourceManager resourceManager, ImageDescriptor descriptor) {
+ return resourceManager.createImage(descriptor);
+ }
+
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/JpaHelpContextIds.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/JpaHelpContextIds.java
new file mode 100644
index 0000000000..26eb7a6c23
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/JpaHelpContextIds.java
@@ -0,0 +1,151 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2010 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.ui.internal;
+
+import org.eclipse.jpt.jpa.ui.JptJpaUiPlugin;
+
+/**
+ * Help context ids for the Dali JPA UI.
+ * <p>
+ * This interface contains constants only; it is not intended to be
+ * implemented.
+ * </p>
+ */
+@SuppressWarnings("nls")
+public interface JpaHelpContextIds {
+
+ //ContextID prefix
+ public static final String PREFIX = JptJpaUiPlugin.PLUGIN_ID + ".";
+
+ //Persistent Type composites
+ public static final String ENTITY_ACCESS_TYPE = PREFIX + "entity_accessType";
+ public static final String ENTITY_ATTRIBUTE_OVERRIDES = PREFIX + "entity_attributeOverrides";
+ public static final String ENTITY_ATTRIBUTE_OVERRIDES_COLUMN = PREFIX + "entity_attributeOverridesColumn";
+ public static final String ENTITY_CATALOG = PREFIX + "entity_catalog";
+ public static final String ENTITY_INHERITANCE_STRATEGY = PREFIX + "entity_inheritanceStrategy";
+ public static final String ENTITY_INHERITANCE_DISCRIMINATOR_TYPE = PREFIX + "entity_inheritanceDiscriminatorType";
+ public static final String ENTITY_INHERITANCE_DISCRIMINATOR_COLUMN = PREFIX + "entity_inheritanceDiscriminatorColumn";
+ public static final String ENTITY_INHERITANCE_DISCRIMINATOR_VALUE = PREFIX + "entity_inheritanceDiscriminatorValue";
+ public static final String ENTITY_NAME = PREFIX + "entity_name";
+ public static final String ENTITY_ORM_PACKAGE = PREFIX + "orm_package";
+ public static final String ENTITY_ORM_SCHEMA = PREFIX + "orm_schema";
+ public static final String ENTITY_ORM_CATALOG = PREFIX + "orm_catalog";
+ public static final String ENTITY_ORM_ACCESS = PREFIX + "orm_access";
+ public static final String ENTITY_ORM_DELIMITED_IDENTIFIERS = PREFIX + "orm_delimited_identifiers";
+ public static final String ENTITY_ORM_CASCADE = PREFIX + "orm_cascade";
+ public static final String ENTITY_ORM_XML = PREFIX + "orm_xml";
+ public static final String ENTITY_SCHEMA = PREFIX + "entity_schema";
+ public static final String ENTITY_TABLE = PREFIX + "entity_table";
+ public static final String ENTITY_CACHEABLE = PREFIX + "entity_cacheable";
+
+ //Persistent Attribute composites
+ public static final String MAPPING_CASCADE_TYPE = PREFIX + "mapping_cascadeType";
+ public static final String MAPPING_COLUMN = PREFIX + "mapping_column";
+ public static final String MAPPING_COLUMN_INSERTABLE = PREFIX + "mapping_columnInsertable";
+ public static final String MAPPING_COLUMN_LENGTH = PREFIX + "mapping_columnLength";
+ public static final String MAPPING_COLUMN_NULLABLE = PREFIX + "mapping_columnNullable";
+ public static final String MAPPING_COLUMN_PRECISION = PREFIX + "mapping_columnPrecision";
+ public static final String MAPPING_COLUMN_SCALE = PREFIX + "mapping_columnScale";
+ public static final String MAPPING_COLUMN_TABLE = PREFIX + "mapping_columnTable";
+ public static final String MAPPING_COLUMN_UNIQUE = PREFIX + "mapping_columnUnique";
+ public static final String MAPPING_COLUMN_UPDATABLE= PREFIX + "mapping_columnUpdatable";
+ public static final String MAPPING_EMBEDDED_ATTRIBUTE_OVERRIDES = PREFIX + "mapping_embeddedAttributeOverrides";
+ public static final String MAPPING_EMBEDDED_ATTRIBUTE_OVERRIDES_COLUMN = PREFIX + "mapping_embeddedAttributeOverridesColumn";
+ public static final String MAPPING_ENUMERATED = PREFIX + "mapping_enumerated";
+ public static final String MAPPING_FETCH_TYPE = PREFIX + "mapping_fetchType";
+ public static final String MAPPING_GENERATED_VALUE_STRATEGY = PREFIX + "mapping_generatedValueStrategy";
+ public static final String MAPPING_GENERATED_VALUE_GENERATOR_NAME = PREFIX + "mapping_generatedValueGeneratorName";
+ public static final String MAPPING_JOIN_COLUMN_NAME = PREFIX + "mapping_joinColumnName";
+ public static final String MAPPING_JOIN_REFERENCED_COLUMN = PREFIX + "mapping_joinReferencedColumn";
+ public static final String MAPPING_JOIN_TABLE_NAME = PREFIX + "mapping_joinTableName";
+ public static final String MAPPING_JOIN_TABLE_SCHEMA = PREFIX + "mapping_joinTableSchema";
+ public static final String MAPPING_JOIN_TABLE_CATALOG = PREFIX + "mapping_joinTableCatalog";
+ public static final String MAPPING_JOIN_TABLE_COLUMNS = PREFIX + "mapping_joinTableJoinColumns";
+ public static final String MAPPING_JOIN_TABLE_INVERSE_JOIN_COLUMNS = PREFIX + "mapping_joinTableInverseJoinColumns";
+ public static final String MAPPING_LOB = PREFIX + "mapping_lob";
+ public static final String MAPPING_MAP_AS = PREFIX + "mapping_mapAs";
+ public static final String MAPPING_MAPPED_BY = PREFIX + "mapping_mappedBy";
+ public static final String MAPPING_NAMED_NATIVE_QUERIES = "named_native_queries";
+ public static final String MAPPING_NAMED_QUERIES = PREFIX + "named_queries";
+ public static final String MAPPING_OPTIONAL = PREFIX + "mapping_optional";
+ public static final String MAPPING_ORDER_BY = PREFIX + "mapping_orderBy";
+ public static final String MAPPING_ORDER_BY_NO_ORDERING = PREFIX + "mapping_orderByNoOrdering";
+ public static final String MAPPING_ORDER_BY_PRIMARY_KEY_ORDERING = PREFIX + "mapping_orderByPrimaryKeyOrdering";
+ public static final String MAPPING_ORDER_BY_CUSTOM_ORDERING = PREFIX + "mapping_orderByCustomOrdering";
+ public static final String MAPPING_ORDER_COLUMN_ORDERING = PREFIX + "mapping_orderColumnOrdering";
+ public static final String MAPPING_ORDER_COLUMN_ORDERING_COLUMN = PREFIX + "mapping_orderColumnOrderingColumn";
+ public static final String MAPPING_PRIMARY_KEY_GENERATION = PREFIX + "mapping_primaryKeyGeneration";
+ public static final String MAPPING_SEQUENCE_GENERATOR = PREFIX + "mapping_sequenceGenerator";
+ public static final String MAPPING_SEQUENCE_GENERATOR_NAME = PREFIX + "mapping_sequenceGeneratorName";
+ public static final String MAPPING_SEQUENCE_GENERATOR_SEQUENCE = PREFIX + "mapping_sequenceGeneratorSequence";
+ public static final String MAPPING_TABLE_GENERATOR = PREFIX + "mapping_tableGenerator";
+ public static final String MAPPING_TABLE_GENERATOR_CATALOG = PREFIX + "mapping_tableGeneratorCatalog";
+ public static final String MAPPING_TABLE_GENERATOR_NAME = PREFIX + "mapping_tableGeneratorName";
+ public static final String MAPPING_TABLE_GENERATOR_PRIMARY_KEY_COLUMN = PREFIX + "mapping_tableGeneratorPrimaryKeyColumn";
+ public static final String MAPPING_TABLE_GENERATOR_PRIMARY_KEY_COLUMN_VALUE = PREFIX + "mapping_tableGeneratorPrimaryKeyColumnValue";
+ public static final String MAPPING_TABLE_GENERATOR_SCHEMA = PREFIX + "mapping_tableGeneratorSchema";
+ public static final String MAPPING_TABLE_GENERATOR_TABLE= PREFIX + "mapping_tableGeneratorTable";
+ public static final String MAPPING_TABLE_GENERATOR_VALUE_COLUMN = PREFIX + "mapping_tableGeneratorValueColumn";
+ public static final String MAPPING_TARGET_ENTITY = PREFIX + "mapping_targetEntity";
+ public static final String MAPPING_TEMPORAL = PREFIX + "mapping_temporal";
+
+ //Project properties
+ public static final String PROPERTIES_JAVA_PERSISTENCE = PREFIX + "properties_javaPersistence";
+ public static final String PROPERTIES_JAVA_PERSISTENCE_CONNECTION = PREFIX + "properties_javaPersistenceConnection";
+ public static final String PROPERTIES_JAVA_PERSISTENCE_SCHEMA = PREFIX + "properties_javaPersistenceSchema";
+ public static final String PROPERTIES_JAVA_PERSISTENCE_METAMODEL = PREFIX + "properties_canonicalMetamodel";
+
+ //Dialogs, Wizards
+ public static final String DIALOG_CREATE_ORM = PREFIX + "dialog_createORM";
+ public static final String DIALOG_EDIT_INVERSE_JOIN_COLUNN = PREFIX + "dialog_editInverseJoinColumn";
+ public static final String DIALOG_GENERATE_ENTITIES = PREFIX + "dialog_generateEntities";
+ public static final String DIALOG_GENERATE_ENTITIES_SOURCE = PREFIX + "dialog_generateEntities_source";
+ public static final String DIALOG_GENERATE_ENTITIES_PACKAGE = PREFIX + "dialog_generateEntities_package";
+ public static final String DIALOG_GENERATE_ENTITIES_TABLES = PREFIX + "dialog_generateEntities_tables";
+ public static final String DIALOG_JPA_FACET = PREFIX + "dialog_JPAFacet";
+ public static final String DIALOG_JPA_PLATFORM = PREFIX + "dialog_JPAPlatform";
+
+ //New JPA Project wizard:
+ public static final String NEW_JPA_PROJECT = PREFIX + "dialog_newJPAProject";
+ public static final String NEW_JPA_PROJECT_CONTENT_PAGE_CLASSPATH = PREFIX + "dialog_addJavaPersistence_classpath";
+ public static final String NEW_JPA_PROJECT_CONTENT_PAGE_DATABASE = PREFIX + "dialog_addJavaPersistence_database";
+ public static final String NEW_JPA_PROJECT_CONTENT_PAGE_PACKAGING = PREFIX + "dialog_addJavaPersistence_packaging";
+ public static final String NEW_JPA_PROJECT_CREATION_PAGE = PREFIX + "dialog_addJavaPersistence";
+ public static final String NEW_JPA_PROJECT_JPA_FACET = PREFIX + "dialog_newJPAProjectFacet";
+
+ //Other
+ public static final String PERSISTENCE_OUTLINE = PREFIX + "persistenceOutline";
+
+ //Persistence Xml Editor
+ public static final String PERSISTENCE_XML_CONNECTION = PREFIX + "persistence_connection";
+ public static final String PERSISTENCE_XML_GENERAL = PREFIX + "persistence_general";
+ public static final String PERSISTENCE_XML_PROPERTIES = PREFIX + "persistence_properties";
+ public static final String PERSISTENCE_XML_SOURCE = PREFIX + "persistence_source";
+
+ //New JPA Entity wizard
+ public static final String NEW_JPA_ENTITY_ENTITY_CLASS = PREFIX + "dialog_entityClassPage";
+ public static final String NEW_JPA_ENTITY_ENTITY_PROPERTIES = PREFIX + "dialog_entityPropertiesPage";
+
+ //Generate Entities Wizard
+ public static final String GENERATE_ENTITIES_WIZARD_ASSOCIATION_CARDINALITY = PREFIX + "dialog_associationCardinalityPage";
+ public static final String GENERATE_ENTITIES_WIZARD_ASSOCIATION_TABLES = PREFIX + "dialog_associationTablesPage";
+ public static final String GENERATE_ENTITIES_WIZARD_CUSTOMIZE_DEFAULT_ENTITY_GENERATION = PREFIX + "dialog_customizeDefaultEntityGeneration";
+ public static final String GENERATE_ENTITIES_WIZARD_CUSTOMIZE_INDIVIDUAL_ENTITIES = PREFIX + "dialog_customizeIndividualEntities";
+ public static final String GENERATE_ENTITIES_WIZARD_JOIN_COLUMNS = PREFIX + "dialog_joinColumnsPage";
+ public static final String GENERATE_ENTITIES_WIZARD_SELECT_CASCADE = PREFIX + "dialog_selectCascade";
+ public static final String GENERATE_ENTITIES_WIZARD_SELECT_TABLES = PREFIX + "dialog_selectTablesPage";
+ public static final String GENERATE_ENTITIES_WIZARD_TABLE_ASSOCIATIONS = PREFIX + "dialog_tableAssociationsPage";
+
+ public static final String MAPPING_COLLECTION_TABLE_NAME = PREFIX + "mapping_collectionTableName";
+ public static final String MAPPING_COLLECTION_TABLE_SCHEMA = PREFIX + "mapping_collectionTableSchema";
+ public static final String MAPPING_COLLECTION_TABLE_CATALOG = PREFIX + "mapping_collectionTableCatalog";
+
+ public static final String MAPPING_ELEMENT_COLLECTION_TARGET_CLASS = PREFIX + "mapping_elementCollectionTargetClass";
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/JpaJavaCompletionProposalComputer.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/JpaJavaCompletionProposalComputer.java
new file mode 100644
index 0000000000..d88d3da7a3
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/JpaJavaCompletionProposalComputer.java
@@ -0,0 +1,187 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2010 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.ui.internal;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.jdt.core.CompletionContext;
+import org.eclipse.jdt.core.ICompilationUnit;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.jdt.core.dom.CompilationUnit;
+import org.eclipse.jdt.ui.text.java.ContentAssistInvocationContext;
+import org.eclipse.jdt.ui.text.java.IJavaCompletionProposalComputer;
+import org.eclipse.jdt.ui.text.java.JavaContentAssistInvocationContext;
+import org.eclipse.jface.text.contentassist.CompletionProposal;
+import org.eclipse.jface.text.contentassist.ICompletionProposal;
+import org.eclipse.jpt.common.core.internal.utility.jdt.ASTTools;
+import org.eclipse.jpt.common.utility.Filter;
+import org.eclipse.jpt.common.utility.internal.CollectionTools;
+import org.eclipse.jpt.common.utility.internal.StringTools;
+import org.eclipse.jpt.jpa.core.JpaFile;
+import org.eclipse.jpt.jpa.core.JpaStructureNode;
+import org.eclipse.jpt.jpa.core.JptJpaCorePlugin;
+import org.eclipse.jpt.jpa.core.context.java.JavaPersistentType;
+
+/**
+ * JPA Java code-completion proposal computer
+ */
+public class JpaJavaCompletionProposalComputer implements IJavaCompletionProposalComputer {
+
+ public JpaJavaCompletionProposalComputer() {
+ super();
+ }
+
+ public void sessionStarted() {
+ // do nothing
+ }
+
+ @SuppressWarnings("unchecked")
+ public List computeCompletionProposals(ContentAssistInvocationContext context, IProgressMonitor monitor) {
+ return (context instanceof JavaContentAssistInvocationContext) ?
+ this.computeCompletionProposals((JavaContentAssistInvocationContext) context)
+ :
+ Collections.emptyList();
+ }
+
+ /**
+ * We fail silently here because (it seems) <em>expected</em> exceptions occur
+ * more frequently than intermittent <em>unexpected</em> exceptions that might
+ * merit investigation (and a logged stacktrace might be the only hint as
+ * to what happened).
+ * <p>
+ * We will get an <em>expected</em> exception (typically a {@link NullPointerException NPE})
+ * here if the user:<ol>
+ * <li>modifies the Java source file in a way that puts it drastically out
+ * of sync with the Dali context model (e.g. deleting a field or
+ * annotation)
+ * <li>immediately invokes Content Assist (typically <code>Ctrl+Space</code>)
+ * </ol>
+ * The AST we build here will be based on the just-modified Java source; but,
+ * since the user moved quickly and we will not have yet received any Java
+ * change notification (since we only get a Java change notification when
+ * the user has paused typing for at least 0.5 seconds), the context model
+ * will still be based on the unmodified Java source. As the new AST is
+ * passed down through the context model to the resource model all the code
+ * expects to find the AST in sync with the model. When this is not the
+ * case (e.g. a field in the resource model is no longer present in the AST
+ * because the user has deleted it or modified the code in such a way that
+ * the parser can no longer detect the field) the model will probably choke
+ * when it cannot find the corresponding AST node.
+ * <p>
+ * It seems reasonable, in these situations, to simply return no completion
+ * proposals. If the user simply waits a moment and tries again, we will be
+ * able to successfully calculate some proposals.
+ * <p>
+ * ~bjv
+ */
+ private List<ICompletionProposal> computeCompletionProposals(JavaContentAssistInvocationContext context) {
+ try {
+ return this.computeCompletionProposals_(context);
+ } catch (Exception ex) {
+ // JptJpaCorePlugin.log(ex); // don't log "expected" exceptions (?)
+ return Collections.emptyList();
+ }
+ }
+
+ private List<ICompletionProposal> computeCompletionProposals_(JavaContentAssistInvocationContext context) {
+ ICompilationUnit cu = context.getCompilationUnit();
+ if (cu == null) {
+ return Collections.emptyList();
+ }
+
+ IFile file = this.getCorrespondingResource(cu);
+ if (file == null) {
+ return Collections.emptyList();
+ }
+
+ JpaFile jpaFile = JptJpaCorePlugin.getJpaFile(file);
+ if (jpaFile == null) {
+ return Collections.emptyList();
+ }
+
+ Collection<JpaStructureNode> rootStructureNodes = CollectionTools.collection(jpaFile.rootStructureNodes());
+ if (rootStructureNodes.isEmpty()) {
+ return Collections.emptyList();
+ }
+
+ CompletionContext cc = context.getCoreContext();
+
+ // the context's "token" is really a sort of "prefix" - it does NOT
+ // correspond to the "start" and "end" we get below...
+ char[] prefix = cc.getToken();
+ Filter<String> filter = ((prefix == null) ? Filter.Null.<String>instance() : new IgnoreCasePrefixFilter(prefix));
+ // the token "start" is the offset of the token's first character
+ int tokenStart = cc.getTokenStart();
+ // the token "end" is the offset of the token's last character (yuk)
+ int tokenEnd = cc.getTokenEnd();
+ if (tokenStart == -1) { // not sure why this happens - see bug 242286
+ return Collections.emptyList();
+ }
+
+// System.out.println("prefix: " + ((prefix == null) ? "[null]" : new String(prefix)));
+// System.out.println("token start: " + tokenStart);
+// System.out.println("token end: " + tokenEnd);
+// String source = cu.getSource();
+// String token = source.substring(Math.max(0, tokenStart), Math.min(source.length(), tokenEnd + 1));
+// System.out.println("token: =>" + token + "<=");
+// String snippet = source.substring(Math.max(0, tokenStart - 20), Math.min(source.length(), tokenEnd + 21));
+// System.out.println("surrounding snippet: =>" + snippet + "<=");
+
+ // TODO move this parser call into the model...
+ CompilationUnit astRoot = ASTTools.buildASTRoot(cu);
+ List<ICompletionProposal> proposals = new ArrayList<ICompletionProposal>();
+ for (JpaStructureNode structureNode : rootStructureNodes) {
+ for (Iterator<String> stream = ((JavaPersistentType) structureNode).javaCompletionProposals(context.getInvocationOffset(), filter, astRoot); stream.hasNext(); ) {
+ String s = stream.next();
+ proposals.add(new CompletionProposal(s, tokenStart, tokenEnd - tokenStart + 1, s.length()));
+ }
+ }
+ return proposals;
+ }
+
+ private IFile getCorrespondingResource(ICompilationUnit cu) {
+ try {
+ return (IFile) cu.getCorrespondingResource();
+ } catch (JavaModelException ex) {
+ JptJpaCorePlugin.log(ex);
+ return null;
+ }
+ }
+
+ @SuppressWarnings("unchecked")
+ public List computeContextInformation(ContentAssistInvocationContext context, IProgressMonitor monitor) {
+ return Collections.emptyList();
+ }
+
+ public String getErrorMessage() {
+ return null;
+ }
+
+ public void sessionEnded() {
+ // do nothing
+ }
+
+ private static class IgnoreCasePrefixFilter implements Filter<String> {
+ private final char[] prefix;
+ IgnoreCasePrefixFilter(char[] prefix) {
+ super();
+ this.prefix = prefix;
+ }
+ public boolean accept(String s) {
+ return StringTools.stringStartsWithIgnoreCase(s.toCharArray(), this.prefix);
+ }
+ }
+
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/JpaMappingImageHelper.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/JpaMappingImageHelper.java
new file mode 100644
index 0000000000..509a13eab8
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/JpaMappingImageHelper.java
@@ -0,0 +1,86 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 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.ui.internal;
+
+import org.eclipse.jpt.common.utility.internal.Tools;
+import org.eclipse.jpt.jpa.core.MappingKeys;
+import org.eclipse.jpt.jpa.core.jpa2.MappingKeys2_0;
+import org.eclipse.jpt.jpa.ui.JptJpaUiPlugin;
+import org.eclipse.swt.graphics.Image;
+
+public class JpaMappingImageHelper
+{
+
+ public static Image imageForTypeMapping(String mappingKey) {
+ return JptJpaUiPlugin.getImage(iconKeyForTypeMapping(mappingKey));
+ }
+
+ public static String iconKeyForTypeMapping(String mappingKey) {
+ if (Tools.valuesAreEqual(mappingKey, MappingKeys.NULL_TYPE_MAPPING_KEY)) {
+ return JptUiIcons.NULL_TYPE_MAPPING;
+ }
+ if (Tools.valuesAreEqual(mappingKey, MappingKeys.ENTITY_TYPE_MAPPING_KEY)) {
+ return JptUiIcons.ENTITY;
+ }
+ if (Tools.valuesAreEqual(mappingKey, MappingKeys.EMBEDDABLE_TYPE_MAPPING_KEY)) {
+ return JptUiIcons.EMBEDDABLE;
+ }
+ if (Tools.valuesAreEqual(mappingKey, MappingKeys.MAPPED_SUPERCLASS_TYPE_MAPPING_KEY)) {
+ return JptUiIcons.MAPPED_SUPERCLASS;
+ }
+ return null;
+ }
+
+ public static Image imageForAttributeMapping(String mappingKey) {
+ return JptJpaUiPlugin.getImage(iconKeyForAttributeMapping(mappingKey));
+ }
+
+ public static String iconKeyForAttributeMapping(String mappingKey) {
+ if (MappingKeys.NULL_ATTRIBUTE_MAPPING_KEY == mappingKey) {
+ return JptUiIcons.NULL_ATTRIBUTE_MAPPING;
+ }
+ else if (MappingKeys.BASIC_ATTRIBUTE_MAPPING_KEY.equals(mappingKey)) {
+ return JptUiIcons.BASIC;
+ }
+ else if (MappingKeys.ID_ATTRIBUTE_MAPPING_KEY.equals(mappingKey)) {
+ return JptUiIcons.ID;
+ }
+ else if (MappingKeys.VERSION_ATTRIBUTE_MAPPING_KEY.equals(mappingKey)) {
+ return JptUiIcons.VERSION;
+ }
+ else if (MappingKeys.EMBEDDED_ID_ATTRIBUTE_MAPPING_KEY.equals(mappingKey)) {
+ return JptUiIcons.EMBEDDED_ID;
+ }
+ else if (MappingKeys.EMBEDDED_ATTRIBUTE_MAPPING_KEY.equals(mappingKey)) {
+ return JptUiIcons.EMBEDDED;
+ }
+ else if (MappingKeys.ONE_TO_ONE_ATTRIBUTE_MAPPING_KEY.equals(mappingKey)) {
+ return JptUiIcons.ONE_TO_ONE;
+ }
+ else if (MappingKeys.ONE_TO_MANY_ATTRIBUTE_MAPPING_KEY.equals(mappingKey)) {
+ return JptUiIcons.ONE_TO_MANY;
+ }
+ else if (MappingKeys.MANY_TO_ONE_ATTRIBUTE_MAPPING_KEY.equals(mappingKey)) {
+ return JptUiIcons.MANY_TO_ONE;
+ }
+ else if (MappingKeys.MANY_TO_MANY_ATTRIBUTE_MAPPING_KEY.equals(mappingKey)) {
+ return JptUiIcons.MANY_TO_MANY;
+ }
+ else if (MappingKeys2_0.ELEMENT_COLLECTION_ATTRIBUTE_MAPPING_KEY.equals(mappingKey)) {
+ return JptUiIcons.ELEMENT_COLLECTION;
+ }
+ else if (MappingKeys.TRANSIENT_ATTRIBUTE_MAPPING_KEY.equals(mappingKey)) {
+ return JptUiIcons.TRANSIENT;
+ }
+ //return the JPA_CONTENT icon instead of null, might as well have an icon if one is not defined
+ return JptUiIcons.JPA_CONTENT;
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/JptUiIcons.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/JptUiIcons.java
new file mode 100644
index 0000000000..5b5a83c909
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/JptUiIcons.java
@@ -0,0 +1,127 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2010 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.ui.internal;
+
+import org.eclipse.draw2d.ImageUtilities;
+import org.eclipse.jpt.jpa.ui.JptJpaUiPlugin;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.graphics.ImageData;
+
+@SuppressWarnings("nls")
+public class JptUiIcons
+{
+ /**
+ * Creates and returns a new SWT image that is a grayed out version of the image
+ * corresponding to the passed in key. Stores this gray image in the JptJpaUiPlugin
+ * ImageRegistry with -gray appended to the key.
+ * Clients of this method should not dispose of the image.
+ *
+ * @return a new grayed out image
+ */
+ public static Image ghost(String key) {
+ Image existingImage = JptJpaUiPlugin.instance().getImageRegistry().get(key + "-gray");
+ if (existingImage != null) {
+ return existingImage;
+ }
+
+ Image grayImage = buildGhostImage(key);
+ JptJpaUiPlugin.instance().getImageRegistry().put(key + "-gray", grayImage);
+ return grayImage;
+ }
+
+ private static Image buildGhostImage(String key) {
+ Image originalImage = JptJpaUiPlugin.getImage(key);
+ Color lightGray = new Color(originalImage.getDevice(), 223, 223, 223);
+ ImageData imageData = ImageUtilities.createShadedImage(originalImage, lightGray);
+
+ Image shadedImage = new Image(originalImage.getDevice(), imageData);
+ Image grayImage = new Image(originalImage.getDevice(), shadedImage, SWT.IMAGE_GRAY);
+
+ lightGray.dispose();
+ shadedImage.dispose();
+ return grayImage;
+ }
+
+
+ // **************** General JPA icons **************************************
+
+ public static final String JPA_CONTENT = "full/obj16/jpa-content";
+
+ public static final String JPA_FILE = "full/obj16/jpa-file";
+
+ public static final String JAR_FILE = "full/obj16/jpa-jar-file";
+
+ public static final String WARNING = "full/obj16/warning";
+
+
+ // **************** Wizard icons *******************************************
+
+ public static final String JPA_WIZ_BANNER = "full/wizban/new_jpa_prj_wiz";
+
+ public static final String ENTITY_WIZ_BANNER = "full/wizban/new_entity_wizban";
+
+ public static final String JPA_FILE_WIZ_BANNER = "full/wizban/new_jpa_file_wizban";
+
+
+ // **************** Persistence icons **************************************
+
+ public static final String PERSISTENCE = "full/obj16/persistence";
+
+ public static final String PERSISTENCE_UNIT = "full/obj16/persistence-unit";
+
+ public static final String MAPPING_FILE_REF = "full/obj16/jpa-file";
+
+ public static final String CLASS_REF = "full/obj16/null-type-mapping";
+
+ public static final String JAR_FILE_REF = "full/obj16/jpa-jar-file";
+
+
+ // **************** Orm icons **********************************************
+
+ public static final String ENTITY_MAPPINGS = "full/obj16/entity-mappings";
+
+
+ // **************** Orm/Java common icons **********************************
+
+ public static final String ENTITY = "full/obj16/entity";
+
+ public static final String EMBEDDABLE = "full/obj16/embeddable";
+
+ public static final String MAPPED_SUPERCLASS = "full/obj16/mapped-superclass";
+
+ public static final String NULL_TYPE_MAPPING = "full/obj16/null-type-mapping";
+
+ public static final String ID = "full/obj16/id";
+
+ public static final String EMBEDDED_ID = "full/obj16/embedded-id";
+
+ public static final String BASIC = "full/obj16/basic";
+
+ public static final String VERSION = "full/obj16/version";
+
+ public static final String MANY_TO_ONE = "full/obj16/many-to-one";
+
+ public static final String ONE_TO_MANY = "full/obj16/one-to-many";
+
+ public static final String ONE_TO_ONE = "full/obj16/one-to-one";
+
+ public static final String MANY_TO_MANY = "full/obj16/many-to-many";
+
+ public static final String ELEMENT_COLLECTION = "full/obj16/element-collection";
+
+ public static final String EMBEDDED = "full/obj16/embedded";
+
+ public static final String TRANSIENT = "full/obj16/transient";
+
+ public static final String NULL_ATTRIBUTE_MAPPING = "full/obj16/null-attribute-mapping";
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/JptUiMessages.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/JptUiMessages.java
new file mode 100644
index 0000000000..19f4ea5bb0
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/JptUiMessages.java
@@ -0,0 +1,154 @@
+/*******************************************************************************
+ * 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.ui.internal;
+
+import org.eclipse.osgi.util.NLS;
+
+/**
+ * Localized messages used by Dali UI.
+ *
+ * @version 3.0
+ * @since 1.0
+ */
+public class JptUiMessages {
+
+ public static String AccessTypeComposite_access;
+ public static String AccessTypeComposite_field;
+ public static String AccessTypeComposite_property;
+ public static String AddToEarComposite_earMemberShip;
+ public static String AddToEarComposite_addToEarLabel;
+ public static String AddToEarComposite_earProjectLabel;
+ public static String AddToEarComposite_newButtonLabel;
+ public static String AddPersistentAttributeDialog_attributeLabel;
+ public static String AddPersistentAttributeDialog_mappingLabel;
+ public static String AddPersistentAttributeDialog_noMappingKeyError;
+ public static String AddPersistentAttributeDialog_title;
+ public static String AddPersistentClassDialog_classDialog_message;
+ public static String AddPersistentClassDialog_classDialog_title;
+ public static String AddPersistentClassDialog_classLabel;
+ public static String AddPersistentClassDialog_classNotFoundWarning;
+ public static String AddPersistentClassDialog_duplicateClassWarning;
+ public static String AddPersistentClassDialog_mappingLabel;
+ public static String AddPersistentClassDialog_noClassError;
+ public static String AddPersistentClassDialog_noMappingKeyError;
+ public static String AddPersistentClassDialog_title;
+ public static String convertToJpa_convertingProject;
+ public static String convertToJpa_detectingTechnologies;
+ public static String DatabaseSchemaWizardPage_title;
+ public static String DatabaseSchemaWizardPage_desc;
+ public static String DatabaseSchemaWizardPage_schemaSettings;
+ public static String DatabaseSchemaWizardPage_addConnectionToProject;
+ public static String DatabaseSchemaWizardPage_connectLink;
+ public static String DatabaseSchemaWizardPage_schema;
+ public static String DatabaseSchemaWizardPage_connectionInfo;
+ public static String DatabaseSchemaWizardPage_schemaInfo;
+ public static String Error_openingEditor;
+ public static String General_browse;
+ public static String General_revert;
+ public static String General_deselectAll;
+ public static String General_selectAll;
+ public static String GenerateDDLWizard_title;
+ public static String GenerateEntitiesWizard_generateEntities;
+ public static String GenerateEntitiesWizardPage_chooseEntityTable;
+ public static String GenerateEntitiesWizardPage_entityNameColumn;
+ public static String GenerateEntitiesWizardPage_generateEntities;
+ public static String GenerateEntitiesWizardPage_synchronizeClasses;
+ public static String GenerateEntitiesWizardPage_tableColumn;
+ public static String GenerateEntitiesWizardPage_tables;
+ public static String GenericPlatformUiDialog_notSupportedMessageText;
+ public static String GenericPlatformUiDialog_notSupportedMessageTitle;
+ public static String JpaContent_label;
+ public static String JpaDetailsView_viewNotAvailable;
+ public static String JpaFacetWizardPage_addDriverLibraryLabel;
+ public static String JpaFacetWizardPage_connectionLabel;
+ public static String JpaFacetWizardPage_connectionLink;
+ public static String JpaFacetWizardPage_connectLink;
+ public static String JpaFacetWizardPage_connectedText;
+ public static String JpaFacetWizardPage_createOrmXmlButton;
+ public static String JpaFacetWizardPage_defaultCatalogLabel;
+ public static String JpaFacetWizardPage_defaultSchemaLabel;
+ public static String JpaFacetWizardPage_description;
+ public static String JpaFacetWizardPage_discoverClassesButton;
+ public static String JpaFacetWizardPage_driverLibraryLabel;
+ public static String JpaFacetWizardPage_facetsPageLink;
+ public static String JpaFacetWizardPage_metamodelSourceFolderLink;
+ public static String JpaFacetWizardPage_jpaImplementationLabel;
+ public static String JpaFacetWizardPage_jpaPrefsLink;
+ public static String JpaFacetWizardPage_listClassesButton;
+ public static String JpaFacetWizardPage_metamodelLabel;
+ public static String JpaFacetWizardPage_none;
+ public static String JpaFacetWizardPage_overrideDefaultCatalogLabel;
+ public static String JpaFacetWizardPage_overrideDefaultSchemaLabel;
+ public static String JpaFacetWizardPage_persistentClassManagementLabel;
+ public static String JpaFacetWizardPage_platformLabel;
+ public static String JpaFacetWizardPage_specifyLibLabel;
+ public static String JpaFacetWizardPage_title;
+ public static String JpaFacetWizardPage_userLibsLink;
+ public static String JpaFacetWizardPage_userServerLibLabel;
+ public static String JpaLibraryProviderInstallPanel_includeLibraries;
+ public static String JpaMakePersistentWizardPage_title;
+ public static String JpaMakePersistentWizardPage_message;
+ public static String JpaMakePersistentWizardPage_annotateInJavaRadioButton;
+ public static String JpaMakePersistentWizardPage_mappingFileRadioButton;
+ public static String JpaMakePersistentWizardPage_mappingFileLink;
+ public static String JpaMakePersistentWizardPage_mappingFileBrowseButton;
+ public static String JpaMakePersistentWizardPage_typeTableColumn;
+ public static String JpaMakePersistentWizardPage_mappingTableColumn;
+ public static String JpaMakePersistentWizardPage_listInPersistenceXmlCheckBox;
+ public static String JpaMakePersistentWizardPage_selectedTypesPersistentError;
+ public static String JpaMakePersistentWizardPage_mappingFileDoesNotExistError;
+ public static String JpaMakePersistentWizardPage_mappingFileNotListedInPersistenceXmlError;
+ public static String JpaStructureView_linkWithEditorDesc;
+ public static String JpaStructureView_linkWithEditorText;
+ public static String JpaStructureView_linkWithEditorTooltip;
+ public static String JpaStructureView_structureNotAvailable;
+ public static String JpaStructureView_numItemsSelected;
+ public static String MappingFileWizard_title;
+ public static String MappingFileWizardPage_newFile_title;
+ public static String MappingFileWizardPage_newFile_desc;
+ public static String MappingFileWizardPage_options_title;
+ public static String MappingFileWizardPage_options_desc;
+ public static String MappingFileWizardPage_projectLabel;
+ public static String MappingFileWizardPage_sourceFolderLabel;
+ public static String MappingFileWizardPage_filePathLabel;
+ public static String MappingFileWizardPage_accessLabel;
+ public static String MappingFileWizardPage_addToPersistenceUnitButton;
+ public static String MappingFileWizardPage_persistenceUnitLabel;
+ public static String MappingFileWizardPage_incorrectSourceFolderError;
+ public static String MappingFileWizardPage_accessLabel_sourceFolderDialogTitle;
+ public static String MappingFileWizardPage_accessLabel_sourceFolderDialogDesc;
+ public static String JpaProjectWizard_title;
+ public static String NewJpaProjectWizard_firstPage_description;
+ public static String NewJpaProjectWizard_firstPage_title;
+ public static String OrmItemLabelProviderFactory_entityMappingsLabel;
+ public static String OverwriteConfirmerDialog_text;
+ public static String OverwriteConfirmerDialog_title;
+ public static String PersistenceItemLabelProviderFactory_persistenceLabel;
+ public static String EntitiesGenerator_jobName;
+ public static String JpaPreferencesPage_Description;
+ public static String JpaProblemSeveritiesPage_Description;
+ public static String JpaProblemSeveritiesPage_Error;
+ public static String JpaProblemSeveritiesPage_Ignore;
+ public static String JpaProblemSeveritiesPage_Info;
+ public static String JpaProblemSeveritiesPage_Warning;
+ public static String SelectJpaOrmMappingFileDialog_newButton;
+
+
+ private static final String BUNDLE_NAME = "jpt_ui"; //$NON-NLS-1$
+ private static final Class<?> BUNDLE_CLASS = JptUiMessages.class;
+ static {
+ NLS.initializeMessages(BUNDLE_NAME, BUNDLE_CLASS);
+ }
+
+ private JptUiMessages() {
+ throw new UnsupportedOperationException();
+ }
+
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/JptUiValidationPreferenceMessages.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/JptUiValidationPreferenceMessages.java
new file mode 100644
index 0000000000..a9bfccf5a0
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/JptUiValidationPreferenceMessages.java
@@ -0,0 +1,220 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2010 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.ui.internal;
+
+import org.eclipse.osgi.util.NLS;
+
+public class JptUiValidationPreferenceMessages {
+
+ public static String PROJECT_LEVEL_CATEGORY;
+ public static String NO_JPA_PROJECT;
+ public static String PROJECT_NO_CONNECTION;
+ public static String PROJECT_INVALID_CONNECTION;
+ public static String PROJECT_INACTIVE_CONNECTION;
+ public static String PROJECT_NO_PERSISTENCE_XML;
+
+ public static String XML_VERSION_NOT_LATEST;
+
+ public static String PROJECT_MULTIPLE_PERSISTENCE_XML;
+ public static String PERSISTENCE_NO_PERSISTENCE_UNIT;
+ public static String PERSISTENCE_MULTIPLE_PERSISTENCE_UNITS;
+ public static String PERSISTENCE_XML_INVALID_CONTENT;
+
+ public static String PERSISTENCE_UNIT_LEVEL_CATEGORY;
+ public static String PERSISTENCE_UNIT_UNSPECIFIED_MAPPING_FILE;
+ public static String PERSISTENCE_UNIT_UNSUPPORTED_MAPPING_FILE_CONTENT;
+ public static String PERSISTENCE_UNIT_NONEXISTENT_MAPPING_FILE;
+ public static String PERSISTENCE_UNIT_INVALID_MAPPING_FILE;
+ public static String PERSISTENCE_UNIT_DUPLICATE_MAPPING_FILE;
+ public static String PERSISTENCE_UNIT_UNSPECIFIED_CLASS;
+ public static String PERSISTENCE_UNIT_NONEXISTENT_CLASS;
+ public static String PERSISTENCE_UNIT_INVALID_CLASS;
+ public static String PERSISTENCE_UNIT_DUPLICATE_CLASS;
+ public static String PERSISTENCE_UNIT_REDUNDANT_CLASS;
+ public static String PERSISTENCE_UNIT_DUPLICATE_JAR_FILE;
+ public static String PERSISTENCE_UNIT_UNSPECIFIED_JAR_FILE;
+ public static String PERSISTENCE_UNIT_JAR_FILE_DEPLOYMENT_PATH_WARNING;
+ public static String PERSISTENCE_UNIT_NONEXISTENT_JAR_FILE;
+ public static String MAPPING_FILE_EXTRANEOUS_PERSISTENCE_UNIT_METADATA;
+ public static String PERSISTENT_TYPE_MAPPED_BUT_NOT_INCLUDED_IN_PERSISTENCE_UNIT;
+ public static String PERSISTENT_TYPE_ANNOTATED_BUT_NOT_INCLUDED_IN_PERSISTENCE_UNIT;
+ public static String PERSISTENT_TYPE_UNSPECIFIED_CLASS;
+ public static String PERSISTENT_TYPE_UNRESOLVED_CLASS;
+
+ public static String TYPE_LEVEL_CATEGORY;
+ public static String ENTITY_NO_PK;
+ public static String ENTITY_SINGLE_TABLE_DESCENDANT_DEFINES_TABLE;
+ public static String ENTITY_ABSTRACT_TABLE_PER_CLASS_DEFINES_TABLE;
+ public static String ENTITY_ABSTRACT_DISCRIMINATOR_VALUE_DEFINED;
+ public static String ENTITY_TABLE_PER_CLASS_DISCRIMINATOR_VALUE_DEFINED;
+ public static String ENTITY_NON_ROOT_DISCRIMINATOR_COLUMN_DEFINED;
+ public static String ENTITY_TABLE_PER_CLASS_DISCRIMINATOR_COLUMN_DEFINED;
+ public static String TYPE_MAPPING_FINAL_CLASS;
+ public static String TYPE_MAPPING_MEMBER_CLASS;
+ public static String TYPE_MAPPING_CLASS_MISSING_NO_ARG_CONSTRUCTOR;
+ public static String TYPE_MAPPING_CLASS_PRIVATE_NO_ARG_CONSTRUCTOR;
+ public static String PERSISTENT_ATTRIBUTE_UNSPECIFIED_NAME;
+ public static String PERSISTENT_ATTRIBUTE_UNRESOLVED_NAME;
+ public static String PERSISTENT_ATTRIBUTE_INHERITED_ATTRIBUTES_NOT_SUPPORTED;
+ public static String PERSISTENT_ATTRIBUTE_INVALID_MAPPING;
+ public static String PERSISTENT_ATTRIBUTE_FINAL_FIELD;
+ public static String PERSISTENT_ATTRIBUTE_FINAL_GETTER;
+ public static String PERSISTENT_ATTRIBUTE_PUBLIC_FIELD;
+
+ public static String ATTRIBUTE_LEVEL_CATEGORY;
+ public static String MAPPING_UNRESOLVED_MAPPED_BY;
+ public static String MAPPING_INVALID_MAPPED_BY;
+ public static String MAPPING_MAPPED_BY_WITH_JOIN_TABLE;
+ public static String MAPPING_MAPPED_BY_ON_BOTH_SIDES;
+ public static String TARGET_ENTITY_NOT_DEFINED;
+ public static String TARGET_ENTITY_IS_NOT_AN_ENTITY;
+ public static String MAPS_ID_VALUE_NOT_SPECIFIED;
+ public static String MAPS_ID_VALUE_NOT_RESOLVED;
+ public static String MAPS_ID_VALUE_INVALID;
+ public static String ORDER_COLUMN_AND_ORDER_BY_BOTH_SPECIFIED;
+ public static String ELEMENT_COLLECTION_TARGET_CLASS_NOT_DEFINED;
+ public static String ELEMENT_COLLECTION_TARGET_CLASS_MUST_BE_EMBEDDABLE_OR_BASIC_TYPE;
+ public static String ELEMENT_COLLECTION_MAP_KEY_CLASS_NOT_DEFINED;
+
+ public static String DATABASE_CATEGORY;
+ public static String TABLE_CATEGORY;
+ public static String COLUMN_CATEGORY;
+ public static String OVERRIDES_CATEGORY;
+ public static String IMPLIED_ATTRIBUTE_LEVEL_CATEGORY;
+
+ public static String TABLE_UNRESOLVED_CATALOG;
+ public static String TABLE_UNRESOLVED_SCHEMA;
+ public static String TABLE_UNRESOLVED_NAME;
+ public static String SECONDARY_TABLE_UNRESOLVED_CATALOG;
+ public static String SECONDARY_TABLE_UNRESOLVED_SCHEMA;
+ public static String SECONDARY_TABLE_UNRESOLVED_NAME;
+ public static String JOIN_TABLE_UNRESOLVED_CATALOG;
+ public static String JOIN_TABLE_UNRESOLVED_SCHEMA;
+ public static String JOIN_TABLE_UNRESOLVED_NAME;
+ public static String COLUMN_TABLE_NOT_VALID;
+ public static String COLUMN_UNRESOLVED_TABLE;
+ public static String COLUMN_UNRESOLVED_NAME;
+ public static String JOIN_COLUMN_TABLE_NOT_VALID;
+ public static String JOIN_COLUMN_UNRESOLVED_NAME;
+ public static String JOIN_COLUMN_NAME_MUST_BE_SPECIFIED_MULTIPLE_JOIN_COLUMNS;
+ public static String JOIN_COLUMN_UNRESOLVED_REFERENCED_COLUMN_NAME;
+ public static String JOIN_COLUMN_REFERENCED_COLUMN_NAME_MUST_BE_SPECIFIED_MULTIPLE_JOIN_COLUMNS;
+ public static String INVERSE_JOIN_COLUMN_TABLE_NOT_VALID;
+ public static String INVERSE_JOIN_COLUMN_UNRESOLVED_NAME;
+ public static String INVERSE_JOIN_COLUMN_NAME_MUST_BE_SPECIFIED_MULTIPLE_JOIN_COLUMNS;
+ public static String INVERSE_JOIN_COLUMN_UNRESOLVED_REFERENCED_COLUMN_NAME;
+ public static String INVERSE_JOIN_COLUMN_REFERENCED_COLUMN_NAME_MUST_BE_SPECIFIED_MULTIPLE_JOIN_COLUMNS;
+ public static String PRIMARY_KEY_JOIN_COLUMN_UNRESOLVED_NAME;
+ public static String PRIMARY_KEY_JOIN_COLUMN_UNRESOLVED_REFERENCED_COLUMN_NAME;
+ public static String PRIMARY_KEY_JOIN_COLUMN_NAME_MUST_BE_SPECIFIED_MULTIPLE_JOIN_COLUMNS;
+ public static String PRIMARY_KEY_JOIN_COLUMN_REFERENCED_COLUMN_NAME_MUST_BE_SPECIFIED_MULTIPLE_JOIN_COLUMNS;
+ public static String VIRTUAL_PRIMARY_KEY_JOIN_COLUMN_UNRESOLVED_NAME;
+ public static String VIRTUAL_PRIMARY_KEY_JOIN_COLUMN_NAME_MUST_BE_SPECIFIED_MULTIPLE_JOIN_COLUMNS;
+ public static String VIRTUAL_PRIMARY_KEY_JOIN_COLUMN_UNRESOLVED_REFERENCED_COLUMN_NAME;
+ public static String VIRTUAL_PRIMARY_KEY_JOIN_COLUMN_REFERENCED_COLUMN_NAME_MUST_BE_SPECIFIED_MULTIPLE_JOIN_COLUMNS;
+ public static String VIRTUAL_SECONDARY_TABLE_PRIMARY_KEY_JOIN_COLUMN_UNRESOLVED_NAME;
+ public static String VIRTUAL_SECONDARY_TABLE_PRIMARY_KEY_JOIN_COLUMN_UNRESOLVED_REFERENCED_COLUMN_NAME;
+ public static String VIRTUAL_SECONDARY_TABLE_PRIMARY_KEY_JOIN_COLUMN_NAME_MUST_BE_SPECIFIED_MULTIPLE_JOIN_COLUMNS;
+ public static String VIRTUAL_SECONDARY_TABLE_PRIMARY_KEY_JOIN_COLUMN_REFERENCED_COLUMN_NAME_MUST_BE_SPECIFIED_MULTIPLE_JOIN_COLUMNS;
+ public static String MAP_KEY_COLUMN_TABLE_NOT_VALID;
+ public static String VIRTUAL_MAP_KEY_ATTRIBUTE_OVERRIDE_COLUMN_TABLE_NOT_VALID;
+
+ public static String COLLECTION_TABLE_UNRESOLVED_CATALOG;
+ public static String COLLECTION_TABLE_UNRESOLVED_SCHEMA;
+ public static String COLLECTION_TABLE_UNRESOLVED_NAME;
+ public static String ORDER_COLUMN_UNRESOLVED_NAME;
+
+ public static String VIRTUAL_ATTRIBUTE_JOIN_TABLE_UNRESOLVED_CATALOG;
+ public static String VIRTUAL_ATTRIBUTE_JOIN_TABLE_UNRESOLVED_SCHEMA;
+ public static String VIRTUAL_ATTRIBUTE_JOIN_TABLE_UNRESOLVED_NAME;
+ public static String ATTRIBUTE_OVERRIDE_INVALID_NAME;
+ public static String ASSOCIATION_OVERRIDE_INVALID_NAME;
+ public static String VIRTUAL_ATTRIBUTE_OVERRIDE_INVALID_NAME;
+ public static String VIRTUAL_ASSOCIATION_OVERRIDE_INVALID_NAME;
+ public static String VIRTUAL_MAP_KEY_ATTRIBUTE_OVERRIDE_INVALID_NAME;
+ public static String VIRTUAL_ATTRIBUTE_ATTRIBUTE_OVERRIDE_INVALID_NAME;
+ public static String VIRTUAL_ATTRIBUTE_ASSOCIATION_OVERRIDE_INVALID_NAME;
+ public static String VIRTUAL_ATTRIBUTE_MAP_KEY_ATTRIBUTE_OVERRIDE_INVALID_NAME;
+ public static String VIRTUAL_ATTRIBUTE_OVERRIDE_COLUMN_TABLE_NOT_VALID;
+ public static String VIRTUAL_ATTRIBUTE_ATTRIBUTE_OVERRIDE_COLUMN_TABLE_NOT_VALID;
+ public static String VIRTUAL_ATTRIBUTE_COLUMN_TABLE_NOT_VALID;
+ public static String VIRTUAL_ATTRIBUTE_ATTRIBUTE_OVERRIDE_COLUMN_UNRESOLVED_NAME;
+ public static String VIRTUAL_ATTRIBUTE_COLUMN_UNRESOLVED_NAME;
+ public static String VIRTUAL_ATTRIBUTE_OVERRIDE_COLUMN_UNRESOLVED_NAME;
+ public static String VIRTUAL_ATTRIBUTE_JOIN_COLUMN_UNRESOLVED_TABLE;
+ public static String VIRTUAL_ATTRIBUTE_JOIN_COLUMN_UNRESOLVED_NAME;
+ public static String VIRTUAL_ATTRIBUTE_JOIN_COLUMN_NAME_MUST_BE_SPECIFIED_MULTIPLE_JOIN_COLUMNS;
+ public static String VIRTUAL_ATTRIBUTE_JOIN_COLUMN_UNRESOLVED_REFERENCED_COLUMN_NAME;
+ public static String VIRTUAL_ATTRIBUTE_JOIN_COLUMN_REFERENCED_COLUMN_NAME_MUST_BE_SPECIFIED_MULTIPLE_JOIN_COLUMNS;
+ public static String VIRTUAL_ATTRIBUTE_TARGET_ENTITY_IS_NOT_AN_ENTITY;
+ public static String VIRTUAL_ATTRIBUTE_TARGET_ENTITY_NOT_DEFINED;
+ public static String VIRTUAL_ATTRIBUTE_COLLECTION_TABLE_UNRESOLVED_CATALOG;
+ public static String VIRTUAL_ATTRIBUTE_COLLECTION_TABLE_UNRESOLVED_SCHEMA;
+ public static String VIRTUAL_ATTRIBUTE_COLLECTION_TABLE_UNRESOLVED_NAME;
+ public static String VIRTUAL_ATTRIBUTE_ORDER_COLUMN_UNRESOLVED_NAME;
+ public static String VIRTUAL_ATTRIBUTE_ELEMENT_COLLECTION_TARGET_CLASS_NOT_DEFINED;
+ public static String VIRTUAL_ATTRIBUTE_ELEMENT_COLLECTION_TARGET_CLASS_MUST_BE_EMBEDDABLE_OR_BASIC_TYPE;
+ public static String VIRTUAL_ATTRIBUTE_ELEMENT_COLLECTION_MAP_KEY_CLASS_NOT_DEFINED;
+ public static String VIRTUAL_ATTRIBUTE_JOIN_COLUMN_TABLE_NOT_VALID;
+ public static String VIRTUAL_ATTRIBUTE_INVERSE_JOIN_COLUMN_TABLE_NOT_VALID;
+ public static String VIRTUAL_ATTRIBUTE_INVERSE_JOIN_COLUMN_UNRESOLVED_NAME;
+ public static String VIRTUAL_ATTRIBUTE_INVERSE_JOIN_COLUMN_NAME_MUST_BE_SPECIFIED_MULTIPLE_JOIN_COLUMNS;
+ public static String VIRTUAL_ATTRIBUTE_INVERSE_JOIN_COLUMN_UNRESOLVED_REFERENCED_COLUMN_NAME;
+ public static String VIRTUAL_ATTRIBUTE_INVERSE_JOIN_COLUMN_REFERENCED_COLUMN_NAME_MUST_BE_SPECIFIED_MULTIPLE_JOIN_COLUMNS;
+ public static String VIRTUAL_ATTRIBUTE_MAP_KEY_COLUMN_TABLE_NOT_VALID;
+ public static String VIRTUAL_ATTRIBUTE_MAP_KEY_ATTRIBUTE_OVERRIDE_COLUMN_TABLE_NOT_VALID;
+
+ public static String VIRTUAL_ASSOCIATION_OVERRIDE_JOIN_TABLE_UNRESOLVED_CATALOG;
+ public static String VIRTUAL_ASSOCIATION_OVERRIDE_JOIN_TABLE_UNRESOLVED_SCHEMA;
+ public static String VIRTUAL_ASSOCIATION_OVERRIDE_JOIN_TABLE_UNRESOLVED_NAME;
+ public static String VIRTUAL_ASSOCIATION_OVERRIDE_JOIN_COLUMN_UNRESOLVED_NAME;
+ public static String VIRTUAL_ASSOCIATION_OVERRIDE_JOIN_COLUMN_UNRESOLVED_REFERENCED_COLUMN_NAME;
+ public static String VIRTUAL_ASSOCIATION_OVERRIDE_JOIN_COLUMN_TABLE_NOT_VALID;
+ public static String VIRTUAL_ASSOCIATION_OVERRIDE_JOIN_COLUMN_NAME_MUST_BE_SPECIFIED_MULTIPLE_JOIN_COLUMNS;
+ public static String VIRTUAL_ASSOCIATION_OVERRIDE_JOIN_COLUMN_REFERENCED_COLUMN_NAME_MUST_BE_SPECIFIED_MULTIPLE_JOIN_COLUMNS;
+ public static String VIRTUAL_ASSOCIATION_OVERRIDE_INVERSE_JOIN_COLUMN_UNRESOLVED_NAME;
+ public static String VIRTUAL_ASSOCIATION_OVERRIDE_INVERSE_JOIN_COLUMN_UNRESOLVED_REFERENCED_COLUMN_NAME;
+ public static String VIRTUAL_ASSOCIATION_OVERRIDE_INVERSE_JOIN_COLUMN_TABLE_NOT_VALID;
+ public static String VIRTUAL_ASSOCIATION_OVERRIDE_INVERSE_JOIN_COLUMN_NAME_MUST_BE_SPECIFIED_MULTIPLE_INVERSE_JOIN_COLUMNS;
+ public static String VIRTUAL_ASSOCIATION_OVERRIDE_INVERSE_JOIN_COLUMN_REFERENCED_COLUMN_NAME_MUST_BE_SPECIFIED_MULTIPLE_INVERSE_JOIN_COLUMNS;
+ public static String VIRTUAL_ATTRIBUTE_ASSOCIATION_OVERRIDE_JOIN_COLUMN_TABLE_NOT_VALID;
+ public static String VIRTUAL_ATTRIBUTE_ASSOCIATION_OVERRIDE_JOIN_COLUMN_UNRESOLVED_NAME;
+ public static String VIRTUAL_ATTRIBUTE_ASSOCIATION_OVERRIDE_JOIN_COLUMN_REFERENCED_COLUMN_UNRESOLVED_NAME;
+ public static String VIRTUAL_ATTRIBUTE_ASSOCIATION_OVERRIDE_JOIN_COLUMN_NAME_MUST_BE_SPECIFIED_MULTIPLE_JOIN_COLUMNS;
+ public static String VIRTUAL_ATTRIBUTE_ASSOCIATION_OVERRIDE_JOIN_COLUMN_REFERENCED_COLUMN_NAME_MUST_BE_SPECIFIED_MULTIPLE_JOIN_COLUMNS;
+ public static String VIRTUAL_ATTRIBUTE_ASSOCIATION_OVERRIDE_INVERSE_JOIN_COLUMN_TABLE_NOT_VALID;
+ public static String VIRTUAL_ATTRIBUTE_ASSOCIATION_OVERRIDE_INVERSE_JOIN_COLUMN_UNRESOLVED_NAME;
+ public static String VIRTUAL_ATTRIBUTE_ASSOCIATION_OVERRIDE_INVERSE_JOIN_COLUMN_REFERENCED_COLUMN_UNRESOLVED_NAME;
+ public static String VIRTUAL_ATTRIBUTE_ASSOCIATION_OVERRIDE_INVERSE_JOIN_COLUMN_NAME_MUST_BE_SPECIFIED_MULTIPLE_INVERSE_JOIN_COLUMNS;
+ public static String VIRTUAL_ATTRIBUTE_ASSOCIATION_OVERRIDE_INVERSE_JOIN_COLUMN_REFERENCED_COLUMN_NAME_MUST_BE_SPECIFIED_MULTIPLE_INVERSE_JOIN_COLUMNS;
+
+ public static String INHERITANCE_CATEGORY;
+ public static String DISCRIMINATOR_COLUMN_UNRESOLVED_NAME;
+ public static String ENTITY_TABLE_PER_CLASS_NOT_SUPPORTED_ON_PLATFORM;
+ public static String ENTITY_TABLE_PER_CLASS_NOT_PORTABLE_ON_PLATFORM;
+
+ public static String QUERIES_GENERATORS_CATEGORY;
+ public static String GENERATOR_DUPLICATE_NAME;
+ public static String ID_MAPPING_UNRESOLVED_GENERATOR_NAME;
+ public static String GENERATED_VALUE_UNRESOLVED_GENERATOR;
+ public static String QUERY_DUPLICATE_NAME;
+
+ private static final String BUNDLE_NAME = "jpt_ui_validation_preferences"; //$NON-NLS-1$
+ private static final Class<?> BUNDLE_CLASS = JptUiValidationPreferenceMessages.class;
+ static {
+ NLS.initializeMessages(BUNDLE_NAME, BUNDLE_CLASS);
+ }
+
+ private JptUiValidationPreferenceMessages() {
+ throw new UnsupportedOperationException();
+ }
+
+
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/actions/GenerateDDLAction.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/actions/GenerateDDLAction.java
new file mode 100644
index 0000000000..f6aca3be2b
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/actions/GenerateDDLAction.java
@@ -0,0 +1,27 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 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.ui.internal.actions;
+
+import org.eclipse.jpt.jpa.core.JpaProject;
+
+/**
+ * GenerateDDLAction
+ */
+public class GenerateDDLAction extends ProjectAction {
+
+ public GenerateDDLAction() {
+ super();
+ }
+
+ @Override
+ protected void execute(JpaProject project) {
+ this.getJpaPlatformUi(project).generateDDL(project, this.getCurrentSelection());
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/actions/GenerateEntitiesAction.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/actions/GenerateEntitiesAction.java
new file mode 100644
index 0000000000..383633831a
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/actions/GenerateEntitiesAction.java
@@ -0,0 +1,26 @@
+/*******************************************************************************
+* Copyright (c) 2007, 2009 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.ui.internal.actions;
+
+import org.eclipse.jpt.jpa.core.JpaProject;
+
+/**
+ * GenerateEntitiesAction
+ */
+public class GenerateEntitiesAction extends ProjectAction {
+ public GenerateEntitiesAction() {
+ super();
+ }
+
+ @Override
+ protected void execute(JpaProject project) {
+ this.getJpaPlatformUi(project).generateEntities(project, this.getCurrentSelection());
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/actions/MakePersistentAction.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/actions/MakePersistentAction.java
new file mode 100644
index 0000000000..4fcf0b4caf
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/actions/MakePersistentAction.java
@@ -0,0 +1,145 @@
+/*******************************************************************************
+* Copyright (c) 2010 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.ui.internal.actions;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.jdt.core.ICompilationUnit;
+import org.eclipse.jdt.core.IJavaElement;
+import org.eclipse.jdt.core.IPackageFragment;
+import org.eclipse.jdt.core.IPackageFragmentRoot;
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.wizard.WizardDialog;
+import org.eclipse.jpt.jpa.ui.JptJpaUiPlugin;
+import org.eclipse.jpt.jpa.ui.internal.wizards.JpaMakePersistentWizard;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.IObjectActionDelegate;
+import org.eclipse.ui.IWorkbenchPart;
+
+
+public class MakePersistentAction implements IObjectActionDelegate {
+
+
+ private Map<IProject, List<IType>> selectedTypes;
+
+ public MakePersistentAction() {
+ super();
+ }
+
+ public void setActivePart(IAction action, IWorkbenchPart targetPart) {
+ // do nothing
+ }
+
+ public void selectionChanged(IAction action, ISelection selection) {
+ // Action is contributed for IType, ICompilationUnit, IPackageFragment, and IPackageFragmentRoot that is a source folder
+ this.selectedTypes = this.buildSelectedTypes((StructuredSelection) selection);
+ }
+
+ protected Map<IProject, List<IType>> buildSelectedTypes(StructuredSelection structuredSelection) {
+ Map<IProject, List<IType>> types = new HashMap<IProject, List<IType>>();
+
+ for (Object selection : structuredSelection.toList()) {
+ switch (((IJavaElement) selection).getElementType()) {
+ case IJavaElement.TYPE :
+ addSelectedType((IType) selection, types);
+ break;
+ case IJavaElement.COMPILATION_UNIT :
+ addSelectedType((ICompilationUnit) selection, types);
+ break;
+ case IJavaElement.PACKAGE_FRAGMENT :
+ addSelectedType((IPackageFragment) selection, types);
+ break;
+ case IJavaElement.PACKAGE_FRAGMENT_ROOT :
+ addSelectedType((IPackageFragmentRoot) selection, types);
+ break;
+ default :
+ break;
+ }
+ }
+ return types;
+ }
+
+ private void addSelectedType(IPackageFragmentRoot packageFragmentRoot, Map<IProject, List<IType>> types) {
+ for (IJavaElement pkgFragment : getPackageFragments(packageFragmentRoot)) {
+ addSelectedType((IPackageFragment) pkgFragment, types);
+ }
+ }
+
+ private void addSelectedType(IPackageFragment packageFragment, Map<IProject, List<IType>> types) {
+ for (ICompilationUnit compUnit : getCompilationUnits(packageFragment)) {
+ addSelectedType(compUnit, types);
+ }
+ }
+
+ private void addSelectedType(ICompilationUnit compilationUnit, Map<IProject, List<IType>> types) {
+ IType primaryType = this.getPrimaryType(compilationUnit);
+ if (primaryType != null) {
+ this.addSelectedType(primaryType, types);
+ }
+ }
+
+ private void addSelectedType(IType primaryType, Map<IProject, List<IType>> typesMap) {
+ IProject project = primaryType.getJavaProject().getProject();
+ List<IType> types = typesMap.get(project);
+ if (types == null) {
+ types = new ArrayList<IType>();
+ typesMap.put(project, types);
+ }
+ if (!types.contains(primaryType)) {
+ types.add(primaryType);
+ }
+ }
+
+ private ICompilationUnit[] getCompilationUnits(IPackageFragment packageFragment) {
+ try {
+ return packageFragment.getCompilationUnits();
+ }
+ catch (JavaModelException e) {
+ JptJpaUiPlugin.log(e);
+ }
+ return new ICompilationUnit[0];
+ }
+
+ private IJavaElement[] getPackageFragments(IPackageFragmentRoot packageFragmentRoot) {
+ try {
+ return packageFragmentRoot.getChildren();
+ }
+ catch (JavaModelException e) {
+ JptJpaUiPlugin.log(e);
+ }
+ return new IJavaElement[0];
+ }
+
+ private IType getPrimaryType(ICompilationUnit compilationUnit) {
+ return compilationUnit.findPrimaryType();
+ }
+
+ public void run(IAction action) {
+ for (List<IType> types : this.selectedTypes.values()) {
+ //open the wizard once for each selected project
+ JpaMakePersistentWizard wizard = new JpaMakePersistentWizard(types);
+ WizardDialog dialog = new WizardDialog(this.getCurrentShell(), wizard);
+ dialog.create();
+ dialog.open();
+ }
+ }
+
+ private Shell getCurrentShell() {
+ return Display.getCurrent().getActiveShell();
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/actions/OpenJpaResourceAction.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/actions/OpenJpaResourceAction.java
new file mode 100644
index 0000000000..b9c222d0c9
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/actions/OpenJpaResourceAction.java
@@ -0,0 +1,101 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2009 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.ui.internal.actions;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.content.IContentType;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jpt.jpa.core.JpaStructureNode;
+import org.eclipse.jpt.jpa.core.context.JpaContextNode;
+import org.eclipse.jpt.jpa.core.context.JpaRootContextNode;
+import org.eclipse.jpt.jpa.ui.internal.JptUiMessages;
+import org.eclipse.jpt.jpa.ui.internal.selection.DefaultJpaSelection;
+import org.eclipse.jpt.jpa.ui.internal.selection.JpaSelectionManager;
+import org.eclipse.jpt.jpa.ui.internal.selection.SelectionManagerFactory;
+import org.eclipse.ui.IEditorDescriptor;
+import org.eclipse.ui.IEditorRegistry;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.actions.BaseSelectionListenerAction;
+import org.eclipse.ui.ide.IDE;
+import org.eclipse.ui.part.FileEditorInput;
+
+public class OpenJpaResourceAction extends BaseSelectionListenerAction
+{
+ private JpaContextNode selectedNode;
+
+
+ public OpenJpaResourceAction() {
+ super("Open"); //$NON-NLS-1$
+ }
+
+
+ @Override
+ public boolean updateSelection(IStructuredSelection s) {
+ selectedNode = null;
+
+ if (! super.updateSelection(s)) {
+ return false;
+ }
+
+ if (s.size() != 1) {
+ return false;
+ }
+
+ if (s.getFirstElement() instanceof JpaRootContextNode) {
+ return false;
+ }
+
+ selectedNode = (JpaContextNode) s.getFirstElement();
+
+ return true;
+ }
+
+ @Override
+ public void run() {
+ if (! isEnabled()) {
+ return;
+ }
+
+ IResource resource = selectedNode.getResource();
+
+ if (resource != null && resource.exists() && resource.getType() == IResource.FILE) {
+ openEditor((IFile) resource);
+
+
+ if (selectedNode instanceof JpaStructureNode) {
+ JpaSelectionManager selectionManager =
+ SelectionManagerFactory.getSelectionManager(PlatformUI.getWorkbench().getActiveWorkbenchWindow());
+ selectionManager.select(new DefaultJpaSelection((JpaStructureNode) selectedNode), null);
+ }
+ }
+ }
+
+ protected void openEditor(IFile file) {
+ IEditorRegistry registry = PlatformUI.getWorkbench().getEditorRegistry();
+ IContentType contentType = IDE.getContentType(file);
+ IEditorDescriptor editorDescriptor = registry.getDefaultEditor(file.getName(), contentType);
+ if (editorDescriptor == null) {
+ return; // no editor associated...
+ }
+
+ IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
+
+ try {
+ page.openEditor(new FileEditorInput(file), editorDescriptor.getId());
+ }
+ catch (Exception e) {
+ MessageDialog.openError(page.getWorkbenchWindow().getShell(), JptUiMessages.Error_openingEditor, e.getMessage());
+ }
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/actions/ProjectAction.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/actions/ProjectAction.java
new file mode 100644
index 0000000000..a91b6381f2
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/actions/ProjectAction.java
@@ -0,0 +1,94 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2009 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.ui.internal.actions;
+
+import java.util.Iterator;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jpt.jpa.core.JpaProject;
+import org.eclipse.jpt.jpa.core.JptJpaCorePlugin;
+import org.eclipse.jpt.jpa.ui.JpaPlatformUi;
+import org.eclipse.jpt.jpa.ui.internal.platform.JpaPlatformUiRegistry;
+import org.eclipse.ui.IObjectActionDelegate;
+import org.eclipse.ui.IWorkbenchPart;
+
+/**
+ * Override any of the #execute() methods.
+ */
+public abstract class ProjectAction implements IObjectActionDelegate {
+
+ private ISelection currentSelection;
+
+
+ public ProjectAction() {
+ super();
+ }
+
+ public void setActivePart(IAction action, IWorkbenchPart targetPart) {
+ // do nothing
+ }
+
+ public void selectionChanged(IAction action, ISelection selection) {
+ this.currentSelection = selection;
+ }
+
+ protected IStructuredSelection getCurrentSelection() {
+ if (this.currentSelection instanceof IStructuredSelection) {
+ return (IStructuredSelection) this.currentSelection;
+ }
+ return null;
+ }
+
+ public void run(IAction action) {
+ if (this.currentSelection instanceof IStructuredSelection) {
+ for (Iterator stream = ((IStructuredSelection) this.currentSelection).iterator(); stream.hasNext(); ) {
+ this.execute(stream.next());
+ }
+ }
+ }
+
+ protected void execute(Object selection) {
+ IProject project = this.projectFromSelection(selection);
+ if (project != null) {
+ this.execute(project);
+ }
+ }
+
+ protected IProject projectFromSelection(Object selection) {
+ if (selection instanceof IProject) {
+ return (IProject) selection;
+ }
+ if (selection instanceof IJavaProject) {
+ return ((IJavaProject) selection).getProject();
+ }
+ return null;
+ }
+
+ protected JpaPlatformUi getJpaPlatformUi(JpaProject project) {
+ String coreJpaPlatformId = project.getJpaPlatform().getId();
+ return JpaPlatformUiRegistry.instance().getJpaPlatformUi(coreJpaPlatformId);
+ }
+
+ protected void execute(IProject project) {
+ JpaProject jpaProject = JptJpaCorePlugin.getJpaProject(project);
+ if (jpaProject == null) {
+ return;
+ }
+ this.execute(jpaProject);
+ }
+
+ protected void execute(JpaProject project) {
+ throw new UnsupportedOperationException();
+ }
+
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/actions/SynchronizeClassesAction.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/actions/SynchronizeClassesAction.java
new file mode 100644
index 0000000000..9f16d7a440
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/actions/SynchronizeClassesAction.java
@@ -0,0 +1,49 @@
+/*******************************************************************************
+ * 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.jpa.ui.internal.actions;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jpt.jpa.core.context.persistence.PersistenceXml;
+import org.eclipse.jpt.jpa.core.internal.synch.SynchronizeClassesJob;
+import org.eclipse.ui.IObjectActionDelegate;
+import org.eclipse.ui.IWorkbenchPart;
+
+public class SynchronizeClassesAction
+ implements IObjectActionDelegate
+{
+ private IFile file;
+
+ public void setActivePart(IAction action, IWorkbenchPart targetPart) {
+ // no-op for now
+ }
+
+ public void run(IAction action) {
+ SynchronizeClassesJob job = new SynchronizeClassesJob(file);
+ job.schedule();
+ }
+
+ public void selectionChanged(IAction action, ISelection selection) {
+ // Action is contributed for IFile's named "persistence.xml" and
+ // for PeristenceXml objects.
+ // There is always only one element in actual selection.
+ Object selectedObject = ((StructuredSelection) selection).getFirstElement();
+
+ if (selectedObject instanceof IFile) {
+ file = (IFile) selectedObject;
+ }
+ else if (selectedObject instanceof PersistenceXml) {
+ file = (IFile) ((PersistenceXml) selectedObject).getResource();
+ }
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/commands/AddPersistentAttributeToXmlAndMapHandler.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/commands/AddPersistentAttributeToXmlAndMapHandler.java
new file mode 100644
index 0000000000..9507ee9bad
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/commands/AddPersistentAttributeToXmlAndMapHandler.java
@@ -0,0 +1,69 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2010 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.ui.internal.commands;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jpt.common.utility.internal.CollectionTools;
+import org.eclipse.jpt.jpa.core.context.orm.OrmPersistentType;
+import org.eclipse.jpt.jpa.core.context.orm.OrmReadOnlyPersistentAttribute;
+import org.eclipse.jpt.jpa.ui.internal.dialogs.AddPersistentAttributeToXmlAndMapDialog;
+import org.eclipse.jpt.jpa.ui.internal.selection.DefaultJpaSelection;
+import org.eclipse.jpt.jpa.ui.internal.selection.JpaSelectionManager;
+import org.eclipse.jpt.jpa.ui.internal.selection.SelectionManagerFactory;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.handlers.HandlerUtil;
+
+public class AddPersistentAttributeToXmlAndMapHandler extends AbstractHandler
+{
+ @SuppressWarnings("unchecked")
+ public Object execute(ExecutionEvent executionEvent) throws ExecutionException {
+ final IWorkbenchWindow window =
+ HandlerUtil.getActiveWorkbenchWindowChecked(executionEvent);
+
+ final List<OrmReadOnlyPersistentAttribute> newAttributes = new ArrayList<OrmReadOnlyPersistentAttribute>();
+
+ IStructuredSelection selection
+ = (IStructuredSelection) HandlerUtil.getCurrentSelectionChecked(executionEvent);
+
+
+ // only applies for multiply selected OrmReadOnlyPersistentAttribute objects in a tree
+ for (OrmReadOnlyPersistentAttribute attribute : (Iterable<OrmReadOnlyPersistentAttribute>) CollectionTools.iterable(selection.iterator())) {
+ OrmPersistentType type = attribute.getOwningPersistentType();
+ String attributeName = attribute.getName();
+
+ AddPersistentAttributeToXmlAndMapDialog dialog = new AddPersistentAttributeToXmlAndMapDialog(window.getShell(), attribute);
+ dialog.create();
+ dialog.setBlockOnOpen(true);
+ dialog.open();
+
+ OrmReadOnlyPersistentAttribute newAttribute = type.getAttributeNamed(attributeName);
+ if (newAttribute != null) {
+ newAttributes.add(newAttribute);
+ }
+ }
+
+ if (newAttributes.size() == 1) {
+ window.getShell().getDisplay().asyncExec(
+ new Runnable() {
+ public void run() {
+ JpaSelectionManager selectionManager = SelectionManagerFactory.getSelectionManager(window);
+ selectionManager.select(new DefaultJpaSelection(newAttributes.get(0)), null);
+ }
+ });
+ }
+
+ return null;
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/commands/AddPersistentAttributeToXmlHandler.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/commands/AddPersistentAttributeToXmlHandler.java
new file mode 100644
index 0000000000..7880e2371d
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/commands/AddPersistentAttributeToXmlHandler.java
@@ -0,0 +1,56 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2010 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.ui.internal.commands;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jpt.common.utility.internal.CollectionTools;
+import org.eclipse.jpt.jpa.core.context.orm.OrmReadOnlyPersistentAttribute;
+import org.eclipse.jpt.jpa.ui.internal.selection.DefaultJpaSelection;
+import org.eclipse.jpt.jpa.ui.internal.selection.JpaSelectionManager;
+import org.eclipse.jpt.jpa.ui.internal.selection.SelectionManagerFactory;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.handlers.HandlerUtil;
+
+public class AddPersistentAttributeToXmlHandler extends AbstractHandler
+{
+ @SuppressWarnings("unchecked")
+ public Object execute(ExecutionEvent executionEvent) throws ExecutionException {
+ final IWorkbenchWindow window =
+ HandlerUtil.getActiveWorkbenchWindowChecked(executionEvent);
+
+ final List<OrmReadOnlyPersistentAttribute> newAttributes = new ArrayList<OrmReadOnlyPersistentAttribute>();
+
+ IStructuredSelection selection =
+ (IStructuredSelection) HandlerUtil.getCurrentSelectionChecked(executionEvent);
+
+ // only applies for multiply selected OrmReadOnlyPersistentAttribute objects in a tree
+ for (OrmReadOnlyPersistentAttribute attribute : (Iterable<OrmReadOnlyPersistentAttribute>) CollectionTools.iterable(selection.iterator())) {
+ newAttributes.add(attribute.convertToSpecified());
+ }
+
+ if (newAttributes.size() == 1) {
+ window.getShell().getDisplay().asyncExec(
+ new Runnable() {
+ public void run() {
+ JpaSelectionManager selectionManager = SelectionManagerFactory.getSelectionManager(window);
+ selectionManager.select(new DefaultJpaSelection(newAttributes.get(0)), null);
+ }
+ });
+ }
+
+ return null;
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/commands/AddPersistentClassHandler.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/commands/AddPersistentClassHandler.java
new file mode 100644
index 0000000000..1068d7fd75
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/commands/AddPersistentClassHandler.java
@@ -0,0 +1,57 @@
+/*******************************************************************************
+ * Copyright (c) 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.jpa.ui.internal.commands;
+
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jpt.jpa.core.context.orm.EntityMappings;
+import org.eclipse.jpt.jpa.core.context.orm.OrmPersistentType;
+import org.eclipse.jpt.jpa.ui.internal.dialogs.AddPersistentClassDialog;
+import org.eclipse.jpt.jpa.ui.internal.selection.DefaultJpaSelection;
+import org.eclipse.jpt.jpa.ui.internal.selection.JpaSelectionManager;
+import org.eclipse.jpt.jpa.ui.internal.selection.SelectionManagerFactory;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.handlers.HandlerUtil;
+
+public class AddPersistentClassHandler extends AbstractHandler
+{
+ public Object execute(ExecutionEvent executionEvent) throws ExecutionException {
+ final IWorkbenchWindow window =
+ HandlerUtil.getActiveWorkbenchWindowChecked(executionEvent);
+
+ IStructuredSelection selection
+ = (IStructuredSelection) HandlerUtil.getCurrentSelectionChecked(executionEvent);
+
+ // only applies for a singly selected EntityMappings object in a tree
+ EntityMappings entityMappings =
+ (EntityMappings) selection.getFirstElement();
+
+ AddPersistentClassDialog dialog =
+ new AddPersistentClassDialog(window.getShell(), entityMappings);
+ dialog.create();
+ dialog.setBlockOnOpen(true);
+ final OrmPersistentType type = dialog.openAndReturnType();
+
+ if (type != null) {
+ window.getShell().getDisplay().asyncExec(
+ new Runnable() {
+ public void run() {
+ JpaSelectionManager selectionManager = SelectionManagerFactory.getSelectionManager(window);
+ selectionManager.select(new DefaultJpaSelection(type), null);
+ }
+ });
+ }
+
+ return null;
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/commands/ConvertJavaProjectToJpaCommandHandler.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/commands/ConvertJavaProjectToJpaCommandHandler.java
new file mode 100644
index 0000000000..66f9eaaefb
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/commands/ConvertJavaProjectToJpaCommandHandler.java
@@ -0,0 +1,158 @@
+/*******************************************************************************
+ * Copyright (c) 2010 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.ui.internal.commands;
+
+import static org.eclipse.wst.common.project.facet.core.util.internal.FileUtil.*;
+import java.lang.reflect.InvocationTargetException;
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IProjectDescription;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.SubProgressMonitor;
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.dialogs.ProgressMonitorDialog;
+import org.eclipse.jface.operation.IRunnableWithProgress;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.wizard.WizardDialog;
+import org.eclipse.jpt.common.utility.internal.ArrayTools;
+import org.eclipse.jpt.jpa.core.JpaFacet;
+import org.eclipse.jpt.jpa.ui.JptJpaUiPlugin;
+import org.eclipse.jpt.jpa.ui.internal.JptUiMessages;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.handlers.HandlerUtil;
+import org.eclipse.wst.common.project.facet.core.IFacetedProject;
+import org.eclipse.wst.common.project.facet.core.IFacetedProjectWorkingCopy;
+import org.eclipse.wst.common.project.facet.core.ProjectFacetsManager;
+import org.eclipse.wst.common.project.facet.core.internal.FacetedProjectNature;
+import org.eclipse.wst.common.project.facet.ui.ModifyFacetedProjectWizard;
+
+public class ConvertJavaProjectToJpaCommandHandler
+ extends AbstractHandler {
+
+ public Object execute(ExecutionEvent event)
+ throws ExecutionException {
+
+ IProject project = null;
+ ISelection currentSelection = HandlerUtil.getCurrentSelection(event);
+
+ if (currentSelection instanceof IStructuredSelection) {
+ Object element = ((IStructuredSelection) currentSelection).getFirstElement();
+ project = (IProject) Platform.getAdapterManager().getAdapter(element, IProject.class);
+ }
+
+ if (project == null) {
+ return null;
+ }
+
+ IWorkbenchWindow activeWorkbenchWindow = HandlerUtil.getActiveWorkbenchWindow(event);
+
+ if (activeWorkbenchWindow != null) {
+ Shell shell = activeWorkbenchWindow.getShell();
+
+ ConvertJavaProjectToJpaRunnable.runInProgressDialog(shell, project);
+ }
+
+ return null;
+ }
+
+
+ private static class ConvertJavaProjectToJpaRunnable
+ implements IRunnableWithProgress {
+
+ private final IProject project;
+ private IFacetedProjectWorkingCopy fprojwc;
+
+ public static void runInProgressDialog(Shell shell, IProject project) {
+ final ConvertJavaProjectToJpaRunnable runnable
+ = new ConvertJavaProjectToJpaRunnable(project);
+
+ try {
+ new ProgressMonitorDialog(shell).run(true, true, runnable);
+
+ ModifyFacetedProjectWizard wizard
+ = new ModifyFacetedProjectWizard(runnable.getFacetedProjectWorkingCopy());
+ WizardDialog dialog = new WizardDialog(shell, wizard);
+
+ if (dialog.open() == Dialog.CANCEL) {
+ throw new InterruptedException();
+ }
+ }
+ catch (InvocationTargetException e) {
+ JptJpaUiPlugin.log(e);
+ }
+ catch(InterruptedException e) {
+ removeFacetNature(project);
+ }
+ }
+
+
+ public static void removeFacetNature(IProject project) {
+ try {
+ IProjectDescription description = project.getDescription();
+ String[] prevNatures = description.getNatureIds();
+ String[] newNatures = ArrayTools.remove(prevNatures, FacetedProjectNature.NATURE_ID);
+ description.setNatureIds( newNatures );
+
+ validateEdit( project.getFile( FILE_DOT_PROJECT ) );
+
+ project.setDescription(description, null);
+ }
+ catch (CoreException ce) {
+ JptJpaUiPlugin.log(ce);
+ }
+ }
+
+
+ public ConvertJavaProjectToJpaRunnable(IProject project) {
+ this.project = project;
+ }
+
+ public void run(IProgressMonitor monitor)
+ throws InvocationTargetException, InterruptedException {
+
+ monitor.beginTask(JptUiMessages.convertToJpa_convertingProject, 1000);
+
+ try {
+ IProgressMonitor createProgressMonitor = new SubProgressMonitor(monitor, 100);
+ IFacetedProject fproj = ProjectFacetsManager.create(this.project, true, createProgressMonitor);
+
+ if (monitor.isCanceled()) {
+ throw new InterruptedException();
+ }
+
+ monitor.setTaskName(JptUiMessages.convertToJpa_detectingTechnologies);
+
+ IProgressMonitor detectProgressMonitor = new SubProgressMonitor(monitor, 800);
+ this.fprojwc = fproj.createWorkingCopy();
+ this.fprojwc.detect(detectProgressMonitor);
+
+ if (! this.fprojwc.hasProjectFacet(JpaFacet.FACET)) {
+ this.fprojwc.addProjectFacet(JpaFacet.FACET.getDefaultVersion());
+ }
+ }
+ catch(CoreException e) {
+ throw new InvocationTargetException(e);
+ }
+ finally {
+ monitor.done();
+ }
+ }
+
+ protected IFacetedProjectWorkingCopy getFacetedProjectWorkingCopy() {
+ return this.fprojwc;
+ }
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/commands/PersistentAttributeMapAsHandler.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/commands/PersistentAttributeMapAsHandler.java
new file mode 100644
index 0000000000..8a2c034563
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/commands/PersistentAttributeMapAsHandler.java
@@ -0,0 +1,143 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2009 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.ui.internal.commands;
+
+import java.util.Map;
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jpt.jpa.core.context.PersistentAttribute;
+import org.eclipse.ui.ISources;
+import org.eclipse.ui.IViewPart;
+import org.eclipse.ui.commands.IElementUpdater;
+import org.eclipse.ui.handlers.HandlerUtil;
+import org.eclipse.ui.menus.UIElement;
+import org.eclipse.ui.services.IEvaluationService;
+
+/**
+ * This handler is responsible to change the mapping type of the selected
+ * <code>PersistentAttribute</code>.
+ * <p>
+ * This handler is defined in the JPT plugin.xml. It will be invoked by the
+ * mapping action dynamically created by the <code>PersistentAttributeMapAsContribution</code>.
+ *
+ * @see PersistentAttribute
+ * @see PersistentAttributeMapAsContribution
+ *
+ * @version 2.0
+ * @since 2.0
+ */
+@SuppressWarnings("nls")
+public class PersistentAttributeMapAsHandler extends AbstractHandler
+ implements IElementUpdater
+{
+ /**
+ * The unique identifier of the Map As command used for <code>PersistentAttribute</code>
+ * defined in the <code>JptJpaUiPlugin</code> plugin.xml.
+ */
+ public static final String COMMAND_ID = "org.eclipse.jpt.jpa.ui.persistentAttributeMapAs";
+
+ /**
+ * The unique identifier of the Map As command parameter used for <code>PersistentAttribute</code>
+ * defined in the <code>JptJpaUiPlugin</code> plugin.xml.
+ */
+ public static final String SPECIFIED_MAPPING_COMMAND_PARAMETER_ID = "specifiedPersistentAttributeMappingKey";
+
+ public static final String DEFAULT_MAPPING_COMMAND_PARAMETER_ID = "defaultPersistentAttributeMappingKey";
+
+ /**
+ * Creates a new <code>PersistentAttributeMapAsHandler</code>.
+ */
+ public PersistentAttributeMapAsHandler() {
+ super();
+ }
+
+ public Object execute(ExecutionEvent event) throws ExecutionException {
+
+ // Retrieve the selection from the ExecutionEvent
+ IStructuredSelection selection = (IStructuredSelection)
+ HandlerUtil.getCurrentSelectionChecked(event);
+
+ // Retrieve the value of the unique parameter passed to the command
+ String mappingKey = event.getParameter(SPECIFIED_MAPPING_COMMAND_PARAMETER_ID);
+
+ // Change the mapping key for all the selected items
+ for (Object item : selection.toArray()) {
+ PersistentAttribute attribute = (PersistentAttribute) item;
+ attribute.setMappingKey(mappingKey);
+ }
+
+ return null;
+ }
+
+ public void updateElement(UIElement element, @SuppressWarnings("unchecked") Map parameters) {
+ // Retrieve the selection for the UIElement
+
+ // Due to Bug 226746, we have to use API workaround to retrieve current
+ // selection
+ IEvaluationService es
+ = (IEvaluationService) element.getServiceLocator().getService(IEvaluationService.class);
+ IViewPart part =
+ (IViewPart) es.getCurrentState().getVariable(ISources.ACTIVE_PART_NAME);
+ IStructuredSelection selection
+ = (IStructuredSelection) part.getSite().getSelectionProvider().getSelection();
+
+ element.setChecked(selectedElementsMappingKeysMatch(selection, parameters));
+ }
+
+ //Check all the selected persistent attribute and verify that they have the same mapping type.
+ //They must all be either default mappings or specified mappings as well.
+ protected boolean selectedElementsMappingKeysMatch(IStructuredSelection selection, @SuppressWarnings("unchecked") Map parameters) {
+ String handlerSpecifiedMappingKey = (String) parameters.get(SPECIFIED_MAPPING_COMMAND_PARAMETER_ID);
+ String handlerDefaultMappingKey = (String) parameters.get(DEFAULT_MAPPING_COMMAND_PARAMETER_ID);
+
+ String commonDefaultKey = null;
+ String commonSpecifiedKey = null;
+ for (Object obj : selection.toArray()) {
+ if (! (obj instanceof PersistentAttribute)) {
+ //oddly enough, you have to check instanceof here, seems like a bug in the framework
+ return false;
+ }
+
+ PersistentAttribute persistentAttribute = (PersistentAttribute) obj;
+ if (persistentAttribute.getMapping().isDefault()) {
+ if (commonSpecifiedKey != null) {
+ return false;
+ }
+ if (commonDefaultKey == null) {
+ commonDefaultKey = persistentAttribute.getMappingKey();
+ }
+ else if (!commonDefaultKey.equals(persistentAttribute.getMappingKey())) {
+ return false;
+ }
+ }
+ else {
+ if (commonDefaultKey != null) {
+ return false;
+ }
+ if (commonSpecifiedKey == null) {
+ commonSpecifiedKey = persistentAttribute.getMappingKey();
+ }
+ else if (!commonSpecifiedKey.equals(persistentAttribute.getMappingKey())) {
+ return false;
+ }
+ }
+ }
+ if (handlerSpecifiedMappingKey != null) {
+ return handlerSpecifiedMappingKey.equals(commonSpecifiedKey);
+ }
+ else if (handlerDefaultMappingKey != null) {
+ return handlerDefaultMappingKey.equals(commonDefaultKey);
+ }
+ return false;
+ }
+
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/commands/PersistentTypeMapAsHandler.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/commands/PersistentTypeMapAsHandler.java
new file mode 100644
index 0000000000..726461f01c
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/commands/PersistentTypeMapAsHandler.java
@@ -0,0 +1,124 @@
+/*******************************************************************************
+ * Copyright (c) 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.jpa.ui.internal.commands;
+
+import java.util.Iterator;
+import java.util.Map;
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jpt.jpa.core.context.PersistentType;
+import org.eclipse.jpt.jpa.ui.internal.menus.PersistentTypeMapAsContribution;
+import org.eclipse.ui.ISources;
+import org.eclipse.ui.IViewPart;
+import org.eclipse.ui.commands.IElementUpdater;
+import org.eclipse.ui.handlers.HandlerUtil;
+import org.eclipse.ui.menus.UIElement;
+import org.eclipse.ui.services.IEvaluationService;
+
+/**
+ * This handler is responsible to change the mapping type of the selected
+ * <code>PersistentType</code>.
+ * <p>
+ * This handler is defined in the JPT plugin.xml. It will be invoked by the
+ * mapping action dynamically created by the <code>PersistentTypeMapAsContribution</code>.
+ *
+ * @see PersistentType
+ * @see PersistentTypeMapAsContribution
+ *
+ * @version 2.0
+ * @since 2.0
+ */
+@SuppressWarnings("nls")
+public class PersistentTypeMapAsHandler extends AbstractHandler
+ implements IElementUpdater
+{
+ /**
+ * The unique identifier of the Map As command used for {@link PersistentType}
+ * defined in the <code>JptJpaUiPlugin</code> plugin.xml.
+ */
+ public static final String COMMAND_ID = "org.eclipse.jpt.jpa.ui.persistentTypeMapAs";
+
+ /**
+ * The unique identifier of the Map As command parameter used for {@link PersistentType}
+ * defined in the <code>JptJpaUiPlugin</code> plugin.xml.
+ */
+ public static final String COMMAND_PARAMETER_ID = "persistentTypeMappingKey";
+
+
+ /**
+ * Creates a new <code>PersistentTypeMapAsHandler</code>.
+ */
+ public PersistentTypeMapAsHandler() {
+ super();
+ }
+
+ public Object execute(ExecutionEvent event) throws ExecutionException {
+
+ // Retrieve the selection from the ExecutionEvent
+ IStructuredSelection selection = (IStructuredSelection)
+ HandlerUtil.getCurrentSelectionChecked(event);
+
+ // Retrieve the value of the unique parameter passed to the command
+ String mappingKey = event.getParameter(COMMAND_PARAMETER_ID);
+
+ // Change the mapping key for all the selected items
+ for (Object item : selection.toArray()) {
+ PersistentType type = (PersistentType) item;
+ type.setMappingKey(mappingKey);
+ }
+
+ return null;
+ }
+
+ @SuppressWarnings("unchecked")
+ public void updateElement(UIElement element, Map parameters) {
+ // Retrieve the selection for the UIElement
+
+ // Due to Bug 226746, we have to use API workaround to retrieve current
+ // selection
+ IEvaluationService es
+ = (IEvaluationService) element.getServiceLocator().getService(IEvaluationService.class);
+ IViewPart part =
+ (IViewPart) es.getCurrentState().getVariable(ISources.ACTIVE_PART_NAME);
+ IStructuredSelection selection
+ = (IStructuredSelection) part.getSite().getSelectionProvider().getSelection();
+
+ String commonMappingKey = commonMappingKey(selection);
+
+ String handlerMappingKey = (String) parameters.get(COMMAND_PARAMETER_ID);
+ if (handlerMappingKey != null) {
+ element.setChecked(handlerMappingKey.equals(commonMappingKey));
+ }
+ }
+
+ @SuppressWarnings("unchecked")
+ protected String commonMappingKey(IStructuredSelection selection) {
+ String commonKey = null;
+ for (Iterator stream = selection.iterator(); stream.hasNext(); ) {
+ Object obj = stream.next();
+
+ if (! (obj instanceof PersistentType)) {
+ return null;
+ }
+
+ PersistentType persistentType = (PersistentType) obj;
+
+ if (commonKey == null) {
+ commonKey = persistentType.getMappingKey();
+ }
+ else if (! commonKey.equals(persistentType.getMappingKey())) {
+ return null;
+ }
+ }
+ return commonKey;
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/commands/RemovePersistentAttributeFromXmlHandler.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/commands/RemovePersistentAttributeFromXmlHandler.java
new file mode 100644
index 0000000000..49e4e16826
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/commands/RemovePersistentAttributeFromXmlHandler.java
@@ -0,0 +1,60 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2010 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.ui.internal.commands;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jpt.common.utility.internal.CollectionTools;
+import org.eclipse.jpt.jpa.core.context.orm.OrmPersistentAttribute;
+import org.eclipse.jpt.jpa.core.context.orm.OrmReadOnlyPersistentAttribute;
+import org.eclipse.jpt.jpa.ui.internal.selection.DefaultJpaSelection;
+import org.eclipse.jpt.jpa.ui.internal.selection.JpaSelectionManager;
+import org.eclipse.jpt.jpa.ui.internal.selection.SelectionManagerFactory;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.handlers.HandlerUtil;
+
+public class RemovePersistentAttributeFromXmlHandler extends AbstractHandler
+{
+ @SuppressWarnings("unchecked")
+ public Object execute(ExecutionEvent executionEvent) throws ExecutionException {
+ final IWorkbenchWindow window =
+ HandlerUtil.getActiveWorkbenchWindowChecked(executionEvent);
+
+ final List<OrmReadOnlyPersistentAttribute> virtualAttributes = new ArrayList<OrmReadOnlyPersistentAttribute>();
+
+ IStructuredSelection selection =
+ (IStructuredSelection) HandlerUtil.getCurrentSelectionChecked(executionEvent);
+
+ // only applies for multiply selected OrmPersistentAttribute objects in a tree
+ for (OrmPersistentAttribute attribute : (Iterable<OrmPersistentAttribute>) CollectionTools.iterable(selection.iterator())) {
+ OrmReadOnlyPersistentAttribute newAttribute = attribute.convertToVirtual();
+ if (newAttribute != null) {
+ virtualAttributes.add(newAttribute);
+ }
+ }
+
+ if (virtualAttributes.size() == 1) {
+ window.getShell().getDisplay().asyncExec(
+ new Runnable() {
+ public void run() {
+ JpaSelectionManager selectionManager = SelectionManagerFactory.getSelectionManager(window);
+ selectionManager.select(new DefaultJpaSelection(virtualAttributes.get(0)), null);
+ }
+ });
+ }
+
+ return null;
+ }
+
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/commands/RemovePersistentClassHandler.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/commands/RemovePersistentClassHandler.java
new file mode 100644
index 0000000000..8aae6fa4e4
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/commands/RemovePersistentClassHandler.java
@@ -0,0 +1,37 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 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.ui.internal.commands;
+
+import java.util.Iterator;
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jpt.jpa.core.context.orm.EntityMappings;
+import org.eclipse.jpt.jpa.core.context.orm.OrmPersistentType;
+import org.eclipse.ui.handlers.HandlerUtil;
+
+public class RemovePersistentClassHandler extends AbstractHandler
+{
+ @SuppressWarnings("unchecked")
+ public Object execute(ExecutionEvent executionEvent) throws ExecutionException {
+ IStructuredSelection selection =
+ (IStructuredSelection) HandlerUtil.getCurrentSelectionChecked(executionEvent);
+
+ // only applies for multiply selected OrmPersistentType objects in a tree
+ for (Iterator<OrmPersistentType> stream = selection.iterator(); stream.hasNext(); ) {
+ OrmPersistentType persistentType = stream.next();
+ ((EntityMappings) persistentType.getMappingFileRoot()).removePersistentType(persistentType);
+ }
+
+ return null;
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/commands/UpgradeXmlFileVersionHandler.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/commands/UpgradeXmlFileVersionHandler.java
new file mode 100644
index 0000000000..b56c54c3cd
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/commands/UpgradeXmlFileVersionHandler.java
@@ -0,0 +1,63 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2010 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.ui.internal.commands;
+
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.content.IContentType;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jpt.jpa.core.JpaProject;
+import org.eclipse.jpt.jpa.core.JptJpaCorePlugin;
+import org.eclipse.jpt.jpa.core.context.XmlFile;
+import org.eclipse.jpt.jpa.core.resource.xml.JpaRootEObject;
+import org.eclipse.jpt.jpa.core.resource.xml.JpaXmlResource;
+import org.eclipse.ui.handlers.HandlerUtil;
+
+public class UpgradeXmlFileVersionHandler extends AbstractHandler
+{
+ public Object execute(ExecutionEvent event) throws ExecutionException {
+ IStructuredSelection selection
+ = (IStructuredSelection) HandlerUtil.getCurrentSelectionChecked(event);
+
+ for (Object selectedObject : selection.toArray()) {
+ upgradeXmlFileVersion(selectedObject);
+ }
+ return null;
+ }
+
+ protected void upgradeXmlFileVersion(Object selectedObject) {
+ JpaXmlResource xmlResource =
+ (JpaXmlResource) Platform.getAdapterManager().getAdapter(selectedObject, JpaXmlResource.class);
+ if (xmlResource == null) {
+ XmlFile xmlFile =
+ (XmlFile) Platform.getAdapterManager().getAdapter(selectedObject, XmlFile.class);
+ if (xmlFile != null) {
+ xmlResource = xmlFile.getXmlResource();
+ }
+ }
+ if (xmlResource == null) {
+ return;
+ }
+
+ final JpaRootEObject root = xmlResource.getRootObject();
+ IContentType contentType = xmlResource.getContentType();
+ JpaProject jpaProject = JptJpaCorePlugin.getJpaProject(xmlResource.getProject());
+ final String newVersion = jpaProject.getJpaPlatform().getMostRecentSupportedResourceType(contentType).getVersion();
+
+ xmlResource.modify(
+ new Runnable() {
+ public void run() {
+ root.setVersion(newVersion);
+ }
+ });
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractBasicMappingComposite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractBasicMappingComposite.java
new file mode 100644
index 0000000000..75b58f72ce
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractBasicMappingComposite.java
@@ -0,0 +1,217 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2010 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.ui.internal.details;
+
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.ui.internal.widgets.Pane;
+import org.eclipse.jpt.common.utility.internal.model.value.PropertyAspectAdapter;
+import org.eclipse.jpt.common.utility.internal.model.value.SimplePropertyValueModel;
+import org.eclipse.jpt.common.utility.internal.model.value.TransformationPropertyValueModel;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.common.utility.model.value.WritablePropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.BasicMapping;
+import org.eclipse.jpt.jpa.core.context.Column;
+import org.eclipse.jpt.jpa.core.context.Converter;
+import org.eclipse.jpt.jpa.core.context.ConvertibleMapping;
+import org.eclipse.jpt.jpa.core.context.EnumeratedConverter;
+import org.eclipse.jpt.jpa.core.context.LobConverter;
+import org.eclipse.jpt.jpa.core.context.TemporalConverter;
+import org.eclipse.jpt.jpa.ui.details.JpaComposite;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * Here the layout of this pane:
+ * <pre>
+ * -----------------------------------------------------------------------------
+ * | ------------------------------------------------------------------------- |
+ * | | | |
+ * | | ColumnComposite | |
+ * | | | |
+ * | ------------------------------------------------------------------------- |
+ * | ------------------------------------------------------------------------- |
+ * | | | |
+ * | | FetchTypeComposite | |
+ * | | | |
+ * | ------------------------------------------------------------------------- |
+ * | ------------------------------------------------------------------------- |
+ * | | | |
+ * | | TemporalTypeComposite | |
+ * | | | |
+ * | ------------------------------------------------------------------------- |
+ * | ------------------------------------------------------------------------- |
+ * | | | |
+ * | | EnumTypeComposite | |
+ * | | | |
+ * | ------------------------------------------------------------------------- |
+ * | ------------------------------------------------------------------------- |
+ * | | | |
+ * | | OptionalComposite | |
+ * | | | |
+ * | ------------------------------------------------------------------------- |
+ * | ------------------------------------------------------------------------- |
+ * | | | |
+ * | | LobComposite | |
+ * | | | |
+ * | ------------------------------------------------------------------------- |
+ * -----------------------------------------------------------------------------</pre>
+ *
+ * @see BasicMapping
+ * @see ColumnComposite
+ * @see EnumTypeComposite
+ * @see FetchTypeComposite
+ * @see LobComposite
+ * @see OptionalComposite
+ * @see TemporalTypeComposite
+ *
+ * @version 2.3
+ * @since 1.0
+ */
+public abstract class AbstractBasicMappingComposite<T extends BasicMapping>
+ extends Pane<T>
+ implements JpaComposite
+{
+ /**
+ * Creates a new <code>BasicMappingComposite</code>.
+ *
+ * @param subjectHolder The holder of the subject <code>IBasicMapping</code>
+ * @param parent The parent container
+ * @param widgetFactory The factory used to create various common widgets
+ */
+ protected AbstractBasicMappingComposite(PropertyValueModel<? extends T> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+
+ super(subjectHolder, parent, widgetFactory);
+ }
+
+ @Override
+ protected void initializeLayout(Composite container) {
+ initializeBasicCollapsibleSection(container);
+ initializeTypeCollapsibleSection(container);
+ }
+
+ protected void initializeBasicCollapsibleSection(Composite container) {
+ container = addCollapsibleSection(
+ container,
+ JptUiDetailsMessages.BasicSection_title,
+ new SimplePropertyValueModel<Boolean>(Boolean.TRUE)
+ );
+
+ this.initializeBasicSection(container);
+ }
+
+ protected void initializeBasicSection(Composite container) {
+ new ColumnComposite(this, buildColumnHolder(), container);
+ new FetchTypeComposite(this, container);
+ new OptionalComposite(this, addSubPane(container, 4));
+ }
+
+ protected void initializeTypeCollapsibleSection(Composite container) {
+ container = addCollapsibleSection(
+ container,
+ JptUiDetailsMessages.TypeSection_type
+ );
+ this.initializeTypeSection(container);
+ }
+
+ protected void initializeTypeSection(Composite container) {
+ ((GridLayout) container.getLayout()).numColumns = 2;
+
+ // No converter
+ Button noConverterButton = addRadioButton(
+ container,
+ JptUiDetailsMessages.TypeSection_default,
+ buildConverterBooleanHolder(null),
+ null);
+ ((GridData) noConverterButton.getLayoutData()).horizontalSpan = 2;
+
+ // Lob
+ Button lobButton = addRadioButton(
+ container,
+ JptUiDetailsMessages.TypeSection_lob,
+ buildConverterBooleanHolder(LobConverter.class),
+ null);
+ ((GridData) lobButton.getLayoutData()).horizontalSpan = 2;
+
+ PropertyValueModel<Converter> converterHolder = buildConverterHolder();
+ // Temporal
+ addRadioButton(
+ container,
+ JptUiDetailsMessages.TypeSection_temporal,
+ buildConverterBooleanHolder(TemporalConverter.class),
+ null);
+ registerSubPane(new TemporalTypeComposite(buildTemporalConverterHolder(converterHolder), container, getWidgetFactory()));
+
+
+ // Enumerated
+ addRadioButton(
+ container,
+ JptUiDetailsMessages.TypeSection_enumerated,
+ buildConverterBooleanHolder(EnumeratedConverter.class),
+ null);
+ registerSubPane(new EnumTypeComposite(buildEnumeratedConverterHolder(converterHolder), container, getWidgetFactory()));
+ }
+
+ protected PropertyValueModel<Column> buildColumnHolder() {
+ return new TransformationPropertyValueModel<T, Column>(getSubjectHolder()) {
+ @Override
+ protected Column transform_(T value) {
+ return value.getColumn();
+ }
+ };
+ }
+
+ protected PropertyValueModel<Converter> buildConverterHolder() {
+ return new PropertyAspectAdapter<T, Converter>(getSubjectHolder(), ConvertibleMapping.CONVERTER_PROPERTY) {
+ @Override
+ protected Converter buildValue_() {
+ return this.subject.getConverter();
+ }
+ };
+ }
+
+ protected PropertyValueModel<TemporalConverter> buildTemporalConverterHolder(PropertyValueModel<Converter> converterHolder) {
+ return new TransformationPropertyValueModel<Converter, TemporalConverter>(converterHolder) {
+ @Override
+ protected TemporalConverter transform_(Converter converter) {
+ return converter.getType() == TemporalConverter.class ? (TemporalConverter) converter : null;
+ }
+ };
+ }
+
+ protected PropertyValueModel<EnumeratedConverter> buildEnumeratedConverterHolder(PropertyValueModel<Converter> converterHolder) {
+ return new TransformationPropertyValueModel<Converter, EnumeratedConverter>(converterHolder) {
+ @Override
+ protected EnumeratedConverter transform_(Converter converter) {
+ return converter.getType() == EnumeratedConverter.class ? (EnumeratedConverter) converter : null;
+ }
+ };
+ }
+
+ protected WritablePropertyValueModel<Boolean> buildConverterBooleanHolder(final Class<? extends Converter> converterType) {
+ return new PropertyAspectAdapter<BasicMapping, Boolean>(getSubjectHolder(), ConvertibleMapping.CONVERTER_PROPERTY) {
+ @Override
+ protected Boolean buildValue_() {
+ Converter converter = this.subject.getConverter();
+ return Boolean.valueOf(converter.getType() == converterType);
+ }
+
+ @Override
+ protected void setValue_(Boolean value) {
+ if (value.booleanValue()) {
+ this.subject.setConverter(converterType);
+ }
+ }
+ };
+ }
+} \ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractBasicMappingUiDefinition.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractBasicMappingUiDefinition.java
new file mode 100644
index 0000000000..f0ef46dffc
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractBasicMappingUiDefinition.java
@@ -0,0 +1,41 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2009 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.ui.internal.details;
+
+import org.eclipse.jpt.jpa.core.MappingKeys;
+import org.eclipse.jpt.jpa.core.context.BasicMapping;
+import org.eclipse.jpt.jpa.ui.internal.JpaMappingImageHelper;
+import org.eclipse.swt.graphics.Image;
+
+public abstract class AbstractBasicMappingUiDefinition<M, T extends BasicMapping>
+ extends AbstractMappingUiDefinition<M, T>
+{
+ protected AbstractBasicMappingUiDefinition() {
+ super();
+ }
+
+
+ public Image getImage() {
+ return JpaMappingImageHelper.imageForAttributeMapping(getKey());
+ }
+
+ public String getLabel() {
+ return JptUiDetailsMessages.BasicMappingUiProvider_label;
+ }
+
+ public String getLinkLabel() {
+ return JptUiDetailsMessages.BasicMappingUiProvider_linkLabel;
+ }
+
+ public String getKey() {
+ return MappingKeys.BASIC_ATTRIBUTE_MAPPING_KEY;
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractEmbeddableComposite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractEmbeddableComposite.java
new file mode 100644
index 0000000000..cd59441aea
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractEmbeddableComposite.java
@@ -0,0 +1,66 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2010 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.ui.internal.details;
+
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.ui.internal.widgets.Pane;
+import org.eclipse.jpt.common.utility.internal.model.value.SimplePropertyValueModel;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.Embeddable;
+import org.eclipse.jpt.jpa.ui.details.JpaComposite;
+import org.eclipse.jpt.jpa.ui.internal.details.JptUiDetailsMessages;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * This pane does not have any widgets.
+ *
+ * @see Embeddable
+ * @see JavaUiFactory - The factory creating this pane
+ * @see EmbeddableUiProvider
+ *
+ * @version 2.3
+ * @since 2.1
+ */
+public abstract class AbstractEmbeddableComposite<T extends Embeddable>
+ extends Pane<T>
+ implements JpaComposite
+{
+ /**
+ * Creates a new <code>EmbeddableComposite</code>.
+ *
+ * @param subjectHolder The holder of this pane's subject
+ * @param parent The parent container
+ * @param widgetFactory The factory used to create various common widgets
+ */
+ protected AbstractEmbeddableComposite(PropertyValueModel<? extends T> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+
+ super(subjectHolder, parent, widgetFactory);
+ }
+
+ @Override
+ protected void initializeLayout(Composite container) {
+ }
+
+ protected void initializeEmbeddableCollapsibleSection(Composite container) {
+ container = addCollapsibleSection(
+ container,
+ JptUiDetailsMessages.EmbeddableSection_title,
+ new SimplePropertyValueModel<Boolean>(Boolean.TRUE)
+ );
+
+ this.initializeEmbeddableSection(container);
+ }
+
+ protected void initializeEmbeddableSection(Composite container) {
+
+ }
+} \ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractEmbeddableUiDefinition.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractEmbeddableUiDefinition.java
new file mode 100644
index 0000000000..985eb31d32
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractEmbeddableUiDefinition.java
@@ -0,0 +1,41 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2009 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.ui.internal.details;
+
+import org.eclipse.jpt.jpa.core.MappingKeys;
+import org.eclipse.jpt.jpa.core.context.Embeddable;
+import org.eclipse.jpt.jpa.ui.internal.JpaMappingImageHelper;
+import org.eclipse.swt.graphics.Image;
+
+public abstract class AbstractEmbeddableUiDefinition<M, T extends Embeddable>
+ extends AbstractMappingUiDefinition<M, T>
+{
+ protected AbstractEmbeddableUiDefinition() {
+ super();
+ }
+
+
+ public String getKey() {
+ return MappingKeys.EMBEDDABLE_TYPE_MAPPING_KEY;
+ }
+
+ public String getLabel() {
+ return JptUiDetailsMessages.EmbeddableUiProvider_label;
+ }
+
+ public String getLinkLabel() {
+ return JptUiDetailsMessages.EmbeddableUiProvider_linkLabel;
+ }
+
+ public Image getImage() {
+ return JpaMappingImageHelper.imageForTypeMapping(getKey());
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractEmbeddedIdMappingComposite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractEmbeddedIdMappingComposite.java
new file mode 100644
index 0000000000..0fc0e5137b
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractEmbeddedIdMappingComposite.java
@@ -0,0 +1,48 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2010 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.ui.internal.details;
+
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.ui.internal.widgets.Pane;
+import org.eclipse.jpt.common.utility.internal.model.value.SimplePropertyValueModel;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.EmbeddedIdMapping;
+import org.eclipse.jpt.jpa.ui.details.JpaComposite;
+import org.eclipse.swt.widgets.Composite;
+
+public abstract class AbstractEmbeddedIdMappingComposite<T extends EmbeddedIdMapping>
+ extends Pane<T>
+ implements JpaComposite
+{
+ protected AbstractEmbeddedIdMappingComposite(
+ PropertyValueModel<? extends T> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+
+ super(subjectHolder, parent, widgetFactory);
+ }
+
+
+ @Override
+ protected void initializeLayout(Composite container) {
+ initializeEmbeddedIdCollapsibleSection(container);
+ }
+
+ protected void initializeEmbeddedIdCollapsibleSection(Composite container) {
+ container = addCollapsibleSection(
+ container,
+ JptUiDetailsMessages.EmbeddedIdSection_title,
+ new SimplePropertyValueModel<Boolean>(Boolean.TRUE));
+
+ this.initializeEmbeddedIdSection(container);
+ }
+
+ protected abstract void initializeEmbeddedIdSection(Composite container);
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractEmbeddedIdMappingUiDefinition.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractEmbeddedIdMappingUiDefinition.java
new file mode 100644
index 0000000000..142fe12e4e
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractEmbeddedIdMappingUiDefinition.java
@@ -0,0 +1,42 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2009 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.ui.internal.details;
+
+import org.eclipse.jpt.jpa.core.MappingKeys;
+import org.eclipse.jpt.jpa.core.context.EmbeddedIdMapping;
+import org.eclipse.jpt.jpa.ui.internal.JpaMappingImageHelper;
+import org.eclipse.swt.graphics.Image;
+
+
+public abstract class AbstractEmbeddedIdMappingUiDefinition<M, T extends EmbeddedIdMapping>
+ extends AbstractMappingUiDefinition<M, T>
+{
+ protected AbstractEmbeddedIdMappingUiDefinition() {
+ super();
+ }
+
+
+ public String getKey() {
+ return MappingKeys.EMBEDDED_ID_ATTRIBUTE_MAPPING_KEY;
+ }
+
+ public String getLabel() {
+ return JptUiDetailsMessages.EmbeddedIdMappingUiProvider_label;
+ }
+
+ public String getLinkLabel() {
+ return JptUiDetailsMessages.EmbeddedIdMappingUiProvider_linkLabel;
+ }
+
+ public Image getImage() {
+ return JpaMappingImageHelper.imageForAttributeMapping(getKey());
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractEmbeddedMappingComposite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractEmbeddedMappingComposite.java
new file mode 100644
index 0000000000..8aedf8ec83
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractEmbeddedMappingComposite.java
@@ -0,0 +1,75 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2010 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.ui.internal.details;
+
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.ui.internal.widgets.Pane;
+import org.eclipse.jpt.common.utility.internal.model.value.SimplePropertyValueModel;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.EmbeddedMapping;
+import org.eclipse.jpt.jpa.ui.details.JpaComposite;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * Here the layout of this pane:
+ * <pre>
+ * -----------------------------------------------------------------------------
+ * | ------------------------------------------------------------------------- |
+ * | | | |
+ * | | EmbeddedAttributeOverridesComposite | |
+ * | | | |
+ * | ------------------------------------------------------------------------- |
+ * -----------------------------------------------------------------------------</pre>
+ *
+ * @see EmbeddedMapping
+ *
+ * @version 2.3
+ * @since 1.0
+ */
+public abstract class AbstractEmbeddedMappingComposite<T extends EmbeddedMapping>
+ extends Pane<T>
+ implements JpaComposite
+{
+ /**
+ * Creates a new <code>EmbeddedMappingComposite</code>.
+ *
+ * @param subjectHolder The holder of the subject <code>EmbeddedMapping</code>
+ * @param parent The parent container
+ * @param widgetFactory The factory used to create various common widgets
+ */
+ protected AbstractEmbeddedMappingComposite(PropertyValueModel<? extends T> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+
+ super(subjectHolder, parent, widgetFactory);
+ }
+
+ @Override
+ protected void initializeLayout(Composite container) {
+ initializeEmbeddedCollapsibleSection(container);
+ }
+
+ protected void initializeEmbeddedCollapsibleSection(Composite container) {
+ container = addCollapsibleSection(
+ container,
+ JptUiDetailsMessages.EmbeddedSection_title,
+ new SimplePropertyValueModel<Boolean>(Boolean.TRUE)
+ );
+
+ this.initializeEmbeddedSection(container);
+ }
+
+ protected void initializeEmbeddedSection(Composite container) {
+ new EmbeddedMappingOverridesComposite(
+ this,
+ container
+ );
+ }
+} \ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractEmbeddedMappingOverridesComposite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractEmbeddedMappingOverridesComposite.java
new file mode 100644
index 0000000000..8311fd4897
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractEmbeddedMappingOverridesComposite.java
@@ -0,0 +1,39 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2010 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.ui.internal.details;
+
+import org.eclipse.jpt.common.ui.internal.widgets.Pane;
+import org.eclipse.jpt.common.utility.internal.model.value.PropertyAspectAdapter;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.AttributeOverrideContainer;
+import org.eclipse.jpt.jpa.core.context.BaseEmbeddedMapping;
+import org.eclipse.swt.widgets.Composite;
+
+public abstract class AbstractEmbeddedMappingOverridesComposite<T extends BaseEmbeddedMapping>
+ extends AbstractOverridesComposite<T>
+{
+ protected AbstractEmbeddedMappingOverridesComposite(
+ Pane<? extends T> parentPane,
+ Composite parent) {
+
+ super(parentPane, parent);
+ }
+
+
+ @Override
+ protected PropertyValueModel<AttributeOverrideContainer> buildAttributeOverrideContainerHolder() {
+ return new PropertyAspectAdapter<T, AttributeOverrideContainer>(getSubjectHolder()) {
+ @Override
+ protected AttributeOverrideContainer buildValue_() {
+ return this.subject.getAttributeOverrideContainer();
+ }
+ };
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractEmbeddedMappingUiDefinition.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractEmbeddedMappingUiDefinition.java
new file mode 100644
index 0000000000..f699c1a6e3
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractEmbeddedMappingUiDefinition.java
@@ -0,0 +1,41 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2009 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.ui.internal.details;
+
+import org.eclipse.jpt.jpa.core.MappingKeys;
+import org.eclipse.jpt.jpa.core.context.EmbeddedMapping;
+import org.eclipse.jpt.jpa.ui.internal.JpaMappingImageHelper;
+import org.eclipse.swt.graphics.Image;
+
+public abstract class AbstractEmbeddedMappingUiDefinition<M, T extends EmbeddedMapping>
+ extends AbstractMappingUiDefinition<M, T>
+{
+ protected AbstractEmbeddedMappingUiDefinition() {
+ super();
+ }
+
+
+ public String getKey() {
+ return MappingKeys.EMBEDDED_ATTRIBUTE_MAPPING_KEY;
+ }
+
+ public String getLabel() {
+ return JptUiDetailsMessages.EmbeddedMappingUiProvider_label;
+ }
+
+ public String getLinkLabel() {
+ return JptUiDetailsMessages.EmbeddedMappingUiProvider_linkLabel;
+ }
+
+ public Image getImage() {
+ return JpaMappingImageHelper.imageForAttributeMapping(getKey());
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractEntityComposite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractEntityComposite.java
new file mode 100644
index 0000000000..56219a0784
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractEntityComposite.java
@@ -0,0 +1,216 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2010 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.ui.internal.details;
+
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.ui.internal.widgets.Pane;
+import org.eclipse.jpt.common.utility.internal.model.value.PropertyAspectAdapter;
+import org.eclipse.jpt.common.utility.internal.model.value.SimplePropertyValueModel;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.Entity;
+import org.eclipse.jpt.jpa.core.context.GeneratorContainer;
+import org.eclipse.jpt.jpa.core.context.IdClassReference;
+import org.eclipse.jpt.jpa.core.context.QueryContainer;
+import org.eclipse.jpt.jpa.ui.details.JpaComposite;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * Here the layout of this pane:
+ * <pre>
+ * -----------------------------------------------------------------------------
+ * | ------------------------------------------------------------------------- |
+ * | | | |
+ * | | EntityNameComposite | |
+ * | | | |
+ * | ------------------------------------------------------------------------- |
+ * | ------------------------------------------------------------------------- |
+ * | | | |
+ * | | TableComposite | |
+ * | | | |
+ * | ------------------------------------------------------------------------- |
+ * | ------------------------------------------------------------------------- |
+ * | | | |
+ * | | IdClassComposite | |
+ * | | | |
+ * | ------------------------------------------------------------------------- |
+ * | |
+ * | - v Attribute Overrides ------------------------------------------------- |
+ * | ------------------------------------------------------------------------- |
+ * | | | |
+ * | | OverridesComposite | |
+ * | | | |
+ * | ------------------------------------------------------------------------- |
+ * | |
+ * | - v Secondary Tables ---------------------------------------------------- |
+ * | ------------------------------------------------------------------------- |
+ * | | | |
+ * | | Pane | |
+ * | | | |
+ * | ------------------------------------------------------------------------- |
+ * | |
+ * | - v Inheritance --------------------------------------------------------- |
+ * | ------------------------------------------------------------------------- |
+ * | | | |
+ * | | InheritanceComposite | |
+ * | | | |
+ * | ------------------------------------------------------------------------- |
+ * | |
+ * | - v Queries ------------------------------------------------------------- |
+ * | ------------------------------------------------------------------------- |
+ * | | | |
+ * | | QueriesComposite | |
+ * | | | |
+ * | ------------------------------------------------------------------------- |
+ * | |
+ * | - v Generators ---------------------------------------------------------- |
+ * | ------------------------------------------------------------------------- |
+ * | | | |
+ * | | GeneratorsComposite | |
+ * | | | |
+ * | ------------------------------------------------------------------------- |
+ * -----------------------------------------------------------------------------</pre>
+ *
+ * @see Entity
+ * @see EntityNameComposite
+ * @see InheritanceComposite
+ * @see IdClassComposite
+ * @see EntityOverridesComposite
+ * @see TableComposite
+ * @see GenerationComposite
+ *
+ * TODO talk to JavaEditor people about what we can do to hook in TabbedProperties for the JavaEditor
+ *
+ * @version 2.3
+ * @since 1.0
+ */
+public abstract class AbstractEntityComposite<T extends Entity>
+ extends Pane<T>
+ implements JpaComposite
+{
+ /**
+ * Creates a new <code>AbstractEntityComposite</code>.
+ *
+ * @param subjectHolder The holder of the subject <code>IEntity</code>
+ * @param parent The parent container
+ * @param widgetFactory The factory used to create various common widgets
+ */
+ protected AbstractEntityComposite(
+ PropertyValueModel<? extends T> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+
+ super(subjectHolder, parent, widgetFactory);
+ }
+
+
+ protected abstract void initializeSecondaryTablesSection(Composite container);
+
+ protected abstract void initializeInheritanceSection(Composite container);
+
+ @Override
+ protected void initializeLayout(Composite container) {
+ this.initializeEntityCollapsibleSection(container);
+ this.initializeQueriesCollapsibleSection(container);
+ this.initializeInheritanceCollapsibleSection(container);
+ this.initializeAttributeOverridesCollapsibleSection(container);
+ this.initializeGeneratorsCollapsibleSection(container);
+ this.initializeSecondaryTablesCollapsibleSection(container);
+ }
+
+ protected void initializeEntityCollapsibleSection(Composite container) {
+ container = addCollapsibleSection(
+ container,
+ JptUiDetailsMessages.EntitySection_title,
+ new SimplePropertyValueModel<Boolean>(Boolean.TRUE)
+ );
+
+ this.initializeEntitySection(container);
+ }
+
+ protected void initializeEntitySection(Composite container) {
+ new TableComposite(this, container);
+ new EntityNameComposite(this, container);
+ new IdClassComposite(this, buildIdClassReferenceHolder(), container);
+ }
+
+ protected PropertyValueModel<IdClassReference> buildIdClassReferenceHolder() {
+ return new PropertyAspectAdapter<Entity, IdClassReference>(getSubjectHolder()) {
+ @Override
+ protected IdClassReference buildValue_() {
+ return this.subject.getIdClassReference();
+ }
+ };
+ }
+
+ protected void initializeQueriesCollapsibleSection(Composite container) {
+ container = addCollapsibleSection(
+ container,
+ JptUiDetailsMessages.EntityComposite_queries);
+ this.initializeQueriesSection(container, buildQueryContainerHolder());
+ }
+
+ protected void initializeQueriesSection(Composite container, PropertyValueModel<QueryContainer> queryContainerHolder) {
+ new QueriesComposite(this, queryContainerHolder, container);
+ }
+
+ private PropertyValueModel<QueryContainer> buildQueryContainerHolder() {
+ return new PropertyAspectAdapter<Entity, QueryContainer>(getSubjectHolder()) {
+ @Override
+ protected QueryContainer buildValue_() {
+ return this.subject.getQueryContainer();
+ }
+ };
+ }
+
+ protected void initializeAttributeOverridesCollapsibleSection(Composite container) {
+ container = addCollapsibleSection(
+ container,
+ JptUiDetailsMessages.OverridesComposite_attributeOverridesSection);
+ initializeAttributeOverridesSection(container);
+ }
+
+ protected void initializeAttributeOverridesSection(Composite container) {
+ new EntityOverridesComposite(this, container);
+ }
+
+ protected void initializeInheritanceCollapsibleSection(Composite container) {
+ container = addCollapsibleSection(
+ container,
+ JptUiDetailsMessages.EntityComposite_inheritance);
+ initializeInheritanceSection(container);
+ }
+
+ protected void initializeGeneratorsCollapsibleSection(Composite container) {
+ container = addCollapsibleSection(
+ container,
+ JptUiDetailsMessages.IdMappingComposite_primaryKeyGenerationSection);
+ initializeGeneratorsSection(container, buildGeneratorContainer());
+ }
+
+ protected void initializeGeneratorsSection(Composite container, PropertyValueModel<GeneratorContainer> generatorContainerHolder) {
+ new GenerationComposite(this, generatorContainerHolder, container);
+ }
+
+ private PropertyValueModel<GeneratorContainer> buildGeneratorContainer() {
+ return new PropertyAspectAdapter<Entity, GeneratorContainer>(getSubjectHolder()) {
+ @Override
+ protected GeneratorContainer buildValue_() {
+ return this.subject.getGeneratorContainer();
+ }
+ };
+ }
+
+ protected void initializeSecondaryTablesCollapsibleSection(Composite container) {
+ container = addCollapsibleSection(
+ container,
+ JptUiDetailsMessages.SecondaryTablesComposite_secondaryTables);
+ initializeSecondaryTablesSection(container);
+ }
+} \ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractEntityMappingsDetailsProvider.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractEntityMappingsDetailsProvider.java
new file mode 100644
index 0000000000..163c5f8163
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractEntityMappingsDetailsProvider.java
@@ -0,0 +1,32 @@
+/*******************************************************************************
+* Copyright (c) 2009 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.ui.internal.details;
+
+import org.eclipse.jpt.common.core.JptResourceType;
+import org.eclipse.jpt.common.utility.internal.Tools;
+import org.eclipse.jpt.jpa.core.JpaStructureNode;
+import org.eclipse.jpt.jpa.core.context.orm.OrmStructureNodes;
+import org.eclipse.jpt.jpa.ui.details.JpaDetailsProvider;
+
+public abstract class AbstractEntityMappingsDetailsProvider
+ implements JpaDetailsProvider
+{
+ protected AbstractEntityMappingsDetailsProvider() {
+ super();
+ }
+
+
+ public final boolean providesDetails(JpaStructureNode structureNode) {
+ return Tools.valuesAreEqual(structureNode.getId(), OrmStructureNodes.ENTITY_MAPPINGS_ID)
+ && providesDetails(structureNode.getResourceType());
+ }
+
+ protected abstract boolean providesDetails(JptResourceType resourceType);
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractEntityOverridesComposite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractEntityOverridesComposite.java
new file mode 100644
index 0000000000..5bbc73260d
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractEntityOverridesComposite.java
@@ -0,0 +1,55 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2010 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.ui.internal.details;
+
+import org.eclipse.jpt.common.ui.internal.widgets.Pane;
+import org.eclipse.jpt.common.utility.internal.model.value.PropertyAspectAdapter;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.AssociationOverrideContainer;
+import org.eclipse.jpt.jpa.core.context.AttributeOverrideContainer;
+import org.eclipse.jpt.jpa.core.context.Entity;
+import org.eclipse.swt.widgets.Composite;
+
+public abstract class AbstractEntityOverridesComposite
+ extends AbstractOverridesComposite<Entity>
+{
+ protected AbstractEntityOverridesComposite(
+ Pane<? extends Entity> parentPane,
+ Composite parent) {
+
+ super(parentPane, parent);
+ }
+
+
+ @Override
+ protected boolean supportsAssociationOverrides() {
+ return true;
+ }
+
+ @Override
+ protected PropertyValueModel<AttributeOverrideContainer> buildAttributeOverrideContainerHolder() {
+ return new PropertyAspectAdapter<Entity, AttributeOverrideContainer>(getSubjectHolder()) {
+ @Override
+ protected AttributeOverrideContainer buildValue_() {
+ return this.subject.getAttributeOverrideContainer();
+ }
+ };
+ }
+
+ @Override
+ protected PropertyValueModel<AssociationOverrideContainer> buildAssociationOverrideContainerHolder() {
+ return new PropertyAspectAdapter<Entity, AssociationOverrideContainer>(getSubjectHolder()) {
+ @Override
+ protected AssociationOverrideContainer buildValue_() {
+ return this.subject.getAssociationOverrideContainer();
+ }
+ };
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractEntityUiDefinition.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractEntityUiDefinition.java
new file mode 100644
index 0000000000..1dae9012f0
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractEntityUiDefinition.java
@@ -0,0 +1,41 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2009 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.ui.internal.details;
+
+import org.eclipse.jpt.jpa.core.MappingKeys;
+import org.eclipse.jpt.jpa.core.context.Entity;
+import org.eclipse.jpt.jpa.ui.internal.JpaMappingImageHelper;
+import org.eclipse.swt.graphics.Image;
+
+public abstract class AbstractEntityUiDefinition<M, T extends Entity>
+ extends AbstractMappingUiDefinition<M, T>
+{
+ protected AbstractEntityUiDefinition() {
+ super();
+ }
+
+
+ public String getKey() {
+ return MappingKeys.ENTITY_TYPE_MAPPING_KEY;
+ }
+
+ public String getLabel() {
+ return JptUiDetailsMessages.EntityUiProvider_label;
+ }
+
+ public String getLinkLabel() {
+ return JptUiDetailsMessages.EntityUiProvider_linkLabel;
+ }
+
+ public Image getImage() {
+ return JpaMappingImageHelper.imageForTypeMapping(getKey());
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractIdMappingComposite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractIdMappingComposite.java
new file mode 100644
index 0000000000..7e3b188e7f
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractIdMappingComposite.java
@@ -0,0 +1,136 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2010 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.ui.internal.details;
+
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.ui.internal.widgets.Pane;
+import org.eclipse.jpt.common.utility.internal.model.value.PropertyAspectAdapter;
+import org.eclipse.jpt.common.utility.internal.model.value.SimplePropertyValueModel;
+import org.eclipse.jpt.common.utility.internal.model.value.TransformationPropertyValueModel;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.common.utility.model.value.WritablePropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.Column;
+import org.eclipse.jpt.jpa.core.context.Converter;
+import org.eclipse.jpt.jpa.core.context.ConvertibleMapping;
+import org.eclipse.jpt.jpa.core.context.IdMapping;
+import org.eclipse.jpt.jpa.core.context.TemporalConverter;
+import org.eclipse.jpt.jpa.ui.details.JpaComposite;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+
+public abstract class AbstractIdMappingComposite<T extends IdMapping>
+ extends Pane<T>
+ implements JpaComposite
+{
+ public AbstractIdMappingComposite(
+ PropertyValueModel<? extends T> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+
+ super(subjectHolder, parent, widgetFactory);
+ }
+
+
+ @Override
+ protected void initializeLayout(Composite container) {
+ initializeIdCollapsibleSection(container);
+ initializeTypeCollapsibleSection(container);
+ initializeGenerationCollapsibleSection(container);
+ }
+
+ protected void initializeIdCollapsibleSection(Composite container) {
+ container = addCollapsibleSection(
+ container,
+ JptUiDetailsMessages.IdSection_title,
+ new SimplePropertyValueModel<Boolean>(Boolean.TRUE));
+
+ this.initializeIdSection(container);
+ }
+
+ protected abstract void initializeIdSection(Composite container);
+
+ protected void initializeTypeCollapsibleSection(Composite container) {
+ container = addCollapsibleSection(
+ container,
+ JptUiDetailsMessages.TypeSection_type);
+ this.initializeTypeSection(container);
+ }
+
+ protected void initializeTypeSection(Composite container) {
+ ((GridLayout) container.getLayout()).numColumns = 2;
+
+ // No converter
+ Button noConverterButton = addRadioButton(
+ container,
+ JptUiDetailsMessages.TypeSection_default,
+ buildConverterBooleanHolder(null),
+ null);
+ ((GridData) noConverterButton.getLayoutData()).horizontalSpan = 2;
+
+ PropertyValueModel<Converter> converterHolder = buildConverterHolder();
+ // Temporal
+ addRadioButton(
+ container,
+ JptUiDetailsMessages.TypeSection_temporal,
+ buildConverterBooleanHolder(TemporalConverter.class),
+ null);
+ registerSubPane(new TemporalTypeComposite(buildTemporalConverterHolder(converterHolder), container, getWidgetFactory()));
+ }
+
+ protected void initializeGenerationCollapsibleSection(Composite container) {
+ new IdMappingGenerationComposite(this, container);
+ }
+
+ protected PropertyValueModel<? extends Column> buildColumnHolder() {
+ return new TransformationPropertyValueModel<T, Column>(getSubjectHolder()) {
+ @Override
+ protected Column transform_(T value) {
+ return value.getColumn();
+ }
+ };
+ }
+
+ protected WritablePropertyValueModel<Boolean> buildConverterBooleanHolder(final Class<? extends Converter> converterType) {
+ return new PropertyAspectAdapter<T, Boolean>(getSubjectHolder(), ConvertibleMapping.CONVERTER_PROPERTY) {
+ @Override
+ protected Boolean buildValue_() {
+ Converter converter = this.subject.getConverter();
+ return Boolean.valueOf(converter.getType() == converterType);
+ }
+
+ @Override
+ protected void setValue_(Boolean value) {
+ if (value.booleanValue()) {
+ this.subject.setConverter(converterType);
+ }
+ }
+ };
+ }
+
+ protected PropertyValueModel<Converter> buildConverterHolder() {
+ return new PropertyAspectAdapter<T, Converter>(getSubjectHolder(), ConvertibleMapping.CONVERTER_PROPERTY) {
+ @Override
+ protected Converter buildValue_() {
+ return this.subject.getConverter();
+ }
+ };
+ }
+
+ protected PropertyValueModel<TemporalConverter> buildTemporalConverterHolder(PropertyValueModel<Converter> converterHolder) {
+ return new TransformationPropertyValueModel<Converter, TemporalConverter>(converterHolder) {
+ @Override
+ protected TemporalConverter transform_(Converter converter) {
+ return converter.getType() == TemporalConverter.class ? (TemporalConverter) converter : null;
+ }
+ };
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractIdMappingUiDefinition.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractIdMappingUiDefinition.java
new file mode 100644
index 0000000000..32a63a31bb
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractIdMappingUiDefinition.java
@@ -0,0 +1,42 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2009 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.ui.internal.details;
+
+import org.eclipse.jpt.jpa.core.MappingKeys;
+import org.eclipse.jpt.jpa.core.context.IdMapping;
+import org.eclipse.jpt.jpa.ui.internal.JpaMappingImageHelper;
+import org.eclipse.swt.graphics.Image;
+
+
+public abstract class AbstractIdMappingUiDefinition<M, T extends IdMapping>
+ extends AbstractMappingUiDefinition<M, T>
+{
+ protected AbstractIdMappingUiDefinition() {
+ super();
+ }
+
+
+ public Image getImage() {
+ return JpaMappingImageHelper.imageForAttributeMapping(getKey());
+ }
+
+ public String getLabel() {
+ return JptUiDetailsMessages.IdMappingUiProvider_label;
+ }
+
+ public String getLinkLabel() {
+ return JptUiDetailsMessages.IdMappingUiProvider_linkLabel;
+ }
+
+ public String getKey() {
+ return MappingKeys.ID_ATTRIBUTE_MAPPING_KEY;
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractInheritanceComposite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractInheritanceComposite.java
new file mode 100644
index 0000000000..095cea3979
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractInheritanceComposite.java
@@ -0,0 +1,291 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2010 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.ui.internal.details;
+
+import java.util.Collection;
+
+import org.eclipse.jpt.common.ui.internal.JptCommonUiMessages;
+import org.eclipse.jpt.common.ui.internal.widgets.EnumFormComboViewer;
+import org.eclipse.jpt.common.ui.internal.widgets.Pane;
+import org.eclipse.jpt.common.utility.internal.StringConverter;
+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.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.core.context.Entity;
+import org.eclipse.jpt.jpa.core.context.InheritanceType;
+import org.eclipse.jpt.jpa.ui.internal.JpaHelpContextIds;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+
+/**
+ * Here the layout of this pane:
+ * <pre>
+ * -----------------------------------------------------------------------------
+ * | ---------------------------------------------------- |
+ * | Strategy: | EnumComboViewer |v| |
+ * | ---------------------------------------------------- |
+ * | ---------------------------------------------------- |
+ * | Value: | I |v| |
+ * | ---------------------------------------------------- |
+ * | |
+ * | > Discriminator Column |
+ * | |
+ * | ---------------------------------------------------- |
+ * | Name: | ColumnCombo |v| |
+ * | ---------------------------------------------------- |
+ * | ---------------------------------------------------- |
+ * | Type: | EnumComboViewer |v| |
+ * | ---------------------------------------------------- |
+ * | ---------------------------------------------------- |
+ * | Column Definition: | I | |
+ * | ---------------------------------------------------- |
+ * | ------------- |
+ * | Length: | I |I| |
+ * | ------------- |
+ * | ------------------------------------------------------------------------- |
+ * | | | |
+ * | | PrimaryKeyJoinColumnsComposite | |
+ * | | | |
+ * | ------------------------------------------------------------------------- |
+ * -----------------------------------------------------------------------------</pre>
+ *
+ * @see Entity
+ * @see AbstractEntityComposite - The parent container
+ * @see ColumnCombo
+ * @see EnumComboViewer
+ * @see PrimaryKeyJoinColumnsComposite
+ *
+ * @version 2.0
+ * @since 2.0
+ */
+@SuppressWarnings("nls")
+public abstract class AbstractInheritanceComposite<T extends Entity> extends Pane<T> {
+
+ /**
+ * A key used to represent the default value, this is required to convert
+ * the selected item from a combo to <code>null</code>. This key is most
+ * likely never typed the user and it will help to convert the value to
+ * <code>null</code> when it's time to set the new selected value into the
+ * model.
+ */
+ protected static String DEFAULT_KEY = "?!#!?#?#?default?#?!#?!#?";
+
+ protected static String NONE_KEY = "?!#!?#?#?none?#?!#?!#?";
+
+ /**
+ * Creates a new <code>InheritanceComposite</code>.
+ *
+ * @param parentPane The parent container of this one
+ * @param parent The parent container
+ */
+ public AbstractInheritanceComposite(Pane<? extends T> parentPane,
+ Composite parent) {
+
+ super(parentPane, parent, false);
+ }
+
+ @Override
+ protected void initializeLayout(Composite container) {
+
+ int groupBoxMargin = getGroupBoxMargin();
+
+ Composite subPane = addSubPane(
+ container, 0, groupBoxMargin, 0, groupBoxMargin
+ );
+
+ // Strategy widgets
+ addLabeledComposite(
+ subPane,
+ JptUiDetailsMessages.InheritanceComposite_strategy,
+ addStrategyCombo(subPane),
+ JpaHelpContextIds.ENTITY_INHERITANCE_STRATEGY
+ );
+
+ // Discrinator Value widgets
+ PropertyValueModel<Boolean> dvEnabled = this.buildDiscriminatorValueEnabledHolder();
+ Combo discriminatorValueCombo = addEditableCombo(
+ subPane,
+ buildDiscriminatorValueListHolder(),
+ buildDiscriminatorValueHolder(),
+ buildDiscriminatorValueConverter(),
+ dvEnabled
+ );
+ Label discriminatorValueLabel = addLabel(
+ subPane,
+ JptUiDetailsMessages.InheritanceComposite_discriminatorValue,
+ dvEnabled
+ );
+ addLabeledComposite(
+ subPane,
+ discriminatorValueLabel,
+ discriminatorValueCombo,
+ null,
+ JpaHelpContextIds.ENTITY_INHERITANCE_DISCRIMINATOR_VALUE
+ );
+
+ new DiscriminatorColumnComposite<Entity>(this, container);
+
+ // Primary Key Join Columns widgets
+ addPrimaryKeyJoinColumnsComposite(addSubPane(container, 5));
+ }
+
+ protected WritablePropertyValueModel<Boolean> buildDiscriminatorValueEnabledHolder() {
+ return new PropertyAspectAdapter<Entity, Boolean>(getSubjectHolder(), Entity.SPECIFIED_DISCRIMINATOR_VALUE_IS_ALLOWED_PROPERTY) {
+ @Override
+ protected Boolean buildValue_() {
+ return Boolean.valueOf(this.subject.specifiedDiscriminatorValueIsAllowed());
+ }
+ };
+ }
+
+ private ListValueModel<String> buildDefaultDiscriminatorListValueHolder() {
+ return new PropertyListValueModelAdapter<String>(
+ buildDefaultDiscriminatorValueHolder()
+ );
+ }
+
+ private WritablePropertyValueModel<String> buildDefaultDiscriminatorValueHolder() {
+ return new PropertyAspectAdapter<Entity, String>(getSubjectHolder(), Entity.DEFAULT_DISCRIMINATOR_VALUE_PROPERTY, Entity.DISCRIMINATOR_VALUE_IS_UNDEFINED_PROPERTY) {
+ @Override
+ protected String buildValue_() {
+ String value = this.subject.getDefaultDiscriminatorValue();
+ if (value == null && this.subject.discriminatorValueIsUndefined()) {
+ return NONE_KEY;
+ }
+
+ if (value == null) {
+ value = DEFAULT_KEY;
+ }
+ else {
+ value = DEFAULT_KEY + value;
+ }
+
+ return value;
+ }
+ };
+ }
+
+ private StringConverter<String> buildDiscriminatorValueConverter() {
+ return new StringConverter<String>() {
+ public String convertToString(String value) {
+
+ if (getSubject() == null) {
+ //this is part of a list given to a combo, combos don't take kindly to null
+ return JptCommonUiMessages.NoneSelected;
+ }
+
+ if (value == null) {
+ value = getSubject().getDefaultDiscriminatorValue();
+ if (value == null && getSubject().discriminatorValueIsUndefined()) {
+ value = NONE_KEY;
+ }
+ else {
+ value = (value != null) ?
+ DEFAULT_KEY + 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 = JptUiDetailsMessages.ProviderDefault;
+ }
+ }
+ if (value.startsWith(NONE_KEY)) {
+ value = JptCommonUiMessages.NoneSelected;
+ }
+ return value;
+ }
+ };
+ }
+
+ private WritablePropertyValueModel<String> buildDiscriminatorValueHolder() {
+ return new PropertyAspectAdapter<Entity, String>(getSubjectHolder(), Entity.SPECIFIED_DISCRIMINATOR_VALUE_PROPERTY) {
+ @Override
+ protected String buildValue_() {
+ return this.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.startsWith(NONE_KEY))) {
+
+ value = null;
+ }
+
+ this.subject.setSpecifiedDiscriminatorValue(value);
+ }
+ };
+ }
+
+ private ListValueModel<String> buildDiscriminatorValueListHolder() {
+ return buildDefaultDiscriminatorListValueHolder();
+ }
+
+ private EnumFormComboViewer<Entity, InheritanceType> addStrategyCombo(Composite container) {
+
+ return new EnumFormComboViewer<Entity, InheritanceType>(this, container) {
+
+ @Override
+ protected void addPropertyNames(Collection<String> propertyNames) {
+ super.addPropertyNames(propertyNames);
+ propertyNames.add(Entity.DEFAULT_INHERITANCE_STRATEGY_PROPERTY);
+ propertyNames.add(Entity.SPECIFIED_INHERITANCE_STRATEGY_PROPERTY);
+ }
+
+ @Override
+ protected InheritanceType[] getChoices() {
+ return InheritanceType.values();
+ }
+
+ @Override
+ protected InheritanceType getDefaultValue() {
+ return getSubject().getDefaultInheritanceStrategy();
+ }
+
+ @Override
+ protected String displayString(InheritanceType value) {
+ return buildDisplayString(
+ JptUiDetailsMessages.class,
+ AbstractInheritanceComposite.class,
+ value
+ );
+ }
+
+ @Override
+ protected InheritanceType getValue() {
+ return getSubject().getSpecifiedInheritanceStrategy();
+ }
+
+ @Override
+ protected void setValue(InheritanceType value) {
+ getSubject().setSpecifiedInheritanceStrategy(value);
+ }
+ };
+ }
+
+ protected abstract void addPrimaryKeyJoinColumnsComposite(Composite container);
+
+} \ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractJoiningStrategyPane.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractJoiningStrategyPane.java
new file mode 100644
index 0000000000..bb05a6a391
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractJoiningStrategyPane.java
@@ -0,0 +1,99 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 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.ui.internal.details;
+
+import org.eclipse.jpt.common.ui.internal.util.ControlSwitcher;
+import org.eclipse.jpt.common.ui.internal.widgets.Pane;
+import org.eclipse.jpt.common.utility.internal.Transformer;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.common.utility.model.value.WritablePropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.MappedByRelationship;
+import org.eclipse.jpt.jpa.core.context.MappedByRelationshipStrategy;
+import org.eclipse.jpt.jpa.core.context.ReadOnlyRelationship;
+import org.eclipse.jpt.jpa.core.context.ReadOnlyRelationshipStrategy;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.ui.part.PageBook;
+
+/**
+ * Abstract superclass for joining strategy form panes
+ *
+ * Here is the basic layout of this pane:
+ * <pre>
+ * -----------------------------------------------------------------------------
+ * | o <label> _______________________________________________________________ |
+ * | | | |
+ * | | (joining strategy details composite) | |
+ * | | | |
+ * | ------------------------------------------------------------------------- |
+ * -----------------------------------------------------------------------------</pre>
+ *
+ * @see MappedByRelationship
+ * @see MappedByRelationshipStrategy
+ * @see OneToOneJoiningStrategyPane
+ *
+ * @version 2.3
+ * @since 2.1
+ */
+public abstract class AbstractJoiningStrategyPane
+ <R extends ReadOnlyRelationship, S extends ReadOnlyRelationshipStrategy>
+ extends Pane<R>
+{
+ protected Composite strategyDetailsComposite;
+
+
+ /**
+ * Creates a new <code>AbstractJoiningStrategyPane</code>.
+ *
+ * @param parentPane The parent form pane
+ * @param parent The parent container
+ */
+ protected AbstractJoiningStrategyPane(
+ Pane<? extends R> parentPane,
+ Composite parent) {
+ super(parentPane, parent);
+ }
+
+ protected AbstractJoiningStrategyPane(Pane<?> parentPane,
+ PropertyValueModel<? extends R> subjectHolder,
+ Composite parent) {
+
+ super(parentPane, subjectHolder, parent);
+ }
+
+ protected abstract WritablePropertyValueModel<Boolean> buildUsesStrategyHolder();
+
+
+ @Override
+ protected void initializeLayout(Composite container) {
+ PageBook pageBook = new PageBook(container, SWT.NULL);
+ GridData gd = new GridData(GridData.FILL_HORIZONTAL);
+ gd.horizontalIndent = 5;
+ pageBook.setLayoutData(gd);
+
+ this.strategyDetailsComposite = buildStrategyDetailsComposite(pageBook);
+
+ new ControlSwitcher(this.buildUsesStrategyHolder(), buildPageBookTransformer(), pageBook);
+ }
+
+ protected abstract Composite buildStrategyDetailsComposite(Composite parent);
+
+ protected Transformer<Boolean, Control> buildPageBookTransformer() {
+ return new Transformer<Boolean, Control>() {
+ public Control transform(Boolean usesStrategy) {
+ return (usesStrategy.booleanValue()) ?
+ AbstractJoiningStrategyPane.this.strategyDetailsComposite :
+ null;
+ }
+ };
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractJpaDetailsPage.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractJpaDetailsPage.java
new file mode 100644
index 0000000000..92261db5f3
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractJpaDetailsPage.java
@@ -0,0 +1,53 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2010 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.ui.internal.details;
+
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.ui.internal.widgets.Pane;
+import org.eclipse.jpt.common.utility.internal.model.value.SimplePropertyValueModel;
+import org.eclipse.jpt.common.utility.model.value.WritablePropertyValueModel;
+import org.eclipse.jpt.jpa.core.JpaStructureNode;
+import org.eclipse.jpt.jpa.ui.JpaPlatformUi;
+import org.eclipse.jpt.jpa.ui.details.JpaDetailsPage;
+import org.eclipse.jpt.jpa.ui.internal.platform.JpaPlatformUiRegistry;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * The base class for the details view.
+ *
+ * @see JpaStructureNode
+ *
+ * @version 3.0
+ * @since 1.0
+ */
+public abstract class AbstractJpaDetailsPage<T extends JpaStructureNode>
+ extends Pane<T>
+ implements JpaDetailsPage<T>
+{
+ /**
+ * Creates a new <code>BaseJpaDetailsPage</code>.
+ *
+ * @param parent The parent container
+ * @param widgetFactory The factory used to create various common widgets
+ */
+ protected AbstractJpaDetailsPage(Composite parent, WidgetFactory widgetFactory) {
+ super(new SimplePropertyValueModel<T>(), parent, widgetFactory);
+ }
+
+ protected JpaPlatformUi getJpaPlatformUi() {
+ String platformId = getSubject().getJpaProject().getJpaPlatform().getId();
+ return JpaPlatformUiRegistry.instance().getJpaPlatformUi(platformId);
+ }
+
+ public final void setSubject(T subject) {
+ WritablePropertyValueModel<T> subjectHolder = (WritablePropertyValueModel<T>) getSubjectHolder();
+ subjectHolder.setValue(subject);
+ }
+} \ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractManyToManyMappingComposite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractManyToManyMappingComposite.java
new file mode 100644
index 0000000000..60fff9a731
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractManyToManyMappingComposite.java
@@ -0,0 +1,140 @@
+/*******************************************************************************
+ * 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.ui.internal.details;
+
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.ui.internal.widgets.Pane;
+import org.eclipse.jpt.common.utility.internal.model.value.PropertyAspectAdapter;
+import org.eclipse.jpt.common.utility.internal.model.value.SimplePropertyValueModel;
+import org.eclipse.jpt.common.utility.internal.model.value.TransformationPropertyValueModel;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.AccessHolder;
+import org.eclipse.jpt.jpa.core.context.Cascade;
+import org.eclipse.jpt.jpa.core.context.ManyToManyMapping;
+import org.eclipse.jpt.jpa.core.context.ManyToManyRelationship;
+import org.eclipse.jpt.jpa.ui.details.JpaComposite;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * Here the layout of this pane:
+ * <pre>
+ * -----------------------------------------------------------------------------
+ * | ------------------------------------------------------------------------- |
+ * | | | |
+ * | | TargetEntityComposite | |
+ * | | | |
+ * | ------------------------------------------------------------------------- |
+ * | ------------------------------------------------------------------------- |
+ * | | | |
+ * | | JoiningStrategyComposite | |
+ * | | | |
+ * | ------------------------------------------------------------------------- |
+ * | ------------------------------------------------------------------------- |
+ * | | | |
+ * | | FetchTypeComposite | |
+ * | | | |
+ * | ------------------------------------------------------------------------- |
+ * | ------------------------------------------------------------------------- |
+ * | | | |
+ * | | CascadeComposite | |
+ * | | | |
+ * | ------------------------------------------------------------------------- |
+ * | ------------------------------------------------------------------------- |
+ * | | | |
+ * | | OrderingComposite | |
+ * | | | |
+ * | ------------------------------------------------------------------------- |
+ * -----------------------------------------------------------------------------</pre>
+ *
+ * @see {@link ManyToManyMapping}
+ * @see {@link TargetEntityComposite}
+ * @see {@link ManyToManyJoiningStrategyPane}
+ * @see {@link FetchTypeComposite}
+ * @see {@link CascadeComposite}
+ * @see {@link OrderingComposite}
+ *
+ * @version 2.3
+ * @since 1.0
+ */
+public abstract class AbstractManyToManyMappingComposite<T extends ManyToManyMapping, R extends ManyToManyRelationship>
+ extends Pane<T>
+ implements JpaComposite
+{
+ /**
+ * Creates a new <code>ManyToManyMappingComposite</code>.
+ *
+ * @param subjectHolder The holder of the subject <code>IManyToManyMapping</code>
+ * @param parent The parent container
+ * @param widgetFactory The factory used to create various common widgets
+ */
+ protected AbstractManyToManyMappingComposite(PropertyValueModel<? extends T> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+
+ super(subjectHolder, parent, widgetFactory);
+ }
+
+ @Override
+ protected void initializeLayout(Composite container) {
+ initializeManyToManyCollapsibleSection(container);
+ initializeJoiningStrategyCollapsibleSection(container);
+ initializeOrderingCollapsibleSection(container);
+ }
+
+ protected void initializeManyToManyCollapsibleSection(Composite container) {
+ container = addCollapsibleSection(
+ container,
+ JptUiDetailsMessages.ManyToManySection_title,
+ new SimplePropertyValueModel<Boolean>(Boolean.TRUE)
+ );
+
+ this.initializeManyToManySection(container);
+ }
+
+ protected abstract void initializeManyToManySection(Composite container);
+
+ protected void initializeJoiningStrategyCollapsibleSection(Composite container) {
+ new ManyToManyJoiningStrategyPane(this, buildJoiningHolder(), container);
+ }
+
+ protected void initializeOrderingCollapsibleSection(Composite container) {
+ new OrderingComposite(this, container);
+ }
+
+
+ protected PropertyValueModel<R> buildJoiningHolder() {
+ return new TransformationPropertyValueModel<T, R>(
+ getSubjectHolder()) {
+ @SuppressWarnings("unchecked")
+ @Override
+ protected R transform_(T value) {
+ return (R) value.getRelationship();
+ }
+ };
+ }
+
+ protected PropertyValueModel<Cascade> buildCascadeHolder() {
+ return new TransformationPropertyValueModel<T, Cascade>(getSubjectHolder()) {
+ @Override
+ protected Cascade transform_(T value) {
+ return value.getCascade();
+ }
+ };
+ }
+
+ protected PropertyValueModel<AccessHolder> buildAccessHolderHolder() {
+ return new PropertyAspectAdapter<T, AccessHolder>(getSubjectHolder()) {
+ @Override
+ protected AccessHolder buildValue_() {
+ return this.subject.getPersistentAttribute();
+ }
+ };
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractManyToManyMappingUiDefinition.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractManyToManyMappingUiDefinition.java
new file mode 100644
index 0000000000..331af34391
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractManyToManyMappingUiDefinition.java
@@ -0,0 +1,41 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2009 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.ui.internal.details;
+
+import org.eclipse.jpt.jpa.core.MappingKeys;
+import org.eclipse.jpt.jpa.core.context.ManyToManyMapping;
+import org.eclipse.jpt.jpa.ui.internal.JpaMappingImageHelper;
+import org.eclipse.swt.graphics.Image;
+
+public abstract class AbstractManyToManyMappingUiDefinition<M, T extends ManyToManyMapping>
+ extends AbstractMappingUiDefinition<M, T>
+{
+ protected AbstractManyToManyMappingUiDefinition() {
+ super();
+ }
+
+
+ public Image getImage() {
+ return JpaMappingImageHelper.imageForAttributeMapping(getKey());
+ }
+
+ public String getLabel() {
+ return JptUiDetailsMessages.ManyToManyMappingUiProvider_label;
+ }
+
+ public String getLinkLabel() {
+ return JptUiDetailsMessages.ManyToManyMappingUiProvider_linkLabel;
+ }
+
+ public String getKey() {
+ return MappingKeys.MANY_TO_MANY_ATTRIBUTE_MAPPING_KEY;
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractManyToOneMappingComposite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractManyToOneMappingComposite.java
new file mode 100644
index 0000000000..c72c170e37
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractManyToOneMappingComposite.java
@@ -0,0 +1,80 @@
+/*******************************************************************************
+ * 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.ui.internal.details;
+
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.ui.internal.widgets.Pane;
+import org.eclipse.jpt.common.utility.internal.model.value.SimplePropertyValueModel;
+import org.eclipse.jpt.common.utility.internal.model.value.TransformationPropertyValueModel;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.Cascade;
+import org.eclipse.jpt.jpa.core.context.ManyToOneMapping;
+import org.eclipse.jpt.jpa.core.context.ManyToOneRelationship;
+import org.eclipse.jpt.jpa.ui.details.JpaComposite;
+import org.eclipse.swt.widgets.Composite;
+
+public abstract class AbstractManyToOneMappingComposite<T extends ManyToOneMapping, R extends ManyToOneRelationship>
+ extends Pane<T>
+ implements JpaComposite
+{
+ protected AbstractManyToOneMappingComposite(
+ PropertyValueModel<? extends T> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+
+ super(subjectHolder, parent, widgetFactory);
+ }
+
+ @Override
+ protected void initializeLayout(Composite container) {
+ initializeManyToOneCollapsibleSection(container);
+ initializeJoiningStrategyCollapsibleSection(container);
+ }
+
+ protected void initializeManyToOneCollapsibleSection(Composite container) {
+ container = addCollapsibleSection(
+ container,
+ JptUiDetailsMessages.ManyToOneSection_title,
+ new SimplePropertyValueModel<Boolean>(Boolean.TRUE)
+ );
+
+ this.initializeManyToOneSection(container);
+ }
+
+ protected abstract void initializeManyToOneSection(Composite container);
+
+ protected void initializeJoiningStrategyCollapsibleSection(Composite container) {
+ new ManyToOneJoiningStrategyPane(this, buildJoiningHolder(), container);
+ }
+
+ protected PropertyValueModel<Cascade> buildCascadeHolder() {
+ return new TransformationPropertyValueModel<T, Cascade>(getSubjectHolder()) {
+ @Override
+ protected Cascade transform_(T value) {
+ return value.getCascade();
+ }
+ };
+ }
+
+ protected PropertyValueModel<R> buildJoiningHolder() {
+ return new TransformationPropertyValueModel<T, R>(
+ getSubjectHolder()) {
+ @SuppressWarnings("unchecked")
+ @Override
+ protected R transform_(T value) {
+ return (R) value.getRelationship();
+ }
+ };
+ }
+
+ protected Composite addPane(Composite container, int groupBoxMargin) {
+ return addSubPane(container, 0, groupBoxMargin, 0, groupBoxMargin);
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractManyToOneMappingUiDefinition.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractManyToOneMappingUiDefinition.java
new file mode 100644
index 0000000000..74635a0651
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractManyToOneMappingUiDefinition.java
@@ -0,0 +1,41 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2009 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.ui.internal.details;
+
+import org.eclipse.jpt.jpa.core.MappingKeys;
+import org.eclipse.jpt.jpa.core.context.ManyToOneMapping;
+import org.eclipse.jpt.jpa.ui.internal.JpaMappingImageHelper;
+import org.eclipse.swt.graphics.Image;
+
+public abstract class AbstractManyToOneMappingUiDefinition<M, T extends ManyToOneMapping>
+ extends AbstractMappingUiDefinition<M, T>
+{
+ protected AbstractManyToOneMappingUiDefinition() {
+ super();
+ }
+
+
+ public Image getImage() {
+ return JpaMappingImageHelper.imageForAttributeMapping(getKey());
+ }
+
+ public String getLabel() {
+ return JptUiDetailsMessages.ManyToOneMappingUiProvider_label;
+ }
+
+ public String getLinkLabel() {
+ return JptUiDetailsMessages.ManyToOneMappingUiProvider_linkLabel;
+ }
+
+ public String getKey() {
+ return MappingKeys.MANY_TO_ONE_ATTRIBUTE_MAPPING_KEY;
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractMappedSuperclassComposite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractMappedSuperclassComposite.java
new file mode 100644
index 0000000000..c9b29c24d8
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractMappedSuperclassComposite.java
@@ -0,0 +1,62 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2010 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.ui.internal.details;
+
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.ui.internal.widgets.Pane;
+import org.eclipse.jpt.common.utility.internal.model.value.PropertyAspectAdapter;
+import org.eclipse.jpt.common.utility.internal.model.value.SimplePropertyValueModel;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.IdClassReference;
+import org.eclipse.jpt.jpa.core.context.MappedSuperclass;
+import org.eclipse.jpt.jpa.ui.details.JpaComposite;
+import org.eclipse.swt.widgets.Composite;
+
+
+public abstract class AbstractMappedSuperclassComposite<T extends MappedSuperclass>
+ extends Pane<T>
+ implements JpaComposite
+{
+ protected AbstractMappedSuperclassComposite(
+ PropertyValueModel<? extends T> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+
+ super(subjectHolder, parent, widgetFactory);
+ }
+
+ @Override
+ protected void initializeLayout(Composite container) {
+ this.initializeMappedSuperclassCollapsibleSection(container);
+ }
+
+ protected void initializeMappedSuperclassCollapsibleSection(Composite container) {
+ container = addCollapsibleSection(
+ container,
+ JptUiDetailsMessages.MappedSuperclassSection_title,
+ new SimplePropertyValueModel<Boolean>(Boolean.TRUE)
+ );
+
+ this.initializeMappedSuperclassSection(container);
+ }
+
+ protected void initializeMappedSuperclassSection(Composite container) {
+ new IdClassComposite(this, buildIdClassReferenceHolder(), container);
+ }
+
+ protected PropertyValueModel<IdClassReference> buildIdClassReferenceHolder() {
+ return new PropertyAspectAdapter<T, IdClassReference>(getSubjectHolder()) {
+ @Override
+ protected IdClassReference buildValue_() {
+ return this.subject.getIdClassReference();
+ }
+ };
+ }
+} \ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractMappedSuperclassUiDefinition.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractMappedSuperclassUiDefinition.java
new file mode 100644
index 0000000000..2d76a0b67b
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractMappedSuperclassUiDefinition.java
@@ -0,0 +1,41 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2009 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.ui.internal.details;
+
+import org.eclipse.jpt.jpa.core.MappingKeys;
+import org.eclipse.jpt.jpa.core.context.MappedSuperclass;
+import org.eclipse.jpt.jpa.ui.internal.JpaMappingImageHelper;
+import org.eclipse.swt.graphics.Image;
+
+public abstract class AbstractMappedSuperclassUiDefinition<M, T extends MappedSuperclass>
+ extends AbstractMappingUiDefinition<M, T>
+{
+ protected AbstractMappedSuperclassUiDefinition() {
+ super();
+ }
+
+
+ public String getKey() {
+ return MappingKeys.MAPPED_SUPERCLASS_TYPE_MAPPING_KEY;
+ }
+
+ public String getLabel() {
+ return JptUiDetailsMessages.MappedSuperclassUiProvider_label;
+ }
+
+ public String getLinkLabel() {
+ return JptUiDetailsMessages.MappedSuperclassUiProvider_linkLabel;
+ }
+
+ public Image getImage() {
+ return JpaMappingImageHelper.imageForTypeMapping(getKey());
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractMappingUiDefinition.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractMappingUiDefinition.java
new file mode 100644
index 0000000000..54562e5693
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractMappingUiDefinition.java
@@ -0,0 +1,25 @@
+/*******************************************************************************
+ * Copyright (c) 2010 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.ui.internal.details;
+
+import org.eclipse.jpt.jpa.ui.details.MappingUiDefinition;
+
+public abstract class AbstractMappingUiDefinition<M, T>
+ implements MappingUiDefinition<M, T>
+{
+ protected AbstractMappingUiDefinition() {
+ super();
+ }
+
+
+ public boolean isEnabledFor(M mappableObject) {
+ return true;
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractOneToManyMappingComposite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractOneToManyMappingComposite.java
new file mode 100644
index 0000000000..f1511e6ef2
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractOneToManyMappingComposite.java
@@ -0,0 +1,132 @@
+/*******************************************************************************
+ * 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.ui.internal.details;
+
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.ui.internal.widgets.Pane;
+import org.eclipse.jpt.common.utility.internal.model.value.SimplePropertyValueModel;
+import org.eclipse.jpt.common.utility.internal.model.value.TransformationPropertyValueModel;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.Cascade;
+import org.eclipse.jpt.jpa.core.context.OneToManyMapping;
+import org.eclipse.jpt.jpa.core.context.OneToManyRelationship;
+import org.eclipse.jpt.jpa.ui.details.JpaComposite;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * Here the layout of this pane:
+ * <pre>
+ * -----------------------------------------------------------------------------
+ * | ------------------------------------------------------------------------- |
+ * | | | |
+ * | | TargetEntityComposite | |
+ * | | | |
+ * | ------------------------------------------------------------------------- |
+ * | ------------------------------------------------------------------------- |
+ * | | | |
+ * | | JoiningStrategyComposite | |
+ * | | | |
+ * | ------------------------------------------------------------------------- |
+ * | ------------------------------------------------------------------------- |
+ * | | | |
+ * | | FetchTypeComposite | |
+ * | | | |
+ * | ------------------------------------------------------------------------- |
+ * | ------------------------------------------------------------------------- |
+ * | | | |
+ * | | CascadeComposite | |
+ * | | | |
+ * | ------------------------------------------------------------------------- |
+ * | ------------------------------------------------------------------------- |
+ * | | | |
+ * | | OrderingComposite | |
+ * | | | |
+ * | ------------------------------------------------------------------------- |
+ * -----------------------------------------------------------------------------</pre>
+ *
+ * @see OneToManyMapping
+ * @see CascadeComposite
+ * @see FetchTypeComposite
+ * @see JoinTableComposite
+ * @see OrderingComposite
+ * @see TargetEntityComposite
+ *
+ * @version 2.3
+ * @since 1.0
+ */
+public abstract class AbstractOneToManyMappingComposite<T extends OneToManyMapping, R extends OneToManyRelationship>
+ extends Pane<T>
+ implements JpaComposite
+{
+ /**
+ * Creates a new <code>OneToManyMappingComposite</code>.
+ *
+ * @param subjectHolder The holder of the subject <code>IOneToManyMapping</code>
+ * @param parent The parent container
+ * @param widgetFactory The factory used to create various common widgets
+ */
+ protected AbstractOneToManyMappingComposite(PropertyValueModel<? extends T> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+
+ super(subjectHolder, parent, widgetFactory);
+ }
+
+ @Override
+ protected void initializeLayout(Composite container) {
+ initializeOneToManyCollapsibleSection(container);
+ initializeJoiningStrategyCollapsibleSection(container);
+ initializeOrderingCollapsibleSection(container);
+ }
+
+ protected void initializeOneToManyCollapsibleSection(Composite container) {
+ container = addCollapsibleSection(
+ container,
+ JptUiDetailsMessages.OneToManySection_title,
+ new SimplePropertyValueModel<Boolean>(Boolean.TRUE)
+ );
+
+ this.initializeOneToManySection(container);
+ }
+
+ protected abstract void initializeOneToManySection(Composite container);
+
+ protected void initializeJoiningStrategyCollapsibleSection(Composite container) {
+ new OneToManyJoiningStrategyPane(this, buildJoiningHolder(), container);
+ }
+
+ protected void initializeOrderingCollapsibleSection(Composite container) {
+ new OrderingComposite(this, container);
+ }
+
+ protected PropertyValueModel<R> buildJoiningHolder() {
+ return new TransformationPropertyValueModel<T, R>(getSubjectHolder()) {
+ @SuppressWarnings("unchecked")
+ @Override
+ protected R transform_(T value) {
+ return (R) value.getRelationship();
+ }
+ };
+ }
+
+ protected PropertyValueModel<Cascade> buildCascadeHolder() {
+ return new TransformationPropertyValueModel<T, Cascade>(getSubjectHolder()) {
+ @Override
+ protected Cascade transform_(T value) {
+ return value.getCascade();
+ }
+ };
+ }
+
+ protected Composite addPane(Composite container, int groupBoxMargin) {
+ return addSubPane(container, 0, groupBoxMargin, 0, groupBoxMargin);
+ }
+
+} \ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractOneToManyMappingUiDefinition.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractOneToManyMappingUiDefinition.java
new file mode 100644
index 0000000000..26680dbc0d
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractOneToManyMappingUiDefinition.java
@@ -0,0 +1,41 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2009 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.ui.internal.details;
+
+import org.eclipse.jpt.jpa.core.MappingKeys;
+import org.eclipse.jpt.jpa.core.context.OneToManyMapping;
+import org.eclipse.jpt.jpa.ui.internal.JpaMappingImageHelper;
+import org.eclipse.swt.graphics.Image;
+
+public abstract class AbstractOneToManyMappingUiDefinition<M, T extends OneToManyMapping>
+ extends AbstractMappingUiDefinition<M, T>
+{
+ protected AbstractOneToManyMappingUiDefinition() {
+ super();
+ }
+
+
+ public Image getImage() {
+ return JpaMappingImageHelper.imageForAttributeMapping(getKey());
+ }
+
+ public String getLabel() {
+ return JptUiDetailsMessages.OneToManyMappingUiProvider_label;
+ }
+
+ public String getLinkLabel() {
+ return JptUiDetailsMessages.OneToManyMappingUiProvider_linkLabel;
+ }
+
+ public String getKey() {
+ return MappingKeys.ONE_TO_MANY_ATTRIBUTE_MAPPING_KEY;
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractOneToOneMappingComposite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractOneToOneMappingComposite.java
new file mode 100644
index 0000000000..0ed720721c
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractOneToOneMappingComposite.java
@@ -0,0 +1,80 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 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.ui.internal.details;
+
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.ui.internal.widgets.Pane;
+import org.eclipse.jpt.common.utility.internal.model.value.SimplePropertyValueModel;
+import org.eclipse.jpt.common.utility.internal.model.value.TransformationPropertyValueModel;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.Cascade;
+import org.eclipse.jpt.jpa.core.context.OneToOneMapping;
+import org.eclipse.jpt.jpa.core.context.OneToOneRelationship;
+import org.eclipse.jpt.jpa.ui.details.JpaComposite;
+import org.eclipse.swt.widgets.Composite;
+
+public abstract class AbstractOneToOneMappingComposite<T extends OneToOneMapping, R extends OneToOneRelationship>
+ extends Pane<T>
+ implements JpaComposite
+{
+ protected AbstractOneToOneMappingComposite(
+ PropertyValueModel<? extends T> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+
+ super(subjectHolder, parent, widgetFactory);
+ }
+
+ @Override
+ protected void initializeLayout(Composite container) {
+ initializeOneToOneCollapsibleSection(container);
+ initializeJoiningStrategyCollapsibleSection(container);
+ }
+
+ protected void initializeOneToOneCollapsibleSection(Composite container) {
+ container = addCollapsibleSection(
+ container,
+ JptUiDetailsMessages.OneToOneSection_title,
+ new SimplePropertyValueModel<Boolean>(Boolean.TRUE)
+ );
+
+ this.initializeOneToOneSection(container);
+ }
+
+ protected abstract void initializeOneToOneSection(Composite container);
+
+ protected void initializeJoiningStrategyCollapsibleSection(Composite container) {
+ new OneToOneJoiningStrategyPane(this, buildJoiningHolder(), container);
+ }
+
+ protected Composite addPane(Composite container, int groupBoxMargin) {
+ return addSubPane(container, 0, groupBoxMargin, 0, groupBoxMargin);
+ }
+
+ protected PropertyValueModel<R> buildJoiningHolder() {
+ return new TransformationPropertyValueModel<T, R>(
+ getSubjectHolder()) {
+ @SuppressWarnings("unchecked")
+ @Override
+ protected R transform_(T value) {
+ return (R) value.getRelationship();
+ }
+ };
+ }
+
+ protected PropertyValueModel<Cascade> buildCascadeHolder() {
+ return new TransformationPropertyValueModel<T, Cascade>(getSubjectHolder()) {
+ @Override
+ protected Cascade transform_(T value) {
+ return value.getCascade();
+ }
+ };
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractOneToOneMappingUiDefinition.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractOneToOneMappingUiDefinition.java
new file mode 100644
index 0000000000..133ad70daa
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractOneToOneMappingUiDefinition.java
@@ -0,0 +1,41 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2009 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.ui.internal.details;
+
+import org.eclipse.jpt.jpa.core.MappingKeys;
+import org.eclipse.jpt.jpa.core.context.OneToOneMapping;
+import org.eclipse.jpt.jpa.ui.internal.JpaMappingImageHelper;
+import org.eclipse.swt.graphics.Image;
+
+public abstract class AbstractOneToOneMappingUiDefinition<M, T extends OneToOneMapping>
+ extends AbstractMappingUiDefinition<M, T>
+{
+ protected AbstractOneToOneMappingUiDefinition() {
+ super();
+ }
+
+
+ public Image getImage() {
+ return JpaMappingImageHelper.imageForAttributeMapping(getKey());
+ }
+
+ public String getLabel() {
+ return JptUiDetailsMessages.OneToOneMappingUiProvider_label;
+ }
+
+ public String getLinkLabel() {
+ return JptUiDetailsMessages.OneToOneMappingUiProvider_linkLabel;
+ }
+
+ public String getKey() {
+ return MappingKeys.ONE_TO_ONE_ATTRIBUTE_MAPPING_KEY;
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractOrderingComposite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractOrderingComposite.java
new file mode 100644
index 0000000000..00d7beacd4
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractOrderingComposite.java
@@ -0,0 +1,139 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2010 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.ui.internal.details;
+
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.ui.internal.widgets.Pane;
+import org.eclipse.jpt.common.utility.internal.model.value.PropertyAspectAdapter;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.common.utility.model.value.WritablePropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.CollectionMapping;
+import org.eclipse.jpt.jpa.core.context.Orderable;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * Here the layout of this pane:
+ * <pre>
+ * -----------------------------------------------------------------------------
+ * | - Ordering -------------------------------------------------------------- |
+ * | | | |
+ * | | o None | |
+ * | | | |
+ * | | o Primary Key | |
+ * | | | |
+ * | | o Custom | |
+ * | | ------------------------------------------------------------------- | |
+ * | | | I | | |
+ * | | ------------------------------------------------------------------- | |
+ * | ------------------------------------------------------------------------- |
+ * -----------------------------------------------------------------------------</pre>
+ *
+ * @see CollectionMapping
+ * @see ManyToManyMappingComposite - A container of this pane
+ * @see OneToManyMappingComposite - A container of this pane
+ *
+ * @version 3.0
+ * @since 1.0
+ */
+public abstract class AbstractOrderingComposite extends Pane<CollectionMapping>
+{
+ /**
+ * Creates a new <code>OrderingComposite</code>.
+ *
+ * @param parentPane The parent container of this one
+ * @param parent The parent container
+ */
+ protected AbstractOrderingComposite(Pane<? extends CollectionMapping> parentPane,
+ Composite parent) {
+
+ super(parentPane, parent);
+ }
+
+ /**
+ * Creates a new <code>OrderingComposite</code>.
+ *
+ * @param subjectHolder The holder of the subject <code>IMultiRelationshipMapping</code>
+ * @param parent The parent container
+ * @param widgetFactory The factory used to create various common widgets
+ */
+ protected AbstractOrderingComposite(PropertyValueModel<? extends CollectionMapping> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+
+ super(subjectHolder, parent, widgetFactory);
+ }
+
+
+ protected PropertyValueModel<Orderable> buildOrderableHolder() {
+ return new PropertyAspectAdapter<CollectionMapping, Orderable>(getSubjectHolder()) {
+ @Override
+ protected Orderable buildValue_() {
+ return this.subject.getOrderable();
+ }
+ };
+ }
+
+ protected WritablePropertyValueModel<Boolean> buildNoOrderingHolder(PropertyValueModel<Orderable> orderableHolder) {
+ return new PropertyAspectAdapter<Orderable, Boolean>(orderableHolder, Orderable.NO_ORDERING_PROPERTY) {
+ @Override
+ protected Boolean buildValue_() {
+ return Boolean.valueOf(this.subject.isNoOrdering());
+ }
+
+ @Override
+ protected void setValue_(Boolean value) {
+ this.subject.setNoOrdering(value.booleanValue());
+ }
+ };
+ }
+
+ protected WritablePropertyValueModel<Boolean> buildPrimaryKeyOrderingHolder(PropertyValueModel<Orderable> orderableHolder) {
+ return new PropertyAspectAdapter<Orderable, Boolean>(orderableHolder, Orderable.PK_ORDERING_PROPERTY) {
+ @Override
+ protected Boolean buildValue_() {
+ return Boolean.valueOf(this.subject.isPkOrdering());
+ }
+
+ @Override
+ protected void setValue_(Boolean value) {
+ this.subject.setPkOrdering(value.booleanValue());
+ }
+ };
+ }
+
+ protected WritablePropertyValueModel<Boolean> buildCustomOrderingHolder(PropertyValueModel<Orderable> orderableHolder) {
+ return new PropertyAspectAdapter<Orderable, Boolean>(orderableHolder, Orderable.CUSTOM_ORDERING_PROPERTY) {
+ @Override
+ protected Boolean buildValue_() {
+ return Boolean.valueOf(this.subject.isCustomOrdering());
+ }
+
+ @Override
+ protected void setValue_(Boolean value) {
+ this.subject.setCustomOrdering(value.booleanValue());
+ }
+ };
+ }
+
+ protected WritablePropertyValueModel<String> buildSpecifiedOrderByHolder(PropertyValueModel<Orderable> orderableHolder) {
+ return new PropertyAspectAdapter<Orderable, String>(orderableHolder, Orderable.SPECIFIED_ORDER_BY_PROPERTY) {
+ @Override
+ protected String buildValue_() {
+ return this.subject.getSpecifiedOrderBy();
+ }
+
+ @Override
+ protected void setValue_(String value) {
+ this.subject.setSpecifiedOrderBy(value);
+ }
+ };
+ }
+
+} \ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractOverridesComposite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractOverridesComposite.java
new file mode 100644
index 0000000000..29203ce771
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractOverridesComposite.java
@@ -0,0 +1,414 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2010 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.ui.internal.details;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.ListIterator;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jpt.common.ui.internal.util.ControlSwitcher;
+import org.eclipse.jpt.common.ui.internal.util.PaneEnabler;
+import org.eclipse.jpt.common.ui.internal.utility.swt.SWTTools;
+import org.eclipse.jpt.common.ui.internal.widgets.AddRemoveListPane;
+import org.eclipse.jpt.common.ui.internal.widgets.Pane;
+import org.eclipse.jpt.common.ui.internal.widgets.AddRemovePane.Adapter;
+import org.eclipse.jpt.common.utility.internal.StringTools;
+import org.eclipse.jpt.common.utility.internal.Transformer;
+import org.eclipse.jpt.common.utility.internal.iterators.SuperListIteratorWrapper;
+import org.eclipse.jpt.common.utility.internal.model.value.CachingTransformationPropertyValueModel;
+import org.eclipse.jpt.common.utility.internal.model.value.CachingTransformationWritablePropertyValueModel;
+import org.eclipse.jpt.common.utility.internal.model.value.CompositeListValueModel;
+import org.eclipse.jpt.common.utility.internal.model.value.ItemPropertyListValueModelAdapter;
+import org.eclipse.jpt.common.utility.internal.model.value.ListAspectAdapter;
+import org.eclipse.jpt.common.utility.internal.model.value.SimplePropertyValueModel;
+import org.eclipse.jpt.common.utility.internal.model.value.TransformationPropertyValueModel;
+import org.eclipse.jpt.common.utility.internal.model.value.TransformationWritablePropertyValueModel;
+import org.eclipse.jpt.common.utility.internal.model.value.swing.ObjectListSelectionModel;
+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.core.context.AssociationOverride;
+import org.eclipse.jpt.jpa.core.context.AssociationOverrideContainer;
+import org.eclipse.jpt.jpa.core.context.AttributeOverride;
+import org.eclipse.jpt.jpa.core.context.AttributeOverrideContainer;
+import org.eclipse.jpt.jpa.core.context.JpaContextNode;
+import org.eclipse.jpt.jpa.core.context.OverrideContainer;
+import org.eclipse.jpt.jpa.core.context.Override_;
+import org.eclipse.jpt.jpa.core.context.ReadOnlyAssociationOverride;
+import org.eclipse.jpt.jpa.core.context.ReadOnlyAttributeOverride;
+import org.eclipse.jpt.jpa.core.context.ReadOnlyOverride;
+import org.eclipse.jpt.jpa.core.context.VirtualAssociationOverride;
+import org.eclipse.jpt.jpa.core.context.VirtualAttributeOverride;
+import org.eclipse.jpt.jpa.core.context.VirtualOverride;
+import org.eclipse.jpt.jpa.ui.internal.JpaHelpContextIds;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.ui.part.PageBook;
+
+@SuppressWarnings("nls")
+public abstract class AbstractOverridesComposite<T extends JpaContextNode>
+ extends Pane<T>
+{
+ private Pane<ReadOnlyAttributeOverride> attributeOverridePane;
+ private Pane<ReadOnlyAssociationOverride> associationOverridePane;
+
+ private WritablePropertyValueModel<ReadOnlyOverride> selectedOverrideHolder;
+ private WritablePropertyValueModel<Boolean> overrideVirtualOverrideHolder;
+
+
+ protected AbstractOverridesComposite(
+ Pane<? extends T> parentPane,
+ Composite parent) {
+
+ super(parentPane, parent, false);
+ }
+
+
+ @Override
+ protected void initialize() {
+ super.initialize();
+ this.selectedOverrideHolder = buildSelectedOverrideHolder();
+ }
+
+ private WritablePropertyValueModel<ReadOnlyOverride> buildSelectedOverrideHolder() {
+ return new SimplePropertyValueModel<ReadOnlyOverride>();
+ }
+
+ protected abstract boolean supportsAssociationOverrides();
+
+ @Override
+ protected void initializeLayout(Composite container) {
+ // Overrides group pane
+ container = addTitledGroup(
+ container,
+ JptUiDetailsMessages.OverridesComposite_attributeOverridesGroup);
+
+ // Overrides list pane
+ initializeOverridesList(container);
+
+ int groupBoxMargin = getGroupBoxMargin();
+
+ // Override Default check box
+ Button overrideCheckBox = addCheckBox(
+ addSubPane(container, 0, groupBoxMargin, 0, groupBoxMargin),
+ JptUiDetailsMessages.OverridesComposite_overrideDefault,
+ getOverrideVirtualOverrideHolder(),
+ null);
+ SWTTools.controlVisibleState(buildSelectedOverrideBooleanHolder(), overrideCheckBox);
+
+ // Property pane
+ PageBook pageBook = addPageBook(container);
+ initializeOverridePanes(pageBook);
+ installOverrideControlSwitcher(this.selectedOverrideHolder, pageBook);
+ }
+
+ protected void initializeOverridePanes(PageBook pageBook) {
+ initializeAttributeOverridePane(pageBook);
+ if (supportsAssociationOverrides()) {
+ initializeAssociationOverridePane(pageBook);
+ }
+ }
+
+ private PropertyValueModel<Boolean> buildSelectedOverrideBooleanHolder() {
+ return new TransformationPropertyValueModel<ReadOnlyOverride, Boolean>(this.selectedOverrideHolder) {
+ @Override
+ protected Boolean transform(ReadOnlyOverride value) {
+ return Boolean.valueOf(value != null);
+ }
+ };
+ }
+
+ private void initializeOverridesList(Composite container) {
+ new AddRemoveListPane<T>(
+ this,
+ addSubPane(container, 8),
+ buildOverridesAdapter(),
+ buildOverridesListModel(),
+ this.selectedOverrideHolder,
+ buildOverrideLabelProvider(),
+ JpaHelpContextIds.ENTITY_ATTRIBUTE_OVERRIDES) {
+
+ @Override
+ protected void initializeButtonPane(Composite c, String helpId) {
+ //no buttons: no way to add/remove/edit overrides, they are all defaulted in
+ }
+
+ @Override
+ protected void updateButtons() {
+ //no buttons: no way to add/remove/edit overrides, they are all defaulted in
+ }
+ };
+ }
+
+ protected void initializeAttributeOverridePane(PageBook pageBook) {
+ PropertyValueModel<ReadOnlyAttributeOverride> attributeOverrideHolder = buildAttributeOverrideHolder();
+ this.attributeOverridePane = buildAttributeOverridePane(pageBook, attributeOverrideHolder);
+ installAttributeOverridePaneEnabler(this.attributeOverridePane, attributeOverrideHolder);
+ }
+
+ protected Pane<ReadOnlyAttributeOverride> buildAttributeOverridePane(PageBook pageBook, PropertyValueModel<ReadOnlyAttributeOverride> attributeOverrideHolder) {
+ return new AttributeOverrideComposite(this, attributeOverrideHolder, pageBook);
+ }
+
+ private void installAttributeOverridePaneEnabler(Pane<ReadOnlyAttributeOverride> pane, PropertyValueModel<ReadOnlyAttributeOverride> overrideHolder) {
+ new PaneEnabler(
+ buildOverrideBooleanHolder(overrideHolder),
+ pane);
+ }
+
+ private PropertyValueModel<Boolean> buildOverrideBooleanHolder(PropertyValueModel<? extends ReadOnlyOverride> overrideHolder) {
+ return new CachingTransformationPropertyValueModel<ReadOnlyOverride, Boolean>(overrideHolder) {
+ @Override
+ protected Boolean transform_(ReadOnlyOverride value) {
+ return Boolean.valueOf(!value.isVirtual());
+ }
+ };
+ }
+
+ protected void initializeAssociationOverridePane(PageBook pageBook) {
+ PropertyValueModel<ReadOnlyAssociationOverride> associationOverrideHolder = buildAssociationOverrideHolder();
+ this.associationOverridePane = buildAssociationOverridePane(pageBook, associationOverrideHolder);
+ installAssociationOverridePaneEnabler(this.associationOverridePane, associationOverrideHolder);
+ }
+
+ protected Pane<ReadOnlyAssociationOverride> buildAssociationOverridePane(PageBook pageBook, PropertyValueModel<ReadOnlyAssociationOverride> associationOverrideHolder) {
+ return new AssociationOverrideComposite(this, associationOverrideHolder, pageBook);
+ }
+
+ private void installAssociationOverridePaneEnabler(Pane<ReadOnlyAssociationOverride> pane, PropertyValueModel<ReadOnlyAssociationOverride> overrideHolder) {
+ new PaneEnabler(
+ buildOverrideBooleanHolder(overrideHolder),
+ pane);
+ }
+
+ private void installOverrideControlSwitcher(
+ PropertyValueModel<ReadOnlyOverride> overrideHolder,
+ PageBook pageBook) {
+
+ new ControlSwitcher(
+ overrideHolder,
+ buildPaneTransformer(),
+ pageBook);
+ }
+
+ private WritablePropertyValueModel<ReadOnlyAssociationOverride> buildAssociationOverrideHolder() {
+ return new TransformationWritablePropertyValueModel<ReadOnlyOverride, ReadOnlyAssociationOverride>(this.selectedOverrideHolder) {
+ @Override
+ protected ReadOnlyAssociationOverride transform_(ReadOnlyOverride value) {
+ return (value instanceof ReadOnlyAssociationOverride) ? (ReadOnlyAssociationOverride) value : null;
+ }
+ };
+ }
+
+ private WritablePropertyValueModel<ReadOnlyAttributeOverride> buildAttributeOverrideHolder() {
+ return new TransformationWritablePropertyValueModel<ReadOnlyOverride, ReadOnlyAttributeOverride>(this.selectedOverrideHolder) {
+ @Override
+ protected ReadOnlyAttributeOverride transform_(ReadOnlyOverride value) {
+ return (value instanceof ReadOnlyAttributeOverride) ? (ReadOnlyAttributeOverride) value : null;
+ }
+ };
+ }
+
+ private ListValueModel<VirtualAssociationOverride> buildDefaultAssociationOverridesListHolder(PropertyValueModel<AssociationOverrideContainer> containerHolder) {
+ return new ListAspectAdapter<AssociationOverrideContainer, VirtualAssociationOverride>(containerHolder, OverrideContainer.VIRTUAL_OVERRIDES_LIST) {
+ @Override
+ protected ListIterator<VirtualAssociationOverride> listIterator_() {
+ return new SuperListIteratorWrapper<VirtualAssociationOverride>(this.subject.virtualOverrides());
+ }
+
+ @Override
+ protected int size_() {
+ return this.subject.virtualOverridesSize();
+ }
+ };
+ }
+
+ private ListValueModel<VirtualAttributeOverride> buildDefaultAttributeOverridesListHolder(PropertyValueModel<AttributeOverrideContainer> containerHolder) {
+ return new ListAspectAdapter<AttributeOverrideContainer, VirtualAttributeOverride>(containerHolder, OverrideContainer.VIRTUAL_OVERRIDES_LIST) {
+ @Override
+ protected ListIterator<VirtualAttributeOverride> listIterator_() {
+ return new SuperListIteratorWrapper<VirtualAttributeOverride>(this.subject.virtualOverrides());
+ }
+
+ @Override
+ protected int size_() {
+ return this.subject.virtualOverridesSize();
+ }
+ };
+ }
+
+ protected WritablePropertyValueModel<Boolean> getOverrideVirtualOverrideHolder() {
+ if (this.overrideVirtualOverrideHolder == null) {
+ this.overrideVirtualOverrideHolder = buildOverrideVirtualOverrideHolder();
+ }
+ return this.overrideVirtualOverrideHolder;
+ }
+
+ private WritablePropertyValueModel<Boolean> buildOverrideVirtualOverrideHolder() {
+ return new CachingTransformationWritablePropertyValueModel<ReadOnlyOverride, Boolean>(this.selectedOverrideHolder) {
+ @Override
+ public void setValue(Boolean value) {
+ updateOverride(value.booleanValue());
+ }
+
+ @Override
+ protected Boolean transform_(ReadOnlyOverride value) {
+ return Boolean.valueOf(!value.isVirtual());
+ }
+ };
+ }
+
+ String buildOverrideDisplayString(ReadOnlyOverride override) {
+ String overrideType;
+
+ // Retrieve the type
+ if (override instanceof ReadOnlyAssociationOverride) {
+ overrideType = JptUiDetailsMessages.OverridesComposite_association;
+ }
+ else {
+ overrideType = JptUiDetailsMessages.OverridesComposite_attribute;
+ }
+
+ // Format the name
+ String name = override.getName();
+
+ if (StringTools.stringIsEmpty(name)) {
+ name = JptUiDetailsMessages.OverridesComposite_noName;
+ }
+
+ // Format: <name> (Attribute/Association Override)
+ StringBuilder sb = new StringBuilder();
+ sb.append(name);
+ sb.append(" (");
+ sb.append(overrideType);
+ sb.append(") ");
+ return sb.toString();
+ }
+
+ protected ILabelProvider buildOverrideLabelProvider() {
+ return new LabelProvider() {
+ @Override
+ public String getText(Object element) {
+ return buildOverrideDisplayString((ReadOnlyOverride) element);
+ }
+ };
+ }
+
+ protected Adapter buildOverridesAdapter() {
+ return new AddRemoveListPane.AbstractAdapter() {
+ public void addNewItem(ObjectListSelectionModel listSelectionModel) {
+ //no way to add/remove/edit overrides, they are all defaulted in
+ }
+
+ public void removeSelectedItems(ObjectListSelectionModel listSelectionModel) {
+ //no way to add/remove/edit overrides, they are all defaulted in
+ }
+ };
+ }
+
+ protected ListValueModel<ReadOnlyOverride> buildOverridesListHolder() {
+ PropertyValueModel<AttributeOverrideContainer> attributeOverrideContainerHolder = buildAttributeOverrideContainerHolder();
+ List<ListValueModel<? extends ReadOnlyOverride>> list = new ArrayList<ListValueModel<? extends ReadOnlyOverride>>();
+
+ list.add(buildSpecifiedAttributeOverridesListHolder(attributeOverrideContainerHolder));
+ list.add(buildDefaultAttributeOverridesListHolder(attributeOverrideContainerHolder));
+
+ if (supportsAssociationOverrides()) {
+ PropertyValueModel<AssociationOverrideContainer> associationOverrideContainerHolder = buildAssociationOverrideContainerHolder();
+ list.add(buildSpecifiedAssociationOverridesListHolder(associationOverrideContainerHolder));
+ list.add(buildDefaultAssociationOverridesListHolder(associationOverrideContainerHolder));
+ }
+
+ return new CompositeListValueModel<ListValueModel<? extends ReadOnlyOverride>, ReadOnlyOverride>(list);
+ }
+
+ protected abstract PropertyValueModel<AttributeOverrideContainer> buildAttributeOverrideContainerHolder();
+
+ protected abstract PropertyValueModel<AssociationOverrideContainer> buildAssociationOverrideContainerHolder();
+
+ private ListValueModel<ReadOnlyOverride> buildOverridesListModel() {
+ return new ItemPropertyListValueModelAdapter<ReadOnlyOverride>(
+ buildOverridesListHolder(),
+ ReadOnlyOverride.NAME_PROPERTY);
+ }
+
+ private Transformer<ReadOnlyOverride, Control> buildPaneTransformer() {
+ return new Transformer<ReadOnlyOverride, Control>() {
+ public Control transform(ReadOnlyOverride override) {
+ return AbstractOverridesComposite.this.transformSelectedOverride(override);
+ }
+ };
+ }
+
+ /**
+ * Given the selected override, return the control that will be displayed
+ */
+ protected Control transformSelectedOverride(ReadOnlyOverride selectedOverride) {
+ if (selectedOverride instanceof ReadOnlyAttributeOverride) {
+ return AbstractOverridesComposite.this.attributeOverridePane.getControl();
+ }
+
+ if (selectedOverride instanceof ReadOnlyAssociationOverride) {
+ return AbstractOverridesComposite.this.associationOverridePane.getControl();
+ }
+
+ return null;
+ }
+
+ private ListValueModel<AssociationOverride> buildSpecifiedAssociationOverridesListHolder(PropertyValueModel<AssociationOverrideContainer> containerHolder) {
+ return new ListAspectAdapter<AssociationOverrideContainer, AssociationOverride>(containerHolder, OverrideContainer.SPECIFIED_OVERRIDES_LIST) {
+ @Override
+ protected ListIterator<AssociationOverride> listIterator_() {
+ return new SuperListIteratorWrapper<AssociationOverride>(this.subject.specifiedOverrides());
+ }
+
+ @Override
+ protected int size_() {
+ return this.subject.specifiedOverridesSize();
+ }
+ };
+ }
+
+ private ListValueModel<AttributeOverride> buildSpecifiedAttributeOverridesListHolder(PropertyValueModel<AttributeOverrideContainer> containerHolder) {
+ return new ListAspectAdapter<AttributeOverrideContainer, AttributeOverride>(containerHolder, OverrideContainer.SPECIFIED_OVERRIDES_LIST) {
+ @Override
+ protected ListIterator<AttributeOverride> listIterator_() {
+ return new SuperListIteratorWrapper<AttributeOverride>(this.subject.specifiedOverrides());
+ }
+
+ @Override
+ protected int size_() {
+ return this.subject.specifiedOverridesSize();
+ }
+ };
+ }
+
+ void updateOverride(boolean convertToSpecified) {
+ if (isPopulating()) {
+ return;
+ }
+
+ setPopulating(true);
+
+ try {
+ ReadOnlyOverride override = this.selectedOverrideHolder.getValue();
+
+ ReadOnlyOverride newOverride = convertToSpecified ?
+ ((VirtualOverride) override).convertToSpecified() :
+ ((Override_) override).convertToVirtual();
+ this.selectedOverrideHolder.setValue(newOverride);
+ }
+ finally {
+ setPopulating(false);
+ }
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractPrimaryKeyJoinColumnsComposite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractPrimaryKeyJoinColumnsComposite.java
new file mode 100644
index 0000000000..b512da1b75
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractPrimaryKeyJoinColumnsComposite.java
@@ -0,0 +1,344 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2010 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.ui.internal.details;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.ListIterator;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jpt.common.ui.internal.util.PaneEnabler;
+import org.eclipse.jpt.common.ui.internal.widgets.AddRemoveListPane;
+import org.eclipse.jpt.common.ui.internal.widgets.Pane;
+import org.eclipse.jpt.common.ui.internal.widgets.PostExecution;
+import org.eclipse.jpt.common.ui.internal.widgets.AddRemovePane.AbstractAdapter;
+import org.eclipse.jpt.common.ui.internal.widgets.AddRemovePane.Adapter;
+import org.eclipse.jpt.common.utility.internal.model.value.CompositeListValueModel;
+import org.eclipse.jpt.common.utility.internal.model.value.ItemPropertyListValueModelAdapter;
+import org.eclipse.jpt.common.utility.internal.model.value.ListAspectAdapter;
+import org.eclipse.jpt.common.utility.internal.model.value.ListPropertyValueModelAdapter;
+import org.eclipse.jpt.common.utility.internal.model.value.SimplePropertyValueModel;
+import org.eclipse.jpt.common.utility.internal.model.value.swing.ObjectListSelectionModel;
+import org.eclipse.jpt.common.utility.model.value.ListValueModel;
+import org.eclipse.jpt.common.utility.model.value.WritablePropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.Entity;
+import org.eclipse.jpt.jpa.core.context.PrimaryKeyJoinColumn;
+import org.eclipse.jpt.jpa.core.context.ReadOnlyBaseJoinColumn;
+import org.eclipse.jpt.jpa.core.context.ReadOnlyNamedColumn;
+import org.eclipse.jpt.jpa.core.context.ReadOnlyPrimaryKeyJoinColumn;
+import org.eclipse.jpt.jpa.ui.internal.JpaHelpContextIds;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Group;
+
+/**
+ * Here the layout of this pane:
+ * <pre>
+ * -----------------------------------------------------------------------------
+ * | - Join Columns ---------------------------------------------------------- |
+ * | | | |
+ * | | x Override Default | |
+ * | | | |
+ * | | --------------------------------------------------------------------- | |
+ * | | | | | |
+ * | | | AddRemoveListPane | | |
+ * | | | | | |
+ * | | --------------------------------------------------------------------- | |
+ * | ------------------------------------------------------------------------- |
+ * -----------------------------------------------------------------------------</pre>
+ *
+ * @see Entity
+ *
+ * @version 2.0
+ * @since 2.0
+ */
+public abstract class AbstractPrimaryKeyJoinColumnsComposite<T extends Entity> extends Pane<T>
+{
+ protected WritablePropertyValueModel<PrimaryKeyJoinColumn> joinColumnHolder;
+
+ public AbstractPrimaryKeyJoinColumnsComposite(Pane<? extends T> subjectHolder,
+ Composite parent) {
+
+ super(subjectHolder, parent, false);
+ }
+
+ void addJoinColumn(PrimaryKeyJoinColumnStateObject stateObject) {
+ PrimaryKeyJoinColumn joinColumn = getSubject().addSpecifiedPrimaryKeyJoinColumn();
+ stateObject.updateJoinColumn(joinColumn);
+ }
+
+ void addPrimaryKeyJoinColumn() {
+
+ PrimaryKeyJoinColumnDialog dialog = new PrimaryKeyJoinColumnDialog(
+ getShell(),
+ getSubject(),
+ null
+ );
+
+ dialog.openDialog(buildAddPrimaryKeyJoinColumnPostExecution());
+ }
+
+ private PostExecution<PrimaryKeyJoinColumnDialog> buildAddPrimaryKeyJoinColumnPostExecution() {
+ return new PostExecution<PrimaryKeyJoinColumnDialog>() {
+ public void execute(PrimaryKeyJoinColumnDialog dialog) {
+ if (dialog.wasConfirmed()) {
+ addJoinColumn(dialog.getSubject());
+ }
+ }
+ };
+ }
+
+ protected abstract ListValueModel<? extends ReadOnlyPrimaryKeyJoinColumn> buildDefaultJoinColumnsListHolder();
+
+ private PostExecution<PrimaryKeyJoinColumnDialog> buildEditPrimaryKeyJoinColumnPostExecution() {
+ return new PostExecution<PrimaryKeyJoinColumnDialog>() {
+ public void execute(PrimaryKeyJoinColumnDialog dialog) {
+ if (dialog.wasConfirmed()) {
+ editJoinColumn(dialog.getSubject());
+ }
+ }
+ };
+ }
+
+ private WritablePropertyValueModel<PrimaryKeyJoinColumn> buildJoinColumnHolder() {
+ return new SimplePropertyValueModel<PrimaryKeyJoinColumn>();
+ }
+
+ String buildJoinColumnLabel(ReadOnlyPrimaryKeyJoinColumn joinColumn) {
+ if (joinColumn.isDefault()) {
+ return NLS.bind(
+ JptUiDetailsMessages.PrimaryKeyJoinColumnsComposite_mappingBetweenTwoParamsDefault,
+ joinColumn.getName(),
+ joinColumn.getReferencedColumnName()
+ );
+ }
+
+ if (joinColumn.getSpecifiedName() == null) {
+ if (joinColumn.getSpecifiedReferencedColumnName() == null) {
+ return NLS.bind(
+ JptUiDetailsMessages.PrimaryKeyJoinColumnsComposite_mappingBetweenTwoParamsBothDefault,
+ joinColumn.getName(),
+ joinColumn.getReferencedColumnName()
+ );
+ }
+
+ return NLS.bind(
+ JptUiDetailsMessages.PrimaryKeyJoinColumnsComposite_mappingBetweenTwoParamsFirstDefault,
+ joinColumn.getName(),
+ joinColumn.getReferencedColumnName()
+ );
+ }
+
+ if (joinColumn.getSpecifiedReferencedColumnName() == null) {
+ return NLS.bind(
+ JptUiDetailsMessages.PrimaryKeyJoinColumnsComposite_mappingBetweenTwoParamsSecDefault,
+ joinColumn.getName(),
+ joinColumn.getReferencedColumnName()
+ );
+ }
+
+ return NLS.bind(
+ JptUiDetailsMessages.PrimaryKeyJoinColumnsComposite_mappingBetweenTwoParams,
+ joinColumn.getName(),
+ joinColumn.getReferencedColumnName()
+ );
+ }
+
+ private Adapter buildJoinColumnsAdapter() {
+ return new AbstractAdapter() {
+ public void addNewItem(ObjectListSelectionModel listSelectionModel) {
+ addPrimaryKeyJoinColumn();
+ }
+
+ @Override
+ public boolean hasOptionalButton() {
+ return true;
+ }
+
+ @Override
+ public String optionalButtonText() {
+ return JptUiDetailsMessages.PrimaryKeyJoinColumnsComposite_edit;
+ }
+
+ @Override
+ public void optionOnSelection(ObjectListSelectionModel listSelectionModel) {
+ editPrimaryKeyJoinColumn(listSelectionModel);
+ }
+
+ public void removeSelectedItems(ObjectListSelectionModel listSelectionModel) {
+
+ int[] selectedIndices = listSelectionModel.selectedIndices();
+ Entity entity = getSubject();
+
+ for (int index = selectedIndices.length; --index >= 0; ) {
+ entity.removeSpecifiedPrimaryKeyJoinColumn(selectedIndices[index]);
+ }
+ }
+ };
+ }
+
+ private ILabelProvider buildJoinColumnsListLabelProvider() {
+ return new LabelProvider() {
+ @Override
+ public String getText(Object element) {
+ return buildJoinColumnLabel((ReadOnlyPrimaryKeyJoinColumn) element);
+ }
+ };
+ }
+
+ private WritablePropertyValueModel<Boolean> buildOverrideDefaultJoinColumnHolder() {
+ return new OverrideDefaultJoinColumnHolder();
+ }
+
+ private ListValueModel<ReadOnlyPrimaryKeyJoinColumn> buildPrimaryKeyJoinColumnsListHolder() {
+ List<ListValueModel<? extends ReadOnlyPrimaryKeyJoinColumn>> list = new ArrayList<ListValueModel<? extends ReadOnlyPrimaryKeyJoinColumn>>();
+ list.add(buildSpecifiedJoinColumnsListHolder());
+ list.add(buildDefaultJoinColumnsListHolder());
+ return new CompositeListValueModel<ListValueModel<? extends ReadOnlyPrimaryKeyJoinColumn>, ReadOnlyPrimaryKeyJoinColumn>(list);
+ }
+
+ private ListValueModel<ReadOnlyPrimaryKeyJoinColumn> buildPrimaryKeyJoinColumnsListModel() {
+ return new ItemPropertyListValueModelAdapter<ReadOnlyPrimaryKeyJoinColumn>(
+ buildPrimaryKeyJoinColumnsListHolder(),
+ ReadOnlyNamedColumn.SPECIFIED_NAME_PROPERTY,
+ ReadOnlyNamedColumn.DEFAULT_NAME_PROPERTY,
+ ReadOnlyBaseJoinColumn.SPECIFIED_REFERENCED_COLUMN_NAME_PROPERTY,
+ ReadOnlyBaseJoinColumn.DEFAULT_REFERENCED_COLUMN_NAME_PROPERTY
+ );
+ }
+
+ ListValueModel<PrimaryKeyJoinColumn> buildSpecifiedJoinColumnsListHolder() {
+ return new ListAspectAdapter<Entity, PrimaryKeyJoinColumn>(getSubjectHolder(), Entity.SPECIFIED_PRIMARY_KEY_JOIN_COLUMNS_LIST) {
+ @Override
+ @SuppressWarnings("unchecked")
+ protected ListIterator<PrimaryKeyJoinColumn> listIterator_() {
+ return (ListIterator<PrimaryKeyJoinColumn>) subject.specifiedPrimaryKeyJoinColumns();
+ }
+
+ @Override
+ protected int size_() {
+ return subject.specifiedPrimaryKeyJoinColumnsSize();
+ }
+ };
+ }
+
+ void editJoinColumn(PrimaryKeyJoinColumnStateObject stateObject) {
+ stateObject.updateJoinColumn(stateObject.getJoinColumn());
+ }
+
+ void editPrimaryKeyJoinColumn(ObjectListSelectionModel listSelectionModel) {
+
+ PrimaryKeyJoinColumn joinColumn = (PrimaryKeyJoinColumn) listSelectionModel.selectedValue();
+
+ PrimaryKeyJoinColumnDialog dialog = new PrimaryKeyJoinColumnDialog(
+ getShell(),
+ getSubject(),
+ joinColumn
+ );
+
+ dialog.openDialog(buildEditPrimaryKeyJoinColumnPostExecution());
+ }
+
+ /*
+ * (non-Javadoc)
+ */
+ @Override
+ protected void initialize() {
+ super.initialize();
+ joinColumnHolder = buildJoinColumnHolder();
+ }
+
+ /*
+ * (non-Javadoc)
+ */
+ @Override
+ protected void initializeLayout(Composite container) {
+
+ // Primary Key Join Columns group pane
+ Group groupPane = addTitledGroup(
+ container,
+ JptUiDetailsMessages.PrimaryKeyJoinColumnsComposite_primaryKeyJoinColumn
+ );
+
+ // Override Default Join Columns check box
+ addCheckBox(
+ addSubPane(groupPane, 8),
+ JptUiDetailsMessages.PrimaryKeyJoinColumnsComposite_overrideDefaultPrimaryKeyJoinColumns,
+ buildOverrideDefaultJoinColumnHolder(),
+ null
+ );
+
+ // Primary Key Join Columns list pane
+ AddRemoveListPane<Entity> joinColumnsListPane = new AddRemoveListPane<Entity>(
+ this,
+ groupPane,
+ buildJoinColumnsAdapter(),
+ buildPrimaryKeyJoinColumnsListModel(),
+ joinColumnHolder,
+ buildJoinColumnsListLabelProvider(),
+ JpaHelpContextIds.MAPPING_JOIN_TABLE_COLUMNS
+ );
+
+ installJoinColumnsListPaneEnabler(joinColumnsListPane);
+ }
+
+ private void installJoinColumnsListPaneEnabler(AddRemoveListPane<Entity> pane) {
+ new PaneEnabler(
+ buildOverrideDefaultJoinColumnHolder(),
+ pane
+ );
+ }
+
+ void updateJoinColumns(boolean selected) {
+
+ if (isPopulating()) {
+ return;
+ }
+
+ setPopulating(true);
+
+ try {
+ // Add a join column by creating a specified one using the default
+ // one if it exists
+ if (selected) {
+
+ switchDefaultToSpecified();
+ }
+ // Remove all the specified join columns
+ else {
+ for (int index = getSubject().specifiedPrimaryKeyJoinColumnsSize(); --index >= 0; ) {
+ getSubject().removeSpecifiedPrimaryKeyJoinColumn(index);
+ }
+ }
+ }
+ finally {
+ setPopulating(false);
+ }
+ }
+
+ protected abstract void switchDefaultToSpecified();
+
+ private class OverrideDefaultJoinColumnHolder extends ListPropertyValueModelAdapter<Boolean>
+ implements WritablePropertyValueModel<Boolean> {
+
+ public OverrideDefaultJoinColumnHolder() {
+ super(buildSpecifiedJoinColumnsListHolder());
+ }
+
+ @Override
+ protected Boolean buildValue() {
+ return listHolder.size() > 0;
+ }
+
+ public void setValue(Boolean value) {
+ updateJoinColumns(value.booleanValue());
+ }
+ }
+} \ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractSecondaryTablesComposite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractSecondaryTablesComposite.java
new file mode 100644
index 0000000000..88748b18b8
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractSecondaryTablesComposite.java
@@ -0,0 +1,177 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2010 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.ui.internal.details;
+
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.window.Window;
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.ui.internal.widgets.AddRemoveListPane;
+import org.eclipse.jpt.common.ui.internal.widgets.Pane;
+import org.eclipse.jpt.common.utility.internal.model.value.SimplePropertyValueModel;
+import org.eclipse.jpt.common.utility.internal.model.value.swing.ObjectListSelectionModel;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.common.utility.model.value.WritablePropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.Entity;
+import org.eclipse.jpt.jpa.core.context.SecondaryTable;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * Here the layout of this pane:
+ * <pre>
+ * -----------------------------------------------------------------------------
+ * | ------------------------------------------------------------------------- |
+ * | | | |
+ * | | AddRemoveListPane | |
+ * | | | |
+ * | ------------------------------------------------------------------------- |
+ * | ------------------------------------------------------------------------- |
+ * | | | |
+ * | | PrimaryKeyJoinColumnsInSecondaryTableComposite | |
+ * | | | |
+ * | ------------------------------------------------------------------------- |
+ * -----------------------------------------------------------------------------</pre>
+ *
+ * @see OrmEntity
+ * @see OrmEntityComposite - The container of this pane
+ * @see AddRemoveListPane
+ * @see PrimaryKeyJoinColumnsInSecondaryTableComposite
+ *
+ * @version 2.0
+ * @since 1.0
+ */
+public abstract class AbstractSecondaryTablesComposite<T extends Entity> extends Pane<T>
+{
+ /**
+ * Creates a new <code>SecondaryTablesComposite</code>.
+ *
+ * @param parentPane The parent container of this one
+ * @param parent The parent container
+ */
+ public AbstractSecondaryTablesComposite(Pane<? extends T> parentPane,
+ Composite parent) {
+
+ super(parentPane, parent, false);
+ }
+
+ /**
+ * Creates a new <code>SecondaryTablesComposite</code>.
+ *
+ * @param subjectHolder The holder of the subject <code>IEntity</code>
+ * @param parent The parent container
+ * @param widgetFactory The factory used to create various common widgets
+ */
+ public AbstractSecondaryTablesComposite(PropertyValueModel<? extends T> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+
+ super(subjectHolder, parent, widgetFactory);
+ }
+
+ protected void addSecondaryTableFromDialog(SecondaryTableDialog dialog, ObjectListSelectionModel listSelectionModel) {
+ if (dialog.open() != Window.OK) {
+ return;
+ }
+
+ SecondaryTable secondaryTable = this.getSubject().addSpecifiedSecondaryTable();
+ secondaryTable.setSpecifiedName(dialog.getSelectedTable());
+ secondaryTable.setSpecifiedCatalog(dialog.getSelectedCatalog());
+ secondaryTable.setSpecifiedSchema(dialog.getSelectedSchema());
+
+ listSelectionModel.setSelectedValue(secondaryTable);
+ }
+
+ protected WritablePropertyValueModel<SecondaryTable> buildSecondaryTableHolder() {
+ return new SimplePropertyValueModel<SecondaryTable>();
+ }
+
+ protected ILabelProvider buildSecondaryTableLabelProvider() {
+ return new LabelProvider() {
+ @Override
+ public String getText(Object element) {
+ // TODO display a qualified name instead
+ SecondaryTable secondaryTable = (SecondaryTable) element;
+ if (secondaryTable.getName() != null) {
+ return secondaryTable.getName();
+ }
+ return "";//TODO
+ }
+ };
+ }
+
+ protected SecondaryTableDialog buildSecondaryTableDialogForAdd() {
+ return new SecondaryTableDialog(getShell(), getSubject().getJpaProject(), getSubject().getTable().getDefaultCatalog(), getSubject().getTable().getDefaultSchema());
+ }
+
+ protected AddRemoveListPane.Adapter buildSecondaryTablesAdapter() {
+ return new AddRemoveListPane.AbstractAdapter() {
+
+ public void addNewItem(ObjectListSelectionModel listSelectionModel) {
+ SecondaryTableDialog dialog = buildSecondaryTableDialogForAdd();
+ addSecondaryTableFromDialog(dialog, listSelectionModel);
+ }
+
+ @Override
+ public boolean hasOptionalButton() {
+ return true;
+ }
+
+ @Override
+ public String optionalButtonText() {
+ return JptUiDetailsMessages.SecondaryTablesComposite_edit;
+ }
+
+ @Override
+ public void optionOnSelection(ObjectListSelectionModel listSelectionModel) {
+ SecondaryTable secondaryTable = (SecondaryTable) listSelectionModel.selectedValue();
+ SecondaryTableDialog dialog = new SecondaryTableDialog(getShell(), getSubject().getJpaProject(), secondaryTable);
+ editSecondaryTableFromDialog(dialog, secondaryTable);
+ }
+
+ public void removeSelectedItems(ObjectListSelectionModel listSelectionModel) {
+ Entity entity = getSubject();
+ int[] selectedIndices = listSelectionModel.selectedIndices();
+
+ for (int index = selectedIndices.length; --index >= 0; ) {
+ entity.removeSpecifiedSecondaryTable(selectedIndices[index]);
+ }
+ }
+
+ @Override
+ public boolean enableOptionOnSelectionChange(ObjectListSelectionModel listSelectionModel) {
+ if (listSelectionModel.selectedValuesSize() != 1) {
+ return false;
+ }
+ SecondaryTable secondaryTable = (SecondaryTable) listSelectionModel.selectedValue();
+ return !secondaryTable.isVirtual();
+ }
+
+ @Override
+ public boolean enableRemoveOnSelectionChange(ObjectListSelectionModel listSelectionModel) {
+ if (listSelectionModel.selectedValue() == null) {
+ return false;
+ }
+ SecondaryTable secondaryTable = (SecondaryTable) listSelectionModel.selectedValue();
+ return !secondaryTable.isVirtual();
+ }
+ };
+ }
+
+ protected void editSecondaryTableFromDialog(SecondaryTableDialog dialog, SecondaryTable secondaryTable) {
+ if (dialog.open() != Window.OK) {
+ return;
+ }
+
+ secondaryTable.setSpecifiedName(dialog.getSelectedTable());
+ secondaryTable.setSpecifiedCatalog(dialog.getSelectedCatalog());
+ secondaryTable.setSpecifiedSchema(dialog.getSelectedSchema());
+ }
+
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractTransientMappingUiDefinition.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractTransientMappingUiDefinition.java
new file mode 100644
index 0000000000..0453e01eb0
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractTransientMappingUiDefinition.java
@@ -0,0 +1,41 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2009 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.ui.internal.details;
+
+import org.eclipse.jpt.jpa.core.MappingKeys;
+import org.eclipse.jpt.jpa.core.context.TransientMapping;
+import org.eclipse.jpt.jpa.ui.internal.JpaMappingImageHelper;
+import org.eclipse.swt.graphics.Image;
+
+public abstract class AbstractTransientMappingUiDefinition<M, T extends TransientMapping>
+ extends AbstractMappingUiDefinition<M, T>
+{
+ protected AbstractTransientMappingUiDefinition() {
+ super();
+ }
+
+
+ public Image getImage() {
+ return JpaMappingImageHelper.imageForAttributeMapping(getKey());
+ }
+
+ public String getLabel() {
+ return JptUiDetailsMessages.TransientMappingUiProvider_label;
+ }
+
+ public String getLinkLabel() {
+ return JptUiDetailsMessages.TransientMappingUiProvider_linkLabel;
+ }
+
+ public String getKey() {
+ return MappingKeys.TRANSIENT_ATTRIBUTE_MAPPING_KEY;
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractVersionMappingComposite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractVersionMappingComposite.java
new file mode 100644
index 0000000000..b53788f97d
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractVersionMappingComposite.java
@@ -0,0 +1,161 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2010 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.ui.internal.details;
+
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.ui.internal.widgets.Pane;
+import org.eclipse.jpt.common.utility.internal.model.value.PropertyAspectAdapter;
+import org.eclipse.jpt.common.utility.internal.model.value.SimplePropertyValueModel;
+import org.eclipse.jpt.common.utility.internal.model.value.TransformationPropertyValueModel;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.common.utility.model.value.WritablePropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.Column;
+import org.eclipse.jpt.jpa.core.context.Converter;
+import org.eclipse.jpt.jpa.core.context.ConvertibleMapping;
+import org.eclipse.jpt.jpa.core.context.TemporalConverter;
+import org.eclipse.jpt.jpa.core.context.VersionMapping;
+import org.eclipse.jpt.jpa.ui.details.JpaComposite;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * Here the layout of this pane:
+ * <pre>
+ * -----------------------------------------------------------------------------
+ * | ------------------------------------------------------------------------- |
+ * | | | |
+ * | | ColumnComposite | |
+ * | | | |
+ * | ------------------------------------------------------------------------- |
+ * | ------------------------------------------------------------------------- |
+ * | | | |
+ * | | TemporalTypeComposite | |
+ * | | | |
+ * | ------------------------------------------------------------------------- |
+ * -----------------------------------------------------------------------------</pre>
+ *
+ * @see VersionMapping
+ * @see ColumnComposite
+ * @see TemporalTypeComposite
+ *
+ * @version 2.3
+ * @since 1.0
+ */
+public abstract class AbstractVersionMappingComposite<T extends VersionMapping>
+ extends Pane<T>
+ implements JpaComposite
+{
+ /**
+ * Creates a new <code>VersionMappingComposite</code>.
+ *
+ * @param subjectHolder The holder of the subject <code>IVersionMapping</code>
+ * @param parent The parent container
+ * @param widgetFactory The factory used to create various common widgets
+ */
+ protected AbstractVersionMappingComposite(PropertyValueModel<? extends T> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+
+ super(subjectHolder, parent, widgetFactory);
+ }
+
+ @Override
+ protected void initializeLayout(Composite container) {
+ initializeVersionCollapsibleSection(container);
+ initializeTypeCollapsibleSection(container);
+ }
+
+ protected void initializeVersionCollapsibleSection(Composite container) {
+ container = addCollapsibleSection(
+ container,
+ JptUiDetailsMessages.VersionSection_title,
+ new SimplePropertyValueModel<Boolean>(Boolean.TRUE)
+ );
+
+ this.initializeVersionSection(container);
+ }
+
+ protected abstract void initializeVersionSection(Composite container);
+
+ protected void initializeTypeCollapsibleSection(Composite container) {
+ container = addCollapsibleSection(
+ container,
+ JptUiDetailsMessages.TypeSection_type
+ );
+ this.initializeTypeSection(container);
+ }
+
+ protected void initializeTypeSection(Composite container) {
+ ((GridLayout) container.getLayout()).numColumns = 2;
+
+ // No converter
+ Button noConverterButton = addRadioButton(
+ container,
+ JptUiDetailsMessages.TypeSection_default,
+ buildConverterBooleanHolder(null),
+ null);
+ ((GridData) noConverterButton.getLayoutData()).horizontalSpan = 2;
+
+ PropertyValueModel<Converter> converterHolder = buildConverterHolder();
+ // Temporal
+ addRadioButton(
+ container,
+ JptUiDetailsMessages.TypeSection_temporal,
+ buildConverterBooleanHolder(TemporalConverter.class),
+ null);
+ registerSubPane(new TemporalTypeComposite(buildTemporalConverterHolder(converterHolder), container, getWidgetFactory()));
+ }
+
+ protected PropertyValueModel<Column> buildColumnHolder() {
+ return new TransformationPropertyValueModel<T, Column>(getSubjectHolder()) {
+ @Override
+ protected Column transform_(T value) {
+ return value.getColumn();
+ }
+ };
+ }
+
+ protected WritablePropertyValueModel<Boolean> buildConverterBooleanHolder(final Class<? extends Converter> converterType) {
+ return new PropertyAspectAdapter<T, Boolean>(getSubjectHolder(), ConvertibleMapping.CONVERTER_PROPERTY) {
+ @Override
+ protected Boolean buildValue_() {
+ Converter converter = this.subject.getConverter();
+ return Boolean.valueOf(converter.getType() == converterType);
+ }
+
+ @Override
+ protected void setValue_(Boolean value) {
+ if (value.booleanValue()) {
+ this.subject.setConverter(converterType);
+ }
+ }
+ };
+ }
+
+ private PropertyValueModel<Converter> buildConverterHolder() {
+ return new PropertyAspectAdapter<VersionMapping, Converter>(getSubjectHolder(), ConvertibleMapping.CONVERTER_PROPERTY) {
+ @Override
+ protected Converter buildValue_() {
+ return this.subject.getConverter();
+ }
+ };
+ }
+
+ private PropertyValueModel<TemporalConverter> buildTemporalConverterHolder(PropertyValueModel<Converter> converterHolder) {
+ return new TransformationPropertyValueModel<Converter, TemporalConverter>(converterHolder) {
+ @Override
+ protected TemporalConverter transform_(Converter converter) {
+ return converter.getType() == TemporalConverter.class ? (TemporalConverter) converter : null;
+ }
+ };
+ }
+} \ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractVersionMappingUiDefinition.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractVersionMappingUiDefinition.java
new file mode 100644
index 0000000000..829f66bc5b
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AbstractVersionMappingUiDefinition.java
@@ -0,0 +1,41 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2009 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.ui.internal.details;
+
+import org.eclipse.jpt.jpa.core.MappingKeys;
+import org.eclipse.jpt.jpa.core.context.VersionMapping;
+import org.eclipse.jpt.jpa.ui.internal.JpaMappingImageHelper;
+import org.eclipse.swt.graphics.Image;
+
+public abstract class AbstractVersionMappingUiDefinition<M, T extends VersionMapping>
+ extends AbstractMappingUiDefinition<M, T>
+{
+ protected AbstractVersionMappingUiDefinition() {
+ super();
+ }
+
+
+ public Image getImage() {
+ return JpaMappingImageHelper.imageForAttributeMapping(getKey());
+ }
+
+ public String getLabel() {
+ return JptUiDetailsMessages.VersionMappingUiProvider_label;
+ }
+
+ public String getLinkLabel() {
+ return JptUiDetailsMessages.VersionMappingUiProvider_linkLabel;
+ }
+
+ public String getKey() {
+ return MappingKeys.VERSION_ATTRIBUTE_MAPPING_KEY;
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AccessTypeComposite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AccessTypeComposite.java
new file mode 100644
index 0000000000..0225750f26
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AccessTypeComposite.java
@@ -0,0 +1,117 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2010 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.ui.internal.details;
+
+import java.util.Collection;
+
+import org.eclipse.jpt.common.ui.internal.widgets.EnumFormComboViewer;
+import org.eclipse.jpt.common.ui.internal.widgets.Pane;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.AccessHolder;
+import org.eclipse.jpt.jpa.core.context.AccessType;
+import org.eclipse.jpt.jpa.ui.internal.JptUiMessages;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * Here the layout of this pane:
+ * <pre>
+ * -----------------------------------------------------------------------------
+ * | ------------------------------------------------------------ |
+ * | Access Type: | |v| |
+ * | ------------------------------------------------------------ |
+ * -----------------------------------------------------------------------------</pre>
+ *
+ * @see AccessHolder
+ * @see OrmEntityComposite - A container of this pane
+ * @see OrmEmbeddableComposite - A container of this pane
+ * @see OrmMappedSuperclassComposite - A container of this pane
+ *
+ * @version 2.2
+ * @since 1.0
+ */
+public class AccessTypeComposite extends Pane<AccessHolder> {
+
+ /**
+ * Creates a new <code>AccessTypeComposite</code>.
+ *
+ * @param parentPane The parent container of this one
+ * @param subjectHolder The holder of this pane's subject
+ * @param parent The parent container
+ */
+ public AccessTypeComposite(Pane<?> parentPane,
+ PropertyValueModel<? extends AccessHolder> subjectHolder,
+ Composite parent) {
+
+ super(parentPane, subjectHolder, parent);
+ }
+
+ public AccessTypeComposite(Pane<?> parentPane,
+ PropertyValueModel<? extends AccessHolder> subjectHolder,
+ Composite parent,
+ boolean automaticallyAlignWidgets) {
+
+ super(parentPane, subjectHolder, parent, automaticallyAlignWidgets);
+ }
+
+ @Override
+ protected void initializeLayout(Composite container) {
+
+ EnumFormComboViewer<AccessHolder, AccessType> comboViewer =
+ addAccessTypeComboViewer(container);
+
+ addLabeledComposite(
+ container,
+ JptUiMessages.AccessTypeComposite_access,
+ comboViewer.getControl()
+ );
+ }
+
+ private EnumFormComboViewer<AccessHolder, AccessType> addAccessTypeComboViewer(Composite container) {
+
+ return new EnumFormComboViewer<AccessHolder, AccessType>(this, container) {
+
+ @Override
+ protected void addPropertyNames(Collection<String> propertyNames) {
+ super.addPropertyNames(propertyNames);
+ propertyNames.add(AccessHolder.DEFAULT_ACCESS_PROPERTY);
+ propertyNames.add(AccessHolder.SPECIFIED_ACCESS_PROPERTY);
+ }
+
+ @Override
+ protected AccessType[] getChoices() {
+ return AccessType.values();
+ }
+
+ @Override
+ protected AccessType getDefaultValue() {
+ return getSubject().getDefaultAccess();
+ }
+
+ @Override
+ protected String displayString(AccessType value) {
+ return buildDisplayString(
+ JptUiMessages.class,
+ AccessTypeComposite.this,
+ value
+ );
+ }
+
+ @Override
+ protected AccessType getValue() {
+ return getSubject().getSpecifiedAccess();
+ }
+
+ @Override
+ protected void setValue(AccessType value) {
+ getSubject().setSpecifiedAccess(value);
+ }
+ };
+ }
+} \ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AddQueryDialog.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AddQueryDialog.java
new file mode 100644
index 0000000000..60204adef6
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AddQueryDialog.java
@@ -0,0 +1,195 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2010 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.ui.internal.details;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.jpt.common.ui.internal.widgets.DialogPane;
+import org.eclipse.jpt.common.ui.internal.widgets.ValidatingDialog;
+import org.eclipse.jpt.common.utility.internal.StringConverter;
+import org.eclipse.jpt.common.utility.internal.model.value.PropertyAspectAdapter;
+import org.eclipse.jpt.common.utility.internal.model.value.StaticListValueModel;
+import org.eclipse.jpt.common.utility.model.value.ListValueModel;
+import org.eclipse.jpt.common.utility.model.value.WritablePropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.persistence.PersistenceUnit;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Text;
+
+/**
+ * Clients can use this dialog to prompt the user for SecondaryTable settings.
+ * Use the following once the dialog is closed:
+ * @see #getSelectedTable()
+ * @see #getSelectedCatalog()
+ * @see #getSelectedSchema()
+ * @version 2.1
+ * @since 2.1
+ */
+public class AddQueryDialog extends ValidatingDialog<AddQueryStateObject> {
+ public static final String NAMED_QUERY = "namedQuery"; //$NON-NLS-1$
+ public static final String NAMED_NATIVE_QUERY = "namedNativeQuery"; //$NON-NLS-1$
+
+ /**
+ * The associated persistence unit
+ */
+ private PersistenceUnit pUnit;
+
+ // ********** constructors **********
+
+ /**
+ * Use this constructor to edit an existing conversion value
+ * @param pUnit
+ */
+ public AddQueryDialog(Shell parent, PersistenceUnit pUnit) {
+ super(parent);
+ this.pUnit = pUnit;
+ }
+
+ @Override
+ protected AddQueryStateObject buildStateObject() {
+ return new AddQueryStateObject(this.pUnit);
+ }
+
+ // ********** open **********
+
+ @Override
+ protected void configureShell(Shell shell) {
+ super.configureShell(shell);
+ shell.setText(this.getTitle());
+ }
+
+ @Override
+ protected String getTitle() {
+ return JptUiDetailsMessages.AddQueryDialog_title;
+ }
+
+ @Override
+ protected String getDescriptionTitle() {
+ return JptUiDetailsMessages.AddQueryDialog_descriptionTitle;
+ }
+
+ @Override
+ protected String getDescription() {
+ return JptUiDetailsMessages.AddQueryDialog_description;
+ }
+
+ @Override
+ protected DialogPane<AddQueryStateObject> buildLayout(Composite container) {
+ return new QueryDialogPane(container);
+ }
+
+ @Override
+ public void create() {
+ super.create();
+
+ QueryDialogPane pane = (QueryDialogPane) getPane();
+ pane.selectAll();
+
+ getButton(OK).setEnabled(false);
+ }
+
+
+ // ********** public API **********
+
+ /**
+ * Return the data value set in the text widget.
+ */
+ public String getName() {
+ return getSubject().getName();
+ }
+
+ /**
+ * Return the object value set in the text widget.
+ */
+ public String getQueryType() {
+ return getSubject().getQueryType();
+ }
+
+ private class QueryDialogPane extends DialogPane<AddQueryStateObject> {
+
+ private Text nameText;
+
+ QueryDialogPane(Composite parent) {
+ super(AddQueryDialog.this.getSubjectHolder(), parent);
+ }
+
+ @Override
+ protected void initializeLayout(Composite container) {
+ this.nameText = addLabeledText(
+ container,
+ JptUiDetailsMessages.AddQueryDialog_name,
+ buildNameHolder()
+ );
+
+ addLabeledCombo(
+ container,
+ JptUiDetailsMessages.AddQueryDialog_queryType,
+ buildQueryTypeListHolder(),
+ buildQueryTypeHolder(),
+ buildStringConverter(),
+ null);
+ }
+
+ protected ListValueModel<String> buildQueryTypeListHolder() {
+ List<String> queryTypes = new ArrayList<String>();
+ queryTypes.add(NAMED_QUERY);
+ queryTypes.add(NAMED_NATIVE_QUERY);
+
+ return new StaticListValueModel<String>(queryTypes);
+ }
+
+ private StringConverter<String> buildStringConverter() {
+ return new StringConverter<String>() {
+ public String convertToString(String value) {
+ if (value == NAMED_QUERY) {
+ return JptUiDetailsMessages.AddQueryDialog_namedQuery;
+ }
+ if (value == NAMED_NATIVE_QUERY) {
+ return JptUiDetailsMessages.AddQueryDialog_namedNativeQuery;
+ }
+ return value;
+ }
+ };
+ }
+
+ private WritablePropertyValueModel<String> buildNameHolder() {
+ return new PropertyAspectAdapter<AddQueryStateObject, String>(getSubjectHolder(), AddQueryStateObject.NAME_PROPERTY) {
+ @Override
+ protected String buildValue_() {
+ return this.subject.getName();
+ }
+
+ @Override
+ protected void setValue_(String value) {
+ this.subject.setName(value);
+ }
+ };
+ }
+
+ private WritablePropertyValueModel<String> buildQueryTypeHolder() {
+ return new PropertyAspectAdapter<AddQueryStateObject, String>(getSubjectHolder(), AddQueryStateObject.QUERY_TYPE_PROPERTY) {
+ @Override
+ protected String buildValue_() {
+ return this.subject.getQueryType();
+ }
+
+ @Override
+ protected void setValue_(String value) {
+ this.subject.setQueryType(value);
+ }
+ };
+ }
+
+ void selectAll() {
+ this.nameText.selectAll();
+ }
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AddQueryStateObject.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AddQueryStateObject.java
new file mode 100644
index 0000000000..835dcb7ec8
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AddQueryStateObject.java
@@ -0,0 +1,146 @@
+/*******************************************************************************
+ * Copyright (c) 2009 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.ui.internal.details;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import org.eclipse.jface.dialogs.IMessageProvider;
+import org.eclipse.jpt.common.utility.internal.StringTools;
+import org.eclipse.jpt.common.utility.internal.node.AbstractNode;
+import org.eclipse.jpt.common.utility.internal.node.Node;
+import org.eclipse.jpt.common.utility.internal.node.Problem;
+import org.eclipse.jpt.jpa.core.context.Query;
+import org.eclipse.jpt.jpa.core.context.persistence.PersistenceUnit;
+
+/**
+ * This is the state object used by the <code>AddQueryDialog</code>, which stores
+ * the current name and validates it when it is modified.
+ *
+ * @see AddQueryDialog
+ *
+ * @version 2.1
+ * @since 2.1
+ */
+final class AddQueryStateObject extends AbstractNode
+{
+ /**
+ * The initial name or <code>null</code>
+ */
+ private String name;
+
+ /**
+ * The initial queryType or <code>null</code>
+ */
+ private String queryType;
+
+ /**
+ * The <code>Validator</code> used to validate this state object.
+ */
+ private Validator validator;
+
+ /**
+ * The associated persistence unit
+ */
+ private PersistenceUnit pUnit;
+
+ /**
+ * Notifies a change in the data value property.
+ */
+ static final String NAME_PROPERTY = "nameProperty"; //$NON-NLS-1$
+
+ /**
+ * Notifies a change in the query type property.
+ */
+ static final String QUERY_TYPE_PROPERTY = "queryTypeProperty"; //$NON-NLS-1$
+
+ /**
+ * Creates a new <code>NewNameStateObject</code>.
+ *
+ * @param name The initial input or <code>null</code> if no initial value can
+ * be specified
+ * @param names The collection of names that can't be used or an empty
+ * collection if none are available
+ */
+ AddQueryStateObject(PersistenceUnit pUnit) {
+ super(null);
+ this.pUnit = pUnit;
+ }
+
+ private void addNameProblemsTo(List<Problem> currentProblems) {
+ if (StringTools.stringIsEmpty(this.name)) {
+ currentProblems.add(buildProblem(JptUiDetailsMessages.QueryStateObject_nameMustBeSpecified, IMessageProvider.ERROR));
+ }
+ else if (names().contains(this.name)){
+ currentProblems.add(buildProblem(JptUiDetailsMessages.AddQueryDialog_nameExists, IMessageProvider.WARNING));
+ }
+ }
+
+ private void addQueryTypeProblemsTo(List<Problem> currentProblems) {
+ if (StringTools.stringIsEmpty(this.queryType)) {
+ currentProblems.add(buildProblem(JptUiDetailsMessages.QueryStateObject_typeMustBeSpecified, IMessageProvider.ERROR));
+ }
+ }
+
+ @Override
+ protected void addProblemsTo(List<Problem> currentProblems) {
+ super.addProblemsTo(currentProblems);
+ addNameProblemsTo(currentProblems);
+ addQueryTypeProblemsTo(currentProblems);
+ }
+
+ private List<String> names(){
+ List<String> names = new ArrayList<String>();
+ for (Iterator<Query> queries = this.pUnit.queries(); queries.hasNext();){
+ String name = queries.next().getName();
+ names.add(name);
+ }
+ return names;
+ }
+
+ @Override
+ protected void checkParent(Node parentNode) {
+ //no parent
+ }
+
+ public String displayString() {
+ return null;
+ }
+
+ String getName() {
+ return this.name;
+ }
+
+ String getQueryType() {
+ return this.queryType;
+ }
+
+ public void setName(String newName) {
+ String oldName = this.name;
+ this.name = newName;
+ firePropertyChanged(NAME_PROPERTY, oldName, newName);
+ }
+
+ public void setQueryType(String newQueryType) {
+ String old = this.queryType;
+ this.queryType = newQueryType;
+ firePropertyChanged(QUERY_TYPE_PROPERTY, old, newQueryType);
+ }
+
+ @Override
+ public void setValidator(Validator validator) {
+ this.validator = validator;
+ }
+
+ @Override
+ public Validator getValidator() {
+ return this.validator;
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AssociationOverrideComposite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AssociationOverrideComposite.java
new file mode 100644
index 0000000000..664a6e29e3
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AssociationOverrideComposite.java
@@ -0,0 +1,85 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 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.ui.internal.details;
+
+import org.eclipse.jpt.common.ui.internal.widgets.Pane;
+import org.eclipse.jpt.common.utility.internal.model.value.TransformationPropertyValueModel;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.AssociationOverride;
+import org.eclipse.jpt.jpa.core.context.ReadOnlyAssociationOverride;
+import org.eclipse.jpt.jpa.core.context.ReadOnlyJoinColumnRelationship;
+import org.eclipse.jpt.jpa.core.context.ReadOnlyRelationship;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * Here the layout of this pane:
+ * <pre>
+ * -----------------------------------------------------------------------------
+ * | |
+ * | JoinColumnsComposite |
+ * | |
+ * -----------------------------------------------------------------------------</pre>
+ *
+ * @see AssociationOverride
+ * @see EntityOverridesComposite - The parent container
+ * @see JoinColumnJoiningStrategyPane
+ *
+ * @version 2.2
+ * @since 1.0
+ */
+public class AssociationOverrideComposite
+ extends Pane<ReadOnlyAssociationOverride>
+{
+ /**
+ * Creates a new <code>AssociationOverrideComposite</code>.
+ *
+ * @param subjectHolder The holder of the subject <code>AssociationOverride</code>
+ * @param parent The parent container
+ * @param widgetFactory The factory used to create various common widgets
+ */
+ public AssociationOverrideComposite(Pane<?> parentPane,
+ PropertyValueModel<? extends ReadOnlyAssociationOverride> subjectHolder,
+ Composite parent) {
+
+ super(parentPane, subjectHolder, parent);
+ }
+
+
+ @Override
+ protected void initializeLayout(Composite container) {
+ Composite composite = addTitledGroup(
+ container,
+ JptUiDetailsMessages.Joining_title);
+
+ addJoinColumnJoiningStrategyPane(composite);
+
+ addSubPane(composite, 5);
+ }
+
+ protected void addJoinColumnJoiningStrategyPane(Composite container) {
+ JoinColumnJoiningStrategyPane.
+ buildJoinColumnJoiningStrategyPaneWithoutIncludeOverrideCheckBox(
+ this,
+ buildRelationshipModel(),
+ container);
+ }
+
+ private PropertyValueModel<ReadOnlyJoinColumnRelationship> buildRelationshipModel() {
+ return new TransformationPropertyValueModel<ReadOnlyAssociationOverride, ReadOnlyJoinColumnRelationship>(getSubjectHolder()) {
+ @Override
+ protected ReadOnlyJoinColumnRelationship transform_(ReadOnlyAssociationOverride value) {
+ // with virtual overrides: m:m mappings do not support join columns, so we need to check
+ ReadOnlyRelationship relationship = value.getRelationship();
+ return (relationship instanceof ReadOnlyJoinColumnRelationship) ?
+ (ReadOnlyJoinColumnRelationship) relationship : null;
+ }
+ };
+ }
+} \ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AttributeOverrideComposite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AttributeOverrideComposite.java
new file mode 100644
index 0000000000..fb29087959
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/AttributeOverrideComposite.java
@@ -0,0 +1,71 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2010 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.ui.internal.details;
+
+import org.eclipse.jpt.common.ui.internal.widgets.Pane;
+import org.eclipse.jpt.common.utility.internal.model.value.TransformationPropertyValueModel;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.AttributeOverride;
+import org.eclipse.jpt.jpa.core.context.ReadOnlyAttributeOverride;
+import org.eclipse.jpt.jpa.core.context.ReadOnlyColumn;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * Here the layout of this pane:
+ * <pre>
+ * -----------------------------------------------------------------------------
+ * | |
+ * | ColumnComposite |
+ * | |
+ * -----------------------------------------------------------------------------</pre>
+ *
+ * @see AttributeOverride
+ * @see EntityOverridesComposite - The parent container
+ * @see ColumnComposite
+ *
+ * @version 2.0
+ * @since 1.0
+ */
+public class AttributeOverrideComposite extends Pane<ReadOnlyAttributeOverride>
+{
+
+ /**
+ * Creates a new <code>AttributeOverrideComposite</code>.
+ *
+ * @param subjectHolder The holder of the subject <code>AttributeOverride</code>
+ * @param parent The parent container
+ * @param widgetFactory The factory used to create various common widgets
+ */
+ public AttributeOverrideComposite(Pane<?> parentPane,
+ PropertyValueModel<? extends ReadOnlyAttributeOverride> subjectHolder,
+ Composite parent) {
+
+ super(parentPane, subjectHolder, parent);
+ }
+
+ @Override
+ protected void initializeLayout(Composite container) {
+ new ColumnComposite(
+ this,
+ buildColumnHolder(),
+ container,
+ false
+ );
+ }
+
+ private PropertyValueModel<ReadOnlyColumn> buildColumnHolder() {
+ return new TransformationPropertyValueModel<ReadOnlyAttributeOverride, ReadOnlyColumn>(getSubjectHolder()) {
+ @Override
+ protected ReadOnlyColumn transform_(ReadOnlyAttributeOverride value) {
+ return value.getColumn();
+ }
+ };
+ }
+} \ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/BaseJoinColumnDialog.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/BaseJoinColumnDialog.java
new file mode 100644
index 0000000000..25ca0bd349
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/BaseJoinColumnDialog.java
@@ -0,0 +1,111 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2009 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.ui.internal.details;
+
+import org.eclipse.jpt.common.ui.internal.widgets.ValidatingDialog;
+import org.eclipse.jpt.jpa.core.context.ReadOnlyBaseJoinColumn;
+import org.eclipse.swt.widgets.Shell;
+
+/**
+ * The abstract definition the dialog showing the information for a join column
+ * to edit or to create.
+ *
+ * @see BaseJoinColumnStateObject
+ *
+ * @version 2.0
+ * @since 1.0
+ */
+public abstract class BaseJoinColumnDialog<T extends BaseJoinColumnStateObject>
+ extends ValidatingDialog<T>
+{
+
+ /**
+ * Either the join column to edit or <code>null</code> if this state object
+ * is used to create a new one.
+ */
+ private ReadOnlyBaseJoinColumn joinColumn;
+
+ /**
+ * The owner of the join column to create or where it is located.
+ */
+ private Object owner;
+
+ /**
+ * Creates a new <code>BaseJoinColumnDialog</code>.
+ *
+ * @param parent The parent shell
+ * @param owner The owner of the join column to create or where it is located
+ * @param joinColumn Either the join column to edit or <code>null</code> if
+ * this state object is used to create a new one
+ */
+ public BaseJoinColumnDialog(Shell parent,
+ Object owner,
+ ReadOnlyBaseJoinColumn joinColumn) {
+
+ super(parent);
+
+ this.owner = owner;
+ this.joinColumn = joinColumn;
+ }
+
+ /*
+ * (non-Javadoc)
+ */
+ @Override
+ protected String getDescription() {
+ return JptUiDetailsMessages.JoinColumnDialog_description;
+ }
+
+ /*
+ * (non-Javadoc)
+ */
+ @Override
+ protected String getDescriptionTitle() {
+
+ if (joinColumn == null) {
+ return JptUiDetailsMessages.JoinColumnDialog_addJoinColumnDescriptionTitle;
+ }
+
+ return JptUiDetailsMessages.JoinColumnDialog_editJoinColumnDescriptionTitle;
+ }
+
+ /**
+ * Returns the join column used by this state object for editing or
+ * <code>null</code> if this state object is used to create a new one.
+ *
+ * @return Either the edited join column or <code>null</code>
+ */
+ public ReadOnlyBaseJoinColumn getJoinColumn() {
+ return joinColumn;
+ }
+
+ /**
+ * Returns the owner where the join column is located or where a new one can
+ * be added.
+ *
+ * @return The parent of the join column
+ */
+ protected Object getOwner() {
+ return owner;
+ }
+
+ /*
+ * (non-Javadoc)
+ */
+ @Override
+ protected String getTitle() {
+
+ if (joinColumn == null) {
+ return JptUiDetailsMessages.JoinColumnDialog_addJoinColumnTitle;
+ }
+
+ return JptUiDetailsMessages.JoinColumnDialog_editJoinColumnTitle;
+ }
+} \ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/BaseJoinColumnDialogPane.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/BaseJoinColumnDialogPane.java
new file mode 100644
index 0000000000..92dc42d6a3
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/BaseJoinColumnDialogPane.java
@@ -0,0 +1,442 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2009 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.ui.internal.details;
+
+import java.util.ArrayList;
+import java.util.ListIterator;
+import org.eclipse.jpt.common.ui.internal.JptCommonUiMessages;
+import org.eclipse.jpt.common.ui.internal.util.SWTUtil;
+import org.eclipse.jpt.common.ui.internal.widgets.DialogPane;
+import org.eclipse.jpt.common.utility.internal.StringConverter;
+import org.eclipse.jpt.common.utility.internal.model.value.CompositeListValueModel;
+import org.eclipse.jpt.common.utility.internal.model.value.ListAspectAdapter;
+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.TransformationPropertyValueModel;
+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.ui.internal.JpaHelpContextIds;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * Here the layout of this pane:
+ * <pre>
+ * -----------------------------------------------------------------------------
+ * | ------------------------------------------------- |
+ * | Name: | I |v| |
+ * | ------------------------------------------------- |
+ * | ------------------------------------------------- |
+ * | Referenced Column Name: | I |v| |
+ * | ------------------------------------------------- |
+ * | ------------------------------------------------- |
+ * | Table: | I |v| |
+ * | ------------------------------------------------- |
+ * | ------------------------------------------------- |
+ * | Column Definition: | I | |
+ * | ------------------------------------------------- |
+ * -----------------------------------------------------------------------------</pre>
+ *
+ * @see BaseJoinColumnStateObject
+ * @see InverseJoinColumnInJoinTableDialog - A container of this pane
+ * @see JoinColumnInReferenceTableDialog - A container of this pane
+ * @see PrimaryKeyJoinColumnDialog - A container of this pane
+ * @see PrimaryKeyJoinColumnInSecondaryTableDialog - A container of this pane
+ *
+ * @version 2.0
+ * @since 2.0
+ */
+@SuppressWarnings("nls")
+public class BaseJoinColumnDialogPane<T extends BaseJoinColumnStateObject> extends DialogPane<T>
+{
+ /**
+ * A key used to represent the default value, this is required to convert
+ * the selected item from a combo to <code>null</code>. This key is most
+ * likely never typed the user and it will help to convert the value to
+ * <code>null</code> when it's time to set the new selected value into the
+ * model.
+ */
+ protected static String DEFAULT_KEY = "?!#!?#?#?default?#?!#?!#?";
+
+ /**
+ * Creates a new <code>BaseJoinColumnDialogPane</code>.
+ *
+ * @param subjectHolder The holder of this pane's subject
+ * @param parent The parent container
+ */
+ public BaseJoinColumnDialogPane(PropertyValueModel<? extends T> subjectHolder,
+ Composite parent) {
+
+ super(subjectHolder, parent);
+ }
+
+ private WritablePropertyValueModel<String> buildColumnDefinitionHolder() {
+ return new PropertyAspectAdapter<BaseJoinColumnStateObject, String>(getSubjectHolder(), BaseJoinColumnStateObject.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);
+ }
+ };
+ }
+
+ /*
+ * (non-Javadoc)
+ */
+ @Override
+ protected Composite addContainer(Composite parent) {
+ return addSubPane(parent, 0, 7, 0, 5);
+ }
+
+ private PropertyValueModel<String> buildDefaultNameHolder() {
+ return new TransformationPropertyValueModel<BaseJoinColumnStateObject, String>(getSubjectHolder()) {
+ @Override
+ protected String transform_(BaseJoinColumnStateObject value) {
+ String name = value.getDefaultName();
+
+ if (name == null) {
+ name = DEFAULT_KEY;
+ }
+ else {
+ name = DEFAULT_KEY + name;
+ }
+
+ return name;
+ }
+ };
+ }
+
+ private ListValueModel<String> buildDefaultNameListHolder() {
+ return new PropertyListValueModelAdapter<String>(
+ buildDefaultNameHolder()
+ );
+ }
+
+ private PropertyValueModel<String> buildDefaultReferencedColumnNameHolder() {
+ return new TransformationPropertyValueModel<BaseJoinColumnStateObject, String>(getSubjectHolder()) {
+ @Override
+ protected String transform_(BaseJoinColumnStateObject value) {
+ String name = value.getDefaultReferencedColumnName();
+
+ if (name == null) {
+ name = DEFAULT_KEY;
+ }
+ else {
+ name = DEFAULT_KEY + name;
+ }
+
+ return name;
+ }
+ };
+ }
+
+ private ListValueModel<String> buildDefaultReferencedColumnNameListHolder() {
+ return new PropertyListValueModelAdapter<String>(
+ buildDefaultReferencedColumnNameHolder()
+ );
+ }
+
+ private PropertyValueModel<String> buildDefaultTableHolder() {
+ return new TransformationPropertyValueModel<BaseJoinColumnStateObject, String>(getSubjectHolder()) {
+ @Override
+ protected String transform_(BaseJoinColumnStateObject value) {
+ String name = value.getDefaultTable();
+
+ if (name == null) {
+ name = DEFAULT_KEY;
+ }
+ else {
+ name = DEFAULT_KEY + name;
+ }
+
+ return name;
+ }
+ };
+ }
+
+ private ListValueModel<String> buildDefaultTableListHolder() {
+ return new PropertyListValueModelAdapter<String>(
+ buildDefaultTableHolder()
+ );
+ }
+
+ private StringConverter<String> buildDisplayableStringConverter(final DefaultValueHandler handler) {
+ return new StringConverter<String>() {
+ public String convertToString(String value) {
+
+ if (getSubject() == null) {
+ return null;
+ }
+
+ if (value == null) {
+ value = handler.getDefaultValue();
+
+ 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 = JptCommonUiMessages.DefaultEmpty;
+ }
+ }
+
+ return value;
+ }
+ };
+ }
+
+ private WritablePropertyValueModel<String> buildNameHolder() {
+ return new PropertyAspectAdapter<BaseJoinColumnStateObject, String>(getSubjectHolder(), BaseJoinColumnStateObject.NAME_PROPERTY) {
+ @Override
+ protected String buildValue_() {
+ return subject.getName();
+ }
+
+ @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.setName(value);
+ }
+ };
+ }
+
+ private ListValueModel<String> buildNameListHolder() {
+ return new ListAspectAdapter<BaseJoinColumnStateObject, String>(getSubjectHolder(), BaseJoinColumnStateObject.NAMES_LIST) {
+ @Override
+ protected ListIterator<String> listIterator_() {
+ return subject.names();
+ }
+ @Override
+ protected int size_() {
+ return subject.columnsSize();
+ }
+ };
+ }
+
+ private ListValueModel<String> buildNamesListHolder() {
+ ArrayList<ListValueModel<String>> holders = new ArrayList<ListValueModel<String>>(2);
+ holders.add(buildDefaultNameListHolder());
+ holders.add(buildNameListHolder());
+ return new CompositeListValueModel<ListValueModel<String>, String>(holders);
+ }
+
+ private StringConverter<String> buildNameStringConverter() {
+ return buildDisplayableStringConverter(new DefaultValueHandler() {
+ public String getDefaultValue() {
+ return getSubject().getDefaultName();
+ }
+ });
+ }
+
+ private WritablePropertyValueModel<String> buildReferencedColumnNameHolder() {
+ return new PropertyAspectAdapter<BaseJoinColumnStateObject, String>(getSubjectHolder(), BaseJoinColumnStateObject.REFERENCED_COLUMN_NAME_PROPERTY) {
+ @Override
+ protected String buildValue_() {
+ return subject.getReferencedColumnName();
+ }
+
+ @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.setReferencedColumnName(value);
+ }
+ };
+ }
+
+ private ListValueModel<String> buildReferencedColumnNameListHolder() {
+ return new ListAspectAdapter<BaseJoinColumnStateObject, String>(getSubjectHolder(), BaseJoinColumnStateObject.REFERENCE_COLUMN_NAMES_LIST) {
+ @Override
+ protected ListIterator<String> listIterator_() {
+ return subject.referenceColumnNames();
+ }
+ @Override
+ protected int size_() {
+ return subject.referenceColumnsSize();
+ }
+ };
+ }
+
+ private ListValueModel<String> buildReferencedColumnNamesListHolder() {
+ ArrayList<ListValueModel<String>> holders = new ArrayList<ListValueModel<String>>(2);
+ holders.add(buildDefaultReferencedColumnNameListHolder());
+ holders.add(buildReferencedColumnNameListHolder());
+ return new CompositeListValueModel<ListValueModel<String>, String>(holders);
+ }
+
+ private StringConverter<String> buildReferencedColumnNameStringConverter() {
+ return buildDisplayableStringConverter(new DefaultValueHandler() {
+ public String getDefaultValue() {
+ return getSubject().getDefaultReferencedColumnName();
+ }
+ });
+ }
+
+ private WritablePropertyValueModel<String> buildTableHolder() {
+ return new PropertyAspectAdapter<BaseJoinColumnStateObject, String>(getSubjectHolder(), BaseJoinColumnStateObject.TABLE_PROPERTY) {
+ @Override
+ protected String buildValue_() {
+ return subject.getTable();
+ }
+
+ @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.setTable(value);
+ }
+ };
+ }
+
+ private ListValueModel<String> buildTableListHolder() {
+ return new ListAspectAdapter<BaseJoinColumnStateObject, String>(getSubjectHolder(), "") {
+ @Override
+ protected ListIterator<String> listIterator_() {
+ return subject.tables();
+ }
+ };
+ }
+
+ private ListValueModel<String> buildTablesListHolder() {
+ ArrayList<ListValueModel<String>> holders = new ArrayList<ListValueModel<String>>(2);
+ holders.add(buildDefaultTableListHolder());
+ holders.add(buildTableListHolder());
+ return new CompositeListValueModel<ListValueModel<String>, String>(holders);
+ }
+
+ private StringConverter<String> buildTableStringConverter() {
+ return buildDisplayableStringConverter(new DefaultValueHandler() {
+ public String getDefaultValue() {
+ return getSubject().getDefaultTable();
+ }
+ });
+ }
+
+ /*
+ * (non-Javadoc)
+ */
+ @Override
+ protected void initializeLayout(Composite container) {
+
+ // Name widgets
+ Combo nameCombo = addLabeledEditableCombo(
+ container,
+ JptUiDetailsMessages.JoinColumnDialog_name,
+ buildNamesListHolder(),
+ buildNameHolder(),
+ buildNameStringConverter(),
+ JpaHelpContextIds.MAPPING_JOIN_COLUMN_NAME
+ );
+
+ SWTUtil.attachDefaultValueHandler(nameCombo);
+
+ // Referenced Column Name widgets
+ Combo referencedColumnNameCombo = addLabeledEditableCombo(
+ container,
+ JptUiDetailsMessages.JoinColumnDialog_referencedColumnName,
+ buildReferencedColumnNamesListHolder(),
+ buildReferencedColumnNameHolder(),
+ buildReferencedColumnNameStringConverter(),
+ JpaHelpContextIds.MAPPING_JOIN_REFERENCED_COLUMN
+ );
+
+ SWTUtil.attachDefaultValueHandler(referencedColumnNameCombo);
+
+ // Table widgets
+ if (isTableEditable()) {
+
+ Combo tableCombo = addLabeledEditableCombo(
+ container,
+ JptUiDetailsMessages.JoinColumnDialogPane_table,
+ buildTablesListHolder(),
+ buildTableHolder(),
+ buildTableStringConverter(),
+ JpaHelpContextIds.MAPPING_JOIN_REFERENCED_COLUMN
+ );
+
+ SWTUtil.attachDefaultValueHandler(tableCombo);
+ }
+ else {
+ Combo tableCombo = addLabeledCombo(
+ container,
+ JptUiDetailsMessages.JoinColumnDialogPane_table,
+ buildTablesListHolder(),
+ buildTableHolder(),
+ buildTableStringConverter(),
+ JpaHelpContextIds.MAPPING_JOIN_REFERENCED_COLUMN
+ );
+
+ tableCombo.setEnabled(false);
+ }
+
+ // Column Definition widgets
+ addLabeledText(
+ container,
+ JptUiDetailsMessages.JoinColumnDialogPane_columnDefinition,
+ buildColumnDefinitionHolder()
+ );
+ }
+
+ /**
+ * Determines whether the table combo should be editable or not. The default
+ * is to keep the combo read-only.
+ *
+ * @return <code>true</code> to support the editing of the selected table;
+ * <code>false</code> otherwise
+ */
+ protected boolean isTableEditable() {
+ return false;
+ }
+
+ protected static interface DefaultValueHandler {
+ String getDefaultValue();
+ }
+} \ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/BaseJoinColumnStateObject.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/BaseJoinColumnStateObject.java
new file mode 100644
index 0000000000..044e5398bc
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/BaseJoinColumnStateObject.java
@@ -0,0 +1,389 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2009 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.ui.internal.details;
+
+import java.util.ArrayList;
+import java.util.ListIterator;
+import org.eclipse.jpt.common.utility.internal.CollectionTools;
+import org.eclipse.jpt.common.utility.internal.iterators.EmptyListIterator;
+import org.eclipse.jpt.common.utility.internal.node.AbstractNode;
+import org.eclipse.jpt.common.utility.internal.node.Node;
+import org.eclipse.jpt.jpa.core.context.BaseJoinColumn;
+import org.eclipse.jpt.jpa.core.context.ReadOnlyBaseJoinColumn;
+import org.eclipse.jpt.jpa.db.Table;
+
+/**
+ * The abstract definition of a state object used to edit or create a new
+ * join column.
+ *
+ * @see AbstractJoinColumn
+ *
+ * @version 2.0
+ * @since 2.0
+ */
+@SuppressWarnings("nls")
+public abstract class BaseJoinColumnStateObject
+ extends AbstractNode
+{
+ /**
+ * The SQL fragment that is used when generating the DDL for the column.
+ */
+ private String columnDefinition;
+
+ /**
+ * Either the join column is being edited or <code>null</code> the state
+ * object is being created.
+ */
+ private ReadOnlyBaseJoinColumn joinColumn;
+
+ /**
+ * The join column's name or <code>null</code> if not defined.
+ */
+ private String name;
+
+ /**
+ * The owner of the join column to create or where it is located.
+ */
+ private Object owner;
+
+ /**
+ * The referenced column name or <code>null</code> if not defined.
+ */
+ private String referencedColumnName;
+
+ /**
+ * The table
+ */
+ private String table;
+
+ /**
+ * Keeps track of the <code>Validator</code> since this is the root object.
+ */
+ private Validator validator;
+
+ /**
+ * Identifies a change in the column definition property.
+ */
+ public static final String COLUMN_DEFINITION_PROPERTY = "columnDefinition";
+
+ /**
+ * Identifies a change in the name property.
+ */
+ public static final String NAME_PROPERTY = "name";
+
+ /**
+ * Identifies a change in the list of names.
+ */
+ public static final String NAMES_LIST = "names";
+
+ /**
+ * Identifies a change in the list of reference column names.
+ */
+ public static final String REFERENCE_COLUMN_NAMES_LIST = "referenceColumnNames";
+
+ /**
+ * Identifies a change in the referenced column name property.
+ */
+ public static final String REFERENCED_COLUMN_NAME_PROPERTY = "referencedColumnName";
+
+ /**
+ * Identifies a change in the table property.
+ */
+ public static final String TABLE_PROPERTY = "table";
+
+ /**
+ * Creates a new <code>AbstractJoinColumnStateObject</code>.
+ *
+ * @param owner The owner of the join column to create or where it is located
+ * @param joinColumn Either the join column to edit or <code>null</code> if
+ * this state object is used to create a new one
+ */
+ public BaseJoinColumnStateObject(Object owner, ReadOnlyBaseJoinColumn joinColumn) {
+ super(null);
+ initialize(owner, joinColumn);
+ }
+
+ @Override
+ protected final void checkParent(Node parentNode) {
+ // This is the root of the Join Column state object
+ }
+
+ private static ListIterator<String> columnNames(Table table) {
+ if (table == null) {
+ return EmptyListIterator.instance();
+ }
+ return CollectionTools.list(table.getSortedColumnIdentifiers()).listIterator();
+ }
+
+ private static int columnsSize(Table table) {
+ if (table == null) {
+ return 0;
+ }
+ return table.getColumnsSize();
+ }
+
+ public final String displayString() {
+ return "";
+ }
+
+ /**
+ * Returns the SQL fragment that is used when generating the DDL for the
+ * column.
+ *
+ * @return The edited column name or <code>null</code> if not used
+ */
+ public String getColumnDefinition() {
+ return columnDefinition;
+ }
+
+ /**
+ * Returns the default name if the join column is being edited otherwise
+ * <code>null</code> is returned.
+ *
+ * @return Either the default name defined by the join column or <code>null</code>
+ */
+ public String getDefaultName() {
+ return (this.joinColumn == null) ? null : this.joinColumn.getDefaultName();
+ }
+
+ /**
+ * Returns the default referenced column name if the join column is being
+ * edited otherwise <code>null</code> is returned.
+ *
+ * @return Either the default referenced column name defined by the join
+ * column or <code>null</code>
+ */
+ public String getDefaultReferencedColumnName() {
+ if (this.joinColumn == null) {
+ return null;
+ }
+
+ return this.joinColumn.getDefaultReferencedColumnName();
+ }
+
+ /**
+ * Returns
+ *
+ * @return
+ */
+ public abstract String getDefaultTable();
+
+ /**
+ * Returns the edited join column or <code>null</code> if this state object
+ * is used to create a new one.
+ *
+ * @return The edited join column or <code>null</code>
+ */
+ public ReadOnlyBaseJoinColumn getJoinColumn() {
+ return this.joinColumn;
+ }
+
+ /**
+ * Returns the name of the join column.
+ *
+ * @return Either join column's name or <code>null</code> to use the default
+ * name
+ */
+ public String getName() {
+ return this.name;
+ }
+
+ /**
+ * Returns the database table if one can be found.
+ *
+ * @return The database table
+ */
+ public abstract Table getNameTable();
+
+ /**
+ * Returns the owner where the join column is located or where a new one can
+ * be added.
+ *
+ * @return The parent of the join column
+ */
+ public Object getOwner() {
+ return owner;
+ }
+
+ /**
+ * Returns the referenced column name of the join column.
+ *
+ * @return Either join column's referenced column name or <code>null</code>
+ * to use the default name
+ */
+ public String getReferencedColumnName() {
+ return this.referencedColumnName;
+ }
+
+ /**
+ * Returns
+ *
+ * @return
+ */
+ public abstract Table getReferencedNameTable();
+
+ /**
+ * Returns
+ *
+ * @return
+ */
+ public String getTable() {
+ return table;
+ }
+
+ @Override
+ public final Validator getValidator() {
+ return this.validator;
+ }
+
+ @Override
+ protected void initialize() {
+ super.initialize();
+ validator = NULL_VALIDATOR;
+ }
+
+ /**
+ * Initializes this state object.
+ *
+ * @param owner The owner of the join column to create or where it is located
+ * @param joinColumn Either the join column to edit or <code>null</code> if
+ * this state object is used to create a new one
+ */
+ protected void initialize(Object o, ReadOnlyBaseJoinColumn jc) {
+
+ this.owner = o;
+ this.joinColumn = jc;
+ this.table = this.getInitialTable();
+
+ if (jc != null) {
+ this.name = jc.getSpecifiedName();
+ this.columnDefinition = jc.getColumnDefinition();
+ this.referencedColumnName = jc.getSpecifiedReferencedColumnName();
+ }
+ }
+
+ /**
+ * Returns
+ */
+ protected abstract String getInitialTable();
+
+ /**
+ * Returns the column names if the database table can be resolved.
+ *
+ * @return The names of the table's columns or an empty iterator if the table
+ * can't be resolved
+ */
+ public ListIterator<String> names() {
+ return columnNames(getNameTable());
+ }
+
+ public int columnsSize() {
+ return columnsSize(getNameTable());
+ }
+
+ /**
+ * Returns the reference column names if the database table can be resolved.
+ *
+ * @return The names of the table's columns or an empty iterator if the table
+ * can't be resolved
+ */
+ public ListIterator<String> referenceColumnNames() {
+ return columnNames(getReferencedNameTable());
+ }
+
+ public int referenceColumnsSize() {
+ return columnsSize(getReferencedNameTable());
+ }
+
+ /**
+ * Sets the SQL fragment that is used when generating the DDL for the column.
+ *
+ * @param columnDefinition The new join column's column definition or
+ * <code>null</code> to clear the value
+ */
+ public void setColumnDefinition(String columnDefinition) {
+ String oldColumnDefinition = this.columnDefinition;
+ this.columnDefinition = columnDefinition;
+ firePropertyChanged(COLUMN_DEFINITION_PROPERTY, oldColumnDefinition, columnDefinition);
+ }
+
+ /**
+ * Sets the name of the join column.
+ *
+ * @param name The new join column's name or <code>null</code> to use the
+ * default name
+ */
+ public void setName(String name) {
+ String oldName = this.name;
+ this.name = name;
+ firePropertyChanged(NAME_PROPERTY, oldName, name);
+ }
+
+ /**
+ * Sets the referenced column name of the join column.
+ *
+ * @param referencedColumnName The new join column's referenced column name
+ * or <code>null</code> to use the default referenced column name
+ */
+ public void setReferencedColumnName(String referencedColumnName) {
+ String oldReferencedColumnName = this.referencedColumnName;
+ this.referencedColumnName = referencedColumnName;
+ firePropertyChanged(REFERENCED_COLUMN_NAME_PROPERTY, oldReferencedColumnName, referencedColumnName);
+ }
+
+ public void setTable(String table) {
+ ArrayList<String> oldNames = CollectionTools.list(this.names());
+ ArrayList<String> oldRefColNames = CollectionTools.list(this.referenceColumnNames());
+ String oldTable = this.table;
+ this.table = table;
+ this.firePropertyChanged(TABLE_PROPERTY, oldTable, table);
+ this.synchronizeList(this.names(), oldNames, NAMES_LIST);
+ this.synchronizeList(this.referenceColumnNames(), oldRefColNames, REFERENCE_COLUMN_NAMES_LIST);
+ }
+
+ @Override
+ public final void setValidator(Validator validator) {
+ this.validator = validator;
+ }
+
+ /**
+ * Retrieves the list of all the table names contains in the associated
+ * schema. The default returns an empty iterator.
+ *
+ * @return The names of the tables
+ */
+ public ListIterator<String> tables() {
+ return EmptyListIterator.instance();
+ }
+
+ /**
+ * Updates the given join column with the values contained in this state
+ * object.
+ *
+ * @param joinColumn The join column to update
+ */
+ public void updateJoinColumn(BaseJoinColumn jc) {
+
+ // Name
+ if (valuesAreDifferent(name, jc.getSpecifiedName())) {
+ jc.setSpecifiedName(name);
+ }
+
+ // Referenced Column Name
+ if (valuesAreDifferent(referencedColumnName, jc.getSpecifiedReferencedColumnName())) {
+ jc.setSpecifiedReferencedColumnName(referencedColumnName);
+ }
+
+ // Column Definition
+ if (valuesAreDifferent(columnDefinition, jc.getColumnDefinition())) {
+ jc.setColumnDefinition(columnDefinition);
+ }
+ }
+} \ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/BasicMappingComposite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/BasicMappingComposite.java
new file mode 100644
index 0000000000..0070d5a8ab
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/BasicMappingComposite.java
@@ -0,0 +1,80 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2009 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.ui.internal.details;
+
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.BasicMapping;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * Here the layout of this pane:
+ * <pre>
+ * -----------------------------------------------------------------------------
+ * | ------------------------------------------------------------------------- |
+ * | | | |
+ * | | ColumnComposite | |
+ * | | | |
+ * | ------------------------------------------------------------------------- |
+ * | ------------------------------------------------------------------------- |
+ * | | | |
+ * | | FetchTypeComposite | |
+ * | | | |
+ * | ------------------------------------------------------------------------- |
+ * | ------------------------------------------------------------------------- |
+ * | | | |
+ * | | TemporalTypeComposite | |
+ * | | | |
+ * | ------------------------------------------------------------------------- |
+ * | ------------------------------------------------------------------------- |
+ * | | | |
+ * | | EnumTypeComposite | |
+ * | | | |
+ * | ------------------------------------------------------------------------- |
+ * | ------------------------------------------------------------------------- |
+ * | | | |
+ * | | OptionalComposite | |
+ * | | | |
+ * | ------------------------------------------------------------------------- |
+ * | ------------------------------------------------------------------------- |
+ * | | | |
+ * | | LobComposite | |
+ * | | | |
+ * | ------------------------------------------------------------------------- |
+ * -----------------------------------------------------------------------------</pre>
+ *
+ * @see BasicMapping
+ * @see ColumnComposite
+ * @see EnumTypeComposite
+ * @see FetchTypeComposite
+ * @see LobComposite
+ * @see OptionalComposite
+ * @see TemporalTypeComposite
+ *
+ * @version 2.0
+ * @since 1.0
+ */
+public class BasicMappingComposite extends AbstractBasicMappingComposite<BasicMapping>
+{
+ /**
+ * Creates a new <code>BasicMappingComposite</code>.
+ *
+ * @param subjectHolder The holder of the subject <code>IBasicMapping</code>
+ * @param parent The parent container
+ * @param widgetFactory The factory used to create various common widgets
+ */
+ public BasicMappingComposite(PropertyValueModel<? extends BasicMapping> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+
+ super(subjectHolder, parent, widgetFactory);
+ }
+
+} \ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/CascadeComposite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/CascadeComposite.java
new file mode 100644
index 0000000000..504c351f8c
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/CascadeComposite.java
@@ -0,0 +1,211 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2010 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.ui.internal.details;
+
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.ui.internal.widgets.Pane;
+import org.eclipse.jpt.common.utility.internal.model.value.PropertyAspectAdapter;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.common.utility.model.value.WritablePropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.Cascade;
+import org.eclipse.jpt.jpa.core.context.RelationshipMapping;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Group;
+
+/**
+ * Here the layout of this pane:
+ * <pre>
+ * -----------------------------------------------------------------------------
+ * | - Cascade --------------------------------------------------------------- |
+ * | | | |
+ * | | x All x Persist x Merge x Remove x Refresh | |
+ * | | | |
+ * | ------------------------------------------------------------------------- |
+ * -----------------------------------------------------------------------------</pre>
+ *
+ * @see Cascade
+ * @see RelationshipMapping
+ * @see ManyToManyMappingComposite - A container of this pane
+ * @see ManyToOneMappingComposite - A container of this pane
+ * @see OneToManyMappingComposite - A container of this pane
+ * @see OneToOneMappingComposite - A container of this pane
+ *
+ * @version 2.0
+ * @since 1.0
+ */
+public class CascadeComposite<T extends Cascade> extends Pane<T>
+{
+ /**
+ * Creates a new <code>CascadeComposite</code>.
+ *
+ * @param parentPane The parent container of this one
+ * @param subjectHolder The holder of the subject <code>ICascade</code>
+ * @param parent The parent container
+ */
+ public CascadeComposite(
+ Pane<? extends RelationshipMapping> parentPane,
+ PropertyValueModel<T> subjectHolder,
+ Composite parent) {
+
+ super(parentPane, subjectHolder, parent, false);
+ }
+
+ /**
+ * Creates a new <code>ColumnComposite</code>.
+ *
+ * @param subjectHolder The holder of the subject <code>ICascade</code>
+ * @param parent The parent container
+ * @param widgetFactory The factory used to create various common widgets
+ */
+ public CascadeComposite(
+ PropertyValueModel<T> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+
+ super(subjectHolder, parent, widgetFactory);
+ }
+
+
+ @Override
+ protected void initializeLayout(Composite container) {
+ // Cascade group
+ Group cascadeGroup = addCascadeGroup(container);
+
+ // Container of the check boxes
+ container = addSubPane(cascadeGroup, 5, 8, 0, 0, 0);
+
+ addAllCheckBox(container);
+ addPersistCheckBox(container);
+ addMergeCheckBox(container);
+ addRemoveCheckBox(container);
+ addRefreshCheckBox(container);
+ }
+
+ protected void addAllCheckBox(Composite container) {
+ // All check box
+ addCheckBox(
+ container,
+ JptUiDetailsMessages.CascadeComposite_all,
+ buildCascadeTypeAllHolder(),
+ null);
+ }
+
+ protected void addPersistCheckBox(Composite container) {
+ // Persist check box
+ addCheckBox(
+ container,
+ JptUiDetailsMessages.CascadeComposite_persist,
+ buildCascadeTypePersistHolder(),
+ null);
+ }
+
+ protected void addMergeCheckBox(Composite container) {
+ // Merge check box
+ addCheckBox(
+ container,
+ JptUiDetailsMessages.CascadeComposite_merge,
+ buildCascadeTypeMergeHolder(),
+ null);
+ }
+
+ protected void addRemoveCheckBox(Composite container) {
+ // Remove check box
+ addCheckBox(
+ container,
+ JptUiDetailsMessages.CascadeComposite_remove,
+ buildCascadeTypeRemoveHolder(),
+ null);
+ }
+
+ protected void addRefreshCheckBox(Composite container) {
+ // Refresh check box
+ addCheckBox(
+ container,
+ JptUiDetailsMessages.CascadeComposite_refresh,
+ buildCascadeTypeRefreshHolder(),
+ null);
+ }
+
+ protected Group addCascadeGroup(Composite container) {
+ return addTitledGroup(
+ container,
+ JptUiDetailsMessages.CascadeComposite_cascadeTitle);
+ }
+
+ protected WritablePropertyValueModel<Boolean> buildCascadeTypeAllHolder() {
+ return new PropertyAspectAdapter<Cascade, Boolean>(getSubjectHolder(), Cascade.ALL_PROPERTY) {
+ @Override
+ protected Boolean buildValue_() {
+ return subject.isAll();
+ }
+
+ @Override
+ protected void setValue_(Boolean value) {
+ subject.setAll(value);
+ }
+ };
+ }
+
+ protected WritablePropertyValueModel<Boolean> buildCascadeTypeMergeHolder() {
+ return new PropertyAspectAdapter<Cascade, Boolean>(getSubjectHolder(), Cascade.MERGE_PROPERTY) {
+ @Override
+ protected Boolean buildValue_() {
+ return subject.isMerge();
+ }
+
+ @Override
+ protected void setValue_(Boolean value) {
+ subject.setMerge(value);
+ }
+ };
+ }
+
+ protected WritablePropertyValueModel<Boolean> buildCascadeTypePersistHolder() {
+ return new PropertyAspectAdapter<Cascade, Boolean>(getSubjectHolder(), Cascade.PERSIST_PROPERTY) {
+ @Override
+ protected Boolean buildValue_() {
+ return subject.isPersist();
+ }
+
+ @Override
+ protected void setValue_(Boolean value) {
+ subject.setPersist(value);
+ }
+ };
+ }
+
+ protected WritablePropertyValueModel<Boolean> buildCascadeTypeRefreshHolder() {
+ return new PropertyAspectAdapter<Cascade, Boolean>(getSubjectHolder(), Cascade.REFRESH_PROPERTY) {
+ @Override
+ protected Boolean buildValue_() {
+ return subject.isRefresh();
+ }
+
+ @Override
+ protected void setValue_(Boolean value) {
+ subject.setRefresh(value);
+ }
+ };
+ }
+
+ protected WritablePropertyValueModel<Boolean> buildCascadeTypeRemoveHolder() {
+ return new PropertyAspectAdapter<Cascade, Boolean>(getSubjectHolder(), Cascade.REMOVE_PROPERTY) {
+ @Override
+ protected Boolean buildValue_() {
+ return subject.isRemove();
+ }
+
+ @Override
+ protected void setValue_(Boolean value) {
+ subject.setRemove(value);
+ }
+ };
+ }
+} \ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/ColumnComposite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/ColumnComposite.java
new file mode 100644
index 0000000000..f71f1ffbcd
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/ColumnComposite.java
@@ -0,0 +1,587 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2010 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.ui.internal.details;
+
+import java.util.Collection;
+import java.util.Iterator;
+import org.eclipse.jpt.common.ui.internal.JptCommonUiMessages;
+import org.eclipse.jpt.common.ui.internal.widgets.IntegerCombo;
+import org.eclipse.jpt.common.ui.internal.widgets.Pane;
+import org.eclipse.jpt.common.utility.internal.CollectionTools;
+import org.eclipse.jpt.common.utility.internal.model.value.PropertyAspectAdapter;
+import org.eclipse.jpt.common.utility.internal.model.value.SimplePropertyValueModel;
+import org.eclipse.jpt.common.utility.internal.model.value.TransformationPropertyValueModel;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.common.utility.model.value.WritablePropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.Column;
+import org.eclipse.jpt.jpa.core.context.ReadOnlyBaseColumn;
+import org.eclipse.jpt.jpa.core.context.ReadOnlyColumn;
+import org.eclipse.jpt.jpa.core.context.ReadOnlyNamedColumn;
+import org.eclipse.jpt.jpa.db.Table;
+import org.eclipse.jpt.jpa.ui.internal.JpaHelpContextIds;
+import org.eclipse.jpt.jpa.ui.internal.details.db.ColumnCombo;
+import org.eclipse.jpt.jpa.ui.internal.details.db.DatabaseObjectCombo;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.swt.widgets.Composite;
+
+public class ColumnComposite
+ extends Pane<ReadOnlyColumn>
+{
+ public ColumnComposite(
+ Pane<?> parentPane,
+ PropertyValueModel<? extends ReadOnlyColumn> subjectHolder,
+ Composite parent) {
+
+ super(parentPane, subjectHolder, parent, false);
+ }
+
+ public ColumnComposite(
+ Pane<?> parentPane,
+ PropertyValueModel<? extends ReadOnlyColumn> subjectHolder,
+ Composite parent,
+ boolean automaticallyAlignWidgets) {
+
+ super(parentPane, subjectHolder, parent, automaticallyAlignWidgets);
+ }
+
+ public ColumnComposite(
+ Pane<?> parentPane,
+ PropertyValueModel<? extends ReadOnlyColumn> subjectHolder,
+ Composite parent,
+ boolean automaticallyAlignWidgets,
+ boolean parentManagePane) {
+
+ super(parentPane, subjectHolder, parent, automaticallyAlignWidgets, parentManagePane);
+ }
+
+
+ private ColumnCombo<ReadOnlyColumn> addColumnCombo(Composite container) {
+
+ return new ColumnCombo<ReadOnlyColumn>(this, container) {
+ @Override
+ protected void addPropertyNames(Collection<String> propertyNames) {
+ super.addPropertyNames(propertyNames);
+ propertyNames.add(ReadOnlyNamedColumn.DEFAULT_NAME_PROPERTY);
+ propertyNames.add(ReadOnlyNamedColumn.SPECIFIED_NAME_PROPERTY);
+ propertyNames.add(ReadOnlyBaseColumn.DEFAULT_TABLE_PROPERTY);
+ propertyNames.add(ReadOnlyBaseColumn.SPECIFIED_TABLE_PROPERTY);
+ }
+
+ @Override
+ protected void propertyChanged(String propertyName) {
+ if (propertyName == ReadOnlyBaseColumn.DEFAULT_TABLE_PROPERTY ||
+ propertyName == ReadOnlyBaseColumn.SPECIFIED_TABLE_PROPERTY) {
+ this.doPopulate();
+ } else {
+ super.propertyChanged(propertyName);
+ }
+ }
+
+ @Override
+ protected String getDefaultValue() {
+ return getSubject().getDefaultName();
+ }
+
+ @Override
+ protected void setValue(String value) {
+ ((Column) this.getSubject()).setSpecifiedName(value);
+ }
+
+ @Override
+ protected Table getDbTable_() {
+ Column column = this.getColumn();
+ return (column == null) ? null : column.getDbTable();
+ }
+
+ protected Column getColumn() {
+ ReadOnlyColumn column = this.getSubject();
+ return (column instanceof Column) ? (Column) column : null;
+ }
+
+ @Override
+ protected String getValue() {
+ return getSubject().getSpecifiedName();
+ }
+
+ @Override
+ protected String buildNullDefaultValueEntry() {
+ return NLS.bind(
+ JptCommonUiMessages.DefaultWithOneParam,
+ JptCommonUiMessages.NoneSelected);
+ }
+
+ @Override
+ public String toString() {
+ return "ColumnComposite.columnCombo"; //$NON-NLS-1$
+ }
+ };
+ }
+
+ WritablePropertyValueModel<String> buildColumnDefinitionHolder() {
+ return new PropertyAspectAdapter<ReadOnlyColumn, String>(getSubjectHolder(), ReadOnlyNamedColumn.COLUMN_DEFINITION_PROPERTY) {
+ @Override
+ protected String buildValue_() {
+ return this.subject.getColumnDefinition();
+ }
+
+ @Override
+ protected void setValue_(String value) {
+ if (value.length() == 0) {
+ value = null;
+ }
+ ((Column) this.subject).setColumnDefinition(value);
+ }
+ };
+ }
+
+ WritablePropertyValueModel<Boolean> buildInsertableHolder() {
+ return new PropertyAspectAdapter<ReadOnlyColumn, Boolean>(getSubjectHolder(), ReadOnlyBaseColumn.SPECIFIED_INSERTABLE_PROPERTY) {
+ @Override
+ protected Boolean buildValue_() {
+ return this.subject.getSpecifiedInsertable();
+ }
+
+ @Override
+ protected void setValue_(Boolean value) {
+ ((Column) this.subject).setSpecifiedInsertable(value);
+ }
+ };
+ }
+
+ PropertyValueModel<String> buildInsertableStringHolder() {
+ return new TransformationPropertyValueModel<Boolean, String>(buildDefaultInsertableHolder()) {
+ @Override
+ protected String transform(Boolean value) {
+ if (value != null) {
+ String defaultStringValue = value.booleanValue() ? JptCommonUiMessages.Boolean_True : JptCommonUiMessages.Boolean_False;
+ return NLS.bind(JptUiDetailsMessages.ColumnComposite_insertableWithDefault, defaultStringValue);
+ }
+ return JptUiDetailsMessages.ColumnComposite_insertable;
+ }
+ };
+ }
+
+ PropertyValueModel<Boolean> buildDefaultInsertableHolder() {
+ return new PropertyAspectAdapter<ReadOnlyColumn, Boolean>(
+ getSubjectHolder(),
+ ReadOnlyBaseColumn.SPECIFIED_INSERTABLE_PROPERTY,
+ ReadOnlyBaseColumn.DEFAULT_INSERTABLE_PROPERTY) {
+
+ @Override
+ protected Boolean buildValue_() {
+ if (this.subject.getSpecifiedInsertable() != null) {
+ return null;
+ }
+ return Boolean.valueOf(this.subject.isDefaultInsertable());
+ }
+ };
+ }
+
+ WritablePropertyValueModel<Boolean> buildNullableHolder() {
+ return new PropertyAspectAdapter<ReadOnlyColumn, Boolean>(
+ getSubjectHolder(),
+ ReadOnlyBaseColumn.SPECIFIED_NULLABLE_PROPERTY) {
+
+ @Override
+ protected Boolean buildValue_() {
+ return this.subject.getSpecifiedNullable();
+ }
+
+ @Override
+ protected void setValue_(Boolean value) {
+ ((Column) this.subject).setSpecifiedNullable(value);
+ }
+ };
+ }
+
+ PropertyValueModel<String> buildNullableStringHolder() {
+ return new TransformationPropertyValueModel<Boolean, String>(buildDefaultNullableHolder()) {
+ @Override
+ protected String transform(Boolean value) {
+ if (value != null) {
+ String defaultStringValue = value.booleanValue() ? JptCommonUiMessages.Boolean_True : JptCommonUiMessages.Boolean_False;
+ return NLS.bind(JptUiDetailsMessages.ColumnComposite_nullableWithDefault, defaultStringValue);
+ }
+ return JptUiDetailsMessages.ColumnComposite_nullable;
+ }
+ };
+ }
+
+ PropertyValueModel<Boolean> buildDefaultNullableHolder() {
+ return new PropertyAspectAdapter<ReadOnlyColumn, Boolean>(
+ getSubjectHolder(),
+ ReadOnlyBaseColumn.SPECIFIED_NULLABLE_PROPERTY,
+ ReadOnlyBaseColumn.DEFAULT_NULLABLE_PROPERTY) {
+
+ @Override
+ protected Boolean buildValue_() {
+ if (this.subject.getSpecifiedNullable() != null) {
+ return null;
+ }
+ return Boolean.valueOf(this.subject.isDefaultNullable());
+ }
+ };
+ }
+
+ private Pane<ReadOnlyColumn> addTableCombo(Composite container) {
+
+ return new DatabaseObjectCombo<ReadOnlyColumn>(this, container) {
+
+ @Override
+ protected void addPropertyNames(Collection<String> propertyNames) {
+ super.addPropertyNames(propertyNames);
+ propertyNames.add(ReadOnlyBaseColumn.DEFAULT_TABLE_PROPERTY);
+ propertyNames.add(ReadOnlyBaseColumn.SPECIFIED_TABLE_PROPERTY);
+ }
+
+ @Override
+ protected String getDefaultValue() {
+ return this.getSubject().getDefaultTable();
+ }
+
+ @Override
+ protected void setValue(String value) {
+ ((Column) this.getSubject()).setSpecifiedTable(value);
+ }
+
+ @Override
+ protected String getValue() {
+ return this.getSubject().getSpecifiedTable();
+ }
+
+ @Override
+ protected Iterable<String> getValues_() {
+ return CollectionTools.iterable(this.values());
+ }
+
+ protected Iterator<String> values() {
+ Column column = this.getColumn();
+ return (column == null) ? null : column.candidateTableNames();
+ }
+
+ protected Column getColumn() {
+ ReadOnlyColumn column = this.getSubject();
+ return (column instanceof Column) ? (Column) column : null;
+ }
+
+ @Override
+ protected String buildNullDefaultValueEntry() {
+ return NLS.bind(
+ JptCommonUiMessages.DefaultWithOneParam,
+ JptCommonUiMessages.NoneSelected);
+ }
+
+ @Override
+ public String toString() {
+ return "ColumnComposite.tableCombo"; //$NON-NLS-1$
+ }
+ };
+ }
+
+ WritablePropertyValueModel<Boolean> buildUniqueHolder() {
+ return new PropertyAspectAdapter<ReadOnlyColumn, Boolean>(
+ getSubjectHolder(),
+ ReadOnlyBaseColumn.SPECIFIED_UNIQUE_PROPERTY) {
+
+ @Override
+ protected Boolean buildValue_() {
+ return this.subject.getSpecifiedUnique();
+ }
+
+ @Override
+ protected void setValue_(Boolean value) {
+ ((Column) this.subject).setSpecifiedUnique(value);
+ }
+ };
+ }
+
+ PropertyValueModel<String> buildUniqueStringHolder() {
+
+ return new TransformationPropertyValueModel<Boolean, String>(buildDefaultUniqueHolder()) {
+
+ @Override
+ protected String transform(Boolean value) {
+ if (value != null) {
+ String defaultStringValue = value.booleanValue() ? JptCommonUiMessages.Boolean_True : JptCommonUiMessages.Boolean_False;
+ return NLS.bind(JptUiDetailsMessages.ColumnComposite_uniqueWithDefault, defaultStringValue);
+ }
+ return JptUiDetailsMessages.ColumnComposite_unique;
+ }
+ };
+ }
+
+ PropertyValueModel<Boolean> buildDefaultUniqueHolder() {
+ return new PropertyAspectAdapter<ReadOnlyColumn, Boolean>(
+ getSubjectHolder(),
+ ReadOnlyBaseColumn.SPECIFIED_UNIQUE_PROPERTY,
+ ReadOnlyBaseColumn.DEFAULT_UNIQUE_PROPERTY) {
+
+ @Override
+ protected Boolean buildValue_() {
+ if (this.subject.getSpecifiedUnique() != null) {
+ return null;
+ }
+ return Boolean.valueOf(this.subject.isDefaultUnique());
+ }
+ };
+ }
+
+ WritablePropertyValueModel<Boolean> buildUpdatableHolder() {
+ return new PropertyAspectAdapter<ReadOnlyColumn, Boolean>(
+ getSubjectHolder(),
+ ReadOnlyBaseColumn.DEFAULT_UPDATABLE_PROPERTY,
+ ReadOnlyBaseColumn.SPECIFIED_UPDATABLE_PROPERTY) {
+
+ @Override
+ protected Boolean buildValue_() {
+ return this.subject.getSpecifiedUpdatable();
+ }
+
+ @Override
+ protected void setValue_(Boolean value) {
+ ((Column) this.subject).setSpecifiedUpdatable(value);
+ }
+ };
+ }
+
+ PropertyValueModel<String> buildUpdatableStringHolder() {
+
+ return new TransformationPropertyValueModel<Boolean, String>(buildDefaultUpdatableHolder()) {
+
+ @Override
+ protected String transform(Boolean value) {
+ if (value != null) {
+ String defaultStringValue = value.booleanValue() ? JptCommonUiMessages.Boolean_True : JptCommonUiMessages.Boolean_False;
+ return NLS.bind(JptUiDetailsMessages.ColumnComposite_updatableWithDefault, defaultStringValue);
+ }
+ return JptUiDetailsMessages.ColumnComposite_updatable;
+ }
+ };
+ }
+
+ PropertyValueModel<Boolean> buildDefaultUpdatableHolder() {
+ return new PropertyAspectAdapter<ReadOnlyColumn, Boolean>(
+ getSubjectHolder(),
+ ReadOnlyBaseColumn.SPECIFIED_UPDATABLE_PROPERTY,
+ ReadOnlyBaseColumn.DEFAULT_UPDATABLE_PROPERTY) {
+
+ @Override
+ protected Boolean buildValue_() {
+ if (this.subject.getSpecifiedUpdatable() != null) {
+ return null;
+ }
+ return Boolean.valueOf(this.subject.isDefaultUpdatable());
+ }
+ };
+ }
+
+ @Override
+ protected void initializeLayout(Composite container) {
+ // Column group pane
+ container = addTitledGroup(
+ container,
+ JptUiDetailsMessages.ColumnComposite_columnSection);
+
+ // Column widgets
+ addLabeledComposite(
+ container,
+ JptUiDetailsMessages.ColumnComposite_name,
+ addColumnCombo(container),
+ JpaHelpContextIds.MAPPING_COLUMN);
+
+ // Table widgets
+ addLabeledComposite(
+ container,
+ JptUiDetailsMessages.ColumnComposite_table,
+ addTableCombo(container),
+ JpaHelpContextIds.MAPPING_COLUMN_TABLE);
+
+ // Details sub-pane
+ container = addCollapsibleSubSection(
+ container,
+ JptUiDetailsMessages.ColumnComposite_details,
+ new SimplePropertyValueModel<Boolean>(Boolean.FALSE));
+
+ new DetailsComposite(this, getSubjectHolder(), addSubPane(container, 0, 16));
+ }
+
+ protected class DetailsComposite extends Pane<ReadOnlyColumn> {
+
+ public DetailsComposite(
+ Pane<?> parentPane,
+ PropertyValueModel<? extends ReadOnlyColumn> subjectHolder,
+ Composite parent) {
+
+ super(parentPane, subjectHolder, parent, false);
+ }
+
+ @Override
+ protected void initializeLayout(Composite container) {
+ // Insertable tri-state check box
+ addTriStateCheckBoxWithDefault(
+ addSubPane(container, 4),
+ JptUiDetailsMessages.ColumnComposite_insertable,
+ buildInsertableHolder(),
+ buildInsertableStringHolder(),
+ JpaHelpContextIds.MAPPING_COLUMN_INSERTABLE);
+
+ // Updatable tri-state check box
+ addTriStateCheckBoxWithDefault(
+ container,
+ JptUiDetailsMessages.ColumnComposite_updatable,
+ buildUpdatableHolder(),
+ buildUpdatableStringHolder(),
+ JpaHelpContextIds.MAPPING_COLUMN_UPDATABLE);
+
+ // Unique tri-state check box
+ addTriStateCheckBoxWithDefault(
+ container,
+ JptUiDetailsMessages.ColumnComposite_unique,
+ buildUniqueHolder(),
+ buildUniqueStringHolder(),
+ JpaHelpContextIds.MAPPING_COLUMN_UNIQUE);
+
+ // Nullable tri-state check box
+ addTriStateCheckBoxWithDefault(
+ container,
+ JptUiDetailsMessages.ColumnComposite_nullable,
+ buildNullableHolder(),
+ buildNullableStringHolder(),
+ JpaHelpContextIds.MAPPING_COLUMN_NULLABLE);
+
+ addLengthCombo(container);
+ addPrecisionCombo(container);
+ addScaleCombo(container);
+
+ // Column Definition widgets
+ addLabeledText(
+ container,
+ JptUiDetailsMessages.ColumnComposite_columnDefinition,
+ buildColumnDefinitionHolder());
+ }
+
+ private void addLengthCombo(Composite container) {
+ new IntegerCombo<ReadOnlyColumn>(this, container) {
+ @Override
+ protected String getLabelText() {
+ return JptUiDetailsMessages.ColumnComposite_length;
+ }
+
+ @Override
+ protected String getHelpId() {
+ return JpaHelpContextIds.MAPPING_COLUMN_LENGTH;
+ }
+
+ @Override
+ protected PropertyValueModel<Integer> buildDefaultHolder() {
+ return new PropertyAspectAdapter<ReadOnlyColumn, Integer>(getSubjectHolder(), ReadOnlyColumn.DEFAULT_LENGTH_PROPERTY) {
+ @Override
+ protected Integer buildValue_() {
+ return Integer.valueOf(this.subject.getDefaultLength());
+ }
+ };
+ }
+
+ @Override
+ protected WritablePropertyValueModel<Integer> buildSelectedItemHolder() {
+ return new PropertyAspectAdapter<ReadOnlyColumn, Integer>(getSubjectHolder(), ReadOnlyColumn.SPECIFIED_LENGTH_PROPERTY) {
+ @Override
+ protected Integer buildValue_() {
+ return this.subject.getSpecifiedLength();
+ }
+
+ @Override
+ protected void setValue_(Integer value) {
+ ((Column) this.subject).setSpecifiedLength(value);
+ }
+ };
+ }
+ };
+ }
+
+ private void addPrecisionCombo(Composite container) {
+ new IntegerCombo<ReadOnlyColumn>(this, container) {
+ @Override
+ protected String getLabelText() {
+ return JptUiDetailsMessages.ColumnComposite_precision;
+ }
+
+ @Override
+ protected String getHelpId() {
+ return JpaHelpContextIds.MAPPING_COLUMN_PRECISION;
+ }
+
+ @Override
+ protected PropertyValueModel<Integer> buildDefaultHolder() {
+ return new PropertyAspectAdapter<ReadOnlyColumn, Integer>(getSubjectHolder(), ReadOnlyColumn.DEFAULT_PRECISION_PROPERTY) {
+ @Override
+ protected Integer buildValue_() {
+ return Integer.valueOf(this.subject.getDefaultPrecision());
+ }
+ };
+ }
+
+ @Override
+ protected WritablePropertyValueModel<Integer> buildSelectedItemHolder() {
+ return new PropertyAspectAdapter<ReadOnlyColumn, Integer>(getSubjectHolder(), ReadOnlyColumn.SPECIFIED_PRECISION_PROPERTY) {
+ @Override
+ protected Integer buildValue_() {
+ return this.subject.getSpecifiedPrecision();
+ }
+
+ @Override
+ protected void setValue_(Integer value) {
+ ((Column) this.subject).setSpecifiedPrecision(value);
+ }
+ };
+ }
+ };
+ }
+
+ private void addScaleCombo(Composite container) {
+ new IntegerCombo<ReadOnlyColumn>(this, container) {
+ @Override
+ protected String getLabelText() {
+ return JptUiDetailsMessages.ColumnComposite_scale;
+ }
+
+ @Override
+ protected String getHelpId() {
+ return JpaHelpContextIds.MAPPING_COLUMN_SCALE;
+ }
+
+ @Override
+ protected PropertyValueModel<Integer> buildDefaultHolder() {
+ return new PropertyAspectAdapter<ReadOnlyColumn, Integer>(getSubjectHolder(), ReadOnlyColumn.DEFAULT_SCALE_PROPERTY) {
+ @Override
+ protected Integer buildValue_() {
+ return Integer.valueOf(this.subject.getDefaultScale());
+ }
+ };
+ }
+
+ @Override
+ protected WritablePropertyValueModel<Integer> buildSelectedItemHolder() {
+ return new PropertyAspectAdapter<ReadOnlyColumn, Integer>(getSubjectHolder(), ReadOnlyColumn.SPECIFIED_SCALE_PROPERTY) {
+ @Override
+ protected Integer buildValue_() {
+ return this.subject.getSpecifiedScale();
+ }
+
+ @Override
+ protected void setValue_(Integer value) {
+ ((Column) this.subject).setSpecifiedScale(value);
+ }
+ };
+ }
+ };
+ }
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/DiscriminatorColumnComposite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/DiscriminatorColumnComposite.java
new file mode 100644
index 0000000000..e71826c251
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/DiscriminatorColumnComposite.java
@@ -0,0 +1,309 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2010 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.ui.internal.details;
+
+import java.util.Collection;
+
+import org.eclipse.jpt.common.ui.internal.JptCommonUiMessages;
+import org.eclipse.jpt.common.ui.internal.util.PaneEnabler;
+import org.eclipse.jpt.common.ui.internal.widgets.EnumFormComboViewer;
+import org.eclipse.jpt.common.ui.internal.widgets.IntegerCombo;
+import org.eclipse.jpt.common.ui.internal.widgets.Pane;
+import org.eclipse.jpt.common.utility.internal.model.value.PropertyAspectAdapter;
+import org.eclipse.jpt.common.utility.internal.model.value.SimplePropertyValueModel;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.common.utility.model.value.WritablePropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.DiscriminatorColumn;
+import org.eclipse.jpt.jpa.core.context.DiscriminatorType;
+import org.eclipse.jpt.jpa.core.context.Entity;
+import org.eclipse.jpt.jpa.core.context.NamedColumn;
+import org.eclipse.jpt.jpa.db.Table;
+import org.eclipse.jpt.jpa.ui.internal.JpaHelpContextIds;
+import org.eclipse.jpt.jpa.ui.internal.details.db.ColumnCombo;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * Here the layout of this pane:
+ * <pre>
+ * -----------------------------------------------------------------------------
+ * | |
+ * | > Discriminator Column |
+ * | |
+ * | ---------------------------------------------------- |
+ * | Name: | ColumnCombo |v| |
+ * | ---------------------------------------------------- |
+ * | ---------------------------------------------------- |
+ * | Type: | EnumComboViewer |v| |
+ * | ---------------------------------------------------- |
+ * | > Details |
+ * | |
+ * | ---------------------------------------------------- |
+ * | Column Definition: | I | |
+ * | ---------------------------------------------------- |
+ * | ------------- |
+ * | Length: | I |I| |
+ * | ------------- |
+ * -----------------------------------------------------------------------------</pre>
+ *
+ * @see Entity
+ * @see AbstractEntityComposite - The parent container
+ * @see ColumnCombo
+ * @see EnumComboViewer
+ * @see PrimaryKeyJoinColumnsComposite
+ *
+ * @version 2.0
+ * @since 2.0
+ */
+public class DiscriminatorColumnComposite<T extends Entity> extends Pane<T> {
+
+ /**
+ * Creates a new <code>InheritanceComposite</code>.
+ *
+ * @param parentPane The parent container of this one
+ * @param parent The parent container
+ */
+ public DiscriminatorColumnComposite(Pane<? extends T> parentPane,
+ Composite parent) {
+
+ super(parentPane, parent, false);
+ }
+
+ @Override
+ protected void initializeLayout(Composite container) {
+ // Discriminator Column sub-pane
+ Composite discriminatorColumnContainer = addTitledGroup(
+ addSubPane(container, 10),
+ JptUiDetailsMessages.InheritanceComposite_discriminatorColumnGroupBox
+ );
+
+ PropertyValueModel<DiscriminatorColumn> discriminatorColumnHolder =
+ buildDiscriminatorColumnHolder();
+
+ // Name widgets
+ addLabeledComposite(
+ discriminatorColumnContainer,
+ JptUiDetailsMessages.DiscriminatorColumnComposite_name,
+ addDiscriminatorColumnCombo(container, discriminatorColumnHolder),
+ JpaHelpContextIds.ENTITY_INHERITANCE_DISCRIMINATOR_COLUMN
+ );
+
+ // Discriminator Type widgets
+ addLabeledComposite(
+ discriminatorColumnContainer,
+ JptUiDetailsMessages.DiscriminatorColumnComposite_discriminatorType,
+ addDiscriminatorTypeCombo(container, discriminatorColumnHolder),
+ JpaHelpContextIds.ENTITY_INHERITANCE_DISCRIMINATOR_TYPE
+ );
+
+ container = addCollapsibleSubSection(
+ discriminatorColumnContainer,
+ JptUiDetailsMessages.InheritanceComposite_detailsGroupBox,
+ new SimplePropertyValueModel<Boolean>(Boolean.FALSE)
+ );
+
+ new DetailsComposite(this, discriminatorColumnHolder, addSubPane(container, 0, 16));
+
+ new PaneEnabler(buildDiscriminatorColumnEnabledHolder(), this);
+ }
+
+ private ColumnCombo<DiscriminatorColumn> addDiscriminatorColumnCombo(
+ Composite container,
+ PropertyValueModel<DiscriminatorColumn> discriminatorColumnHolder) {
+
+ return new ColumnCombo<DiscriminatorColumn>(
+ this,
+ discriminatorColumnHolder,
+ container)
+ {
+
+ @Override
+ protected void addPropertyNames(Collection<String> propertyNames) {
+ super.addPropertyNames(propertyNames);
+ propertyNames.add(NamedColumn.SPECIFIED_NAME_PROPERTY);
+ propertyNames.add(NamedColumn.DEFAULT_NAME_PROPERTY);
+ }
+
+ @Override
+ protected String getDefaultValue() {
+ return getSubject().getDefaultName();
+ }
+
+ @Override
+ protected void setValue(String value) {
+ getSubject().setSpecifiedName(value);
+ }
+
+ @Override
+ protected Table getDbTable_() {
+ return getSubject().getDbTable();
+ }
+
+ @Override
+ protected String getValue() {
+ return getSubject().getSpecifiedName();
+ }
+
+ @Override
+ protected String buildNullDefaultValueEntry() {
+ return JptCommonUiMessages.NoneSelected;
+ }
+ };
+ }
+
+ private PropertyValueModel<DiscriminatorColumn> buildDiscriminatorColumnHolder() {
+ return new PropertyAspectAdapter<Entity, DiscriminatorColumn>(getSubjectHolder()) {
+ @Override
+ protected DiscriminatorColumn buildValue_() {
+ return this.subject.getDiscriminatorColumn();
+ }
+ };
+ }
+
+ private EnumFormComboViewer<DiscriminatorColumn, DiscriminatorType> addDiscriminatorTypeCombo(
+ Composite container,
+ PropertyValueModel<DiscriminatorColumn> discriminatorColumnHolder) {
+
+ return new EnumFormComboViewer<DiscriminatorColumn, DiscriminatorType>(
+ this,
+ discriminatorColumnHolder,
+ container)
+ {
+ @Override
+ protected void addPropertyNames(Collection<String> propertyNames) {
+ super.addPropertyNames(propertyNames);
+ propertyNames.add(DiscriminatorColumn.DEFAULT_DISCRIMINATOR_TYPE_PROPERTY);
+ propertyNames.add(DiscriminatorColumn.SPECIFIED_DISCRIMINATOR_TYPE_PROPERTY);
+ }
+
+ @Override
+ protected DiscriminatorType[] getChoices() {
+ return DiscriminatorType.values();
+ }
+
+ @Override
+ protected DiscriminatorType getDefaultValue() {
+ return getSubject().getDefaultDiscriminatorType();
+ }
+
+ @Override
+ protected String displayString(DiscriminatorType value) {
+ return buildDisplayString(
+ JptUiDetailsMessages.class,
+ DiscriminatorColumnComposite.class,
+ value
+ );
+ }
+
+ @Override
+ protected String nullDisplayString() {
+ return JptCommonUiMessages.NoneSelected;
+ }
+
+ @Override
+ protected DiscriminatorType getValue() {
+ return getSubject().getSpecifiedDiscriminatorType();
+ }
+
+ @Override
+ protected void setValue(DiscriminatorType value) {
+ getSubject().setSpecifiedDiscriminatorType(value);
+ }
+ };
+ }
+
+ protected WritablePropertyValueModel<Boolean> buildDiscriminatorColumnEnabledHolder() {
+ return new PropertyAspectAdapter<Entity, Boolean>(getSubjectHolder(), Entity.SPECIFIED_DISCRIMINATOR_COLUMN_IS_ALLOWED_PROPERTY) {
+ @Override
+ protected Boolean buildValue_() {
+ return Boolean.valueOf(this.subject.specifiedDiscriminatorColumnIsAllowed());
+ }
+ };
+ }
+
+ protected class DetailsComposite extends Pane<DiscriminatorColumn> {
+ public DetailsComposite(Pane<?> parentPane,
+ PropertyValueModel<? extends DiscriminatorColumn> subjectHolder,
+ Composite parent) {
+
+ super(parentPane, subjectHolder, parent, false);
+ }
+
+ @Override
+ protected void initializeLayout(Composite container) {
+ // Length widgets
+ addLengthCombo(container);
+
+ // Column Definition widgets
+ addLabeledText(
+ container,
+ JptUiDetailsMessages.ColumnComposite_columnDefinition,
+ buildColumnDefinitionHolder(getSubjectHolder())
+ );
+ }
+
+ private void addLengthCombo(Composite container) {
+ new IntegerCombo<DiscriminatorColumn>(this, container) {
+
+ @Override
+ protected String getLabelText() {
+ return JptUiDetailsMessages.ColumnComposite_length;
+ }
+
+ @Override
+ protected String getHelpId() {
+ return JpaHelpContextIds.MAPPING_COLUMN_LENGTH;
+ }
+
+ @Override
+ protected PropertyValueModel<Integer> buildDefaultHolder() {
+ return new PropertyAspectAdapter<DiscriminatorColumn, Integer>(getSubjectHolder(), DiscriminatorColumn.DEFAULT_LENGTH_PROPERTY) {
+ @Override
+ protected Integer buildValue_() {
+ return Integer.valueOf(this.subject.getDefaultLength());
+ }
+ };
+ }
+
+ @Override
+ protected WritablePropertyValueModel<Integer> buildSelectedItemHolder() {
+ return new PropertyAspectAdapter<DiscriminatorColumn, Integer>(getSubjectHolder(), DiscriminatorColumn.SPECIFIED_LENGTH_PROPERTY) {
+ @Override
+ protected Integer buildValue_() {
+ return this.subject.getSpecifiedLength();
+ }
+
+ @Override
+ protected void setValue_(Integer value) {
+ this.subject.setSpecifiedLength(value);
+ }
+ };
+ }
+ };
+ }
+
+ private WritablePropertyValueModel<String> buildColumnDefinitionHolder(PropertyValueModel<DiscriminatorColumn> discriminatorColumnHolder) {
+
+ return new PropertyAspectAdapter<DiscriminatorColumn, String>(discriminatorColumnHolder, NamedColumn.COLUMN_DEFINITION_PROPERTY) {
+ @Override
+ protected String buildValue_() {
+ return this.subject.getColumnDefinition();
+ }
+
+ @Override
+ protected void setValue_(String value) {
+ if (value.length() == 0) {
+ value = null;
+ }
+ this.subject.setColumnDefinition(value);
+ }
+ };
+ }
+ }
+} \ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/EmbeddedIdMappingComposite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/EmbeddedIdMappingComposite.java
new file mode 100644
index 0000000000..6a118d24ba
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/EmbeddedIdMappingComposite.java
@@ -0,0 +1,35 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2010 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.ui.internal.details;
+
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.EmbeddedIdMapping;
+import org.eclipse.swt.widgets.Composite;
+
+public class EmbeddedIdMappingComposite
+ extends AbstractEmbeddedIdMappingComposite<EmbeddedIdMapping>
+{
+ public EmbeddedIdMappingComposite(
+ PropertyValueModel<? extends EmbeddedIdMapping> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+
+ super(subjectHolder, parent, widgetFactory);
+ }
+
+
+ @Override
+ protected void initializeEmbeddedIdSection(Composite container) {
+ new EmbeddedMappingOverridesComposite(
+ this,
+ container);
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/EmbeddedMappingComposite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/EmbeddedMappingComposite.java
new file mode 100644
index 0000000000..8b6b16e292
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/EmbeddedMappingComposite.java
@@ -0,0 +1,50 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2010 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.ui.internal.details;
+
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.EmbeddedMapping;
+import org.eclipse.jpt.jpa.ui.details.JpaComposite;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * Here the layout of this pane:
+ * <pre>
+ * -----------------------------------------------------------------------------
+ * | ------------------------------------------------------------------------- |
+ * | | | |
+ * | | EmbeddedAttributeOverridesComposite | |
+ * | | | |
+ * | ------------------------------------------------------------------------- |
+ * -----------------------------------------------------------------------------</pre>
+ *
+ * @see EmbeddedMapping
+ *
+ * @version 2.3
+ * @since 1.0
+ */
+public class EmbeddedMappingComposite extends AbstractEmbeddedMappingComposite<EmbeddedMapping>
+ implements JpaComposite
+{
+ /**
+ * Creates a new <code>EmbeddedMappingComposite</code>.
+ *
+ * @param subjectHolder The holder of the subject <code>EmbeddedMapping</code>
+ * @param parent The parent container
+ * @param widgetFactory The factory used to create various common widgets
+ */
+ public EmbeddedMappingComposite(PropertyValueModel<? extends EmbeddedMapping> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+
+ super(subjectHolder, parent, widgetFactory);
+ }
+} \ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/EmbeddedMappingOverridesComposite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/EmbeddedMappingOverridesComposite.java
new file mode 100644
index 0000000000..8b0ec1b4fe
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/EmbeddedMappingOverridesComposite.java
@@ -0,0 +1,50 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2010 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.ui.internal.details;
+
+import org.eclipse.jpt.common.ui.internal.widgets.Pane;
+import org.eclipse.jpt.common.utility.internal.model.value.PropertyAspectAdapter;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.AssociationOverrideContainer;
+import org.eclipse.jpt.jpa.core.context.AttributeOverrideContainer;
+import org.eclipse.jpt.jpa.core.context.BaseEmbeddedMapping;
+import org.eclipse.swt.widgets.Composite;
+
+public class EmbeddedMappingOverridesComposite
+ extends AbstractEmbeddedMappingOverridesComposite<BaseEmbeddedMapping>
+{
+ public EmbeddedMappingOverridesComposite(
+ Pane<? extends BaseEmbeddedMapping> parentPane,
+ Composite parent) {
+
+ super(parentPane, parent);
+ }
+
+
+ @Override
+ protected boolean supportsAssociationOverrides() {
+ return false;
+ }
+
+ @Override
+ protected PropertyValueModel<AttributeOverrideContainer> buildAttributeOverrideContainerHolder() {
+ return new PropertyAspectAdapter<BaseEmbeddedMapping, AttributeOverrideContainer>(getSubjectHolder()) {
+ @Override
+ protected AttributeOverrideContainer buildValue_() {
+ return this.subject.getAttributeOverrideContainer();
+ }
+ };
+ }
+
+ @Override
+ protected PropertyValueModel<AssociationOverrideContainer> buildAssociationOverrideContainerHolder() {
+ throw new UnsupportedOperationException();
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/EntityNameComposite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/EntityNameComposite.java
new file mode 100644
index 0000000000..61ce5a3b4b
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/EntityNameComposite.java
@@ -0,0 +1,122 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2010 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.ui.internal.details;
+
+import org.eclipse.jpt.common.ui.internal.JptCommonUiMessages;
+import org.eclipse.jpt.common.ui.internal.util.SWTUtil;
+import org.eclipse.jpt.common.ui.internal.widgets.Pane;
+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.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.core.context.Entity;
+import org.eclipse.jpt.jpa.ui.internal.JpaHelpContextIds;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * Here the layout of this pane:
+ * <pre>
+ * -----------------------------------------------------------------------------
+ * | ------------------------------------------------------------ |
+ * | Entity Name: | I |v| |
+ * | ------------------------------------------------------------ |
+ * -----------------------------------------------------------------------------</pre>
+ *
+ * @see Entity
+ * @see AbstractEntityComposite - The parent container
+ *
+ * @version 2.3
+ * @since 1.0
+ */
+public class EntityNameComposite
+ extends Pane<Entity>
+{
+ /**
+ * Creates a new <code>EntityNameComposite</code>.
+ *
+ * @param parentPane The parent container of this one
+ * @param parent The parent container
+ */
+ public EntityNameComposite(
+ Pane<? extends Entity> parentPane,
+ Composite parent) {
+
+ super(parentPane, parent);
+ }
+
+
+ @Override
+ protected void initializeLayout(Composite container) {
+ Combo combo = addLabeledEditableCombo(
+ container,
+ JptUiDetailsMessages.EntityNameComposite_name,
+ buildDefaultEntityNameListHolder(),
+ buildEntityNameHolder(),
+ JpaHelpContextIds.ENTITY_NAME);
+
+ SWTUtil.attachDefaultValueHandler(combo);
+ }
+
+ private ListValueModel<String> buildDefaultEntityNameListHolder() {
+ return new PropertyListValueModelAdapter<String>(
+ buildDefaultEntityNameHolder()
+ );
+ }
+
+ private PropertyValueModel<String> buildDefaultEntityNameHolder() {
+ return new PropertyAspectAdapter<Entity, String>(getSubjectHolder(), Entity.DEFAULT_NAME_PROPERTY) {
+ @Override
+ protected String buildValue_() {
+ return defaultValue(this.subject);
+ }
+ };
+ }
+
+ private WritablePropertyValueModel<String> buildEntityNameHolder() {
+ return new PropertyAspectAdapter<Entity, String>(getSubjectHolder(), Entity.SPECIFIED_NAME_PROPERTY, Entity.DEFAULT_NAME_PROPERTY) {
+ @Override
+ protected String buildValue_() {
+
+ String name = this.subject.getSpecifiedName();
+
+ if (name == null) {
+ name = defaultValue(this.subject);
+ }
+
+ return name;
+ }
+
+ @Override
+ protected void setValue_(String value) {
+
+ if (defaultValue(this.subject).equals(value)) {
+ value = null;
+ }
+
+ this.subject.setSpecifiedName(value);
+ }
+ };
+ }
+
+ private String defaultValue(Entity subject) {
+ String defaultValue = subject.getDefaultName();
+
+ if (defaultValue != null) {
+ return NLS.bind(
+ JptCommonUiMessages.DefaultWithOneParam,
+ defaultValue
+ );
+ }
+ return JptCommonUiMessages.DefaultEmpty;
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/EntityOverridesComposite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/EntityOverridesComposite.java
new file mode 100644
index 0000000000..4087cd2f4d
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/EntityOverridesComposite.java
@@ -0,0 +1,25 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2010 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.ui.internal.details;
+
+import org.eclipse.jpt.common.ui.internal.widgets.Pane;
+import org.eclipse.jpt.jpa.core.context.Entity;
+import org.eclipse.swt.widgets.Composite;
+
+public class EntityOverridesComposite
+ extends AbstractEntityOverridesComposite
+{
+ public EntityOverridesComposite(
+ Pane<? extends Entity> parentPane,
+ Composite parent) {
+
+ super(parentPane, parent);
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/EnumTypeComposite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/EnumTypeComposite.java
new file mode 100644
index 0000000000..d83d5d64e1
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/EnumTypeComposite.java
@@ -0,0 +1,115 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2010 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.ui.internal.details;
+
+import java.util.Collection;
+
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.ui.internal.util.PaneEnabler;
+import org.eclipse.jpt.common.ui.internal.widgets.EnumFormComboViewer;
+import org.eclipse.jpt.common.ui.internal.widgets.Pane;
+import org.eclipse.jpt.common.utility.internal.model.value.TransformationPropertyValueModel;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.EnumType;
+import org.eclipse.jpt.jpa.core.context.EnumeratedConverter;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * Here the layout of this pane:
+ * <pre>
+ * -----------------------------------------------------------------------------
+ * | -------------------------------------------------------------- |
+ * | Enum Type: | |v| |
+ * | -------------------------------------------------------------- |
+ * -----------------------------------------------------------------------------</pre>
+ *
+ * @see BasicMapping
+ * @see BasicMappingComposite - A container of this widget
+ *
+ * @version 2.0
+ * @since 1.0
+ */
+public class EnumTypeComposite extends Pane<EnumeratedConverter>
+{
+ /**
+ * Creates a new <code>EnumTypeComposite</code>.
+ *
+ * @param parentPane The parent container of this one
+ * @param parent The parent container
+ */
+ public EnumTypeComposite(PropertyValueModel<? extends EnumeratedConverter> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+
+ super(subjectHolder, parent, widgetFactory);
+ }
+
+ private EnumFormComboViewer<EnumeratedConverter, EnumType> addEnumTypeCombo(Composite container) {
+
+ return new EnumFormComboViewer<EnumeratedConverter, EnumType>(this, container) {
+
+ @Override
+ protected void addPropertyNames(Collection<String> propertyNames) {
+ super.addPropertyNames(propertyNames);
+ propertyNames.add(EnumeratedConverter.SPECIFIED_ENUM_TYPE_PROPERTY);
+ }
+
+ @Override
+ protected EnumType[] getChoices() {
+ return EnumType.values();
+ }
+
+ @Override
+ protected EnumType getDefaultValue() {
+ return getSubject().getDefaultEnumType();
+ }
+
+ @Override
+ protected String displayString(EnumType value) {
+ return buildDisplayString(
+ JptUiDetailsMessages.class,
+ EnumTypeComposite.this,
+ value
+ );
+ }
+
+ @Override
+ protected EnumType getValue() {
+ return getSubject().getSpecifiedEnumType();
+ }
+
+ @Override
+ protected void setValue(EnumType value) {
+ getSubject().setSpecifiedEnumType(value);
+ }
+ };
+ }
+
+ @Override
+ protected void initializeLayout(Composite container) {
+ //JpaHelpContextIds.MAPPING_ENUMERATED
+ addEnumTypeCombo(container);
+
+ new PaneEnabler(buildBooleanHolder(), this);
+ }
+
+
+ protected PropertyValueModel<Boolean> buildBooleanHolder() {
+ return new TransformationPropertyValueModel<EnumeratedConverter, Boolean>(getSubjectHolder()) {
+ @Override
+ protected Boolean transform(EnumeratedConverter value) {
+ if (getSubject() != null && getSubject().getParent().getPersistentAttribute().isVirtual()) {
+ return Boolean.FALSE;
+ }
+ return Boolean.valueOf(value != null);
+ }
+ };
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/FetchTypeComposite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/FetchTypeComposite.java
new file mode 100644
index 0000000000..843c39962d
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/FetchTypeComposite.java
@@ -0,0 +1,109 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2010 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.ui.internal.details;
+
+import java.util.Collection;
+
+import org.eclipse.jpt.common.ui.internal.widgets.EnumFormComboViewer;
+import org.eclipse.jpt.common.ui.internal.widgets.Pane;
+import org.eclipse.jpt.jpa.core.context.FetchType;
+import org.eclipse.jpt.jpa.core.context.FetchableMapping;
+import org.eclipse.jpt.jpa.ui.internal.JpaHelpContextIds;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * Here the layout of this pane:
+ * <pre>
+ * -----------------------------------------------------------------------------
+ * | ------------------------------------------------------------------ |
+ * | Fetch: | |v| |
+ * | ------------------------------------------------------------------ |
+ * -----------------------------------------------------------------------------</pre>
+ *
+ * @see FetchableMapping
+ * @see BasicMappingComposite - A container of this widget
+ * @see ManyToManyMappingComposite - A container of this widget
+ * @see ManyToOneMappingComposite - A container of this widget
+ * @see OneToManyMappingComposite - A container of this widget
+ * @see OneToOneMappingComposite - A container of this widget
+ *
+ * @version 2.0
+ * @since 1.0
+ */
+public class FetchTypeComposite extends Pane<FetchableMapping> {
+
+ /**
+ * Creates a new <code>FetchTypeComposite</code>.
+ *
+ * @param parentPane The parent container of this one
+ * @param parent The parent container
+ */
+ public FetchTypeComposite(Pane<? extends FetchableMapping> parentPane,
+ Composite parent) {
+
+ super(parentPane, parent);
+ }
+
+ private EnumFormComboViewer<FetchableMapping, FetchType> addFetchTypeCombo(Composite container) {
+
+ return new EnumFormComboViewer<FetchableMapping, FetchType>(this, container) {
+
+ @Override
+ protected void addPropertyNames(Collection<String> propertyNames) {
+ super.addPropertyNames(propertyNames);
+ propertyNames.add(FetchableMapping.DEFAULT_FETCH_PROPERTY);
+ propertyNames.add(FetchableMapping.SPECIFIED_FETCH_PROPERTY);
+ }
+
+ @Override
+ protected FetchType[] getChoices() {
+ return FetchType.values();
+ }
+
+ @Override
+ protected FetchType getDefaultValue() {
+ return getSubject().getDefaultFetch();
+ }
+
+ @Override
+ protected String displayString(FetchType value) {
+ return buildDisplayString(
+ JptUiDetailsMessages.class,
+ FetchTypeComposite.this,
+ value
+ );
+ }
+
+ @Override
+ protected FetchType getValue() {
+ return getSubject().getSpecifiedFetch();
+ }
+
+ @Override
+ protected void setValue(FetchType value) {
+ getSubject().setSpecifiedFetch(value);
+ }
+ };
+ }
+
+ /*
+ * (non-Javadoc)
+ */
+ @Override
+ protected void initializeLayout(Composite container) {
+
+ addLabeledComposite(
+ container,
+ JptUiDetailsMessages.BasicGeneralSection_fetchLabel,
+ addFetchTypeCombo(container),
+ JpaHelpContextIds.MAPPING_FETCH_TYPE
+ );
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/GeneratedValueComposite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/GeneratedValueComposite.java
new file mode 100644
index 0000000000..5c32bbaecb
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/GeneratedValueComposite.java
@@ -0,0 +1,217 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2010 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.ui.internal.details;
+
+import java.util.Collection;
+import java.util.Comparator;
+import java.util.Iterator;
+
+import org.eclipse.jpt.common.ui.internal.widgets.EnumFormComboViewer;
+import org.eclipse.jpt.common.ui.internal.widgets.Pane;
+import org.eclipse.jpt.common.utility.internal.model.value.CollectionAspectAdapter;
+import org.eclipse.jpt.common.utility.internal.model.value.PropertyAspectAdapter;
+import org.eclipse.jpt.common.utility.internal.model.value.SortedListValueModelAdapter;
+import org.eclipse.jpt.common.utility.internal.model.value.TransformationListValueModel;
+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.core.context.GeneratedValue;
+import org.eclipse.jpt.jpa.core.context.GenerationType;
+import org.eclipse.jpt.jpa.core.context.Generator;
+import org.eclipse.jpt.jpa.core.context.IdMapping;
+import org.eclipse.jpt.jpa.core.context.persistence.PersistenceUnit;
+import org.eclipse.jpt.jpa.ui.internal.JpaHelpContextIds;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * Here the layout of this pane:
+ * <pre>
+ * -----------------------------------------------------------------------------
+ * | --------------------------------------------------------- |
+ * | Strategy: | I |v| |
+ * | --------------------------------------------------------- |
+ * | --------------------------------------------------------- |
+ * | Generator Name: | I |v| |
+ * | --------------------------------------------------------- |
+ * -----------------------------------------------------------------------------</pre>
+ *
+ * @see IdMapping
+ * @see GeneratedValue
+ * @see IdMappingGenerationComposite - The parent container
+ *
+ * @version 2.3
+ * @since 1.0
+ */
+public class GeneratedValueComposite extends Pane<IdMapping>
+{
+
+ /**
+ * Creates a new <code>GeneratedValueComposite</code>.
+ *
+ * @param parentPane The parent container of this one
+ * @param parent The parent container
+ */
+ public GeneratedValueComposite(Pane<? extends IdMapping> parentPane,
+ Composite parent) {
+
+ super(parentPane, parent);
+ }
+
+ @Override
+ protected void initializeLayout(Composite container) {
+
+ // Strategy widgets
+ addLabeledComposite(
+ container,
+ JptUiDetailsMessages.GeneratedValueComposite_strategy,
+ addStrategyComboViewer(container),
+ JpaHelpContextIds.MAPPING_GENERATED_VALUE_STRATEGY
+ );
+
+ addLabeledEditableCombo(
+ container,
+ JptUiDetailsMessages.GeneratedValueComposite_generatorName,
+ buildGeneratorNamesModel(),
+ buildGeneratorNameHolder(),
+ JpaHelpContextIds.MAPPING_GENERATED_VALUE_STRATEGY
+ );
+ }
+
+ private EnumFormComboViewer<GeneratedValue, GenerationType> addStrategyComboViewer(Composite parent) {
+
+ return new EnumFormComboViewer<GeneratedValue, GenerationType>(this, buildGeneratedValueHolder(), parent) {
+
+ @Override
+ protected void addPropertyNames(Collection<String> propertyNames) {
+ super.addPropertyNames(propertyNames);
+ propertyNames.add(GeneratedValue.DEFAULT_STRATEGY_PROPERTY);
+ propertyNames.add(GeneratedValue.SPECIFIED_STRATEGY_PROPERTY);
+ }
+
+ @Override
+ protected GenerationType[] getChoices() {
+ return GenerationType.values();
+ }
+
+ @Override
+ protected GenerationType getDefaultValue() {
+ return getSubject().getDefaultStrategy();
+ }
+
+ @Override
+ protected String displayString(GenerationType value) {
+ return buildDisplayString(
+ JptUiDetailsMessages.class,
+ GeneratedValueComposite.this,
+ value
+ );
+ }
+
+ @Override
+ protected GenerationType getValue() {
+ return getSubject().getSpecifiedStrategy();
+ }
+
+ @Override
+ protected void setValue(GenerationType value) {
+ retrieveGeneratedValue().setSpecifiedStrategy(value);
+ }
+ };
+ }
+
+ private PropertyValueModel<GeneratedValue> buildGeneratedValueHolder() {
+ return new PropertyAspectAdapter<IdMapping, GeneratedValue>(getSubjectHolder(), IdMapping.GENERATED_VALUE_PROPERTY) {
+ @Override
+ protected GeneratedValue buildValue_() {
+ return getSubject().getGeneratedValue();
+ }
+ };
+ }
+
+ protected final WritablePropertyValueModel<String> buildGeneratorNameHolder() {
+ return new PropertyAspectAdapter<GeneratedValue, String>(buildGeneratedValueHolder(), GeneratedValue.SPECIFIED_GENERATOR_PROPERTY) {
+ @Override
+ protected String buildValue_() {
+ return this.subject.getSpecifiedGenerator();
+ }
+
+ @Override
+ public void setValue(String value) {
+ if (this.subject != null) {
+ setValue_(value);
+ return;
+ }
+ if (value.length() == 0) {
+ return;
+ }
+ retrieveGeneratedValue().setSpecifiedGenerator(value);
+ }
+
+ @Override
+ protected void setValue_(String value) {
+ if (value.length() == 0) {
+ value = null;
+ }
+ this.subject.setSpecifiedGenerator(value);
+ }
+ };
+ }
+
+ protected ListValueModel<String> buildGeneratorNamesModel() {
+ return new TransformationListValueModel<Generator, String>(this.buildSortedGeneratorsModel()) {
+ @Override
+ protected String transformItem_(Generator item) {
+ return item.getName();
+ }
+ };
+ }
+
+ protected ListValueModel<Generator> buildSortedGeneratorsModel() {
+ return new SortedListValueModelAdapter<Generator>(this.buildGeneratorsModel(), GENERATOR_COMPARATOR);
+ }
+
+ protected static final Comparator<Generator> GENERATOR_COMPARATOR = new Comparator<Generator>() {
+ public int compare(Generator generator1, Generator generator2) {
+ return generator1.getName().compareTo(generator2.getName());
+ }
+ };
+
+ protected CollectionValueModel<Generator> buildGeneratorsModel() {
+ return new CollectionAspectAdapter<PersistenceUnit, Generator>(this.buildPersistenceUnitModel(), PersistenceUnit.GENERATORS_COLLECTION) {
+ @Override
+ protected Iterator<Generator> iterator_() {
+ return this.subject.generators();
+ }
+ @Override
+ protected int size_() {
+ return this.subject.generatorsSize();
+ }
+ };
+ }
+
+ protected PropertyValueModel<PersistenceUnit> buildPersistenceUnitModel() {
+ return new PropertyAspectAdapter<IdMapping, PersistenceUnit>(getSubjectHolder()) {
+ @Override
+ protected PersistenceUnit buildValue_() {
+ return getSubject().getPersistenceUnit();
+ }
+ };
+ }
+
+ private GeneratedValue retrieveGeneratedValue() {
+ GeneratedValue generatedValue = getSubject().getGeneratedValue();
+
+ if (generatedValue == null) {
+ generatedValue = getSubject().addGeneratedValue();
+ }
+ return generatedValue;
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/GenerationComposite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/GenerationComposite.java
new file mode 100644
index 0000000000..da1ee61f4e
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/GenerationComposite.java
@@ -0,0 +1,234 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2009 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.ui.internal.details;
+
+import org.eclipse.jpt.common.ui.internal.widgets.Pane;
+import org.eclipse.jpt.common.utility.internal.model.value.PropertyAspectAdapter;
+import org.eclipse.jpt.common.utility.internal.model.value.SimplePropertyValueModel;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.common.utility.model.value.WritablePropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.GeneratorContainer;
+import org.eclipse.jpt.jpa.core.context.SequenceGenerator;
+import org.eclipse.jpt.jpa.core.context.TableGenerator;
+import org.eclipse.jpt.jpa.ui.internal.JpaHelpContextIds;
+import org.eclipse.jpt.jpa.ui.internal.details.GeneratorComposite.GeneratorBuilder;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * Here the layout of this pane:
+ * <pre>
+ * -----------------------------------------------------------------------------
+ * | v Table Generator |
+ * | |
+ * | x Table Generator |
+ * | ----------------------------------------------------------------------- |
+ * | | | |
+ * | | TableGeneratorComposite | |
+ * | | | |
+ * | ----------------------------------------------------------------------- |
+ * | |
+ * | v Sequence Generator |
+ * | |
+ * | x Sequence Generator |
+ * | ----------------------------------------------------------------------- |
+ * | | | |
+ * | | SequenceGeneratorComposite | |
+ * | | | |
+ * | ----------------------------------------------------------------------- |
+ * -----------------------------------------------------------------------------</pre>
+ *
+ * @see GeneratorContainer
+ * @see TableGeneratorComposite
+ * @see SequenceGeneratorComposite
+ * @see AbstractEntityComposite - The parent container
+ *
+ * @version 2.2
+ * @since 2.0
+ */
+public class GenerationComposite extends Pane<GeneratorContainer>
+{
+
+ //These are built to stand alone because we do not want the panels to collapse just
+ //because the generator is removed either in the source or using the check box in the UI.
+ //We don't want these to be built on the model generator properties.
+ private WritablePropertyValueModel<Boolean> sequenceGeneratorExpansionStateHolder;
+ private WritablePropertyValueModel<Boolean> tableGeneratorExpansionStateHolder;
+
+
+ public GenerationComposite(
+ Pane<?> parentPane,
+ PropertyValueModel<? extends GeneratorContainer> subjectHolder,
+ Composite parent) {
+
+ super(parentPane, subjectHolder, parent, false);
+ }
+
+ @Override
+ protected void initialize() {
+ super.initialize();
+ this.sequenceGeneratorExpansionStateHolder = new SimplePropertyValueModel<Boolean>(Boolean.FALSE);
+ this.tableGeneratorExpansionStateHolder = new SimplePropertyValueModel<Boolean>(Boolean.FALSE);
+ }
+
+ @Override
+ protected void doPopulate() {
+ super.doPopulate();
+ this.sequenceGeneratorExpansionStateHolder.setValue(Boolean.valueOf(getSubject() != null && getSubject().getSequenceGenerator() != null));
+ this.tableGeneratorExpansionStateHolder .setValue(Boolean.valueOf(getSubject() != null && getSubject().getTableGenerator() != null));
+ }
+
+ @Override
+ protected void initializeLayout(Composite container) {
+
+ this.initializeTableGeneratorPane(container);
+ this.initializeSequenceGeneratorPane(container);
+ }
+
+ private void initializeSequenceGeneratorPane(Composite container) {
+
+ // Sequence Generator sub-section
+ container = this.addCollapsibleSubSection(
+ this.addSubPane(container, 10),
+ JptUiDetailsMessages.GeneratorsComposite_sequenceGeneratorSection,
+ this.sequenceGeneratorExpansionStateHolder
+ );
+
+ // Sequence Generator check box
+ Button sequenceGeneratorCheckBox = addCheckBox(
+ this.addSubPane(container, 5),
+ JptUiDetailsMessages.GeneratorsComposite_sequenceGeneratorCheckBox,
+ this.buildSequenceGeneratorBooleanHolder(),
+ JpaHelpContextIds.MAPPING_SEQUENCE_GENERATOR
+ );
+
+ // Sequence Generator pane
+ this.addSequenceGeneratorComposite(container, 0, sequenceGeneratorCheckBox.getBorderWidth() + 16);
+ }
+
+ protected void addSequenceGeneratorComposite(Composite container, int topMargin, int leftMargin) {
+ new SequenceGeneratorComposite(
+ this,
+ this.buildSequenceGeneratorHolder(),
+ this.addSubPane(container, topMargin, leftMargin),
+ this.buildSequenceGeneratorBuilder()
+ );
+ }
+
+ protected PropertyValueModel<SequenceGenerator> buildSequenceGeneratorHolder() {
+ return new PropertyAspectAdapter<GeneratorContainer, SequenceGenerator>(getSubjectHolder(), GeneratorContainer.SEQUENCE_GENERATOR_PROPERTY) {
+ @Override
+ protected SequenceGenerator buildValue_() {
+ return this.subject.getSequenceGenerator();
+ }
+ };
+ }
+
+ protected GeneratorBuilder<SequenceGenerator> buildSequenceGeneratorBuilder() {
+ return new GeneratorBuilder<SequenceGenerator>() {
+ public SequenceGenerator addGenerator() {
+ return getSubject().addSequenceGenerator();
+ }
+ };
+ }
+
+ private WritablePropertyValueModel<Boolean> buildSequenceGeneratorBooleanHolder() {
+ return new PropertyAspectAdapter<GeneratorContainer, Boolean>(getSubjectHolder(), GeneratorContainer.SEQUENCE_GENERATOR_PROPERTY) {
+ @Override
+ protected Boolean buildValue_() {
+ return Boolean.valueOf(this.subject.getSequenceGenerator() != null);
+ }
+
+ @Override
+ protected void setValue_(Boolean value) {
+
+ if (value.booleanValue() && (this.subject.getSequenceGenerator() == null)) {
+ this.subject.addSequenceGenerator();
+ }
+ else if (!value.booleanValue() && (this.subject.getSequenceGenerator() != null)) {
+ this.subject.removeSequenceGenerator();
+ }
+ }
+ };
+ }
+
+ private void initializeTableGeneratorPane(Composite container) {
+
+ // Table Generator sub-section
+ container = addCollapsibleSubSection(
+ container,
+ JptUiDetailsMessages.GeneratorsComposite_tableGeneratorSection,
+ this.tableGeneratorExpansionStateHolder
+ );
+
+ Button tableGeneratorCheckBox = addCheckBox(
+ this.addSubPane(container, 5),
+ JptUiDetailsMessages.GeneratorsComposite_tableGeneratorCheckBox,
+ this.buildTableGeneratorBooleanHolder(),
+ JpaHelpContextIds.MAPPING_TABLE_GENERATOR
+ );
+
+
+ // Table Generator pane
+ new TableGeneratorComposite(
+ this,
+ this.buildTableGeneratorHolder(),
+ this.addSubPane(container, 0, tableGeneratorCheckBox.getBorderWidth() + 16),
+ this.buildTableGeneratorBuilder()
+ );
+ }
+
+ private PropertyValueModel<TableGenerator> buildTableGeneratorHolder() {
+ return new PropertyAspectAdapter<GeneratorContainer, TableGenerator>(getSubjectHolder(), GeneratorContainer.TABLE_GENERATOR_PROPERTY) {
+ @Override
+ protected TableGenerator buildValue_() {
+ return this.subject.getTableGenerator();
+ }
+ };
+ }
+
+ private GeneratorBuilder<TableGenerator> buildTableGeneratorBuilder() {
+ return new GeneratorBuilder<TableGenerator>() {
+ public TableGenerator addGenerator() {
+ return getSubject().addTableGenerator();
+ }
+ };
+ }
+
+ protected PropertyValueModel<Boolean> buildTableGeneratorExpanstionStateHolder() {
+ return new PropertyAspectAdapter<GeneratorContainer, Boolean>(getSubjectHolder(), GeneratorContainer.TABLE_GENERATOR_PROPERTY) {
+ @Override
+ protected Boolean buildValue_() {
+ return Boolean.valueOf(this.subject.getTableGenerator() != null);
+ }
+ };
+ }
+
+ private WritablePropertyValueModel<Boolean> buildTableGeneratorBooleanHolder() {
+ return new PropertyAspectAdapter<GeneratorContainer, Boolean>(getSubjectHolder(), GeneratorContainer.TABLE_GENERATOR_PROPERTY) {
+ @Override
+ protected Boolean buildValue_() {
+ return Boolean.valueOf(this.subject.getTableGenerator() != null);
+ }
+
+ @Override
+ protected void setValue_(Boolean value) {
+
+ if (value.booleanValue() && (this.subject.getTableGenerator() == null)) {
+ this.subject.addTableGenerator();
+ }
+ else if (!value.booleanValue() && (this.subject.getTableGenerator() != null)) {
+ this.subject.removeTableGenerator();
+ }
+ }
+ };
+ }
+
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/GeneratorComposite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/GeneratorComposite.java
new file mode 100644
index 0000000000..62beecbbf8
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/GeneratorComposite.java
@@ -0,0 +1,206 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 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.ui.internal.details;
+
+import org.eclipse.jpt.common.ui.internal.widgets.IntegerCombo;
+import org.eclipse.jpt.common.ui.internal.widgets.Pane;
+import org.eclipse.jpt.common.utility.internal.model.value.PropertyAspectAdapter;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.common.utility.model.value.WritablePropertyValueModel;
+import org.eclipse.jpt.jpa.core.JpaProject;
+import org.eclipse.jpt.jpa.core.context.Generator;
+import org.eclipse.jpt.jpa.core.context.IdMapping;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * This is the generic pane for a generator.
+ *
+ * @see IdMapping
+ * @see Generator
+ * @see SequenceGeneratorComposite - A sub-pane
+ * @see TalbeGeneratorComposite - A sub-pane
+ *
+ * @version 2.2
+ * @since 1.0
+ */
+public abstract class GeneratorComposite<T extends Generator> extends Pane<T>
+{
+
+ protected GeneratorBuilder<T> generatorBuilder;
+
+ protected GeneratorComposite(Pane<?> parentPane,
+ PropertyValueModel<T> subjectHolder,
+ Composite parent,
+ GeneratorBuilder<T> generatorBuilder) {
+
+ super(parentPane, subjectHolder, parent, false);
+ this.generatorBuilder = generatorBuilder;
+ }
+
+ /**
+ * Creates a new Generator. This makes it possible for the user
+ * to set values on a Generator before the model object has been created.
+ * Allows them not to first have to check the check box to enable the panel.
+ */
+ protected final T buildGenerator() {
+ return this.generatorBuilder.addGenerator();
+ }
+
+ /**
+ * Retrieves the <code>Generator</code> and if it is <code>null</code>, then
+ * create it.
+ *
+ * @param subject The subject used to retrieve the generator
+ * @return The <code>Generator</code> which should never be <code>null</code>
+ */
+ protected final T retrieveGenerator() {
+ T generator = getSubject();
+
+ if (generator == null) {
+ generator = this.buildGenerator();
+ }
+
+ return generator;
+ }
+
+ protected final WritablePropertyValueModel<String> buildGeneratorNameHolder() {
+ return new PropertyAspectAdapter<Generator, String>(getSubjectHolder(), Generator.NAME_PROPERTY) {
+ @Override
+ protected String buildValue_() {
+ return this.subject.getName();
+ }
+
+ @Override
+ public void setValue(String value) {
+ if (this.subject != null) {
+ setValue_(value);
+ return;
+ }
+ if (value.length() == 0) {
+ return;
+ }
+ retrieveGenerator().setName(value);
+ }
+
+ @Override
+ protected void setValue_(String value) {
+ if (value.length() == 0) {
+ value = null;
+ }
+ this.subject.setName(value);
+ }
+ };
+ }
+
+ protected void addAllocationSizeCombo(Composite container) {
+ new IntegerCombo<Generator>(this, getSubjectHolder(), container) {
+
+ @Override
+ protected String getLabelText() {
+ return JptUiDetailsMessages.GeneratorComposite_allocationSize;
+ }
+
+ @Override
+ protected String getHelpId() {
+ return null;//JpaHelpContextIds.MAPPING_COLUMN_LENGTH;
+ }
+
+ @Override
+ protected PropertyValueModel<Integer> buildDefaultHolder() {
+ return new PropertyAspectAdapter<Generator, Integer>(getSubjectHolder(), Generator.DEFAULT_ALLOCATION_SIZE_PROPERTY) {
+ @Override
+ protected Integer buildValue_() {
+ return Integer.valueOf(this.subject.getDefaultAllocationSize());
+ }
+ };
+ }
+
+ @Override
+ protected WritablePropertyValueModel<Integer> buildSelectedItemHolder() {
+ return new PropertyAspectAdapter<Generator, Integer>(getSubjectHolder(), Generator.SPECIFIED_ALLOCATION_SIZE_PROPERTY) {
+ @Override
+ protected Integer buildValue_() {
+ return this.subject.getSpecifiedAllocationSize();
+ }
+
+ @Override
+ public void setValue(Integer value) {
+ retrieveGenerator().setSpecifiedAllocationSize(value);
+ }
+ };
+ }
+ };
+ }
+
+ protected void addInitialValueCombo(Composite container) {
+ new IntegerCombo<Generator>(this, getSubjectHolder(), container) {
+
+ @Override
+ protected String getLabelText() {
+ return JptUiDetailsMessages.GeneratorComposite_initialValue;
+ }
+
+ @Override
+ protected String getHelpId() {
+ return null;//JpaHelpContextIds.MAPPING_COLUMN_LENGTH;
+ }
+
+ @Override
+ protected PropertyValueModel<Integer> buildDefaultHolder() {
+ return new PropertyAspectAdapter<Generator, Integer>(getSubjectHolder(), Generator.DEFAULT_INITIAL_VALUE_PROPERTY) {
+ @Override
+ protected Integer buildValue_() {
+ return Integer.valueOf(this.subject.getDefaultInitialValue());
+ }
+ };
+ }
+
+ @Override
+ protected WritablePropertyValueModel<Integer> buildSelectedItemHolder() {
+ return new PropertyAspectAdapter<Generator, Integer>(getSubjectHolder(), Generator.SPECIFIED_INITIAL_VALUE_PROPERTY) {
+ @Override
+ protected Integer buildValue_() {
+ return this.subject.getSpecifiedInitialValue();
+ }
+
+ @Override
+ public void setValue(Integer value) {
+ retrieveGenerator().setSpecifiedInitialValue(value);
+ }
+ };
+ }
+ };
+ }
+
+ /**
+ * Retrieves the JPA project.
+ *
+ * @return The JPA project or <code>null</code> if the subject is <code>null</code>
+ */
+ protected final JpaProject getJpaProject() {
+ return this.getSubject() == null ? null : this.getSubject().getJpaProject();
+ }
+
+ /**
+ * Returns the property name used to listen to the ID mapping when the
+ * generator changes.
+ *
+ * @return The property name associated with the generator
+ */
+ protected abstract String getPropertyName();
+
+
+ public interface GeneratorBuilder<T> {
+ /**
+ * Add a generator to the model and return it
+ */
+ T addGenerator();
+ }
+} \ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/IdClassComposite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/IdClassComposite.java
new file mode 100644
index 0000000000..fc4d85dfd5
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/IdClassComposite.java
@@ -0,0 +1,139 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 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.ui.internal.details;
+
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jpt.common.ui.internal.JptCommonUiMessages;
+import org.eclipse.jpt.common.ui.internal.widgets.ClassChooserComboPane;
+import org.eclipse.jpt.common.ui.internal.widgets.Pane;
+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.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.core.context.IdClassReference;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * Id class hyperlink label, combo, and browse button
+ *
+ */
+public class IdClassComposite
+ extends Pane<IdClassReference>
+{
+ /**
+ * Creates a new <code>IdClassComposite</code>.
+ *
+ * @param parentPane The parent pane of this one
+ * @param parent The parent container
+ */
+ public IdClassComposite(
+ Pane<?> parentPane,
+ PropertyValueModel<? extends IdClassReference> subjectHolder,
+ Composite parent) {
+
+ super(parentPane, subjectHolder, parent);
+ }
+
+ public IdClassComposite(
+ Pane<?> parentPane,
+ PropertyValueModel<? extends IdClassReference> subjectHolder,
+ Composite parent,
+ boolean automaticallyAlignWidgets) {
+
+ super(parentPane, subjectHolder, parent, automaticallyAlignWidgets);
+ }
+
+
+ @Override
+ protected void initializeLayout(Composite container) {
+ new IdClassChooserComboPane(this, container);
+ }
+
+
+ private class IdClassChooserComboPane
+ extends ClassChooserComboPane<IdClassReference>
+ {
+ public IdClassChooserComboPane(Pane<IdClassReference> parentPane, Composite parent) {
+ super(parentPane, parent);
+ }
+
+
+ @Override
+ protected String getClassName() {
+ return getSubject().getIdClassName();
+ }
+
+ @Override
+ protected void setClassName(String className) {
+ getSubject().setSpecifiedIdClassName(className);
+ }
+
+ @Override
+ protected String getLabelText() {
+ return JptUiDetailsMessages.IdClassComposite_label;
+ }
+
+ @Override
+ protected IJavaProject getJavaProject() {
+ return getSubject().getJpaProject().getJavaProject();
+ }
+
+ @Override
+ protected char getEnclosingTypeSeparator() {
+ return getSubject().getIdClassEnclosingTypeSeparator();
+ }
+
+ @Override
+ protected WritablePropertyValueModel<String> buildTextHolder() {
+ return new PropertyAspectAdapter<IdClassReference, String>(
+ getSubjectHolder(),
+ IdClassReference.SPECIFIED_ID_CLASS_NAME_PROPERTY,
+ IdClassReference.DEFAULT_ID_CLASS_NAME_PROPERTY) {
+
+ @Override
+ protected String buildValue_() {
+ String value = this.subject.getSpecifiedIdClassName();
+ return (value == null) ? defaultText(this.subject) : value;
+ }
+
+ @Override
+ protected void setValue_(String value) {
+ if (value == null
+ || value.length() == 0
+ || value.equals(defaultText(this.subject))) {
+ value = null;
+ }
+ this.subject.setSpecifiedIdClassName(value);
+ }
+ };
+ }
+
+ protected String defaultText(IdClassReference idClassReference) {
+ String defaultClassName = idClassReference.getDefaultIdClassName();
+ return (defaultClassName == null) ?
+ JptCommonUiMessages.NoneSelected
+ : NLS.bind(JptCommonUiMessages.DefaultWithOneParam, defaultClassName);
+ }
+
+ @Override
+ protected ListValueModel<String> buildClassListHolder() {
+ return new PropertyListValueModelAdapter<String>(
+ new PropertyAspectAdapter<IdClassReference, String>(
+ getSubjectHolder(), IdClassReference.DEFAULT_ID_CLASS_NAME_PROPERTY) {
+ @Override
+ protected String buildValue_() {
+ return defaultText(this.subject);
+ }
+ });
+ }
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/IdMappingComposite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/IdMappingComposite.java
new file mode 100644
index 0000000000..617adaadf1
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/IdMappingComposite.java
@@ -0,0 +1,33 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2010 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.ui.internal.details;
+
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.IdMapping;
+import org.eclipse.swt.widgets.Composite;
+
+public class IdMappingComposite
+ extends AbstractIdMappingComposite<IdMapping>
+{
+ public IdMappingComposite(
+ PropertyValueModel<? extends IdMapping> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+
+ super(subjectHolder, parent, widgetFactory);
+ }
+
+
+ @Override
+ protected void initializeIdSection(Composite container) {
+ new ColumnComposite(this, buildColumnHolder(), container);
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/IdMappingGenerationComposite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/IdMappingGenerationComposite.java
new file mode 100644
index 0000000000..85e4b40eda
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/IdMappingGenerationComposite.java
@@ -0,0 +1,348 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 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.ui.internal.details;
+
+import org.eclipse.jpt.common.ui.internal.widgets.Pane;
+import org.eclipse.jpt.common.utility.internal.model.value.PropertyAspectAdapter;
+import org.eclipse.jpt.common.utility.internal.model.value.SimplePropertyValueModel;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.common.utility.model.value.WritablePropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.GeneratedValue;
+import org.eclipse.jpt.jpa.core.context.GeneratorContainer;
+import org.eclipse.jpt.jpa.core.context.IdMapping;
+import org.eclipse.jpt.jpa.core.context.SequenceGenerator;
+import org.eclipse.jpt.jpa.core.context.TableGenerator;
+import org.eclipse.jpt.jpa.ui.internal.JpaHelpContextIds;
+import org.eclipse.jpt.jpa.ui.internal.details.GeneratorComposite.GeneratorBuilder;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * This panel is partially a copy of the GenerationComposite panel. The difference
+ * is that this panel includes the Generated Value composite. When a table
+ * or sequence generator is added, we set the "name" to be the same as the
+ * generated value "generator" if it already exists
+ *
+ * Here is the layout of this pane:
+ * <pre>
+ * -----------------------------------------------------------------------------
+ * | v Primary Key Generation |
+ * | |
+ * | x Primary Key Generation |
+ * | --------------------------------------------------------------------- |
+ * | | | |
+ * | | GeneratedValueComposite | |
+ * | | | |
+ * | --------------------------------------------------------------------- |
+ * | |
+ * | v Table Generator |
+ * | |
+ * | x Table Generator |
+ * | --------------------------------------------------------------------- |
+ * | | | |
+ * | | TableGeneratorComposite | |
+ * | | | |
+ * | --------------------------------------------------------------------- |
+ * | |
+ * | v Sequence Generator |
+ * | |
+ * | x Sequence Generator |
+ * | --------------------------------------------------------------------- |
+ * | | | |
+ * | | SequenceGeneratorComposite | |
+ * | | | |
+ * | --------------------------------------------------------------------- |
+ * -----------------------------------------------------------------------------</pre>
+ *
+ * @see IdMapping
+ * @see GeneratedValueComposite
+ * @see TableGeneratorComposite
+ * @see SequenceGeneratorComposite
+ * @see IdMappingComposite - The parent container
+ *
+ * @version 2.2
+ * @since 1.0
+ */
+public class IdMappingGenerationComposite extends Pane<IdMapping>
+{
+
+ //These are built to stand alone because we do not want the panels to collapse just
+ //because the generator is removed either in the source or using the check box in the UI.
+ //We don't want these to be built on the model generator properties.
+ private WritablePropertyValueModel<Boolean> sequenceGeneratorExpansionStateHolder;
+ private WritablePropertyValueModel<Boolean> tableGeneratorExpansionStateHolder;
+
+
+ /**
+ * Creates a new <code>GenerationComposite</code>.
+ *
+ * @param parentPane The parent container of this one
+ * @param parent The parent container
+ */
+ public IdMappingGenerationComposite(Pane<? extends IdMapping> parentPane,
+ Composite parent)
+ {
+ super(parentPane, parent, false);
+ }
+
+ @Override
+ protected void initialize() {
+ super.initialize();
+ this.sequenceGeneratorExpansionStateHolder = new SimplePropertyValueModel<Boolean>(Boolean.FALSE);
+ this.tableGeneratorExpansionStateHolder = new SimplePropertyValueModel<Boolean>(Boolean.FALSE);
+ }
+
+ @Override
+ protected void doPopulate() {
+ super.doPopulate();
+ this.sequenceGeneratorExpansionStateHolder.setValue(Boolean.valueOf(getSubject() != null && getSubject().getGeneratorContainer().getSequenceGenerator() != null));
+ this.tableGeneratorExpansionStateHolder .setValue(Boolean.valueOf(getSubject() != null && getSubject().getGeneratorContainer().getTableGenerator() != null));
+ }
+
+ @Override
+ protected void initializeLayout(Composite container) {
+
+ // Primary Key Generation section
+ container = addCollapsibleSection(
+ container,
+ JptUiDetailsMessages.IdMappingComposite_primaryKeyGenerationSection,
+ new SimplePropertyValueModel<Boolean>(Boolean.TRUE)
+ );
+
+ // Primary Key Generation check box
+ Button primaryKeyGenerationCheckBox = addCheckBox(
+ container,
+ JptUiDetailsMessages.IdMappingComposite_primaryKeyGenerationCheckBox,
+ buildPrimaryKeyGenerationHolder(),
+ JpaHelpContextIds.MAPPING_PRIMARY_KEY_GENERATION
+ );
+
+ // Generated Value widgets
+ GeneratedValueComposite generatedValueComposite = new GeneratedValueComposite(
+ this,
+ container
+ );
+
+ GridData gridData = new GridData();
+ gridData.horizontalAlignment = GridData.FILL;
+ gridData.grabExcessHorizontalSpace = true;
+ gridData.horizontalIndent = primaryKeyGenerationCheckBox.getBorderWidth() + 16;
+
+ generatedValueComposite.getControl().setLayoutData(gridData);
+
+ PropertyValueModel<GeneratorContainer> generatorHolder = buildGeneratorContainer();
+ // Table Generator pane
+ initializeTableGeneratorPane(addSubPane(container, 10), generatorHolder);
+
+ // Sequence Generator pane
+ initializeSequenceGeneratorPane(addSubPane(container, 10), generatorHolder);
+ }
+
+ private WritablePropertyValueModel<Boolean> buildPrimaryKeyGenerationHolder() {
+ return new PropertyAspectAdapter<IdMapping, Boolean>(getSubjectHolder(), IdMapping.GENERATED_VALUE_PROPERTY) {
+ @Override
+ protected Boolean buildValue_() {
+ return Boolean.valueOf(this.subject.getGeneratedValue() != null);
+ }
+
+ @Override
+ protected void setValue_(Boolean value) {
+
+ if (value.booleanValue() && (this.subject.getGeneratedValue() == null)) {
+ this.subject.addGeneratedValue();
+ }
+ else if (!value.booleanValue() && (this.subject.getGeneratedValue() != null)) {
+ this.subject.removeGeneratedValue();
+ }
+ }
+ };
+ }
+
+ private PropertyValueModel<GeneratorContainer> buildGeneratorContainer() {
+ return new PropertyAspectAdapter<IdMapping, GeneratorContainer>(getSubjectHolder()) {
+ @Override
+ protected GeneratorContainer buildValue_() {
+ return this.subject.getGeneratorContainer();
+ }
+ };
+ }
+
+ private void initializeSequenceGeneratorPane(Composite container, PropertyValueModel<GeneratorContainer> generatorHolder) {
+
+ // Sequence Generator sub-section
+ container = addCollapsibleSubSection(
+ container,
+ JptUiDetailsMessages.IdMappingComposite_sequenceGeneratorSection,
+ this.sequenceGeneratorExpansionStateHolder
+ );
+
+ // Sequence Generator check box
+ Button sequenceGeneratorCheckBox = addCheckBox(
+ container,
+ JptUiDetailsMessages.IdMappingComposite_sequenceGeneratorCheckBox,
+ buildSequenceGeneratorBooleanHolder(generatorHolder),
+ JpaHelpContextIds.MAPPING_SEQUENCE_GENERATOR
+ );
+
+ // Sequence Generator pane
+ this.buildSequenceGeneratorComposite(
+ container,
+ buildSequenceGeneratorHolder(generatorHolder),
+ buildSequenceGeneratorBuilder(generatorHolder),
+ 0,
+ sequenceGeneratorCheckBox.getBorderWidth() + 16);
+ }
+
+ private WritablePropertyValueModel<Boolean> buildSequenceGeneratorBooleanHolder(PropertyValueModel<GeneratorContainer> generatorHolder) {
+ return new PropertyAspectAdapter<GeneratorContainer, Boolean>(generatorHolder, GeneratorContainer.SEQUENCE_GENERATOR_PROPERTY) {
+ @Override
+ protected Boolean buildValue_() {
+ return Boolean.valueOf(this.subject.getSequenceGenerator() != null);
+ }
+
+ @Override
+ protected void setValue_(Boolean value) {
+
+ if (value.booleanValue() && (this.subject.getSequenceGenerator() == null)) {
+
+ SequenceGenerator sequenceGenerator = this.subject.addSequenceGenerator();
+ GeneratedValue generatedValue = getSubject().getGeneratedValue();
+
+ if ((generatedValue != null) &&
+ (generatedValue.getGenerator() != null))
+ {
+ sequenceGenerator.setName(generatedValue.getGenerator());
+ }
+ }
+ else if (!value.booleanValue() && (this.subject.getSequenceGenerator() != null)) {
+ this.subject.removeSequenceGenerator();
+ }
+ }
+ };
+ }
+
+ protected SequenceGeneratorComposite buildSequenceGeneratorComposite(
+ Composite container,
+ PropertyValueModel<SequenceGenerator> sequenceGeneratorHolder,
+ GeneratorBuilder<SequenceGenerator> generatorBuilder,
+ int topMargin,
+ int leftMargin) {
+
+ return new SequenceGeneratorComposite(
+ this,
+ sequenceGeneratorHolder,
+ this.addSubPane(container, topMargin, leftMargin),
+ generatorBuilder
+ );
+ }
+
+ private PropertyValueModel<SequenceGenerator> buildSequenceGeneratorHolder(PropertyValueModel<GeneratorContainer> generatorHolder) {
+ return new PropertyAspectAdapter<GeneratorContainer, SequenceGenerator>(generatorHolder, GeneratorContainer.SEQUENCE_GENERATOR_PROPERTY) {
+ @Override
+ protected SequenceGenerator buildValue_() {
+ return this.subject.getSequenceGenerator();
+ }
+ };
+ }
+ private GeneratorBuilder<SequenceGenerator> buildSequenceGeneratorBuilder(final PropertyValueModel<GeneratorContainer> generatorHolder) {
+ return new GeneratorBuilder<SequenceGenerator>() {
+ public SequenceGenerator addGenerator() {
+ return generatorHolder.getValue().addSequenceGenerator();
+ }
+ };
+ }
+
+ private void initializeTableGeneratorPane(Composite container, PropertyValueModel<GeneratorContainer> generatorHolder) {
+
+ // Table Generator sub-section
+ container = addCollapsibleSubSection(
+ container,
+ JptUiDetailsMessages.IdMappingComposite_tableGeneratorSection,
+ this.tableGeneratorExpansionStateHolder
+ );
+
+ Button tableGeneratorCheckBox = addCheckBox(
+ container,
+ JptUiDetailsMessages.IdMappingComposite_tableGeneratorCheckBox,
+ buildTableGeneratorBooleanHolder(generatorHolder),
+ JpaHelpContextIds.MAPPING_TABLE_GENERATOR
+ );
+
+ // Sequence Generator pane
+ this.buildTableGeneratorComposite(
+ container,
+ buildTableGeneratorHolder(generatorHolder),
+ buildTableGeneratorBuilder(generatorHolder),
+ 0,
+ tableGeneratorCheckBox.getBorderWidth() + 16);
+ }
+
+ protected TableGeneratorComposite buildTableGeneratorComposite(
+ Composite container,
+ PropertyValueModel<TableGenerator> tableGeneratorHolder,
+ GeneratorBuilder<TableGenerator> generatorBuilder,
+ int topMargin,
+ int leftMargin) {
+
+ return new TableGeneratorComposite(
+ this,
+ tableGeneratorHolder,
+ this.addSubPane(container, topMargin, leftMargin),
+ generatorBuilder
+ );
+ }
+
+ private PropertyValueModel<TableGenerator> buildTableGeneratorHolder(PropertyValueModel<GeneratorContainer> generatorHolder) {
+ return new PropertyAspectAdapter<GeneratorContainer, TableGenerator>(generatorHolder, GeneratorContainer.TABLE_GENERATOR_PROPERTY) {
+ @Override
+ protected TableGenerator buildValue_() {
+ return this.subject.getTableGenerator();
+ }
+ };
+ }
+
+ private GeneratorBuilder<TableGenerator> buildTableGeneratorBuilder(final PropertyValueModel<GeneratorContainer> generatorHolder) {
+ return new GeneratorBuilder<TableGenerator>() {
+ public TableGenerator addGenerator() {
+ return generatorHolder.getValue().addTableGenerator();
+ }
+ };
+ }
+
+ private WritablePropertyValueModel<Boolean> buildTableGeneratorBooleanHolder(PropertyValueModel<GeneratorContainer> generatorHolder) {
+ return new PropertyAspectAdapter<GeneratorContainer, Boolean>(generatorHolder, GeneratorContainer.TABLE_GENERATOR_PROPERTY) {
+ @Override
+ protected Boolean buildValue_() {
+ return Boolean.valueOf(this.subject.getTableGenerator() != null);
+ }
+
+ @Override
+ protected void setValue_(Boolean value) {
+
+ if (value.booleanValue() && (this.subject.getTableGenerator() == null)) {
+
+ TableGenerator tableGenerator = this.subject.addTableGenerator();
+ GeneratedValue generatedValue = getSubject().getGeneratedValue();
+
+ if ((generatedValue != null) &&
+ (generatedValue.getGenerator() != null))
+ {
+ tableGenerator.setName(generatedValue.getGenerator());
+ }
+ }
+ else if (!value.booleanValue() && (this.subject.getTableGenerator() != null)) {
+ this.subject.removeTableGenerator();
+ }
+ }
+ };
+ }
+
+} \ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/InverseJoinColumnInJoinTableDialog.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/InverseJoinColumnInJoinTableDialog.java
new file mode 100644
index 0000000000..025924321f
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/InverseJoinColumnInJoinTableDialog.java
@@ -0,0 +1,78 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2009 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.ui.internal.details;
+
+import org.eclipse.jpt.common.ui.internal.widgets.DialogPane;
+import org.eclipse.jpt.jpa.core.context.JoinColumn;
+import org.eclipse.jpt.jpa.core.context.JoinTable;
+import org.eclipse.jpt.jpa.core.context.ReadOnlyJoinColumn;
+import org.eclipse.jpt.jpa.core.context.ReadOnlyJoinTable;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Shell;
+
+/**
+ *
+ * @see InverseJoinColumnInJoinTableStateObject
+ * @see BaseJoinColumnDialogPane
+ *
+ * @version 2.0
+ * @since 2.0
+ */
+public class InverseJoinColumnInJoinTableDialog extends BaseJoinColumnDialog<InverseJoinColumnInJoinTableStateObject> {
+
+ /**
+ * Creates a new <code>JoinColumnInJoinTableDialog</code>.
+ *
+ * @param parent The parent shell
+ * @param joinTable The owner of the join column to create or where it is
+ * located
+ * @param joinColumn Either the join column to edit or <code>null</code> if
+ * this state object is used to create a new one
+ */
+ public InverseJoinColumnInJoinTableDialog(Shell parent,
+ ReadOnlyJoinTable joinTable,
+ ReadOnlyJoinColumn joinColumn) {
+
+ super(parent, joinTable, joinColumn);
+ }
+
+ @Override
+ protected DialogPane<InverseJoinColumnInJoinTableStateObject> buildLayout(Composite container) {
+ return new JoinColumnDialogPane<InverseJoinColumnInJoinTableStateObject>(
+ getSubjectHolder(),
+ container
+ )
+
+ {
+ @Override
+ protected boolean isTableEditable() {
+ return false;
+ }
+ };
+ }
+
+ @Override
+ protected InverseJoinColumnInJoinTableStateObject buildStateObject() {
+ return new InverseJoinColumnInJoinTableStateObject(
+ getOwner(),
+ getJoinColumn()
+ );
+ }
+
+ @Override
+ public JoinColumn getJoinColumn() {
+ return (JoinColumn) super.getJoinColumn();
+ }
+
+ @Override
+ protected JoinTable getOwner() {
+ return (JoinTable) super.getOwner();
+ }
+} \ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/InverseJoinColumnInJoinTableStateObject.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/InverseJoinColumnInJoinTableStateObject.java
new file mode 100644
index 0000000000..0b8d288e83
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/InverseJoinColumnInJoinTableStateObject.java
@@ -0,0 +1,94 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 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.ui.internal.details;
+
+import java.util.ListIterator;
+import org.eclipse.jpt.common.utility.internal.iterators.SingleElementListIterator;
+import org.eclipse.jpt.jpa.core.context.Entity;
+import org.eclipse.jpt.jpa.core.context.JoinColumn;
+import org.eclipse.jpt.jpa.core.context.JoinTable;
+import org.eclipse.jpt.jpa.core.context.RelationshipMapping;
+import org.eclipse.jpt.jpa.db.Table;
+
+/**
+ * The state object used to create or edit a primary key join column on a join
+ * table.
+ *
+ * @see JoinColumn
+ * @see JoinTable
+ * @see InverseJoinColumnInJoinTableDialog
+ *
+ * @version 2.3
+ * @since 2.0
+ */
+public class InverseJoinColumnInJoinTableStateObject
+ extends JoinColumnStateObject
+{
+ /**
+ * Creates a new <code>JoinColumnInJoinTableStateObject</code>.
+ *
+ * @param joinTable
+ * @param joinColumn Either the join column to edit or <code>null</code> if
+ * this state object is used to create a new one
+ */
+ public InverseJoinColumnInJoinTableStateObject(
+ JoinTable joinTable,
+ JoinColumn joinColumn) {
+ super(joinTable, joinColumn);
+ }
+
+
+ @Override
+ public JoinTable getOwner() {
+ return (JoinTable) super.getOwner();
+ }
+
+ private RelationshipMapping getRelationshipMapping() {
+ return getOwner().getRelationshipMapping();
+ }
+
+ @Override
+ public String getDefaultTable() {
+ return null;
+ }
+
+ @Override
+ public Table getNameTable() {
+ return getOwner().getDbTable();
+ }
+
+ @Override
+ public Table getReferencedNameTable() {
+ RelationshipMapping relationshipMapping = getRelationshipMapping();
+ if (relationshipMapping == null) {
+ return null;
+ }
+ Entity targetEntity = relationshipMapping.getResolvedTargetEntity();
+ if (targetEntity == null) {
+ return null;
+ }
+ return targetEntity.getPrimaryDbTable();
+ }
+
+ @Override
+ protected String getInitialTable() {
+ return getOwner().getName();
+ }
+
+ @Override
+ protected boolean isTableEditable() {
+ return false;
+ }
+
+ @Override
+ public ListIterator<String> tables() {
+ return new SingleElementListIterator<String>(getInitialTable());
+ }
+} \ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/JoinColumnDialog.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/JoinColumnDialog.java
new file mode 100644
index 0000000000..57109bf588
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/JoinColumnDialog.java
@@ -0,0 +1,53 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2009 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.ui.internal.details;
+
+import org.eclipse.jpt.common.ui.internal.widgets.DialogPane;
+import org.eclipse.jpt.jpa.core.context.JoinColumn;
+import org.eclipse.jpt.jpa.core.context.ReadOnlyJoinColumn;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Shell;
+
+/**
+ * The abstract definition of the dialog used to edit an <code>IJoinColumn</code>.
+ *
+ * @see JoinColumn
+ * @see JoinColumnStateObject
+ * @see JoinColumnDialogPane
+ *
+ * @version 2.0
+ * @since 2.0
+ */
+public abstract class JoinColumnDialog<T extends JoinColumnStateObject>
+ extends BaseJoinColumnDialog<T>
+{
+
+ /**
+ * Creates a new <code>AbstractJoinColumnDialog</code>.
+ *
+ * @param parent The parent shell
+ * @param owner The owner of the join column to create or where it is located
+ * @param joinColumn Either the join column to edit or <code>null</code> if
+ * this state object is used to create a new one
+ */
+ public JoinColumnDialog(Shell parent, Object owner, ReadOnlyJoinColumn joinColumn) {
+ super(parent, owner, joinColumn);
+ }
+
+ @Override
+ protected DialogPane<?> buildLayout(Composite container) {
+ return new JoinColumnDialogPane<T>(getSubjectHolder(), container);
+ }
+
+ @Override
+ public ReadOnlyJoinColumn getJoinColumn() {
+ return (ReadOnlyJoinColumn) super.getJoinColumn();
+ }
+} \ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/JoinColumnDialogPane.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/JoinColumnDialogPane.java
new file mode 100644
index 0000000000..afd6199f1c
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/JoinColumnDialogPane.java
@@ -0,0 +1,286 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2009 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.ui.internal.details;
+
+import org.eclipse.jpt.common.ui.internal.JptCommonUiMessages;
+import org.eclipse.jpt.common.utility.internal.model.value.PropertyAspectAdapter;
+import org.eclipse.jpt.common.utility.internal.model.value.TransformationPropertyValueModel;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.common.utility.model.value.WritablePropertyValueModel;
+import org.eclipse.jpt.jpa.ui.internal.JpaHelpContextIds;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * Here the layout of this pane:
+ * <pre>
+ * -----------------------------------------------------------------------------
+ * | ------------------------------------------------------------------------- |
+ * | | | |
+ * | | BaseJoinColumnDialogPane | |
+ * | | | |
+ * | ------------------------------------------------------------------------- |
+ * | |
+ * | x Insertable |
+ * | |
+ * | x Nullable |
+ * | |
+ * | x Unique |
+ * | |
+ * | x Updatable |
+ * | |
+ * -----------------------------------------------------------------------------</pre>
+ *
+ * @see JoinColumnStateObject
+ * @see JoinColumnDialog - The parent container
+ *
+ * @version 2.0
+ * @since 1.0
+ */
+public class JoinColumnDialogPane<T extends JoinColumnStateObject> extends BaseJoinColumnDialogPane<T>
+{
+ /**
+ * Creates a new <code>JoinColumnDialogPane</code>.
+ *
+ * @param subjectHolder The holder of this pane's subject
+ * @param parent The parent container
+ */
+ public JoinColumnDialogPane(PropertyValueModel<? extends T> subjectHolder,
+ Composite parent)
+ {
+ super(subjectHolder, parent);
+ }
+
+ private WritablePropertyValueModel<Boolean> buildInsertableHolder() {
+ return new PropertyAspectAdapter<T, Boolean>(getSubjectHolder(), JoinColumnStateObject.INSERTABLE_PROPERTY) {
+ @Override
+ protected Boolean buildValue_() {
+ return this.subject.getInsertable();
+ }
+
+ @Override
+ protected void setValue_(Boolean value) {
+ this.subject.setInsertable(value);
+ }
+ };
+ }
+
+ private PropertyValueModel<String> buildInsertableStringHolder() {
+ return new TransformationPropertyValueModel<Boolean, String>(buildDefaultInsertableHolder()) {
+ @Override
+ protected String transform(Boolean value) {
+ if (value != null) {
+ String defaultStringValue = value.booleanValue() ? JptCommonUiMessages.Boolean_True : JptCommonUiMessages.Boolean_False;
+ return NLS.bind(JptUiDetailsMessages.JoinColumnDialogPane_insertableWithDefault, defaultStringValue);
+ }
+ return JptUiDetailsMessages.JoinColumnDialogPane_insertable;
+ }
+ };
+ }
+
+ private PropertyValueModel<Boolean> buildDefaultInsertableHolder() {
+ return new PropertyAspectAdapter<T, Boolean>(
+ getSubjectHolder(),
+ JoinColumnStateObject.INSERTABLE_PROPERTY)
+ {
+ @Override
+ protected Boolean buildValue_() {
+ if (this.subject.getInsertable() != null) {
+ return null;
+ }
+ return Boolean.valueOf(this.subject.isDefaultInsertable());
+ }
+ };
+ }
+
+ private WritablePropertyValueModel<Boolean> buildNullableHolder() {
+ return new PropertyAspectAdapter<T, Boolean>(
+ getSubjectHolder(),
+ JoinColumnStateObject.NULLABLE_PROPERTY)
+ {
+ @Override
+ protected Boolean buildValue_() {
+ return this.subject.getNullable();
+ }
+
+ @Override
+ protected void setValue_(Boolean value) {
+ this.subject.setNullable(value);
+ }
+ };
+ }
+
+ private PropertyValueModel<String> buildNullableStringHolder() {
+
+ return new TransformationPropertyValueModel<Boolean, String>(buildDefaultNullableHolder()) {
+
+ @Override
+ protected String transform(Boolean value) {
+ if (value != null) {
+ String defaultStringValue = value.booleanValue() ? JptCommonUiMessages.Boolean_True : JptCommonUiMessages.Boolean_False;
+ return NLS.bind(JptUiDetailsMessages.JoinColumnDialogPane_nullableWithDefault, defaultStringValue);
+ }
+ return JptUiDetailsMessages.JoinColumnDialogPane_nullable;
+ }
+ };
+ }
+
+ private PropertyValueModel<Boolean> buildDefaultNullableHolder() {
+ return new PropertyAspectAdapter<T, Boolean>(
+ getSubjectHolder(),
+ JoinColumnStateObject.NULLABLE_PROPERTY)
+ {
+ @Override
+ protected Boolean buildValue_() {
+ if (this.subject.getNullable() != null) {
+ return null;
+ }
+ return Boolean.valueOf(this.subject.isDefaultNullable());
+ }
+ };
+ }
+
+ private WritablePropertyValueModel<Boolean> buildUniqueHolder() {
+ return new PropertyAspectAdapter<T, Boolean>(
+ getSubjectHolder(),
+ JoinColumnStateObject.UNIQUE_PROPERTY)
+ {
+ @Override
+ protected Boolean buildValue_() {
+ return this.subject.getUnique();
+ }
+
+ @Override
+ protected void setValue_(Boolean value) {
+ this.subject.setUnique(value);
+ }
+ };
+ }
+
+ private PropertyValueModel<String> buildUniqueStringHolder() {
+ return new TransformationPropertyValueModel<Boolean, String>(buildDefaultUniqueHolder()) {
+ @Override
+ protected String transform(Boolean value) {
+ if (value != null) {
+ String defaultStringValue = value.booleanValue() ? JptCommonUiMessages.Boolean_True : JptCommonUiMessages.Boolean_False;
+ return NLS.bind(JptUiDetailsMessages.JoinColumnDialogPane_uniqueWithDefault, defaultStringValue);
+ }
+ return JptUiDetailsMessages.JoinColumnDialogPane_unique;
+ }
+ };
+ }
+
+ private PropertyValueModel<Boolean> buildDefaultUniqueHolder() {
+ return new PropertyAspectAdapter<T, Boolean>(
+ getSubjectHolder(),
+ JoinColumnStateObject.UNIQUE_PROPERTY)
+ {
+ @Override
+ protected Boolean buildValue_() {
+ if (this.subject.getUnique() != null) {
+ return null;
+ }
+ return Boolean.valueOf(this.subject.isDefaultUnique());
+ }
+ };
+ }
+
+ private WritablePropertyValueModel<Boolean> buildUpdatableHolder() {
+ return new PropertyAspectAdapter<T, Boolean>(getSubjectHolder(), JoinColumnStateObject.UPDATABLE_PROPERTY) {
+ @Override
+ protected Boolean buildValue_() {
+ return this.subject.getUpdatable();
+ }
+
+ @Override
+ protected void setValue_(Boolean value) {
+ this.subject.setUpdatable(value);
+ }
+ };
+ }
+
+ private PropertyValueModel<String> buildUpdatableStringHolder() {
+ return new TransformationPropertyValueModel<Boolean, String>(buildDefaultUpdatableHolder()) {
+ @Override
+ protected String transform(Boolean value) {
+ if (value != null) {
+ String defaultStringValue = value.booleanValue() ? JptCommonUiMessages.Boolean_True : JptCommonUiMessages.Boolean_False;
+ return NLS.bind(JptUiDetailsMessages.JoinColumnDialogPane_updatableWithDefault, defaultStringValue);
+ }
+ return JptUiDetailsMessages.JoinColumnDialogPane_updatable;
+ }
+ };
+ }
+
+ private PropertyValueModel<Boolean> buildDefaultUpdatableHolder() {
+ return new PropertyAspectAdapter<T, Boolean>(
+ getSubjectHolder(),
+ JoinColumnStateObject.UPDATABLE_PROPERTY)
+ {
+ @Override
+ protected Boolean buildValue_() {
+ if (this.subject.getUpdatable() != null) {
+ return null;
+ }
+ return Boolean.valueOf(this.subject.isDefaultUpdatable());
+ }
+ };
+ }
+
+ @Override
+ protected void initializeLayout(Composite container) {
+
+ super.initializeLayout(container);
+
+ // Insertable tri-state check box
+ addTriStateCheckBoxWithDefault(
+ addSubPane(container, 4),
+ JptUiDetailsMessages.JoinColumnDialogPane_insertable,
+ buildInsertableHolder(),
+ buildInsertableStringHolder(),
+ JpaHelpContextIds.MAPPING_COLUMN_INSERTABLE
+ );
+
+ // Updatable tri-state check box
+ addTriStateCheckBoxWithDefault(
+ container,
+ JptUiDetailsMessages.JoinColumnDialogPane_updatable,
+ buildUpdatableHolder(),
+ buildUpdatableStringHolder(),
+ JpaHelpContextIds.MAPPING_COLUMN_UPDATABLE
+ );
+
+ // Unique tri-state check box
+ addTriStateCheckBoxWithDefault(
+ container,
+ JptUiDetailsMessages.ColumnComposite_unique,
+ buildUniqueHolder(),
+ buildUniqueStringHolder(),
+ JpaHelpContextIds.MAPPING_COLUMN_UNIQUE
+ );
+
+ // Nullable tri-state check box
+ addTriStateCheckBoxWithDefault(
+ container,
+ JptUiDetailsMessages.ColumnComposite_nullable,
+ buildNullableHolder(),
+ buildNullableStringHolder(),
+ JpaHelpContextIds.MAPPING_COLUMN_NULLABLE
+ );
+ }
+
+ /*
+ * (non-Javadoc)
+ */
+ @Override
+ protected boolean isTableEditable() {
+ return true;
+ }
+} \ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/JoinColumnInJoiningStrategyDialog.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/JoinColumnInJoiningStrategyDialog.java
new file mode 100644
index 0000000000..24d6fd8e78
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/JoinColumnInJoiningStrategyDialog.java
@@ -0,0 +1,62 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2009 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.ui.internal.details;
+
+import org.eclipse.jpt.jpa.core.context.JoinColumn;
+import org.eclipse.jpt.jpa.core.context.JoinColumnRelationshipStrategy;
+import org.eclipse.jpt.jpa.core.context.ReadOnlyJoinColumn;
+import org.eclipse.jpt.jpa.core.context.ReadOnlyJoinColumnRelationshipStrategy;
+import org.eclipse.swt.widgets.Shell;
+
+/**
+ * This dialog is used to either create or edit a joing column that is located
+ * on a relational mapping.
+ *
+ * @see JoinColumn
+ * @see JoinColumnRelationshipStrategy
+ * @see JoinColumnInJoiningStrategyStateObject
+ * @see JoinColumnDialogPane
+ *
+ * @version 2.0
+ * @since 2.0
+ */
+public class JoinColumnInJoiningStrategyDialog
+ extends JoinColumnDialog<JoinColumnInJoiningStrategyStateObject>
+{
+ /**
+ * Creates a new <code>AbstractJoinColumnDialog</code>.
+ *
+ * @param parent The parent shell
+ * @param relationshipMapping The owner of the join column to edit or to
+ * create
+ * @param joinColumn The join column to edit or <code>null</code> if this is
+ * used to create a new one
+ */
+ JoinColumnInJoiningStrategyDialog(
+ Shell parent,
+ ReadOnlyJoinColumnRelationshipStrategy joinColumnOwner,
+ ReadOnlyJoinColumn joinColumn) {
+
+ super(parent, joinColumnOwner, joinColumn);
+ }
+
+ @Override
+ protected JoinColumnInJoiningStrategyStateObject buildStateObject() {
+ return new JoinColumnInJoiningStrategyStateObject(
+ getOwner(),
+ getJoinColumn()
+ );
+ }
+
+ @Override
+ protected JoinColumnRelationshipStrategy getOwner() {
+ return (JoinColumnRelationshipStrategy) super.getOwner();
+ }
+} \ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/JoinColumnInJoiningStrategyStateObject.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/JoinColumnInJoiningStrategyStateObject.java
new file mode 100644
index 0000000000..2ff745f0f3
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/JoinColumnInJoiningStrategyStateObject.java
@@ -0,0 +1,97 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 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.ui.internal.details;
+
+import java.util.ListIterator;
+import org.eclipse.jpt.common.utility.internal.CollectionTools;
+import org.eclipse.jpt.jpa.core.context.JoinColumn;
+import org.eclipse.jpt.jpa.core.context.JoinColumnRelationshipStrategy;
+import org.eclipse.jpt.jpa.core.context.ReadOnlyJoinColumn;
+import org.eclipse.jpt.jpa.core.context.ReadOnlyJoinColumnRelationshipStrategy;
+import org.eclipse.jpt.jpa.core.context.TypeMapping;
+import org.eclipse.jpt.jpa.db.Schema;
+import org.eclipse.jpt.jpa.db.Table;
+
+/**
+ * The state object used to create or edit a primary key join column on a
+ * relationship mapping.
+ *
+ * @see JoinColumn
+ * @see JoinColumnRelationshipStrategy
+ * @see JoinColumnInJoiningStrategyDialog
+ *
+ * @version 2.3
+ * @since 2.0
+ */
+public class JoinColumnInJoiningStrategyStateObject
+ extends JoinColumnStateObject
+{
+ /**
+ * Creates a new <code>JoinColumnInJoiningStrategyStateObject</code>.
+ *
+ * @param joiningStrategy The owner of the join column to create
+ * @param joinColumn The join column to edit or <code>null</code> if this is
+ * used to create a new one
+ */
+ public JoinColumnInJoiningStrategyStateObject(
+ ReadOnlyJoinColumnRelationshipStrategy joiningStrategy,
+ ReadOnlyJoinColumn joinColumn) {
+ super(joiningStrategy, joinColumn);
+ }
+
+
+ @Override
+ public JoinColumnRelationshipStrategy getOwner() {
+ return (JoinColumnRelationshipStrategy) super.getOwner();
+ }
+
+ @Override
+ public ListIterator<String> tables() {
+ Schema schema = getDbSchema();
+ return schema == null ? super.tables() : CollectionTools.list(schema.getSortedTableIdentifiers()).listIterator();
+ }
+
+ protected Schema getDbSchema() {
+ TypeMapping typeMapping = getRelationshipSource();
+ return typeMapping == null ? null : typeMapping.getDbSchema();
+ }
+
+ protected TypeMapping getRelationshipSource() {
+ return getOwner().getRelationshipSource();
+ }
+
+ protected TypeMapping getRelationshipTarget() {
+ return getOwner().getRelationshipTarget();
+ }
+
+ @Override
+ public String getDefaultTable() {
+ JoinColumn joinColumn = getJoinColumn();
+
+ if (joinColumn != null) {
+ return joinColumn.getDefaultTable();
+ }
+ TypeMapping typeMapping = getRelationshipSource();
+ return typeMapping == null ? null : typeMapping.getPrimaryTableName();
+ }
+
+ @Override
+ public Table getNameTable() {
+ TypeMapping typeMapping = getRelationshipSource();
+ return typeMapping == null ? null : typeMapping.getPrimaryDbTable();
+ }
+
+ @Override
+ public Table getReferencedNameTable() {
+ TypeMapping relationshipTarget = getRelationshipTarget();
+ return relationshipTarget == null ? null : relationshipTarget.getPrimaryDbTable();
+ }
+
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/JoinColumnInReferenceTableDialog.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/JoinColumnInReferenceTableDialog.java
new file mode 100644
index 0000000000..291b5d8a92
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/JoinColumnInReferenceTableDialog.java
@@ -0,0 +1,80 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2009 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.ui.internal.details;
+
+import org.eclipse.jpt.common.ui.internal.widgets.DialogPane;
+import org.eclipse.jpt.jpa.core.context.JoinColumn;
+import org.eclipse.jpt.jpa.core.context.JoinTable;
+import org.eclipse.jpt.jpa.core.context.ReadOnlyJoinColumn;
+import org.eclipse.jpt.jpa.core.context.ReadOnlyReferenceTable;
+import org.eclipse.jpt.jpa.core.context.ReferenceTable;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Shell;
+
+/**
+ * This dialog is used to either create or edit a join column that is located
+ * on a join table.
+ *
+ * @see JoinColumn
+ * @see JoinTable
+ * @see JoinColumnInReferenceTableStateObject
+ * @see BaseJoinColumnDialogPane
+ *
+ * @version 2.0
+ * @since 1.0
+ */
+public class JoinColumnInReferenceTableDialog extends BaseJoinColumnDialog<JoinColumnInReferenceTableStateObject> {
+
+ /**
+ * Creates a new <code>JoinColumnInReferenceTableDialog</code>.
+ *
+ * @param parent The parent shell
+ * @param joinTable The parent of the join column to edit or to create
+ * @param joinColumn Either the join column to edit or <code>null</code> if
+ * this state object is used to create a new one
+ */
+ public JoinColumnInReferenceTableDialog(Shell parent,
+ ReadOnlyReferenceTable referenceTable,
+ ReadOnlyJoinColumn joinColumn) {
+
+ super(parent, referenceTable, joinColumn);
+ }
+
+ @Override
+ protected DialogPane<JoinColumnInReferenceTableStateObject> buildLayout(Composite container) {
+ return new JoinColumnDialogPane<JoinColumnInReferenceTableStateObject>(
+ getSubjectHolder(),
+ container
+ ) {
+ @Override
+ protected boolean isTableEditable() {
+ return false;
+ }
+ };
+ }
+
+ @Override
+ protected JoinColumnInReferenceTableStateObject buildStateObject() {
+ return new JoinColumnInReferenceTableStateObject(
+ getOwner(),
+ getJoinColumn()
+ );
+ }
+
+ @Override
+ public JoinColumn getJoinColumn() {
+ return (JoinColumn) super.getJoinColumn();
+ }
+
+ @Override
+ protected ReferenceTable getOwner() {
+ return (ReferenceTable) super.getOwner();
+ }
+} \ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/JoinColumnInReferenceTableStateObject.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/JoinColumnInReferenceTableStateObject.java
new file mode 100644
index 0000000000..a3bdb624a8
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/JoinColumnInReferenceTableStateObject.java
@@ -0,0 +1,87 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 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.ui.internal.details;
+
+import java.util.ListIterator;
+import org.eclipse.jpt.common.utility.internal.iterators.SingleElementListIterator;
+import org.eclipse.jpt.jpa.core.context.JoinColumn;
+import org.eclipse.jpt.jpa.core.context.JoinTable;
+import org.eclipse.jpt.jpa.core.context.ReferenceTable;
+import org.eclipse.jpt.jpa.core.context.TypeMapping;
+import org.eclipse.jpt.jpa.db.Table;
+
+/**
+ * The state object used to create or edit a primary key join column on a
+ * joint table.
+ *
+ * @see JoinColumn
+ * @see JoinTable
+ * @see InverseJoinColumnDialog
+ * @see InverseJoinColumnDialogPane
+ * @see JoinColumnInReferenceTableDialog
+ *
+ * @version 2.0
+ * @since 2.0
+ */
+public class JoinColumnInReferenceTableStateObject
+ extends JoinColumnStateObject
+{
+ /**
+ * Creates a new <code>JoinColumnInJoinTableStateObject</code>.
+ *
+ * @param joinTable The owner of the join column to create or to edit
+ * @param joinColumn The join column to edit
+ */
+ public JoinColumnInReferenceTableStateObject(
+ ReferenceTable referenceTable,
+ JoinColumn joinColumn) {
+ super(referenceTable, joinColumn);
+ }
+
+
+ @Override
+ public ReferenceTable getOwner() {
+ return (ReferenceTable) super.getOwner();
+ }
+
+ private TypeMapping getTypeMapping() {
+ return getOwner().getPersistentAttribute().getOwningTypeMapping();
+ }
+
+ @Override
+ public String getDefaultTable() {
+ return null;
+ }
+
+ @Override
+ public Table getNameTable() {
+ return getOwner().getDbTable();
+ }
+
+ @Override
+ public Table getReferencedNameTable() {
+ return getTypeMapping().getPrimaryDbTable();
+ }
+
+ @Override
+ protected String getInitialTable() {
+ return getOwner().getName();
+ }
+
+ @Override
+ protected boolean isTableEditable() {
+ return false;
+ }
+
+ @Override
+ public ListIterator<String> tables() {
+ return new SingleElementListIterator<String>(getInitialTable());
+ }
+} \ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/JoinColumnJoiningStrategyPane.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/JoinColumnJoiningStrategyPane.java
new file mode 100644
index 0000000000..debfa6e73c
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/JoinColumnJoiningStrategyPane.java
@@ -0,0 +1,152 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 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.ui.internal.details;
+
+import org.eclipse.jpt.common.ui.internal.widgets.Pane;
+import org.eclipse.jpt.common.utility.internal.model.value.PropertyAspectAdapter;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.common.utility.model.value.WritablePropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.JoinColumnRelationship;
+import org.eclipse.jpt.jpa.core.context.ReadOnlyJoinColumnRelationship;
+import org.eclipse.jpt.jpa.core.context.ReadOnlyJoinColumnRelationshipStrategy;
+import org.eclipse.jpt.jpa.core.context.ReadOnlyRelationship;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * Here is the layout of this pane:
+ * <pre>
+ * -----------------------------------------------------------------------------
+ * | o Join columns __________________________________________________________ |
+ * | | --------------------------------------------------------------------- | |
+ * | | | | | |
+ * | | | JoiningStrategyJoinColumnsComposite | | |
+ * | | | | | |
+ * | | --------------------------------------------------------------------- | |
+ * | ------------------------------------------------------------------------- |
+ * -----------------------------------------------------------------------------</pre>
+ *
+ * @see JoinColumnRelationship
+ * @see ReadOnlyJoinColumnRelationshipStrategy
+ * @see OneToOneJoiningStrategyPane
+ * @see ManyToOneJoiningStrategyPane
+ *
+ * @version 2.3
+ * @since 2.1
+ */
+public class JoinColumnJoiningStrategyPane
+ extends AbstractJoiningStrategyPane
+ <ReadOnlyJoinColumnRelationship, ReadOnlyJoinColumnRelationshipStrategy>
+{
+ private final boolean includeOverrideCheckBox;
+
+
+ public static JoinColumnJoiningStrategyPane buildJoinColumnJoiningStrategyPaneWithIncludeOverrideCheckBox(
+ Pane<? extends ReadOnlyJoinColumnRelationship> parentPane,
+ Composite parent) {
+ return new JoinColumnJoiningStrategyPane(parentPane, parent, true);
+ }
+
+ public static JoinColumnJoiningStrategyPane buildJoinColumnJoiningStrategyPaneWithoutIncludeOverrideCheckBox(
+ Pane<? extends ReadOnlyJoinColumnRelationship> parentPane,
+ Composite parent) {
+ return new JoinColumnJoiningStrategyPane(parentPane, parent, false);
+ }
+
+ public static JoinColumnJoiningStrategyPane buildJoinColumnJoiningStrategyPaneWithIncludeOverrideCheckBox(
+ Pane<?> parentPane,
+ PropertyValueModel<? extends ReadOnlyJoinColumnRelationship> subjectHolder,
+ Composite parent) {
+ return new JoinColumnJoiningStrategyPane(parentPane, subjectHolder, parent, true);
+ }
+
+ public static JoinColumnJoiningStrategyPane buildJoinColumnJoiningStrategyPaneWithoutIncludeOverrideCheckBox(
+ Pane<?> parentPane,
+ PropertyValueModel<? extends ReadOnlyJoinColumnRelationship> subjectHolder,
+ Composite parent) {
+ return new JoinColumnJoiningStrategyPane(parentPane, subjectHolder, parent, false);
+ }
+
+
+ private JoinColumnJoiningStrategyPane(
+ Pane<? extends ReadOnlyJoinColumnRelationship> parentPane,
+ Composite parent,
+ boolean includeOverrideCheckBox) {
+ super(parentPane, parent);
+ this.includeOverrideCheckBox = includeOverrideCheckBox;
+ initializeLayout2(getControl());
+ }
+
+ private JoinColumnJoiningStrategyPane(Pane<?> parentPane,
+ PropertyValueModel<? extends ReadOnlyJoinColumnRelationship> subjectHolder,
+ Composite parent,
+ boolean includeOverrideCheckBox) {
+
+ super(parentPane, subjectHolder, parent);
+ this.includeOverrideCheckBox = includeOverrideCheckBox;
+ initializeLayout2(getControl());
+ }
+
+ @Override
+ protected void initializeLayout(Composite container) {
+ //see initializeLayout2
+ }
+
+ protected void initializeLayout2(Composite container) {
+ super.initializeLayout(container);
+ //just call super, we are delaying the initializeLayout because of the includeOverrideCheckBox boolean
+ }
+
+ @Override
+ protected Composite buildStrategyDetailsComposite(Composite parent) {
+ PropertyValueModel<ReadOnlyJoinColumnRelationshipStrategy> joiningStrategyHolder = this.buildJoinColumnJoiningStrategyHolder();
+
+ return this.includeOverrideCheckBox ?
+ new JoiningStrategyJoinColumnsWithOverrideOptionComposite(this, joiningStrategyHolder, parent).getControl() :
+ new JoiningStrategyJoinColumnsComposite(this, joiningStrategyHolder, parent).getControl();
+ }
+
+ @Override
+ protected WritablePropertyValueModel<Boolean> buildUsesStrategyHolder() {
+ return buildUsesJoinColumnJoiningStrategyHolder(getSubjectHolder());
+ }
+
+ protected PropertyValueModel<ReadOnlyJoinColumnRelationshipStrategy> buildJoinColumnJoiningStrategyHolder() {
+ return new PropertyAspectAdapter
+ <ReadOnlyJoinColumnRelationship, ReadOnlyJoinColumnRelationshipStrategy>(
+ getSubjectHolder()) {
+ @Override
+ protected ReadOnlyJoinColumnRelationshipStrategy buildValue_() {
+ return this.subject.getJoinColumnStrategy();
+ }
+ };
+ }
+
+ public static WritablePropertyValueModel<Boolean> buildUsesJoinColumnJoiningStrategyHolder(PropertyValueModel<? extends ReadOnlyJoinColumnRelationship> subjectHolder) {
+ return new PropertyAspectAdapter<ReadOnlyJoinColumnRelationship, Boolean>(
+ subjectHolder, ReadOnlyRelationship.STRATEGY_PROPERTY) {
+ @Override
+ protected Boolean buildValue() {
+ return Boolean.valueOf(this.buildBooleanValue());
+ }
+
+ protected boolean buildBooleanValue() {
+ return (this.subject != null) && this.subject.strategyIsJoinColumn();
+ }
+
+ @Override
+ protected void setValue_(Boolean value) {
+ if (value == Boolean.TRUE) {
+ ((JoinColumnRelationship) this.subject).setStrategyToJoinColumn();
+ }
+ //value == FALSE - selection of another radio button causes this strategy to get unset
+ }
+ };
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/JoinColumnStateObject.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/JoinColumnStateObject.java
new file mode 100644
index 0000000000..0627a4072b
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/JoinColumnStateObject.java
@@ -0,0 +1,212 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 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.ui.internal.details;
+
+import java.util.ListIterator;
+import org.eclipse.jpt.common.utility.internal.iterators.EmptyListIterator;
+import org.eclipse.jpt.jpa.core.context.BaseJoinColumn;
+import org.eclipse.jpt.jpa.core.context.JoinColumn;
+import org.eclipse.jpt.jpa.core.context.ReadOnlyBaseColumn;
+import org.eclipse.jpt.jpa.core.context.ReadOnlyBaseJoinColumn;
+import org.eclipse.jpt.jpa.core.context.ReadOnlyJoinColumn;
+
+/**
+ * The state object used to edit a <code>JoinColumn</code>.
+ *
+ * @see JoinColumn
+ *
+ * @version 2.0
+ * @since 2.0
+ */
+@SuppressWarnings("nls")
+public abstract class JoinColumnStateObject
+ extends BaseJoinColumnStateObject
+{
+ private Boolean insertable;
+ private Boolean nullable;
+ private Boolean unique;
+ private Boolean updatable;
+
+ public static final String INSERTABLE_PROPERTY = "insertable";
+ public static final String NULLABLE_PROPERTY = "nullable";
+ public static final String UNIQUE_PROPERTY = "unique";
+ public static final String UPDATABLE_PROPERTY = "updatable";
+
+ /**
+ * Creates a new <code>JoinColumnStateObject</code>.
+ *
+ * @param owner The owner of the join column to create or where it is located
+ * @param joinColumn The join column to edit
+ */
+ public JoinColumnStateObject(Object owner, ReadOnlyJoinColumn joinColumn) {
+ super(owner, joinColumn);
+ }
+
+ public boolean isDefaultInsertable() {
+
+ JoinColumn joinColumn = getJoinColumn();
+
+ if (joinColumn != null) {
+ return joinColumn.isDefaultInsertable();
+ }
+
+ return ReadOnlyBaseColumn.DEFAULT_INSERTABLE;
+ }
+
+ public boolean isDefaultNullable() {
+
+ JoinColumn joinColumn = getJoinColumn();
+
+ if (joinColumn != null) {
+ return joinColumn.isDefaultNullable();
+ }
+
+ return ReadOnlyBaseColumn.DEFAULT_NULLABLE;
+ }
+
+ public boolean isDefaultUnique() {
+
+ JoinColumn joinColumn = getJoinColumn();
+
+ if (joinColumn != null) {
+ return joinColumn.isDefaultUnique();
+ }
+
+ return ReadOnlyBaseColumn.DEFAULT_UNIQUE;
+ }
+
+ public boolean isDefaultUpdatable() {
+
+ JoinColumn joinColumn = getJoinColumn();
+
+ if (joinColumn != null) {
+ return joinColumn.isDefaultUpdatable();
+ }
+
+ return ReadOnlyBaseColumn.DEFAULT_UPDATABLE;
+ }
+
+ public Boolean getInsertable() {
+ return this.insertable;
+ }
+
+ @Override
+ public JoinColumn getJoinColumn() {
+ return (JoinColumn) super.getJoinColumn();
+ }
+
+ public Boolean getNullable() {
+ return this.nullable;
+ }
+
+ public Boolean getUnique() {
+ return this.unique;
+ }
+
+ public Boolean getUpdatable() {
+ return this.updatable;
+ }
+
+ @Override
+ protected void initialize(Object owner, ReadOnlyBaseJoinColumn baseJoinColumn) {
+
+ super.initialize(owner, baseJoinColumn);
+
+ if (baseJoinColumn != null) {
+ ReadOnlyJoinColumn joinColumn = (ReadOnlyJoinColumn) baseJoinColumn;
+
+ this.insertable = joinColumn.getSpecifiedInsertable();
+ this.nullable = joinColumn.getSpecifiedNullable();
+ this.unique = joinColumn.getSpecifiedUnique();
+ this.updatable = joinColumn.getSpecifiedUpdatable();
+ }
+ }
+
+ @Override
+ protected String getInitialTable() {
+ JoinColumn joinColumn = getJoinColumn();
+
+ if (joinColumn == null) {
+ return null;
+ }
+
+ return joinColumn.getSpecifiedTable();
+ }
+
+ protected boolean isTableEditable() {
+ return true;
+ }
+
+ public void setInsertable(Boolean insertable) {
+ Boolean oldInsertable = this.insertable;
+ this.insertable = insertable;
+ firePropertyChanged(INSERTABLE_PROPERTY, oldInsertable, insertable);
+ }
+
+ public void setNullable(Boolean nullable) {
+ Boolean oldNullable = this.nullable;
+ this.nullable = nullable;
+ firePropertyChanged(NULLABLE_PROPERTY, oldNullable, nullable);
+ }
+
+ public void setUnique(Boolean unique) {
+ Boolean oldUnique = this.unique;
+ this.unique = unique;
+ firePropertyChanged(UNIQUE_PROPERTY, oldUnique, unique);
+ }
+
+ public void setUpdatable(Boolean updatable) {
+ Boolean oldUpdatable = this.updatable;
+ this.updatable = updatable;
+ firePropertyChanged(UPDATABLE_PROPERTY, oldUpdatable, updatable);
+ }
+
+ @Override
+ public ListIterator<String> tables() {
+ return EmptyListIterator.instance();
+ }
+
+ @Override
+ public void updateJoinColumn(BaseJoinColumn abstractJoinColumn) {
+
+ super.updateJoinColumn(abstractJoinColumn);
+
+ JoinColumn joinColumn = (JoinColumn) abstractJoinColumn;
+
+ // Table
+ if (isTableEditable()) {
+ String table = getTable();
+
+ if (valuesAreDifferent(table, joinColumn.getSpecifiedTable())) {
+ joinColumn.setSpecifiedTable(table);
+ }
+ }
+
+ // Insertable
+ if (joinColumn.getSpecifiedInsertable() != this.insertable){
+ joinColumn.setSpecifiedInsertable(this.insertable);
+ }
+
+ // Updatable
+ if (joinColumn.getSpecifiedUpdatable() != this.updatable){
+ joinColumn.setSpecifiedUpdatable(this.updatable);
+ }
+
+ // Unique
+ if (joinColumn.getSpecifiedUnique() != this.unique){
+ joinColumn.setSpecifiedUnique(this.unique);
+ }
+
+ // Nullable
+ if (joinColumn.getSpecifiedNullable() != this.nullable){
+ joinColumn.setSpecifiedNullable(this.nullable);
+ }
+ }
+} \ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/JoinColumnsComposite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/JoinColumnsComposite.java
new file mode 100644
index 0000000000..2797dd324e
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/JoinColumnsComposite.java
@@ -0,0 +1,329 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2010 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.ui.internal.details;
+
+import java.util.ArrayList;
+import java.util.ListIterator;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.ui.internal.util.PaneEnabler;
+import org.eclipse.jpt.common.ui.internal.widgets.AddRemoveListPane;
+import org.eclipse.jpt.common.ui.internal.widgets.Pane;
+import org.eclipse.jpt.common.ui.internal.widgets.AddRemovePane.AbstractAdapter;
+import org.eclipse.jpt.common.ui.internal.widgets.AddRemovePane.Adapter;
+import org.eclipse.jpt.common.utility.internal.model.value.CompositeListValueModel;
+import org.eclipse.jpt.common.utility.internal.model.value.ItemPropertyListValueModelAdapter;
+import org.eclipse.jpt.common.utility.internal.model.value.ListAspectAdapter;
+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.SimplePropertyValueModel;
+import org.eclipse.jpt.common.utility.internal.model.value.swing.ObjectListSelectionModel;
+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.core.JpaNode;
+import org.eclipse.jpt.jpa.core.context.JoinColumn;
+import org.eclipse.jpt.jpa.core.context.ReadOnlyBaseJoinColumn;
+import org.eclipse.jpt.jpa.core.context.ReadOnlyJoinColumn;
+import org.eclipse.jpt.jpa.core.context.ReadOnlyNamedColumn;
+import org.eclipse.jpt.jpa.ui.internal.JpaHelpContextIds;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * Here is the layout of this pane:
+ * <pre>
+ * -----------------------------------------------------------------------------
+ * | ------------------------------------------------------------------------- |
+ * | | | |
+ * | | AddRemoveListPane | |
+ * | | | |
+ * | ------------------------------------------------------------------------- |
+ * -----------------------------------------------------------------------------</pre>
+ *
+ * @see JoiningStrategyJoinColumnsComposite - A container of this pane
+ * @see JoinTableComposite - A container of this pane
+ * @see EntityOverridesComposite - A container of this pane
+ *
+ * @version 3.0
+ * @since 2.0
+ */
+public class JoinColumnsComposite<T extends JpaNode> extends Pane<T>
+{
+ /**
+ * The editor used to perform the common behaviors defined in the list pane.
+ */
+ JoinColumnsEditor<T> joinColumnsEditor;
+
+ private AddRemoveListPane<T> listPane;
+
+ /**
+ * Creates a new <code>JoinColumnsComposite</code>.
+ *
+ * @param parentPane The parent controller of this one
+ * @param parent The parent container
+ * @param joinColumnsEditor The editor used to perform the common behaviors
+ * defined in the list pane
+ */
+ public JoinColumnsComposite(Pane<? extends T> parentPane,
+ Composite parent,
+ JoinColumnsEditor<T> joinColumnsEditor) {
+
+ super(parentPane, parent);
+ this.joinColumnsEditor = joinColumnsEditor;
+ initializeLayout2();
+ }
+
+ /**
+ * Creates a new <code>JoinColumnsComposite</code>.
+ *
+ * @param parentPane The parent controller of this one
+ * @param subjectHolder The holder of this pane's subject
+ * @param parent The parent container
+ * @param joinColumnsEditor The editor used to perform the common behaviors
+ * defined in the list pane
+ */
+ public JoinColumnsComposite(Pane<?> parentPane,
+ PropertyValueModel<? extends T> subjectHolder,
+ Composite parent,
+ JoinColumnsEditor<T> joinColumnsEditor,
+ boolean automaticallyAlignWidgets) {
+
+ super(parentPane, subjectHolder, parent, automaticallyAlignWidgets);
+ this.joinColumnsEditor = joinColumnsEditor;
+ initializeLayout2();
+ }
+
+ /**
+ * Creates a new <code>JoinColumnsComposite</code>.
+ *
+ * @param subjectHolder The holder of this pane's subject
+ * @param parent The parent container
+ * @param widgetFactory The factory used to create various common widgets
+ */
+ public JoinColumnsComposite(PropertyValueModel<? extends T> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory,
+ JoinColumnsEditor<T> joinColumnsEditor) {
+
+ super(subjectHolder, parent, widgetFactory);
+ this.joinColumnsEditor = joinColumnsEditor;
+ initializeLayout2();
+ }
+
+ @Override
+ protected void initializeLayout(Composite container) {
+ //see intiailizeLayout2()
+ }
+
+ private void initializeLayout2() {
+ this.listPane = new AddRemoveListPane<T>(
+ this,
+ getControl(),
+ buildJoinColumnsAdapter(),
+ buildJoinColumnsListModel(),
+ buildSelectedJoinColumnHolder(),
+ buildJoinColumnsListLabelProvider(),
+ JpaHelpContextIds.MAPPING_JOIN_TABLE_COLUMNS,
+ false
+ );
+ }
+
+ private WritablePropertyValueModel<JoinColumn> buildSelectedJoinColumnHolder() {
+ return new SimplePropertyValueModel<JoinColumn>();
+ }
+
+ String buildJoinColumnLabel(ReadOnlyJoinColumn joinColumn) {
+
+ if (joinColumn.isDefault()) {
+ return NLS.bind(
+ JptUiDetailsMessages.JoinColumnsComposite_mappingBetweenTwoParamsDefault,
+ joinColumn.getName(),
+ joinColumn.getReferencedColumnName()
+ );
+ }
+ if (joinColumn.getSpecifiedName() == null) {
+
+ if (joinColumn.getSpecifiedReferencedColumnName() == null) {
+ return NLS.bind(
+ JptUiDetailsMessages.JoinColumnsComposite_mappingBetweenTwoParamsBothDefault,
+ joinColumn.getName(),
+ joinColumn.getReferencedColumnName()
+ );
+ }
+
+ return NLS.bind(
+ JptUiDetailsMessages.JoinColumnsComposite_mappingBetweenTwoParamsFirstDefault,
+ joinColumn.getName(),
+ joinColumn.getReferencedColumnName()
+ );
+ }
+
+ if (joinColumn.getSpecifiedReferencedColumnName() == null) {
+ return NLS.bind(
+ JptUiDetailsMessages.JoinColumnsComposite_mappingBetweenTwoParamsSecDefault,
+ joinColumn.getName(),
+ joinColumn.getReferencedColumnName()
+ );
+ }
+
+ return NLS.bind(
+ JptUiDetailsMessages.JoinColumnsComposite_mappingBetweenTwoParams,
+ joinColumn.getName(),
+ joinColumn.getReferencedColumnName()
+ );
+ }
+
+ private Adapter buildJoinColumnsAdapter() {
+ return new AbstractAdapter() {
+
+ public void addNewItem(ObjectListSelectionModel listSelectionModel) {
+ JoinColumnsComposite.this.joinColumnsEditor.addJoinColumn(getSubject());
+ }
+
+ @Override
+ public boolean hasOptionalButton() {
+ return true;
+ }
+
+ @Override
+ public String optionalButtonText() {
+ return JptUiDetailsMessages.JoinColumnsComposite_edit;
+ }
+
+ @Override
+ public void optionOnSelection(ObjectListSelectionModel listSelectionModel) {
+ JoinColumn joinColumn = (JoinColumn) listSelectionModel.selectedValue();
+ JoinColumnsComposite.this.joinColumnsEditor.editJoinColumn(getSubject(), joinColumn);
+ }
+
+ public void removeSelectedItems(ObjectListSelectionModel listSelectionModel) {
+ JoinColumnsComposite.this.joinColumnsEditor.removeJoinColumns(getSubject(), listSelectionModel.selectedIndices());
+ }
+ };
+ }
+
+ private ListValueModel<ReadOnlyJoinColumn> buildJoinColumnsListModel() {
+ return new ItemPropertyListValueModelAdapter<ReadOnlyJoinColumn>(buildJoinColumnsListHolder(),
+ ReadOnlyNamedColumn.SPECIFIED_NAME_PROPERTY,
+ ReadOnlyNamedColumn.DEFAULT_NAME_PROPERTY,
+ ReadOnlyBaseJoinColumn.SPECIFIED_REFERENCED_COLUMN_NAME_PROPERTY,
+ ReadOnlyBaseJoinColumn.DEFAULT_REFERENCED_COLUMN_NAME_PROPERTY);
+ }
+
+ private ListValueModel<ReadOnlyJoinColumn> buildJoinColumnsListHolder() {
+ java.util.List<ListValueModel<ReadOnlyJoinColumn>> list = new ArrayList<ListValueModel<ReadOnlyJoinColumn>>();
+ list.add(buildSpecifiedJoinColumnsListHolder());
+ list.add(buildDefaultJoinColumnListHolder());
+ return new CompositeListValueModel<ListValueModel<ReadOnlyJoinColumn>, ReadOnlyJoinColumn>(list);
+ }
+
+ private ListValueModel<ReadOnlyJoinColumn> buildSpecifiedJoinColumnsListHolder() {
+ return new ListAspectAdapter<T, ReadOnlyJoinColumn>(getSubjectHolder(), this.joinColumnsEditor.getSpecifiedJoinColumnsListPropertyName()) {
+ @Override
+ protected ListIterator<ReadOnlyJoinColumn> listIterator_() {
+ return JoinColumnsComposite.this.joinColumnsEditor.specifiedJoinColumns(this.subject);
+ }
+
+ @Override
+ protected int size_() {
+ return JoinColumnsComposite.this.joinColumnsEditor.specifiedJoinColumnsSize(this.subject);
+ }
+ };
+ }
+
+
+ private ListValueModel<ReadOnlyJoinColumn> buildDefaultJoinColumnListHolder() {
+ return new PropertyListValueModelAdapter<ReadOnlyJoinColumn>(buildDefaultJoinColumnHolder());
+
+ }
+
+ private PropertyValueModel<ReadOnlyJoinColumn> buildDefaultJoinColumnHolder() {
+ return new PropertyAspectAdapter<T, ReadOnlyJoinColumn>(getSubjectHolder(), this.joinColumnsEditor.getDefaultPropertyName()) {
+ @Override
+ protected ReadOnlyJoinColumn buildValue_() {
+ return JoinColumnsComposite.this.joinColumnsEditor.getDefaultJoinColumn(this.subject);
+ }
+ };
+ }
+
+
+ private ILabelProvider buildJoinColumnsListLabelProvider() {
+ return new LabelProvider() {
+ @Override
+ public String getText(Object element) {
+ ReadOnlyJoinColumn joinColumn = (ReadOnlyJoinColumn) element;
+
+ return buildJoinColumnLabel(joinColumn);
+ }
+ };
+ }
+
+ public void installJoinColumnsPaneEnabler(PropertyValueModel<Boolean> joinColumnsPaneEnablerHolder) {
+ new PaneEnabler(joinColumnsPaneEnablerHolder, this.listPane);
+ }
+
+ public void setSelectedJoinColumn(JoinColumn joinColumn) {
+ this.listPane.setSelectedItem(joinColumn);
+ }
+
+ /**
+ * The editor is used to complete the behavior of this pane.
+ */
+ public static interface JoinColumnsEditor<T> {
+
+ /**
+ * Add a join column to the given subject and return it
+ */
+ void addJoinColumn(T subject);
+
+ /**
+ * Edit the given join column, the Edit button was pressed
+ * while this join column was selected.
+ */
+ void editJoinColumn(T subject, ReadOnlyJoinColumn joinColumn);
+
+ /**
+ * Return whether the subject has specified join columns
+ */
+ boolean hasSpecifiedJoinColumns(T subject);
+
+ /**
+ * Return the spcified join columns from the given subject
+ */
+ ListIterator<ReadOnlyJoinColumn> specifiedJoinColumns(T subject);
+
+ /**
+ * Return the number of specified join columns on the given subject
+ */
+ int specifiedJoinColumnsSize(T subject);
+
+ /**
+ * Return the default join column from the given subject or null.
+ */
+ ReadOnlyJoinColumn getDefaultJoinColumn(T subject);
+
+ /**
+ * Return the property name of the specified join columns list
+ */
+ String getSpecifiedJoinColumnsListPropertyName();
+
+ /**
+ * Return the property name of the specified join columns list
+ */
+ String getDefaultPropertyName();
+
+ /**
+ * Remove the join columns at the specified indices from the subject
+ */
+ void removeJoinColumns(T subject, int[] selectedIndices);
+ }
+} \ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/JoinTableComposite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/JoinTableComposite.java
new file mode 100644
index 0000000000..6ee91890a4
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/JoinTableComposite.java
@@ -0,0 +1,417 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 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.ui.internal.details;
+
+import java.util.ListIterator;
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.ui.internal.widgets.Pane;
+import org.eclipse.jpt.common.ui.internal.widgets.PostExecution;
+import org.eclipse.jpt.common.utility.internal.iterators.SuperListIteratorWrapper;
+import org.eclipse.jpt.common.utility.internal.model.value.CachingTransformationPropertyValueModel;
+import org.eclipse.jpt.common.utility.internal.model.value.ListAspectAdapter;
+import org.eclipse.jpt.common.utility.internal.model.value.ListPropertyValueModelAdapter;
+import org.eclipse.jpt.common.utility.internal.model.value.ReadOnlyWritablePropertyValueModelWrapper;
+import org.eclipse.jpt.common.utility.internal.model.value.ValueListAdapter;
+import org.eclipse.jpt.common.utility.model.event.StateChangeEvent;
+import org.eclipse.jpt.common.utility.model.listener.StateChangeListener;
+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.core.context.JoinColumn;
+import org.eclipse.jpt.jpa.core.context.JoinTable;
+import org.eclipse.jpt.jpa.core.context.ReadOnlyJoinColumn;
+import org.eclipse.jpt.jpa.core.context.ReadOnlyJoinTable;
+import org.eclipse.jpt.jpa.ui.internal.JpaHelpContextIds;
+import org.eclipse.jpt.jpa.ui.internal.details.JoinColumnsComposite.JoinColumnsEditor;
+import org.eclipse.jpt.jpa.ui.internal.details.db.CatalogCombo;
+import org.eclipse.jpt.jpa.ui.internal.details.db.SchemaCombo;
+import org.eclipse.jpt.jpa.ui.internal.details.db.TableCombo;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Group;
+
+/**
+ * Here the layout of this pane:
+ * <pre>
+ * -----------------------------------------------------------------------------
+ * | --------------------------------------------------------------- |
+ * | Name: | |v| |
+ * | --------------------------------------------------------------- |
+ * | |
+ * | - Join Columns ---------------------------------------------------------- |
+ * | | | |
+ * | | x Override Default | |
+ * | | | |
+ * | | --------------------------------------------------------------------- | |
+ * | | | | | |
+ * | | | JoinColumnsComposite | | |
+ * | | | | | |
+ * | | --------------------------------------------------------------------- | |
+ * | ------------------------------------------------------------------------- |
+ * | |
+ * | - Inverse Join Columns -------------------------------------------------- |
+ * | | | |
+ * | | x Override Default | |
+ * | | | |
+ * | | --------------------------------------------------------------------- | |
+ * | | | | | |
+ * | | | JoinColumnsComposite | | |
+ * | | | | | |
+ * | | --------------------------------------------------------------------- | |
+ * | ------------------------------------------------------------------------- |
+ * -----------------------------------------------------------------------------</pre>
+ *
+ * @see JoinTable
+ * @see JoinTableJoiningStrategyPane
+ * @see JoinColumnsComposite
+ *
+ * @version 2.1
+ * @since 1.0
+ */
+public class JoinTableComposite
+ extends ReferenceTableComposite<ReadOnlyJoinTable>
+{
+ private Button overrideDefaultInverseJoinColumnsCheckBox;
+
+ private JoinColumnsComposite<ReadOnlyJoinTable> inverseJoinColumnsComposite;
+ /**
+ * Creates a new <code>JoinTableComposite</code>.
+ *
+ * @param parentPane The parent container of this one
+ * @param subjectHolder The holder of this pane's subject
+ * @param parent The parent container
+ */
+ public JoinTableComposite(
+ Pane<?> parentPane,
+ PropertyValueModel<? extends ReadOnlyJoinTable> subjectHolder,
+ Composite parent) {
+
+ super(parentPane, subjectHolder, parent);
+ }
+
+ /**
+ * Creates a new <code>JoinTableComposite</code>.
+ *
+ * @param subjectHolder The holder of the subject <code>IJoinTable</code>
+ * @param parent The parent container
+ * @param widgetFactory The factory used to create various common widgets
+ */
+ public JoinTableComposite(PropertyValueModel<? extends ReadOnlyJoinTable> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+
+ super(subjectHolder, parent, widgetFactory);
+ }
+
+ @Override
+ protected boolean tableIsVirtual(ReadOnlyJoinTable joinTable) {
+ return joinTable.getParent().getRelationship().isVirtual();
+ }
+ @Override
+ protected void initializeLayout(Composite container) {
+
+ int groupBoxMargin = getGroupBoxMargin();
+
+ // Name widgets
+ TableCombo<ReadOnlyJoinTable> tableCombo = addTableCombo(container);
+ Composite tablePane = addPane(container, groupBoxMargin);
+ addLabeledComposite(
+ tablePane,
+ JptUiDetailsMessages.JoinTableComposite_name,
+ tableCombo.getControl(),
+ JpaHelpContextIds.MAPPING_JOIN_TABLE_NAME
+ );
+
+ // schema widgets
+ SchemaCombo<ReadOnlyJoinTable> schemaCombo = addSchemaCombo(container);
+
+ addLabeledComposite(
+ tablePane,
+ JptUiDetailsMessages.JoinTableComposite_schema,
+ schemaCombo.getControl(),
+ JpaHelpContextIds.MAPPING_JOIN_TABLE_SCHEMA
+ );
+
+ // catalog widgets
+ CatalogCombo<ReadOnlyJoinTable> catalogCombo = addCatalogCombo(container);
+
+ addLabeledComposite(
+ tablePane,
+ JptUiDetailsMessages.JoinTableComposite_catalog,
+ catalogCombo.getControl(),
+ JpaHelpContextIds.MAPPING_JOIN_TABLE_CATALOG
+ );
+
+ // Join Columns group pane
+ Group joinColumnGroupPane = addTitledGroup(
+ container,
+ JptUiDetailsMessages.JoinTableComposite_joinColumn
+ );
+
+ // Override Default Join Columns check box
+ this.overrideDefaultJoinColumnsCheckBox = addCheckBox(
+ addSubPane(joinColumnGroupPane, 8),
+ JptUiDetailsMessages.JoinTableComposite_overrideDefaultJoinColumns,
+ buildOverrideDefaultJoinColumnHolder(),
+ null
+ );
+
+ this.joinColumnsComposite = new JoinColumnsComposite<ReadOnlyJoinTable>(
+ this,
+ joinColumnGroupPane,
+ buildJoinColumnsEditor()
+ );
+
+ installJoinColumnsPaneEnabler(this.joinColumnsComposite);
+
+ // Inverse Join Columns group pane
+ Group inverseJoinColumnGroupPane = addTitledGroup(
+ container,
+ JptUiDetailsMessages.JoinTableComposite_inverseJoinColumn
+ );
+
+ // Override Default Inverse Join Columns check box
+ this.overrideDefaultInverseJoinColumnsCheckBox = addCheckBox(
+ addSubPane(inverseJoinColumnGroupPane, 8),
+ JptUiDetailsMessages.JoinTableComposite_overrideDefaultInverseJoinColumns,
+ buildOverrideDefaultInverseJoinColumnHolder(),
+ null
+ );
+
+ this.inverseJoinColumnsComposite = new JoinColumnsComposite<ReadOnlyJoinTable>(
+ this,
+ inverseJoinColumnGroupPane,
+ buildInverseJoinColumnsEditor()
+ );
+
+ installInverseJoinColumnsPaneEnabler(this.inverseJoinColumnsComposite);
+ }
+
+ private void installInverseJoinColumnsPaneEnabler(JoinColumnsComposite<ReadOnlyJoinTable> pane) {
+ pane.installJoinColumnsPaneEnabler(new InverseJoinColumnPaneEnablerHolder());
+ }
+
+ void addInverseJoinColumn(ReadOnlyJoinTable joinTable) {
+
+ InverseJoinColumnInJoinTableDialog dialog =
+ new InverseJoinColumnInJoinTableDialog(getShell(), joinTable, null);
+
+ dialog.openDialog(buildAddInverseJoinColumnPostExecution());
+ }
+
+ void addInverseJoinColumnFromDialog(InverseJoinColumnInJoinTableStateObject stateObject) {
+
+ JoinTable subject = (JoinTable) getSubject();
+ int index = subject.specifiedInverseJoinColumnsSize();
+
+ JoinColumn joinColumn = subject.addSpecifiedInverseJoinColumn(index);
+ stateObject.updateJoinColumn(joinColumn);
+ this.setSelectedInverseJoinColumn(joinColumn);
+ }
+
+ private void setSelectedInverseJoinColumn(JoinColumn joinColumn) {
+ this.inverseJoinColumnsComposite.setSelectedJoinColumn(joinColumn);
+ }
+
+ private PostExecution<InverseJoinColumnInJoinTableDialog> buildAddInverseJoinColumnPostExecution() {
+ return new PostExecution<InverseJoinColumnInJoinTableDialog>() {
+ public void execute(InverseJoinColumnInJoinTableDialog dialog) {
+ if (dialog.wasConfirmed()) {
+ addInverseJoinColumnFromDialog(dialog.getSubject());
+ }
+ }
+ };
+ }
+
+ private PostExecution<InverseJoinColumnInJoinTableDialog> buildEditInverseJoinColumnPostExecution() {
+ return new PostExecution<InverseJoinColumnInJoinTableDialog>() {
+ public void execute(InverseJoinColumnInJoinTableDialog dialog) {
+ if (dialog.wasConfirmed()) {
+ editInverseJoinColumn(dialog.getSubject());
+ }
+ }
+ };
+ }
+
+
+ private InverseJoinColumnsProvider buildInverseJoinColumnsEditor() {
+ return new InverseJoinColumnsProvider();
+ }
+
+ private WritablePropertyValueModel<Boolean> buildOverrideDefaultInverseJoinColumnHolder() {
+ return new OverrideDefaultInverseJoinColumnHolder();
+ }
+
+ ListValueModel<ReadOnlyJoinColumn> buildSpecifiedInverseJoinColumnsListHolder() {
+ return new ListAspectAdapter<ReadOnlyJoinTable, ReadOnlyJoinColumn>(getSubjectHolder(), ReadOnlyJoinTable.SPECIFIED_INVERSE_JOIN_COLUMNS_LIST) {
+ @Override
+ protected ListIterator<ReadOnlyJoinColumn> listIterator_() {
+ return new SuperListIteratorWrapper<ReadOnlyJoinColumn>(this.subject.specifiedInverseJoinColumns());
+ }
+
+ @Override
+ protected int size_() {
+ return this.subject.specifiedInverseJoinColumnsSize();
+ }
+ };
+ }
+
+
+ void editInverseJoinColumn(InverseJoinColumnInJoinTableStateObject stateObject) {
+ stateObject.updateJoinColumn(stateObject.getJoinColumn());
+ }
+
+ void editInverseJoinColumn(ReadOnlyJoinColumn joinColumn) {
+
+ InverseJoinColumnInJoinTableDialog dialog =
+ new InverseJoinColumnInJoinTableDialog(getShell(), getSubject(), joinColumn);
+
+ dialog.openDialog(buildEditInverseJoinColumnPostExecution());
+ }
+
+ void updateInverseJoinColumns() {
+ if (this.isPopulating()) {
+ return;
+ }
+
+ JoinTable joinTable = (JoinTable) this.getSubject();
+ if (joinTable == null) {
+ return;
+ }
+
+ boolean selected = this.overrideDefaultInverseJoinColumnsCheckBox.getSelection();
+ this.setPopulating(true);
+
+ try {
+ if (selected) {
+ joinTable.convertDefaultToSpecifiedInverseJoinColumn();
+ setSelectedInverseJoinColumn(joinTable.specifiedInverseJoinColumns().next());
+ } else {
+ joinTable.clearSpecifiedInverseJoinColumns();
+ }
+ } finally {
+ this.setPopulating(false);
+ }
+ }
+
+
+
+ class InverseJoinColumnsProvider implements JoinColumnsEditor<ReadOnlyJoinTable> {
+
+ public void addJoinColumn(ReadOnlyJoinTable subject) {
+ JoinTableComposite.this.addInverseJoinColumn(subject);
+ }
+
+ public ReadOnlyJoinColumn getDefaultJoinColumn(ReadOnlyJoinTable subject) {
+ return subject.getDefaultInverseJoinColumn();
+ }
+
+ public String getDefaultPropertyName() {
+ return ReadOnlyJoinTable.DEFAULT_INVERSE_JOIN_COLUMN;
+ }
+
+ public void editJoinColumn(ReadOnlyJoinTable subject, ReadOnlyJoinColumn joinColumn) {
+ JoinTableComposite.this.editInverseJoinColumn(joinColumn);
+ }
+
+ public boolean hasSpecifiedJoinColumns(ReadOnlyJoinTable subject) {
+ return subject.hasSpecifiedInverseJoinColumns();
+ }
+
+ public void removeJoinColumns(ReadOnlyJoinTable subject, int[] selectedIndices) {
+ for (int index = selectedIndices.length; index-- > 0; ) {
+ ((JoinTable) subject).removeSpecifiedInverseJoinColumn(selectedIndices[index]);
+ }
+ }
+
+ public ListIterator<ReadOnlyJoinColumn> specifiedJoinColumns(ReadOnlyJoinTable subject) {
+ return new SuperListIteratorWrapper<ReadOnlyJoinColumn>(subject.specifiedInverseJoinColumns());
+ }
+
+ public int specifiedJoinColumnsSize(ReadOnlyJoinTable subject) {
+ return subject.specifiedInverseJoinColumnsSize();
+ }
+
+ public String getSpecifiedJoinColumnsListPropertyName() {
+ return ReadOnlyJoinTable.SPECIFIED_INVERSE_JOIN_COLUMNS_LIST;
+ }
+ }
+
+ private class OverrideDefaultInverseJoinColumnHolder extends ListPropertyValueModelAdapter<Boolean>
+ implements WritablePropertyValueModel<Boolean> {
+
+ public OverrideDefaultInverseJoinColumnHolder() {
+ super(buildSpecifiedInverseJoinColumnsListHolder());
+ }
+
+ @Override
+ protected Boolean buildValue() {
+ return Boolean.valueOf(this.listHolder.size() > 0);
+ }
+
+ public void setValue(Boolean value) {
+ updateInverseJoinColumns();
+ }
+ }
+
+
+ private class InverseJoinColumnPaneEnablerHolder
+ extends CachingTransformationPropertyValueModel<ReadOnlyJoinTable, Boolean>
+ {
+ private StateChangeListener stateChangeListener;
+
+
+ public InverseJoinColumnPaneEnablerHolder() {
+ super(
+ new ValueListAdapter<ReadOnlyJoinTable>(
+ new ReadOnlyWritablePropertyValueModelWrapper<ReadOnlyJoinTable>(getSubjectHolder()),
+ ReadOnlyJoinTable.SPECIFIED_INVERSE_JOIN_COLUMNS_LIST));
+ this.stateChangeListener = buildStateChangeListener();
+ }
+
+
+ private StateChangeListener buildStateChangeListener() {
+ return new StateChangeListener() {
+ public void stateChanged(StateChangeEvent event) {
+ valueStateChanged();
+ }
+ };
+ }
+
+ void valueStateChanged() {
+ Object oldValue = this.cachedValue;
+ Object newValue = transformNew(this.valueHolder.getValue());
+ firePropertyChanged(VALUE, oldValue, newValue);
+ }
+
+ @Override
+ protected Boolean transform(ReadOnlyJoinTable value) {
+ return (value == null) ? Boolean.FALSE : super.transform(value);
+ }
+
+ @Override
+ protected Boolean transform_(ReadOnlyJoinTable value) {
+ boolean virtual = JoinTableComposite.this.tableIsVirtual(value);
+ return Boolean.valueOf(! virtual && value.specifiedInverseJoinColumnsSize() > 0);
+ }
+
+ @Override
+ protected void engageModel() {
+ super.engageModel();
+ this.valueHolder.addStateChangeListener(this.stateChangeListener);
+ }
+
+ @Override
+ protected void disengageModel() {
+ this.valueHolder.removeStateChangeListener(this.stateChangeListener);
+ super.disengageModel();
+ }
+ }
+} \ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/JoinTableJoiningStrategyPane.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/JoinTableJoiningStrategyPane.java
new file mode 100644
index 0000000000..28ec5e1098
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/JoinTableJoiningStrategyPane.java
@@ -0,0 +1,114 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 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.ui.internal.details;
+
+import org.eclipse.jpt.common.ui.internal.widgets.Pane;
+import org.eclipse.jpt.common.utility.internal.model.value.PropertyAspectAdapter;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.common.utility.model.value.WritablePropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.JoinTableRelationship;
+import org.eclipse.jpt.jpa.core.context.JoinTableRelationshipStrategy;
+import org.eclipse.jpt.jpa.core.context.ReadOnlyJoinTable;
+import org.eclipse.jpt.jpa.core.context.ReadOnlyJoinTableRelationship;
+import org.eclipse.jpt.jpa.core.context.ReadOnlyJoinTableRelationshipStrategy;
+import org.eclipse.jpt.jpa.core.context.ReadOnlyRelationship;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * Here is the layout of this pane:
+ * <pre>
+ * -----------------------------------------------------------------------------
+ * | o Join table ____________________________________________________________ |
+ * | | --------------------------------------------------------------------- | |
+ * | | | | | |
+ * | | | JoinTableComposite | | |
+ * | | | | | |
+ * | | --------------------------------------------------------------------- | |
+ * | ------------------------------------------------------------------------- |
+ * -----------------------------------------------------------------------------</pre>
+ *
+ * @see {@link JoinTableRelationship}
+ * @see {@link JoinTableRelationshipStrategy}
+ * @see {@link ManyToOneJoiningStrategyPane}
+ * @see {@link ManyToManyJoiningStrategyPane}
+ *
+ * @version 2.3
+ * @since 2.1
+ */
+public class JoinTableJoiningStrategyPane
+ extends AbstractJoiningStrategyPane
+ <ReadOnlyJoinTableRelationship, ReadOnlyJoinTableRelationshipStrategy>
+{
+ public JoinTableJoiningStrategyPane(
+ Pane<? extends ReadOnlyJoinTableRelationship> parentPane,
+ Composite parent) {
+ super(parentPane, parent);
+ }
+
+ public JoinTableJoiningStrategyPane(Pane<?> parentPane,
+ PropertyValueModel<? extends ReadOnlyJoinTableRelationship> subjectHolder,
+ Composite parent) {
+
+ super(parentPane, subjectHolder, parent);
+ }
+
+ @Override
+ protected Composite buildStrategyDetailsComposite(Composite parent) {
+ return new JoinTableComposite(this, buildJoinTableHolder(), parent).getControl();
+ }
+
+ @Override
+ protected WritablePropertyValueModel<Boolean> buildUsesStrategyHolder() {
+ return buildUsesJoinTableJoiningStrategyHolder(getSubjectHolder());
+ }
+
+ protected PropertyValueModel<ReadOnlyJoinTableRelationshipStrategy> buildJoinTableJoiningStrategyHolder() {
+ return new PropertyAspectAdapter
+ <ReadOnlyJoinTableRelationship, ReadOnlyJoinTableRelationshipStrategy>(
+ getSubjectHolder()) {
+ @Override
+ protected ReadOnlyJoinTableRelationshipStrategy buildValue_() {
+ return this.subject.getJoinTableStrategy();
+ }
+ };
+ }
+
+ protected PropertyValueModel<ReadOnlyJoinTable> buildJoinTableHolder() {
+ return new PropertyAspectAdapter<ReadOnlyJoinTableRelationshipStrategy, ReadOnlyJoinTable>(
+ this.buildJoinTableJoiningStrategyHolder(), ReadOnlyJoinTableRelationshipStrategy.JOIN_TABLE_PROPERTY) {
+ @Override
+ protected ReadOnlyJoinTable buildValue_() {
+ return this.subject.getJoinTable();
+ }
+ };
+ }
+
+ public static WritablePropertyValueModel<Boolean> buildUsesJoinTableJoiningStrategyHolder(PropertyValueModel<? extends ReadOnlyJoinTableRelationship> subjectHolder) {
+ return new PropertyAspectAdapter<ReadOnlyJoinTableRelationship, Boolean>(
+ subjectHolder, ReadOnlyRelationship.STRATEGY_PROPERTY) {
+ @Override
+ protected Boolean buildValue() {
+ return Boolean.valueOf(this.buildBooleanValue());
+ }
+
+ protected boolean buildBooleanValue() {
+ return (this.subject != null) && this.subject.strategyIsJoinTable();
+ }
+
+ @Override
+ protected void setValue_(Boolean value) {
+ if (value == Boolean.TRUE) {
+ ((JoinTableRelationship) this.subject).setStrategyToJoinTable();
+ }
+ //value == FALSE - selection of another radio button causes this strategy to get unset
+ }
+ };
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/JoiningStrategyJoinColumnsComposite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/JoiningStrategyJoinColumnsComposite.java
new file mode 100644
index 0000000000..a23e0e293e
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/JoiningStrategyJoinColumnsComposite.java
@@ -0,0 +1,237 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 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.ui.internal.details;
+
+import java.util.ListIterator;
+import org.eclipse.jpt.common.ui.internal.widgets.Pane;
+import org.eclipse.jpt.common.ui.internal.widgets.PostExecution;
+import org.eclipse.jpt.common.utility.internal.iterators.SuperListIteratorWrapper;
+import org.eclipse.jpt.common.utility.internal.model.value.CachingTransformationPropertyValueModel;
+import org.eclipse.jpt.common.utility.internal.model.value.ReadOnlyWritablePropertyValueModelWrapper;
+import org.eclipse.jpt.common.utility.internal.model.value.ValueListAdapter;
+import org.eclipse.jpt.common.utility.model.event.StateChangeEvent;
+import org.eclipse.jpt.common.utility.model.listener.StateChangeListener;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.JoinColumn;
+import org.eclipse.jpt.jpa.core.context.JoinColumnRelationship;
+import org.eclipse.jpt.jpa.core.context.JoinColumnRelationshipStrategy;
+import org.eclipse.jpt.jpa.core.context.ReadOnlyJoinColumn;
+import org.eclipse.jpt.jpa.core.context.ReadOnlyJoinColumnRelationshipStrategy;
+import org.eclipse.jpt.jpa.ui.internal.details.JoinColumnsComposite.JoinColumnsEditor;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * Here is the layout of this pane:
+ * <pre>
+ * ---------------------------------------------------------------------
+ * | |
+ * | JoinColumnsComposite |
+ * | |
+ * ---------------------------------------------------------------------
+ * -------------------------------------------------------------------------</pre>
+ *
+ * @see JoinColumnRelationship
+ * @see JoinColumnRelationshipStrategy
+ * @see JoinColumnJoiningStrategyPane
+ * @see JoinColumnInJoiningStrategyDialog
+ *
+ * @version 3.0
+ * @since 2.0
+ */
+public class JoiningStrategyJoinColumnsComposite
+ extends Pane<ReadOnlyJoinColumnRelationshipStrategy>
+{
+
+ private JoinColumnsComposite<ReadOnlyJoinColumnRelationshipStrategy> joinColumnsComposite;
+
+ public JoiningStrategyJoinColumnsComposite(
+ Pane<?> parentPane,
+ PropertyValueModel<ReadOnlyJoinColumnRelationshipStrategy> subjectHolder,
+ Composite parent) {
+ super(parentPane, subjectHolder, parent);
+ }
+
+
+ @Override
+ protected void initializeLayout(Composite container) {
+ this.joinColumnsComposite = new JoinColumnsComposite<ReadOnlyJoinColumnRelationshipStrategy>(this, container, buildJoinColumnsProvider());
+ this.joinColumnsComposite.installJoinColumnsPaneEnabler(new JoinColumnPaneEnablerHolder());
+ }
+
+ private JoinColumnsEditor<ReadOnlyJoinColumnRelationshipStrategy> buildJoinColumnsProvider() {
+ return new JoinColumnsEditor<ReadOnlyJoinColumnRelationshipStrategy>() {
+
+ public void addJoinColumn(ReadOnlyJoinColumnRelationshipStrategy subject) {
+ JoiningStrategyJoinColumnsComposite.this.addJoinColumn(subject);
+ }
+
+ public boolean hasSpecifiedJoinColumns(ReadOnlyJoinColumnRelationshipStrategy subject) {
+ return subject.hasSpecifiedJoinColumns();
+ }
+
+ public void editJoinColumn(ReadOnlyJoinColumnRelationshipStrategy subject, ReadOnlyJoinColumn joinColumn) {
+ JoiningStrategyJoinColumnsComposite.this.editJoinColumn(subject, joinColumn);
+ }
+
+ public ReadOnlyJoinColumn getDefaultJoinColumn(ReadOnlyJoinColumnRelationshipStrategy subject) {
+ return subject.getDefaultJoinColumn();
+ }
+
+ public String getDefaultPropertyName() {
+ return ReadOnlyJoinColumnRelationshipStrategy.DEFAULT_JOIN_COLUMN_PROPERTY;
+ }
+
+ public String getSpecifiedJoinColumnsListPropertyName() {
+ return ReadOnlyJoinColumnRelationshipStrategy.SPECIFIED_JOIN_COLUMNS_LIST;
+ }
+
+ public void removeJoinColumns(ReadOnlyJoinColumnRelationshipStrategy subject, int[] selectedIndices) {
+ for (int index = selectedIndices.length; --index >= 0; ) {
+ ((JoinColumnRelationshipStrategy) subject).removeSpecifiedJoinColumn(selectedIndices[index]);
+ }
+ }
+
+ public ListIterator<ReadOnlyJoinColumn> specifiedJoinColumns(ReadOnlyJoinColumnRelationshipStrategy subject) {
+ return new SuperListIteratorWrapper<ReadOnlyJoinColumn>(subject.specifiedJoinColumns());
+ }
+
+ public int specifiedJoinColumnsSize(ReadOnlyJoinColumnRelationshipStrategy subject) {
+ return subject.specifiedJoinColumnsSize();
+ }
+ };
+ }
+
+ void addJoinColumn(ReadOnlyJoinColumnRelationshipStrategy joiningStrategy) {
+ JoinColumnInJoiningStrategyDialog dialog =
+ new JoinColumnInJoiningStrategyDialog(getShell(), joiningStrategy, null);
+ dialog.openDialog(buildAddJoinColumnPostExecution());
+ }
+
+ private PostExecution<JoinColumnInJoiningStrategyDialog> buildAddJoinColumnPostExecution() {
+ return new PostExecution<JoinColumnInJoiningStrategyDialog>() {
+ public void execute(JoinColumnInJoiningStrategyDialog dialog) {
+ if (dialog.wasConfirmed()) {
+ addJoinColumn(dialog.getSubject());
+ }
+ }
+ };
+ }
+
+ void addJoinColumn(JoinColumnInJoiningStrategyStateObject stateObject) {
+ JoinColumnRelationshipStrategy subject = (JoinColumnRelationshipStrategy) getSubject();
+ JoinColumn joinColumn = subject.addSpecifiedJoinColumn();
+ stateObject.updateJoinColumn(joinColumn);
+ this.setSelectedJoinColumn(joinColumn);
+ }
+
+ public void setSelectedJoinColumn(JoinColumn joinColumn) {
+ this.joinColumnsComposite.setSelectedJoinColumn(joinColumn);
+ }
+
+ void editJoinColumn(ReadOnlyJoinColumnRelationshipStrategy joiningStrategy, ReadOnlyJoinColumn joinColumn) {
+ JoinColumnInJoiningStrategyDialog dialog =
+ new JoinColumnInJoiningStrategyDialog(getShell(), joiningStrategy, joinColumn);
+ dialog.openDialog(buildEditJoinColumnPostExecution());
+ }
+
+ private PostExecution<JoinColumnInJoiningStrategyDialog> buildEditJoinColumnPostExecution() {
+ return new PostExecution<JoinColumnInJoiningStrategyDialog>() {
+ public void execute(JoinColumnInJoiningStrategyDialog dialog) {
+ if (dialog.wasConfirmed()) {
+ updateJoinColumn(dialog.getSubject());
+ }
+ }
+ };
+ }
+
+ void updateJoinColumn(JoinColumnInJoiningStrategyStateObject stateObject) {
+ stateObject.updateJoinColumn(stateObject.getJoinColumn());
+ }
+
+ protected CachingTransformationPropertyValueModel<ReadOnlyJoinColumnRelationshipStrategy, Boolean> buildJoinColumnsPaneEnabledHolder() {
+ return new CachingTransformationPropertyValueModel<ReadOnlyJoinColumnRelationshipStrategy, Boolean>(
+ new ValueListAdapter<ReadOnlyJoinColumnRelationshipStrategy>(
+ new ReadOnlyWritablePropertyValueModelWrapper<ReadOnlyJoinColumnRelationshipStrategy>(getSubjectHolder()),
+ ReadOnlyJoinColumnRelationshipStrategy.SPECIFIED_JOIN_COLUMNS_LIST)) {
+
+ @Override
+ protected Boolean transform(ReadOnlyJoinColumnRelationshipStrategy value) {
+ if (value == null) {
+ return Boolean.FALSE;
+ }
+ return super.transform(value);
+ }
+
+ @Override
+ protected Boolean transform_(ReadOnlyJoinColumnRelationshipStrategy value) {
+ boolean virtual = value.getRelationship().getMapping().getPersistentAttribute().isVirtual();
+ return Boolean.valueOf(! virtual && value.specifiedJoinColumnsSize() > 0);
+ }
+ };
+
+ }
+
+
+ private class JoinColumnPaneEnablerHolder
+ extends CachingTransformationPropertyValueModel<ReadOnlyJoinColumnRelationshipStrategy, Boolean>
+ {
+ private StateChangeListener stateChangeListener;
+
+
+ public JoinColumnPaneEnablerHolder() {
+ super(
+ new ValueListAdapter<ReadOnlyJoinColumnRelationshipStrategy>(
+ new ReadOnlyWritablePropertyValueModelWrapper<ReadOnlyJoinColumnRelationshipStrategy>(getSubjectHolder()),
+ ReadOnlyJoinColumnRelationshipStrategy.SPECIFIED_JOIN_COLUMNS_LIST));
+ this.stateChangeListener = buildStateChangeListener();
+ }
+
+
+ private StateChangeListener buildStateChangeListener() {
+ return new StateChangeListener() {
+ public void stateChanged(StateChangeEvent event) {
+ valueStateChanged();
+ }
+ };
+ }
+
+ void valueStateChanged() {
+ Object oldValue = this.cachedValue;
+ Object newValue = transformNew(this.valueHolder.getValue());
+ firePropertyChanged(VALUE, oldValue, newValue);
+ }
+
+ @Override
+ protected Boolean transform(ReadOnlyJoinColumnRelationshipStrategy value) {
+ if (value == null) {
+ return Boolean.FALSE;
+ }
+ return super.transform(value);
+ }
+
+ @Override
+ protected Boolean transform_(ReadOnlyJoinColumnRelationshipStrategy value) {
+ boolean virtual = value.getRelationship().isVirtual();
+ return Boolean.valueOf(! virtual && value.specifiedJoinColumnsSize() > 0);
+ }
+
+ @Override
+ protected void engageModel() {
+ super.engageModel();
+ this.valueHolder.addStateChangeListener(this.stateChangeListener);
+ }
+
+ @Override
+ protected void disengageModel() {
+ this.valueHolder.removeStateChangeListener(this.stateChangeListener);
+ super.disengageModel();
+ }
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/JoiningStrategyJoinColumnsWithOverrideOptionComposite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/JoiningStrategyJoinColumnsWithOverrideOptionComposite.java
new file mode 100644
index 0000000000..553f818029
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/JoiningStrategyJoinColumnsWithOverrideOptionComposite.java
@@ -0,0 +1,152 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 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.ui.internal.details;
+
+import java.util.ListIterator;
+import org.eclipse.jpt.common.ui.internal.widgets.Pane;
+import org.eclipse.jpt.common.utility.internal.iterators.SuperListIteratorWrapper;
+import org.eclipse.jpt.common.utility.internal.model.value.ListAspectAdapter;
+import org.eclipse.jpt.common.utility.internal.model.value.ListPropertyValueModelAdapter;
+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.core.context.JoinColumn;
+import org.eclipse.jpt.jpa.core.context.JoinColumnRelationship;
+import org.eclipse.jpt.jpa.core.context.JoinColumnRelationshipStrategy;
+import org.eclipse.jpt.jpa.core.context.ReadOnlyJoinColumn;
+import org.eclipse.jpt.jpa.core.context.ReadOnlyJoinColumnRelationshipStrategy;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * Here is the layout of this pane:
+ * <pre>
+ * -------------------------------------------------------------------------
+ * x Override Default
+ * ---------------------------------------------------------------------
+ * | |
+ * | JoiningStrategyJoinColumnsComposite |
+ * | |
+ * ---------------------------------------------------------------------
+ * -------------------------------------------------------------------------</pre>
+ *
+ * @see JoinColumnRelationship
+ * @see JoinColumnRelationshipStrategy
+ * @see JoinColumnJoiningStrategyPane
+ * @see JoinColumnInJoiningStrategyDialog
+ *
+ * @version 3.0
+ * @since 2.0
+ */
+public class JoiningStrategyJoinColumnsWithOverrideOptionComposite
+ extends Pane<ReadOnlyJoinColumnRelationshipStrategy>
+{
+
+ private JoiningStrategyJoinColumnsComposite joiningStrategyComposite;
+
+ public JoiningStrategyJoinColumnsWithOverrideOptionComposite(
+ Pane<?> parentPane,
+ PropertyValueModel<ReadOnlyJoinColumnRelationshipStrategy> subjectHolder,
+ Composite parent) {
+ super(parentPane, subjectHolder, parent);
+ }
+
+
+ @Override
+ protected void initializeLayout(Composite container) {
+ // Override Default Join Columns check box
+ addCheckBox(
+ addSubPane(container, 8),
+ JptUiDetailsMessages.JoiningStrategyJoinColumnsComposite_overrideDefaultJoinColumns,
+ buildOverrideDefaultJoinColumnHolder(),
+ null
+ );
+
+ this.joiningStrategyComposite = new JoiningStrategyJoinColumnsComposite(this, getSubjectHolder(), container);
+ }
+
+ void setSelectedJoinColumn(JoinColumn joinColumn) {
+ this.joiningStrategyComposite.setSelectedJoinColumn(joinColumn);
+ }
+
+ private WritablePropertyValueModel<Boolean> buildOverrideDefaultJoinColumnHolder() {
+ return new OverrideDefaultJoinColumnHolder();
+ }
+
+ ListValueModel<ReadOnlyJoinColumn> buildSpecifiedJoinColumnsListHolder() {
+ return new ListAspectAdapter<ReadOnlyJoinColumnRelationshipStrategy, ReadOnlyJoinColumn>(
+ getSubjectHolder(), ReadOnlyJoinColumnRelationshipStrategy.SPECIFIED_JOIN_COLUMNS_LIST) {
+ @Override
+ protected ListIterator<ReadOnlyJoinColumn> listIterator_() {
+ return new SuperListIteratorWrapper<ReadOnlyJoinColumn>(this.subject.specifiedJoinColumns());
+ }
+
+ @Override
+ protected int size_() {
+ return this.subject.specifiedJoinColumnsSize();
+ }
+ };
+ }
+
+ private class OverrideDefaultJoinColumnHolder
+ extends ListPropertyValueModelAdapter<Boolean>
+ implements WritablePropertyValueModel<Boolean>
+ {
+ public OverrideDefaultJoinColumnHolder() {
+ super(buildSpecifiedJoinColumnsListHolder());
+ }
+
+ @Override
+ protected Boolean buildValue() {
+ return Boolean.valueOf(this.listHolder.size() > 0);
+ }
+
+ public void setValue(Boolean value) {
+ updateJoinColumns(value.booleanValue());
+ }
+
+ private void updateJoinColumns(boolean selected) {
+ if (isPopulating()) {
+ return;
+ }
+
+ setPopulating(true);
+
+ try {
+ JoinColumnRelationshipStrategy subject = (JoinColumnRelationshipStrategy) getSubject();
+
+ // Add a join column by creating a specified one using the default
+ // one if it exists
+ if (selected) {
+ ReadOnlyJoinColumn defaultJoinColumn = subject.getDefaultJoinColumn();//TODO could be null, disable override default check box?
+
+ if (defaultJoinColumn != null) {
+ String columnName = defaultJoinColumn.getDefaultName();
+ String referencedColumnName = defaultJoinColumn.getDefaultReferencedColumnName();
+
+ JoinColumn joinColumn = subject.addSpecifiedJoinColumn();
+ joinColumn.setSpecifiedName(columnName);
+ joinColumn.setSpecifiedReferencedColumnName(referencedColumnName);
+
+ JoiningStrategyJoinColumnsWithOverrideOptionComposite.this.setSelectedJoinColumn(joinColumn);
+ }
+ }
+ // Remove all the specified join columns
+ else {
+ for (int index = subject.specifiedJoinColumnsSize(); --index >= 0; ) {
+ subject.removeSpecifiedJoinColumn(index);
+ }
+ }
+ }
+ finally {
+ setPopulating(false);
+ }
+ }
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/JptUiDetailsMessages.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/JptUiDetailsMessages.java
new file mode 100644
index 0000000000..88415df3e4
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/JptUiDetailsMessages.java
@@ -0,0 +1,303 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2010 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.ui.internal.details;
+
+import org.eclipse.osgi.util.NLS;
+
+/**
+ * Localized messages used by Dali mapping panes.
+ *
+ * @version 2.3
+ * @since 1.0
+ */
+public class JptUiDetailsMessages {
+
+ public static String AccessTypeCombo_default;
+ public static String AddQueryDialog_name;
+ public static String AddQueryDialog_queryType;
+ public static String AddQueryDialog_title;
+ public static String AddQueryDialog_descriptionTitle;
+ public static String AddQueryDialog_description;
+ public static String AddQueryDialog_nameExists;
+ public static String AddQueryDialog_namedQuery;
+ public static String AddQueryDialog_namedNativeQuery;
+ public static String QueryStateObject_nameMustBeSpecified;
+ public static String QueryStateObject_typeMustBeSpecified;
+ public static String NamedQueryComposite_nameTextLabel;
+
+ public static String OverridesComposite_attributeOverridesGroup;
+ public static String OverridesComposite_attributeOverridesSection;
+ public static String OverridesComposite_overrideDefault;
+
+ public static String BasicSection_title;
+ public static String EmbeddableSection_title;
+ public static String EmbeddedSection_title;
+ public static String EmbeddedIdSection_title;
+ public static String EntitySection_title;
+ public static String IdSection_title;
+ public static String ManyToManySection_title;
+ public static String ManyToOneSection_title;
+ public static String MappedSuperclassSection_title;
+ public static String OneToManySection_title;
+ public static String OneToOneSection_title;
+ public static String VersionSection_title;
+
+ public static String BasicGeneralSection_enumeratedLabel;
+ public static String BasicGeneralSection_fetchLabel;
+ public static String BasicGeneralSection_lobLabel;
+ public static String BasicGeneralSection_name;
+ public static String BasicGeneralSection_nameDefault;
+ public static String BasicGeneralSection_optionalLabel;
+ public static String BasicGeneralSection_optionalLabelDefault;
+ public static String BasicGeneralSection_temporalLabel;
+ public static String TypeSection_type;
+ public static String TypeSection_default;
+ public static String TypeSection_lob;
+ public static String TypeSection_temporal;
+ public static String TypeSection_enumerated;
+ public static String CascadeComposite_all;
+ public static String CascadeComposite_cascadeTitle;
+ public static String CascadeComposite_merge;
+ public static String CascadeComposite_persist;
+ public static String CascadeComposite_refresh;
+ public static String CascadeComposite_remove;
+ public static String CatalogChooser_label;
+ public static String ColumnComposite_columnDefinition;
+ public static String ColumnComposite_columnSection;
+ public static String ColumnComposite_details;
+ public static String ColumnComposite_insertable;
+ public static String ColumnComposite_insertableWithDefault;
+ public static String ColumnComposite_length;
+ public static String ColumnComposite_name;
+ public static String ColumnComposite_nullable;
+ public static String ColumnComposite_nullableWithDefault;
+ public static String ColumnComposite_precision;
+ public static String ColumnComposite_scale;
+ public static String ColumnComposite_table;
+ public static String ColumnComposite_unique;
+ public static String ColumnComposite_uniqueWithDefault;
+ public static String ColumnComposite_updatable;
+ public static String ColumnComposite_updatableWithDefault;
+ public static String ProviderDefault;
+ public static String DiscriminatorColumnComposite_discriminatorType;
+ public static String DiscriminatorColumnComposite_name;
+ public static String DiscriminatorColumnComposite_char;
+ public static String DiscriminatorColumnComposite_integer;
+ public static String DiscriminatorColumnComposite_string;
+ public static String EntityComposite_inheritance;
+ public static String EntityComposite_queries;
+ public static String EntityComposite_tableDefault;
+ public static String EntityComposite_tableNoDefaultSpecified;
+ public static String EntityGeneralSection_name;
+ public static String EntityNameComposite_name;
+ public static String EnumTypeComposite_ordinal;
+ public static String EnumTypeComposite_string;
+ public static String FetchTypeComposite_eager;
+ public static String FetchTypeComposite_lazy;
+ public static String GeneratedValueComposite_auto;
+ public static String GeneratedValueComposite_generatedValue;
+ public static String GeneratedValueComposite_generatorName;
+ public static String GeneratedValueComposite_identity;
+ public static String GeneratedValueComposite_sequence;
+ public static String GeneratedValueComposite_strategy;
+ public static String GeneratedValueComposite_table;
+ public static String GeneratorComposite_allocationSize;
+ public static String GeneratorComposite_initialValue;
+ public static String GeneratorsComposite_sequenceGeneratorCheckBox;
+ public static String GeneratorsComposite_sequenceGeneratorSection;
+ public static String GeneratorsComposite_tableGeneratorCheckBox;
+ public static String GeneratorsComposite_tableGeneratorSection;
+ public static String IdClassComposite_label;
+ public static String IdMappingComposite_pk_generation;
+ public static String IdMappingComposite_primaryKeyGenerationCheckBox;
+ public static String IdMappingComposite_primaryKeyGenerationSection;
+ public static String IdMappingComposite_sequenceGeneratorCheckBox;
+ public static String IdMappingComposite_sequenceGeneratorSection;
+ public static String IdMappingComposite_tableGeneratorCheckBox;
+ public static String IdMappingComposite_tableGeneratorSection;
+ public static String InheritanceComposite_detailsGroupBox;
+ public static String InheritanceComposite_discriminatorColumnGroupBox;
+ public static String InheritanceComposite_discriminatorValue;
+ public static String AbstractInheritanceComposite_joined;
+ public static String AbstractInheritanceComposite_single_table;
+ public static String InheritanceComposite_strategy;
+ public static String AbstractInheritanceComposite_table_per_class;
+ public static String InverseJoinColumnDialog_editInverseJoinColumnTitle;
+ public static String Joining_title;
+ public static String Joining_mappedByLabel;
+ public static String Joining_mappedByAttributeLabel;
+ public static String Joining_joinColumnJoiningLabel;
+ public static String Joining_primaryKeyJoinColumnJoiningLabel;
+ public static String Joining_joinTableJoiningLabel;
+ public static String JoinColumnsComposite_edit;
+ public static String JoinColumnsComposite_mappingBetweenTwoParams;
+ public static String JoinColumnsComposite_mappingBetweenTwoParamsBothDefault;
+ public static String JoinColumnsComposite_mappingBetweenTwoParamsDefault;
+ public static String JoinColumnsComposite_mappingBetweenTwoParamsFirstDefault;
+ public static String JoinColumnsComposite_mappingBetweenTwoParamsSecDefault;
+ public static String JoiningStrategyJoinColumnsComposite_overrideDefaultJoinColumns;
+ public static String JoinColumnDialog_addJoinColumnDescriptionTitle;
+ public static String JoinColumnDialog_addJoinColumnTitle;
+ public static String JoinColumnDialog_description;
+ public static String JoinColumnDialog_editJoinColumnDescriptionTitle;
+ public static String JoinColumnDialog_editJoinColumnTitle;
+ public static String JoinColumnDialog_name;
+ public static String JoinColumnDialog_referencedColumnName;
+ public static String JoinColumnDialogPane_columnDefinition;
+ public static String JoinColumnDialogPane_insertable;
+ public static String JoinColumnDialogPane_insertableWithDefault;
+ public static String JoinColumnDialogPane_nullable;
+ public static String JoinColumnDialogPane_nullableWithDefault;
+ public static String JoinColumnDialogPane_table;
+ public static String JoinColumnDialogPane_unique;
+ public static String JoinColumnDialogPane_uniqueWithDefault;
+ public static String JoinColumnDialogPane_updatable;
+ public static String JoinColumnDialogPane_updatableWithDefault;
+ public static String JoinTableComposite_inverseJoinColumn;
+ public static String JoinTableComposite_joinColumn;
+ public static String JoinTableComposite_name;
+ public static String JoinTableComposite_schema;
+ public static String JoinTableComposite_catalog;
+ public static String JoinTableComposite_overrideDefaultInverseJoinColumns;
+ public static String JoinTableComposite_overrideDefaultJoinColumns;
+
+ public static String DefaultBasicMappingUiProvider_label;
+ public static String DefaultEmbeddedMappingUiProvider_label;
+ public static String BasicMappingUiProvider_label;
+ public static String EmbeddedIdMappingUiProvider_label;
+ public static String EmbeddedMappingUiProvider_label;
+ public static String IdMappingUiProvider_label;
+ public static String ManyToManyMappingUiProvider_label;
+ public static String ManyToOneMappingUiProvider_label;
+ public static String OneToManyMappingUiProvider_label;
+ public static String OneToOneMappingUiProvider_label;
+ public static String TransientMappingUiProvider_label;
+ public static String VersionMappingUiProvider_label;
+ public static String DefaultBasicMappingUiProvider_linkLabel;
+ public static String DefaultEmbeddedMappingUiProvider_linkLabel;
+ public static String BasicMappingUiProvider_linkLabel;
+ public static String EmbeddedIdMappingUiProvider_linkLabel;
+ public static String EmbeddedMappingUiProvider_linkLabel;
+ public static String IdMappingUiProvider_linkLabel;
+ public static String ManyToManyMappingUiProvider_linkLabel;
+ public static String ManyToOneMappingUiProvider_linkLabel;
+ public static String OneToManyMappingUiProvider_linkLabel;
+ public static String OneToOneMappingUiProvider_linkLabel;
+ public static String TransientMappingUiProvider_linkLabel;
+ public static String VersionMappingUiProvider_linkLabel;
+
+ public static String MapAsComposite_changeMappingType;
+ public static String MapAsComposite_default;
+ public static String MapAsComposite_dialogTitle;
+ public static String MapAsComposite_labelText;
+ public static String MapAsComposite_mappedAttributeText;
+ public static String MapAsComposite_mappedTypeText;
+ public static String MapAsComposite_unmappedAttributeText;
+ public static String MapAsComposite_unmappedTypeText;
+ public static String MapAsComposite_virtualAttributeText;
+
+ public static String EmbeddableUiProvider_label;
+ public static String EntityUiProvider_label;
+ public static String MappedSuperclassUiProvider_label;
+ public static String EmbeddableUiProvider_linkLabel;
+ public static String EntityUiProvider_linkLabel;
+ public static String MappedSuperclassUiProvider_linkLabel;
+
+ public static String NullTypeMappingUiProvider_label;
+
+ public static String MetaDataCompleteCombo_Default;
+ public static String MultiRelationshipMappingComposite_cascadeType;
+ public static String MultiRelationshipMappingComposite_fetchType;
+ public static String MultiRelationshipMappingComposite_general;
+ public static String MultiRelationshipMappingComposite_joinTable;
+ public static String MultiRelationshipMappingComposite_mappedBy;
+ public static String MultiRelationshipMappingComposite_targetEntity;
+ public static String NamedNativeQueryPropertyComposite_query;
+ public static String NamedNativeQueryPropertyComposite_queryHintsGroupBox;
+ public static String NamedNativeQueryPropertyComposite_resultClass;
+ public static String NamedQueryPropertyComposite_query;
+ public static String NamedQueryPropertyComposite_queryHintsGroupBox;
+ public static String NoNameSet;
+ public static String NullAttributeMappingUiProvider_label;
+ public static String OptionalComposite_false;
+ public static String OptionalComposite_true;
+ public static String OrderingComposite_custom;
+ public static String OrderingComposite_none;
+ public static String OrderingComposite_orderingGroup;
+ public static String OrderingComposite_primaryKey;
+ public static String OrmSecondaryTablesComposite_defineInXml;
+ public static String OverridesComposite_association;
+ public static String OverridesComposite_attribute;
+ public static String AssociationOverridesComposite_joinColumn;
+ public static String OverridesComposite_noName;
+ public static String PrimaryKeyJoinColumnDialog_addDescriptionTitle;
+ public static String PrimaryKeyJoinColumnDialog_addTitle;
+ public static String PrimaryKeyJoinColumnDialog_editDescriptionTitle;
+ public static String PrimaryKeyJoinColumnDialog_editTitle;
+ public static String PrimaryKeyJoinColumnInSecondaryTableDialog_addDescriptionTitle;
+ public static String PrimaryKeyJoinColumnInSecondaryTableDialog_addTitle;
+ public static String PrimaryKeyJoinColumnInSecondaryTableDialog_editDescriptionTitle;
+ public static String PrimaryKeyJoinColumnInSecondaryTableDialog_editTitle;
+ public static String PrimaryKeyJoinColumnsComposite_edit;
+ public static String PrimaryKeyJoinColumnsComposite_mappingBetweenTwoParams;
+ public static String PrimaryKeyJoinColumnsComposite_mappingBetweenTwoParamsBothDefault;
+ public static String PrimaryKeyJoinColumnsComposite_mappingBetweenTwoParamsDefault;
+ public static String PrimaryKeyJoinColumnsComposite_mappingBetweenTwoParamsFirstDefault;
+ public static String PrimaryKeyJoinColumnsComposite_mappingBetweenTwoParamsSecDefault;
+ public static String PrimaryKeyJoinColumnsComposite_overrideDefaultPrimaryKeyJoinColumns;
+ public static String PrimaryKeyJoinColumnsComposite_primaryKeyJoinColumn;
+ public static String QueriesComposite_displayString;
+ public static String QueryHintsComposite_nameColumn;
+ public static String QueryHintsComposite_valueColumn;
+ public static String SchemaChooser_label;
+ public static String SecondaryTableDialog_addSecondaryTable;
+ public static String SecondaryTableDialog_catalog;
+ public static String SecondaryTableDialog_defaultCatalog;
+ public static String SecondaryTableDialog_defaultSchema;
+ public static String SecondaryTableDialog_editSecondaryTable;
+ public static String SecondaryTableDialog_name;
+ public static String SecondaryTableDialog_schema;
+ public static String SecondaryTablesComposite_edit;
+ public static String SecondaryTablesComposite_secondaryTables;
+ public static String SequenceGeneratorComposite_catalog;
+ public static String SequenceGeneratorComposite_default;
+ public static String SequenceGeneratorComposite_name;
+ public static String SequenceGeneratorComposite_schema;
+ public static String SequenceGeneratorComposite_sequence;
+ public static String SequenceGeneratorComposite_sequenceGenerator;
+ public static String TableChooser_label;
+ public static String TableComposite_tableSection;
+ public static String TableGeneratorComposite_catalog;
+ public static String TableGeneratorComposite_default;
+ public static String TableGeneratorComposite_name;
+ public static String TableGeneratorComposite_pkColumn;
+ public static String TableGeneratorComposite_pkColumnValue;
+ public static String TableGeneratorComposite_schema;
+ public static String TableGeneratorComposite_table;
+ public static String TableGeneratorComposite_tableGenerator;
+ public static String TableGeneratorComposite_valueColumn;
+ public static String TargetEntityChooser_browse;
+ public static String TargetEntityChooser_label;
+ public static String TargetEntityChooser_selectTypeTitle;
+ public static String TemporalTypeComposite_date;
+ public static String TemporalTypeComposite_time;
+ public static String TemporalTypeComposite_timestamp;
+
+ private static final String BUNDLE_NAME = "jpt_ui_details"; //$NON-NLS-1$
+ private static final Class<?> BUNDLE_CLASS = JptUiDetailsMessages.class;
+ static {
+ NLS.initializeMessages(BUNDLE_NAME, BUNDLE_CLASS);
+ }
+
+ private JptUiDetailsMessages() {
+ throw new UnsupportedOperationException();
+ }
+
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/ManyToManyJoiningStrategyPane.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/ManyToManyJoiningStrategyPane.java
new file mode 100644
index 0000000000..5685bd06af
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/ManyToManyJoiningStrategyPane.java
@@ -0,0 +1,125 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 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.ui.internal.details;
+
+import org.eclipse.jpt.common.ui.internal.widgets.Pane;
+import org.eclipse.jpt.common.utility.internal.model.value.PropertyAspectAdapter;
+import org.eclipse.jpt.common.utility.internal.model.value.SimplePropertyValueModel;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.common.utility.model.value.WritablePropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.JoinTableRelationship;
+import org.eclipse.jpt.jpa.core.context.ManyToManyMapping;
+import org.eclipse.jpt.jpa.core.context.ManyToManyRelationship;
+import org.eclipse.jpt.jpa.core.context.MappedByRelationship;
+import org.eclipse.jpt.jpa.core.context.ReadOnlyRelationship;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * Here is the layout of this pane:
+ * <pre>
+ * -----------------------------------------------------------------------------
+ * | - Joining Strategy ------------------------------------------------------ |
+ * | | | |
+ * | | o MappedByJoiningStrategyPane _______________________________________ | |
+ * | | | | | |
+ * | | | | | |
+ * | | --------------------------------------------------------------------- | |
+ * | | o JoinTableStrategyPane _____________________________________________ | |
+ * | | | | | |
+ * | | | | | |
+ * | | --------------------------------------------------------------------- | |
+ * | ------------------------------------------------------------------------- |
+ * -----------------------------------------------------------------------------</pre>
+ *
+ * @see {@link ManyToManyMapping}
+ * @see {@link ManyToManyRelationship}
+ * @see {@link ManyToManyMappingComposite}
+ * @see {@link MappedByStrategyPane}
+ * @see {@link JoinTableStrategyPane}
+ *
+ * @version 2.3
+ * @since 2.1
+ */
+public class ManyToManyJoiningStrategyPane
+ extends Pane<ManyToManyRelationship>
+{
+ public ManyToManyJoiningStrategyPane(
+ Pane<?> parentPane,
+ PropertyValueModel<? extends ManyToManyRelationship> subjectHolder,
+ Composite parent) {
+
+ super(parentPane, subjectHolder, parent);
+ }
+
+
+ @Override
+ protected void initializeLayout(Composite container) {
+ Composite composite = addCollapsibleSection(
+ container,
+ JptUiDetailsMessages.Joining_title,
+ new SimplePropertyValueModel<Boolean>(Boolean.TRUE));
+
+ addRadioButton(
+ composite,
+ JptUiDetailsMessages.Joining_mappedByLabel,
+ MappedByJoiningStrategyPane.buildUsesMappedByJoiningStrategyHolder(getSubjectHolder()),
+ null);
+
+ new MappedByJoiningStrategyPane(this, composite);
+
+ addRadioButton(
+ composite,
+ JptUiDetailsMessages.Joining_joinTableJoiningLabel,
+ JoinTableJoiningStrategyPane.buildUsesJoinTableJoiningStrategyHolder(getSubjectHolder()),
+ null);
+
+ new JoinTableJoiningStrategyPane(this, composite);
+
+ addSubPane(composite, 5);
+ }
+
+ protected WritablePropertyValueModel<Boolean> buildUsesMappedByStrategyHolder() {
+ return new PropertyAspectAdapter<MappedByRelationship, Boolean>(
+ this.getSubjectHolder(), ReadOnlyRelationship.STRATEGY_PROPERTY) {
+ @Override
+ protected Boolean buildValue() {
+ return (this.subject == null) ? Boolean.FALSE :
+ Boolean.valueOf(this.subject.strategyIsMappedBy());
+ }
+
+ @Override
+ protected void setValue_(Boolean value) {
+ if (value == Boolean.TRUE) {
+ this.subject.setStrategyToMappedBy();
+ }
+ //value == FALSE - selection of another radio button causes this strategy to get unset
+ }
+ };
+ }
+
+ protected WritablePropertyValueModel<Boolean> buildUsesJoinTableStrategyHolder() {
+ return new PropertyAspectAdapter<JoinTableRelationship, Boolean>(
+ this.getSubjectHolder(), ReadOnlyRelationship.STRATEGY_PROPERTY) {
+ @Override
+ protected Boolean buildValue() {
+ return (this.subject == null) ? Boolean.FALSE :
+ Boolean.valueOf(this.subject.strategyIsJoinTable());
+ }
+
+ @Override
+ protected void setValue_(Boolean value) {
+ if (value == Boolean.TRUE) {
+ this.subject.setStrategyToJoinTable();
+ }
+ //value == FALSE - selection of another radio button causes this strategy to get unset
+ }
+ };
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/ManyToManyMappingComposite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/ManyToManyMappingComposite.java
new file mode 100644
index 0000000000..a2ffd3aa2f
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/ManyToManyMappingComposite.java
@@ -0,0 +1,83 @@
+/*******************************************************************************
+ * 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.ui.internal.details;
+
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.ManyToManyMapping;
+import org.eclipse.jpt.jpa.core.context.ManyToManyRelationship;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * Here the layout of this pane:
+ * <pre>
+ * -----------------------------------------------------------------------------
+ * | ------------------------------------------------------------------------- |
+ * | | | |
+ * | | TargetEntityComposite | |
+ * | | | |
+ * | ------------------------------------------------------------------------- |
+ * | ------------------------------------------------------------------------- |
+ * | | | |
+ * | | JoiningStrategyComposite | |
+ * | | | |
+ * | ------------------------------------------------------------------------- |
+ * | ------------------------------------------------------------------------- |
+ * | | | |
+ * | | FetchTypeComposite | |
+ * | | | |
+ * | ------------------------------------------------------------------------- |
+ * | ------------------------------------------------------------------------- |
+ * | | | |
+ * | | CascadeComposite | |
+ * | | | |
+ * | ------------------------------------------------------------------------- |
+ * | ------------------------------------------------------------------------- |
+ * | | | |
+ * | | OrderingComposite | |
+ * | | | |
+ * | ------------------------------------------------------------------------- |
+ * -----------------------------------------------------------------------------</pre>
+ *
+ * @see {@link ManyToManyMapping}
+ * @see {@link TargetEntityComposite}
+ * @see {@link ManyToManyJoiningStrategyPane}
+ * @see {@link FetchTypeComposite}
+ * @see {@link CascadeComposite}
+ * @see {@link OrderingComposite}
+ *
+ * @version 2.3
+ * @since 1.0
+ */
+public class ManyToManyMappingComposite
+ extends AbstractManyToManyMappingComposite<ManyToManyMapping, ManyToManyRelationship>
+{
+ /**
+ * Creates a new <code>ManyToManyMappingComposite</code>.
+ *
+ * @param subjectHolder The holder of the subject <code>IManyToManyMapping</code>
+ * @param parent The parent container
+ * @param widgetFactory The factory used to create various common widgets
+ */
+ public ManyToManyMappingComposite(PropertyValueModel<? extends ManyToManyMapping> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+
+ super(subjectHolder, parent, widgetFactory);
+ }
+
+ @Override
+ protected void initializeManyToManySection(Composite container) {
+ new TargetEntityComposite(this, container);
+ new FetchTypeComposite(this, container);
+ new CascadeComposite(this, buildCascadeHolder(), addSubPane(container, 5));
+ }
+
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/ManyToOneJoiningStrategyPane.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/ManyToOneJoiningStrategyPane.java
new file mode 100644
index 0000000000..dfc728863f
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/ManyToOneJoiningStrategyPane.java
@@ -0,0 +1,68 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 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.ui.internal.details;
+
+import org.eclipse.jpt.common.ui.internal.widgets.Pane;
+import org.eclipse.jpt.common.utility.internal.model.value.SimplePropertyValueModel;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.ManyToOneRelationship;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * Here is the layout of this pane:
+ * <pre>
+ * -----------------------------------------------------------------------------
+ * | - Joining Strategy ------------------------------------------------------ |
+ * | | | |
+ * | | o JoinColumnStrategyPane ____________________________________________ | |
+ * | | | | | |
+ * | | | | | |
+ * | | --------------------------------------------------------------------- | |
+ * | ------------------------------------------------------------------------- |
+ * -----------------------------------------------------------------------------</pre>
+ *
+ * @see {@link ManyToOneMapping}
+ * @see {@link ManyToOneRelationship}
+ * @see {@link ManyToOneMappingComposite}
+ * @see {@link JoinColumnStrategyPane}
+ *
+ * @version 2.3
+ * @since 2.1
+ */
+public class ManyToOneJoiningStrategyPane extends Pane<ManyToOneRelationship>
+{
+ public ManyToOneJoiningStrategyPane(
+ Pane<?> parentPane,
+ PropertyValueModel<? extends ManyToOneRelationship> subjectHolder,
+ Composite parent) {
+
+ super(parentPane, subjectHolder, parent);
+ }
+
+
+ @Override
+ protected void initializeLayout(Composite container) {
+ Composite composite = addCollapsibleSection(
+ container,
+ JptUiDetailsMessages.Joining_title,
+ new SimplePropertyValueModel<Boolean>(Boolean.TRUE));
+
+ addRadioButton(
+ composite,
+ JptUiDetailsMessages.Joining_joinColumnJoiningLabel,
+ JoinColumnJoiningStrategyPane.buildUsesJoinColumnJoiningStrategyHolder(getSubjectHolder()),
+ null);
+
+ JoinColumnJoiningStrategyPane.
+ buildJoinColumnJoiningStrategyPaneWithIncludeOverrideCheckBox(this, composite);
+
+ addSubPane(composite, 5);
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/ManyToOneMappingComposite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/ManyToOneMappingComposite.java
new file mode 100644
index 0000000000..903149fe3d
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/ManyToOneMappingComposite.java
@@ -0,0 +1,84 @@
+/*******************************************************************************
+ * 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.ui.internal.details;
+
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.ManyToOneMapping;
+import org.eclipse.jpt.jpa.core.context.ManyToOneRelationship;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * Here the layout of this pane:
+ * <pre>
+ * -----------------------------------------------------------------------------
+ * | ------------------------------------------------------------------------- |
+ * | | | |
+ * | | TargetEntityComposite | |
+ * | | | |
+ * | ------------------------------------------------------------------------- |
+ * | ------------------------------------------------------------------------- |
+ * | | | |
+ * | | JoiningStrategyComposite | |
+ * | | | |
+ * | ------------------------------------------------------------------------- |
+ * | ------------------------------------------------------------------------- |
+ * | | | |
+ * | | FetchTypeComposite | |
+ * | | | |
+ * | ------------------------------------------------------------------------- |
+ * | ------------------------------------------------------------------------- |
+ * | | | |
+ * | | OptionalComposite | |
+ * | | | |
+ * | ------------------------------------------------------------------------- |
+ * | ------------------------------------------------------------------------- |
+ * | | | |
+ * | | CascadeComposite | |
+ * | | | |
+ * | ------------------------------------------------------------------------- |
+ * -----------------------------------------------------------------------------</pre>
+ *
+ * @see {@link ManyToOneMapping}
+ * @see {@link TargetEntityComposite}
+ * @see {@link ManyToOneJoiningStrategyPane}
+ * @see {@link FetchTypeComposite}
+ * @see {@link OptionalComposite}
+ * @see {@link CascadeComposite}
+ *
+ * @version 2.3
+ * @since 1.0
+ */
+public class ManyToOneMappingComposite
+ extends AbstractManyToOneMappingComposite<ManyToOneMapping, ManyToOneRelationship>
+{
+ /**
+ * Creates a new <code>ManyToOneMappingComposite</code>.
+ *
+ * @param subjectHolder The holder of the subject <code>IManyToOneMapping</code>
+ * @param parent The parent container
+ * @param widgetFactory The factory used to create various common widgets
+ */
+ public ManyToOneMappingComposite(PropertyValueModel<? extends ManyToOneMapping> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+
+ super(subjectHolder, parent, widgetFactory);
+ }
+
+ @Override
+ protected void initializeManyToOneSection(Composite container) {
+ new TargetEntityComposite(this, container);
+ new FetchTypeComposite(this, container);
+ new OptionalComposite(this, container);
+ new CascadeComposite(this, buildCascadeHolder(), addSubPane(container, 5));
+ }
+
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/MapAsComposite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/MapAsComposite.java
new file mode 100644
index 0000000000..fc573e777a
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/MapAsComposite.java
@@ -0,0 +1,638 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 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.ui.internal.details;
+
+import java.util.Comparator;
+import java.util.Iterator;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.jface.dialogs.IDialogSettings;
+import org.eclipse.jface.resource.JFaceColors;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jpt.common.ui.internal.util.SWTUtil;
+import org.eclipse.jpt.common.ui.internal.widgets.Pane;
+import org.eclipse.jpt.common.ui.internal.widgets.PostExecution;
+import org.eclipse.jpt.common.utility.internal.CollectionTools;
+import org.eclipse.jpt.common.utility.internal.StringTools;
+import org.eclipse.jpt.jpa.core.JpaNode;
+import org.eclipse.jpt.jpa.ui.JpaPlatformUi;
+import org.eclipse.jpt.jpa.ui.JptJpaUiPlugin;
+import org.eclipse.jpt.jpa.ui.details.DefaultMappingUiDefinition;
+import org.eclipse.jpt.jpa.ui.details.MappingUiDefinition;
+import org.eclipse.jpt.jpa.ui.internal.platform.JpaPlatformUiRegistry;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.StyleRange;
+import org.eclipse.swt.custom.StyledText;
+import org.eclipse.swt.events.MouseEvent;
+import org.eclipse.swt.events.MouseListener;
+import org.eclipse.swt.events.MouseMoveListener;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.Cursor;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.ui.dialogs.FilteredItemsSelectionDialog;
+import com.ibm.icu.text.Collator;
+
+/**
+ * This map as composite simply shows a styled text where the name of the
+ * mapping and its type are displayed. The mapping type can be clicked on to
+ * invoke a dialog in order to change the type.
+ * <p>
+ * Here the layout of this pane:
+ * <pre>
+ * -----------------------------------------------------------------------------
+ * | |
+ * | Attribute 'name' is mapped as one to one. |
+ * | ¯¯¯¯¯¯¯¯¯¯ |
+ * -----------------------------------------------------------------------------</pre>
+ *
+ * @version 2.0
+ * @since 2.0
+ */
+@SuppressWarnings("nls")
+public abstract class MapAsComposite<T extends JpaNode> extends Pane<T> {
+
+ protected boolean dragEvent;
+ protected boolean enabled;
+ protected Cursor handCursor;
+ protected MappingChangeHandler<T> mappingChangeHandler;
+ protected int mappingTypeLength;
+ protected int mappingTypeStart;
+ protected boolean mouseDown;
+ protected int nameLength;
+ protected int nameStart;
+ protected StyledText styledText;
+
+ /**
+ * The constant ID used to retrieve the dialog settings.
+ */
+ private static final String DIALOG_SETTINGS = "org.eclipse.jpt.jpa.ui.dialogs.MapAsDialog";
+
+ /**
+ * Creates a new <code>MapAsComposite</code>.
+ *
+ * @param parentPane The parent pane of this one
+ * @param parent The parent container
+ */
+ public MapAsComposite(Pane<? extends T> parentPane,
+ Composite parent) {
+
+ super(parentPane, parent);
+ }
+
+ /**
+ * Returns the JPT platform responsble to manage the user interface part of
+ * the JPT plug-in.
+ *
+ * @return The UI platform of the JPT plug-in
+ */
+ protected JpaPlatformUi getJpaPlatformUi() {
+ String platformId = getSubject().getJpaProject().getJpaPlatform().getId();
+ return JpaPlatformUiRegistry.instance().getJpaPlatformUi(platformId);
+ }
+
+ /**
+ * Creates the default provider responsible for clearing the mapping type.
+ * Return null if there is not a default provider
+ * @return A provider that acts as a default mapping provider
+ */
+ protected abstract DefaultMappingUiDefinition getDefaultDefinition();
+
+ protected abstract DefaultMappingUiDefinition getDefaultDefinition(String mappingKey);
+
+ protected MappingUiDefinition getMappingUiDefinition(String mappingKey) {
+ for (MappingUiDefinition<T, ?> provider : CollectionTools.iterable(this.mappingChangeHandler.mappingUiDefinitions())) {
+ if (provider.getKey() == mappingKey) {
+ return provider;
+ }
+ }
+ return null;
+ }
+
+ /**
+ * Creates the handler responsible to give the information required for
+ * completing the behavior of this pane.
+ *
+ * @return A new <code>MappingChangeHandler</code>
+ */
+ protected abstract MappingChangeHandler buildMappingChangeHandler();
+
+ private MouseListener buildMouseListener() {
+ return new MouseListener() {
+ public void mouseDoubleClick(MouseEvent e) {
+ }
+
+ public void mouseDown(MouseEvent e) {
+ if (e.button == 1) {
+ mouseDown = true;
+ }
+ }
+
+ public void mouseUp(MouseEvent e) {
+ mouseDown = false;
+ StyledText text = (StyledText) e.widget;
+ int offset = text.getCaretOffset();
+
+ if (dragEvent) {
+ dragEvent = false;
+
+ if (isOverLink(offset)) {
+ text.setCursor(handCursor);
+ }
+ }
+ else if (isOverLink(offset)) {
+ text.setCursor(handCursor);
+ openMappingSelectionDialog();
+ text.setCursor(null);
+ }
+ }
+ };
+ }
+
+ private MouseMoveListener buildMouseMoveListener() {
+ return new MouseMoveListener() {
+ public void mouseMove(MouseEvent e) {
+ StyledText text = (StyledText) e.widget;
+
+ if (mouseDown) {
+ if (!dragEvent) {
+ text.setCursor(null);
+ }
+
+ dragEvent = true;
+ return;
+ }
+
+ int offset = -1;
+
+ try {
+ offset = text.getOffsetAtLocation(new Point(e.x, e.y));
+ }
+ catch (IllegalArgumentException ex) {
+ }
+
+ if (isOverLink(offset)) {
+ text.setCursor(handCursor);
+ }
+ else {
+ text.setCursor(null);
+ }
+ }
+ };
+ }
+
+ private PostExecution<MappingSelectionDialog> buildPostExecution() {
+
+ return new PostExecution<MappingSelectionDialog>() {
+ public void execute(MappingSelectionDialog dialog) {
+
+ if (dialog.getReturnCode() == IDialogConstants.OK_ID) {
+ MappingUiDefinition definition = (MappingUiDefinition) dialog.getFirstResult();
+ morphMapping(definition);
+ }
+ }
+ };
+ }
+
+ /**
+ * Creates the full localized string by formatting the label text returned
+ * by the <code>MappingChangeHandler</code> with the mapping name and the
+ * mapping type.
+ *
+ * @param name The display string of the mapping being edited
+ * @param mappingType The localized message describing the mapping type
+ * @return The localized string describing the mapping
+ */
+ protected String buildText(String name, String mappingType) {
+ return NLS.bind(
+ mappingChangeHandler.getLabelText(),
+ name,
+ mappingType
+ );
+ }
+
+ /**
+ * Removes any style applied to the styled text.
+ */
+ protected void clearStyleRange() {
+ styledText.setStyleRange(null);
+ }
+
+ /*
+ * (non-Javadoc)
+ */
+ @Override
+ protected void doPopulate() {
+ super.doPopulate();
+ updateDescription();
+ }
+
+ /*
+ * (non-Javadoc)
+ */
+ @Override
+ public void enableWidgets(boolean enabled) {
+ this.enabled = enabled;
+ super.enableWidgets(enabled);
+
+ if (!styledText.isDisposed()) {
+ styledText.setEnabled(enabled);
+
+ if (enabled) {
+ updateLinkRange();
+ }
+ else {
+ clearStyleRange();
+ }
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ */
+ @Override
+ protected void initialize() {
+
+ super.initialize();
+
+ this.enabled = true;
+ this.mappingChangeHandler = buildMappingChangeHandler();
+ }
+
+ /*
+ * (non-Javadoc)
+ */
+ @Override
+ protected void initializeLayout(Composite container) {
+
+ handCursor = getShell().getDisplay().getSystemCursor(SWT.CURSOR_HAND);
+
+ styledText = new StyledText(container, SWT.WRAP | SWT.READ_ONLY);
+ styledText.addMouseListener(buildMouseListener());
+ styledText.addMouseMoveListener(buildMouseMoveListener());
+ styledText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+ }
+
+ /**
+ * Retreive the <code>MappingUiDefinition</code> that provides the UI for the
+ * current mapping.
+ *
+ * @return The <code>MappingUiProvider</code> representing the type of the
+ * mapping being edited
+ */
+ protected MappingUiDefinition initialSelection() {
+
+ for (Iterator<? extends MappingUiDefinition> iter = this.mappingChangeHandler.mappingUiDefinitions(); iter.hasNext(); ) {
+ MappingUiDefinition definition = iter.next();
+
+ if (getMappingKey() == definition.getKey()) {
+ return definition;
+ }
+ }
+
+ return null;
+ }
+
+ /**
+ * Determines whether the given location is within the mapping type range.
+ *
+ * @param location The mouse location in character coordinate
+ * @return <code>true</code> if the mouse is over the mapping type text;
+ * <code>false</code> otherwise
+ */
+ protected boolean isOverLink(int location) {
+
+ return (location >= mappingTypeStart &&
+ location <= mappingTypeStart + mappingTypeLength);
+ }
+
+ /**
+ * Returns the mapping key representing the current mapping object.
+ *
+ * @return A non-<code>null</code> unique identifier representing the type
+ * of the mapping being edited
+ */
+ protected abstract String getMappingKey();
+
+ /**
+ * Aks the <code>MappingChangeHandler</code> to change the mapping type using
+ * the given <code>MappingUiDefinition</code>.
+ *
+ * @param provider The provider used to determine the mapping type used for
+ * morphing the mapping being edited
+ */
+ protected void morphMapping(MappingUiDefinition definition) {
+ mappingChangeHandler.morphMapping(definition);
+ }
+
+ /**
+ * Opens the dialog that shows the registered mapping types in order for the
+ * user to select a provider in order to change the mapping type of the
+ * mapping being edited.
+ */
+ protected void openMappingSelectionDialog() {
+
+ MappingSelectionDialog dialog = new MappingSelectionDialog();
+ SWTUtil.show(dialog, buildPostExecution());
+ }
+
+ /**
+ * Updates the description by recreating the label.
+ */
+ protected void updateDescription() {
+ if (getSubject() == null) {
+ return;
+ }
+
+ clearStyleRange();
+ updateText();
+
+ if (enabled) {
+ updateLinkRange();
+ }
+ }
+
+ /**
+ * Updates the colors of the text: (1) the name is shown in bold and (2) the
+ * mapping type is shown in bold and in hyperlink color.
+ */
+ protected void updateLinkRange() {
+
+ Color linkColor = JFaceColors.getHyperlinkText(getShell().getDisplay());
+
+ // Make the name bold
+ StyleRange styleRange = new StyleRange(
+ nameStart, nameLength,
+ null, null,
+ SWT.BOLD
+ );
+ styledText.setStyleRange(styleRange);
+
+ // Make the mapping type shown as a hyperlink
+ if (mappingTypeStart > -1) {
+ styleRange = new StyleRange(
+ mappingTypeStart, mappingTypeLength,
+ linkColor, null
+ );
+
+ styleRange.underline = true;
+ styleRange.underlineColor = linkColor;
+ styleRange.underlineStyle = SWT.UNDERLINE_SINGLE;
+ styledText.setStyleRange(styleRange);
+ }
+ }
+
+ /**
+ * Updates the styles text's input.
+ */
+ protected void updateText() {
+
+ String name = mappingChangeHandler.getName();
+
+ if (name == null) {
+ name = JptUiDetailsMessages.NoNameSet;
+ }
+
+ String mappingType = mappingChangeHandler.getMappingText();
+ String text = buildText(name, mappingType);
+
+ mappingTypeStart = text.lastIndexOf(mappingType);
+ mappingTypeLength = mappingType.length();
+
+ nameStart = text.indexOf(name);
+ nameLength = name.length();
+
+ styledText.setText(text);
+ }
+
+ @Override
+ public void dispose() {
+ this.styledText.dispose();
+ super.dispose();
+ }
+
+ /**
+ * This handler is responsible to give the text information and to open the
+ * mapping dialog if the user clicked on the mapping type.
+ */
+ protected interface MappingChangeHandler<T> {
+
+ /**
+ * Returns the entire text describing the mapping (entity or mapping) and
+ * its type.
+ *
+ * @return A localized text with two arguments where the first one should
+ * be replaced by the name and the second be replaced by the mapping type
+ */
+ String getLabelText();
+
+ /**
+ * Returns the displayable text representing the mapping type.
+ *
+ * @return A human readable text describing the mapping type
+ */
+ String getMappingText();
+
+ /**
+ * Morphes the current mapping into a new type by using the given provider.
+ *
+ * @param provider The definition that was selected for changing the mapping
+ */
+ void morphMapping(MappingUiDefinition<T, ?> definition);
+
+ /**
+ * Returns the name of the current mapping.
+ *
+ * @return The displayable name of the mapping
+ */
+ String getName();
+
+ /**
+ * Returns the list of mapping UI definitions that are registered with the JPT plugin.
+ *
+ * @return The supported types of mapping
+ */
+ Iterator<MappingUiDefinition<T, ?>> mappingUiDefinitions();
+ }
+
+ /**
+ * This dialog shows the list of possible mapping types and lets the user
+ * the option to filter them using a search field.
+ */
+ protected class MappingSelectionDialog extends FilteredItemsSelectionDialog
+ {
+ private MappingUiDefinition defaultDefinition;
+
+ /**
+ * Creates a new <code>MappingSelectionDialog</code>.
+ */
+ private MappingSelectionDialog() {
+ super(MapAsComposite.this.getShell(), false);
+ setMessage(JptUiDetailsMessages.MapAsComposite_labelText);
+ setTitle(JptUiDetailsMessages.MapAsComposite_dialogTitle);
+ setListLabelProvider(buildLabelProvider());
+ setDetailsLabelProvider(buildLabelProvider());
+ }
+
+ private ILabelProvider buildLabelProvider() {
+ return new LabelProvider() {
+
+ @Override
+ public Image getImage(Object element) {
+
+ if (element == null) {
+ return null;
+ }
+
+ MappingUiDefinition definition = (MappingUiDefinition) element;
+ return definition.getImage();
+ }
+
+ @Override
+ public String getText(Object element) {
+ if (element == null) {
+ return "";
+ }
+
+ MappingUiDefinition definition = (MappingUiDefinition) element;
+ return definition.getLabel();
+ }
+ };
+ }
+
+ @Override
+ protected Control createExtendedContentArea(Composite parent) {
+ return null;
+ }
+
+ @Override
+ protected ItemsFilter createFilter() {
+ return new MappingTypeItemsFilter();
+ }
+
+ @Override
+ protected void fillContentProvider(
+ AbstractContentProvider provider,
+ ItemsFilter itemsFilter,
+ IProgressMonitor monitor) throws CoreException {
+
+ monitor.beginTask(null, -1);
+
+ try {
+ // Add the default provider
+ defaultDefinition = getDefaultDefinition();
+
+ if (defaultDefinition != null) {
+ provider.add(defaultDefinition, itemsFilter);
+ }
+
+ // Add the registered mapping providers to the dialog
+ for (Iterator<MappingUiDefinition<T, ?>> iter = mappingChangeHandler.mappingUiDefinitions(); iter.hasNext(); ) {
+ MappingUiDefinition mappingDefinition = iter.next();
+ if (mappingDefinition.isEnabledFor(getSubject())) {
+ provider.add(mappingDefinition, itemsFilter);
+ }
+ }
+ }
+ finally {
+ monitor.done();
+ }
+ }
+
+ @Override
+ protected IDialogSettings getDialogSettings() {
+
+ IDialogSettings dialogSettings = JptJpaUiPlugin.instance().getDialogSettings();
+ IDialogSettings settings = dialogSettings.getSection(DIALOG_SETTINGS);
+
+ if (settings == null) {
+ settings = dialogSettings.addNewSection(DIALOG_SETTINGS);
+ }
+
+ return settings;
+ }
+
+ @Override
+ public String getElementName(Object object) {
+ MappingUiDefinition definition = (MappingUiDefinition) object;
+ return definition.getLabel();
+ }
+
+ @Override
+ protected Comparator<MappingUiDefinition> getItemsComparator() {
+ return new Comparator<MappingUiDefinition>() {
+ public int compare(MappingUiDefinition item1, MappingUiDefinition item2) {
+
+ if (item1 == defaultDefinition) {
+ return -1;
+ }
+
+ if (item2 == defaultDefinition) {
+ return 1;
+ }
+
+ String displayString1 = item1.getLabel();
+ String displayString2 = item2.getLabel();
+ return Collator.getInstance().compare(displayString1, displayString2);
+ }
+ };
+ }
+
+ @Override
+ protected IStatus validateItem(Object item) {
+
+ if (item == null) {
+ return new Status(IStatus.ERROR, JptJpaUiPlugin.PLUGIN_ID, IStatus.ERROR, "", null);
+ }
+
+ return Status.OK_STATUS;
+ }
+
+ /**
+ * Create the filter responsible to remove any mapping type based on the
+ * pattern entered in the text field.
+ */
+ private class MappingTypeItemsFilter extends ItemsFilter {
+
+ /**
+ * Creates a new <code>MappingTypeItemsFilter</code>.
+ */
+ MappingTypeItemsFilter() {
+
+ super();
+
+ // Make sure that if the pattern is empty, we specify * in order
+ // to show all the mapping types
+ if (StringTools.stringIsEmpty(getPattern())) {
+ patternMatcher.setPattern("*");
+ }
+ }
+
+ @Override
+ public boolean isConsistentItem(Object item) {
+ return true;
+ }
+
+ @Override
+ public boolean matchItem(Object item) {
+ MappingUiDefinition definition = (MappingUiDefinition) item;
+ return matches(definition.getLabel());
+ }
+ }
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/MappedByJoiningStrategyPane.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/MappedByJoiningStrategyPane.java
new file mode 100644
index 0000000000..5143c9f5bc
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/MappedByJoiningStrategyPane.java
@@ -0,0 +1,94 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 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.ui.internal.details;
+
+import org.eclipse.jpt.common.ui.internal.widgets.Pane;
+import org.eclipse.jpt.common.utility.internal.model.value.PropertyAspectAdapter;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.common.utility.model.value.WritablePropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.MappedByRelationship;
+import org.eclipse.jpt.jpa.core.context.MappedByRelationshipStrategy;
+import org.eclipse.jpt.jpa.core.context.ReadOnlyRelationship;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * Here is the layout of this pane:
+ * <pre>
+ * -----------------------------------------------------------------------------
+ * | o Mapped by _____________________________________________________________ |
+ * | | --------------------------------------------- ---------- | |
+ * | | Attribute: | | |Browse..| | |
+ * | | --------------------------------------------- ---------- | |
+ * | ------------------------------------------------------------------------- |
+ * -----------------------------------------------------------------------------</pre>
+ *
+ * @see {@link MappedByRelationship}
+ * @see {@link MappedByRelationshipStrategy}
+ * @see {@link OneToOneJoiningStrategyPane}
+ * @see {@link OneToManyJoiningStrategyPane}
+ * @see {@link ManyToManyJoiningStrategyPane}
+ *
+ * @version 2.3
+ * @since 2.1
+ */
+public class MappedByJoiningStrategyPane
+ extends AbstractJoiningStrategyPane<MappedByRelationship, MappedByRelationshipStrategy>
+{
+ /**
+ * Creates a new <code>MappedByJoiningStrategyPane</code>.
+ *
+ * @param parentPane The parent form pane
+ * @param parent The parent container
+ */
+ public MappedByJoiningStrategyPane(
+ Pane<? extends MappedByRelationship> parentPane,
+ Composite parent) {
+ super(parentPane, parent);
+ }
+
+ @Override
+ protected Composite buildStrategyDetailsComposite(Composite parent) {
+ return new MappedByPane(this, this.buildMappedByJoiningStrategyHolder(), parent).getControl();
+ }
+
+ @Override
+ protected WritablePropertyValueModel<Boolean> buildUsesStrategyHolder() {
+ return buildUsesMappedByJoiningStrategyHolder(getSubjectHolder());
+ }
+
+ protected PropertyValueModel<MappedByRelationshipStrategy> buildMappedByJoiningStrategyHolder() {
+ return new PropertyAspectAdapter<MappedByRelationship, MappedByRelationshipStrategy>(
+ getSubjectHolder()) {
+ @Override
+ protected MappedByRelationshipStrategy buildValue_() {
+ return this.subject.getMappedByStrategy();
+ }
+ };
+ }
+
+ public static WritablePropertyValueModel<Boolean> buildUsesMappedByJoiningStrategyHolder(PropertyValueModel<? extends MappedByRelationship> subjectHolder) {
+ return new PropertyAspectAdapter<MappedByRelationship, Boolean>(
+ subjectHolder, ReadOnlyRelationship.STRATEGY_PROPERTY) {
+ @Override
+ protected Boolean buildValue() {
+ return (this.subject == null) ? Boolean.FALSE :
+ Boolean.valueOf(this.subject.strategyIsMappedBy());
+ }
+
+ @Override
+ protected void setValue_(Boolean value) {
+ if (value == Boolean.TRUE) {
+ this.subject.setStrategyToMappedBy();
+ }
+ //value == FALSE - selection of another radio button causes this strategy to get unset
+ }
+ };
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/MappedByPane.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/MappedByPane.java
new file mode 100644
index 0000000000..cac8094c2a
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/MappedByPane.java
@@ -0,0 +1,100 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2010 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.ui.internal.details;
+
+import java.util.Iterator;
+
+import org.eclipse.jpt.common.ui.internal.widgets.Pane;
+import org.eclipse.jpt.common.utility.internal.model.value.CollectionAspectAdapter;
+import org.eclipse.jpt.common.utility.internal.model.value.PropertyAspectAdapter;
+import org.eclipse.jpt.common.utility.internal.model.value.SortedListValueModelAdapter;
+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.core.context.MappedByRelationshipStrategy;
+import org.eclipse.jpt.jpa.ui.internal.JpaHelpContextIds;
+import org.eclipse.swt.widgets.Composite;
+
+import com.ibm.icu.text.Collator;
+
+/**
+ * Here the layout of this pane:
+ * <pre>
+ * -----------------------------------------------------------------------------
+ * | -------------------------------------------------------------- |
+ * | Mapped By: | |v| |
+ * | -------------------------------------------------------------- |
+ * -----------------------------------------------------------------------------</pre>
+ *
+ * @see NonOwningMapping
+ * @see ManyToManyMappingComposite - A container of this pane
+ * @see OneToManyMappingComposite - A container of this pane
+ * @see OneToOneMappingComposite - A container of this pane
+ *
+ * @version 2.0
+ * @since 1.0
+ */
+public class MappedByPane
+ extends Pane<MappedByRelationshipStrategy>
+{
+ /**
+ * Creates a new <code>MappedByPane</code>.
+ *
+ * @param parentPane The parent form pane
+ * @param subjectHolder The PVM for the {@link MappedByRelationshipStrategy}
+ * @param parent The parent container
+ */
+ public MappedByPane(
+ Pane<?> parentPane,
+ PropertyValueModel<MappedByRelationshipStrategy> subjectHolder,
+ Composite parent) {
+ super(parentPane, subjectHolder, parent);
+ }
+
+
+ @Override
+ protected void initializeLayout(Composite container) {
+ addLabeledEditableCombo(
+ container,
+ JptUiDetailsMessages.Joining_mappedByAttributeLabel,
+ buildCandidateAttributesListValueModel(),
+ buildAttributePropertyValueModel(),
+ JpaHelpContextIds.MAPPING_MAPPED_BY);
+ }
+
+ @SuppressWarnings("unchecked")
+ protected ListValueModel<String> buildCandidateAttributesListValueModel() {
+ return new SortedListValueModelAdapter<String>(
+ new CollectionAspectAdapter<MappedByRelationshipStrategy, String>(
+ getSubjectHolder()) {
+ @Override
+ protected Iterator<String> iterator_() {
+ return this.subject.candidateMappedByAttributeNames();
+ }
+ },
+ Collator.getInstance()
+ );
+ }
+
+ protected WritablePropertyValueModel<String> buildAttributePropertyValueModel() {
+ return new PropertyAspectAdapter<MappedByRelationshipStrategy, String>(
+ getSubjectHolder(), MappedByRelationshipStrategy.MAPPED_BY_ATTRIBUTE_PROPERTY) {
+ @Override
+ protected String buildValue_() {
+ return this.subject.getMappedByAttribute();
+ }
+
+ @Override
+ protected void setValue_(String value) {
+ this.subject.setMappedByAttribute(value);
+ }
+ };
+ }
+} \ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/NamedNativeQueryPropertyComposite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/NamedNativeQueryPropertyComposite.java
new file mode 100644
index 0000000000..4d9515992a
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/NamedNativeQueryPropertyComposite.java
@@ -0,0 +1,182 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 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.ui.internal.details;
+
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jpt.common.ui.internal.widgets.ClassChooserPane;
+import org.eclipse.jpt.common.ui.internal.widgets.Pane;
+import org.eclipse.jpt.common.utility.internal.model.value.PropertyAspectAdapter;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.common.utility.model.value.WritablePropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.NamedNativeQuery;
+import org.eclipse.jpt.jpa.core.context.Query;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * Here the layout of this pane:
+ * <pre>
+ * -----------------------------------------------------------------------------
+ * | --------------------------------------------- ------------- |
+ * | Result Class: | I | | Browse... | |
+ * | --------------------------------------------- ------------- |
+ * | --------------------------------------------- |
+ * | Query: | I | |
+ * | | | |
+ * | | | |
+ * | | | |
+ * | --------------------------------------------- |
+ * | |
+ * | - Query Hints ----------------------------------------------------------- |
+ * | | --------------------------------------------------------------------- | |
+ * | | | | | |
+ * | | | QueryHintsComposite | | |
+ * | | | | | |
+ * | | --------------------------------------------------------------------- | |
+ * | ------------------------------------------------------------------------- |
+ * -----------------------------------------------------------------------------</pre>
+ *
+ * @see NamedNativeQuery
+ * @see NamedNativeQueriesComposite - The parent container
+ * @see ClassChooserPane
+ *
+ * @version 2.0
+ * @since 2.0
+ */
+public class NamedNativeQueryPropertyComposite extends Pane<NamedNativeQuery>
+{
+ private ClassChooserPane<NamedNativeQuery> resultClassChooserPane;
+
+ /**
+ * Creates a new <code>NamedNativeQueryPropertyComposite</code>.
+ *
+ * @param parentPane The parent container of this one
+ * @param subjectHolder The holder of this pane's subject
+ * @param parent The parent container
+ */
+ public NamedNativeQueryPropertyComposite(Pane<?> parentPane,
+ PropertyValueModel<? extends NamedNativeQuery> subjectHolder,
+ Composite parent) {
+
+ super(parentPane, subjectHolder, parent);
+ }
+
+ private ClassChooserPane<NamedNativeQuery> addClassChooser(Composite container) {
+
+ return new ClassChooserPane<NamedNativeQuery>(this, container) {
+
+ @Override
+ protected WritablePropertyValueModel<String> buildTextHolder() {
+ return new PropertyAspectAdapter<NamedNativeQuery, String>(getSubjectHolder(), NamedNativeQuery.RESULT_CLASS_PROPERTY) {
+ @Override
+ protected String buildValue_() {
+ return this.subject.getResultClass();
+ }
+
+ @Override
+ protected void setValue_(String value) {
+ this.subject.setResultClass(value);
+ }
+ };
+ }
+
+ @Override
+ protected String getClassName() {
+ return getSubject().getResultClass();
+ }
+
+ @Override
+ protected String getLabelText() {
+ return JptUiDetailsMessages.NamedNativeQueryPropertyComposite_resultClass;
+ }
+
+ @Override
+ protected IJavaProject getJavaProject() {
+ return getSubject().getJpaProject().getJavaProject();
+ }
+
+ @Override
+ protected void setClassName(String className) {
+ getSubject().setResultClass(className);
+ }
+
+ @Override
+ protected char getEnclosingTypeSeparator() {
+ return getSubject().getResultClassEnclosingTypeSeparator();
+ }
+ };
+ }
+
+ private WritablePropertyValueModel<String> buildQueryHolder() {
+ return new PropertyAspectAdapter<NamedNativeQuery, String>(getSubjectHolder(), Query.QUERY_PROPERTY) {
+ @Override
+ protected String buildValue_() {
+ return this.subject.getQuery();
+ }
+
+ @Override
+ protected void setValue_(String value) {
+ this.subject.setQuery(value);
+ }
+ };
+ }
+
+ @Override
+ public void enableWidgets(boolean enabled) {
+ super.enableWidgets(enabled);
+ this.resultClassChooserPane.enableWidgets(enabled);
+ }
+
+ @Override
+ protected void initializeLayout(Composite container) {
+
+ addLabeledText(
+ container,
+ JptUiDetailsMessages.NamedQueryComposite_nameTextLabel,
+ buildNameTextHolder());
+
+ // Result class chooser
+ this.resultClassChooserPane = addClassChooser(container);
+
+ // Query text area
+ addLabeledMultiLineText(
+ container,
+ JptUiDetailsMessages.NamedNativeQueryPropertyComposite_query,
+ buildQueryHolder(),
+ 4,
+ null
+ );
+
+ // Query Hints pane
+ container = addTitledGroup(
+ addSubPane(container, 5),
+ JptUiDetailsMessages.NamedNativeQueryPropertyComposite_queryHintsGroupBox
+ );
+
+ new QueryHintsComposite(this, container);
+ }
+
+ protected WritablePropertyValueModel<String> buildNameTextHolder() {
+ return new PropertyAspectAdapter<NamedNativeQuery, String>(
+ getSubjectHolder(), Query.NAME_PROPERTY) {
+ @Override
+ protected String buildValue_() {
+ return this.subject.getName();
+ }
+
+ @Override
+ protected void setValue_(String value) {
+ if (value.length() == 0) {
+ value = null;
+ }
+ this.subject.setName(value);
+ }
+ };
+ }
+} \ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/NamedQueryPropertyComposite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/NamedQueryPropertyComposite.java
new file mode 100644
index 0000000000..8c1fbb12be
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/NamedQueryPropertyComposite.java
@@ -0,0 +1,119 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2009 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.ui.internal.details;
+
+import org.eclipse.jpt.common.ui.internal.widgets.Pane;
+import org.eclipse.jpt.common.utility.internal.model.value.PropertyAspectAdapter;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.common.utility.model.value.WritablePropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.NamedQuery;
+import org.eclipse.jpt.jpa.core.context.Query;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * Here the layout of this pane:
+ * <pre>
+ * -----------------------------------------------------------------------------
+ * | ------------------------------------------------------------------ |
+ * | Query: | I | |
+ * | | | |
+ * | | | |
+ * | ------------------------------------------------------------------ |
+ * | |
+ * | - Query Hints ----------------------------------------------------------- |
+ * | | --------------------------------------------------------------------- | |
+ * | | | | | |
+ * | | | QueryHintsComposite | | |
+ * | | | | | |
+ * | | --------------------------------------------------------------------- | |
+ * | ------------------------------------------------------------------------- |
+ * -----------------------------------------------------------------------------</pre>
+ *
+ * @see NamedQuery
+ * @see NamedQueriesComposite - The parent container
+ * @see QueryHintsComposite
+ *
+ * @version 2.0
+ * @since 2.0
+ */
+public class NamedQueryPropertyComposite<T extends NamedQuery> extends Pane<T>
+{
+ /**
+ * Creates a new <code>NamedQueryPropertyComposite</code>.
+ *
+ * @param parentPane The parent container of this one
+ * @param subjectHolder The holder of this pane's subject
+ * @param parent The parent container
+ */
+ public NamedQueryPropertyComposite(Pane<?> parentPane,
+ PropertyValueModel<T> subjectHolder,
+ Composite parent) {
+
+ super(parentPane, subjectHolder, parent);
+ }
+
+ protected WritablePropertyValueModel<String> buildQueryHolder() {
+ return new PropertyAspectAdapter<NamedQuery, String>(getSubjectHolder(), Query.QUERY_PROPERTY) {
+ @Override
+ protected String buildValue_() {
+ return this.subject.getQuery();
+ }
+
+ @Override
+ protected void setValue_(String value) {
+ this.subject.setQuery(value);
+ }
+ };
+ }
+
+ @Override
+ protected void initializeLayout(Composite container) {
+
+ addLabeledText(
+ container,
+ JptUiDetailsMessages.NamedQueryComposite_nameTextLabel,
+ buildNameTextHolder());
+
+ // Query text area
+ addLabeledMultiLineText(
+ container,
+ JptUiDetailsMessages.NamedQueryPropertyComposite_query,
+ buildQueryHolder(),
+ 4,
+ null
+ );
+
+ // Query Hints pane
+ container = addTitledGroup(
+ addSubPane(container, 5),
+ JptUiDetailsMessages.NamedQueryPropertyComposite_queryHintsGroupBox
+ );
+
+ new QueryHintsComposite(this, container);
+ }
+
+ protected WritablePropertyValueModel<String> buildNameTextHolder() {
+ return new PropertyAspectAdapter<NamedQuery, String>(
+ getSubjectHolder(), Query.NAME_PROPERTY) {
+ @Override
+ protected String buildValue_() {
+ return this.subject.getName();
+ }
+
+ @Override
+ protected void setValue_(String value) {
+ if (value.length() == 0) {
+ value = null;
+ }
+ this.subject.setName(value);
+ }
+ };
+ }
+} \ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/OneToManyJoiningStrategyPane.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/OneToManyJoiningStrategyPane.java
new file mode 100644
index 0000000000..c5b3641989
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/OneToManyJoiningStrategyPane.java
@@ -0,0 +1,82 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 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.ui.internal.details;
+
+import org.eclipse.jpt.common.ui.internal.widgets.Pane;
+import org.eclipse.jpt.common.utility.internal.model.value.SimplePropertyValueModel;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.OneToManyRelationship;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * Here is the layout of this pane:
+ * <pre>
+ * -----------------------------------------------------------------------------
+ * | - Joining Strategy ------------------------------------------------------ |
+ * | | | |
+ * | | o MappedByJoiningStrategyPane _______________________________________ | |
+ * | | | | | |
+ * | | | | | |
+ * | | --------------------------------------------------------------------- | |
+ * | | o JoinTableStrategyPane _____________________________________________ | |
+ * | | | | | |
+ * | | | | | |
+ * | | --------------------------------------------------------------------- | |
+ * | ------------------------------------------------------------------------- |
+ * -----------------------------------------------------------------------------</pre>
+ *
+ * @see {@link OneToManyMapping}
+ * @see {@link OneToManyRelationship}
+ * @see {@link OneToManyMappingComposite}
+ * @see {@link MappedByStrategyPane}
+ * @see {@link JoinTableStrategyPane}
+ *
+ * @version 2.3
+ * @since 2.1
+ */
+public class OneToManyJoiningStrategyPane
+ extends Pane<OneToManyRelationship>
+{
+ public OneToManyJoiningStrategyPane(
+ Pane<?> parentPane,
+ PropertyValueModel<? extends OneToManyRelationship> subjectHolder,
+ Composite parent) {
+
+ super(parentPane, subjectHolder, parent);
+ }
+
+
+ @Override
+ protected void initializeLayout(Composite container) {
+ Composite composite = addCollapsibleSection(
+ container,
+ JptUiDetailsMessages.Joining_title,
+ new SimplePropertyValueModel<Boolean>(Boolean.TRUE));
+
+ addRadioButton(
+ composite,
+ JptUiDetailsMessages.Joining_mappedByLabel,
+ MappedByJoiningStrategyPane.buildUsesMappedByJoiningStrategyHolder(getSubjectHolder()),
+ null);
+
+ new MappedByJoiningStrategyPane(this, composite);
+
+
+ addRadioButton(
+ composite,
+ JptUiDetailsMessages.Joining_joinTableJoiningLabel,
+ JoinTableJoiningStrategyPane.buildUsesJoinTableJoiningStrategyHolder(getSubjectHolder()),
+ null);
+
+ new JoinTableJoiningStrategyPane(this, composite);
+
+ addSubPane(composite, 5);
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/OneToManyMappingComposite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/OneToManyMappingComposite.java
new file mode 100644
index 0000000000..de42ebc0b2
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/OneToManyMappingComposite.java
@@ -0,0 +1,82 @@
+/*******************************************************************************
+ * 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.ui.internal.details;
+
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.OneToManyMapping;
+import org.eclipse.jpt.jpa.core.context.OneToManyRelationship;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * Here the layout of this pane:
+ * <pre>
+ * -----------------------------------------------------------------------------
+ * | ------------------------------------------------------------------------- |
+ * | | | |
+ * | | TargetEntityComposite | |
+ * | | | |
+ * | ------------------------------------------------------------------------- |
+ * | ------------------------------------------------------------------------- |
+ * | | | |
+ * | | JoiningStrategyComposite | |
+ * | | | |
+ * | ------------------------------------------------------------------------- |
+ * | ------------------------------------------------------------------------- |
+ * | | | |
+ * | | FetchTypeComposite | |
+ * | | | |
+ * | ------------------------------------------------------------------------- |
+ * | ------------------------------------------------------------------------- |
+ * | | | |
+ * | | CascadeComposite | |
+ * | | | |
+ * | ------------------------------------------------------------------------- |
+ * | ------------------------------------------------------------------------- |
+ * | | | |
+ * | | OrderingComposite | |
+ * | | | |
+ * | ------------------------------------------------------------------------- |
+ * -----------------------------------------------------------------------------</pre>
+ *
+ * @see OneToManyMapping
+ * @see CascadeComposite
+ * @see FetchTypeComposite
+ * @see JoinTableComposite
+ * @see OrderingComposite
+ * @see TargetEntityComposite
+ *
+ * @version 2.3
+ * @since 1.0
+ */
+public class OneToManyMappingComposite
+ extends AbstractOneToManyMappingComposite<OneToManyMapping, OneToManyRelationship>
+{
+ /**
+ * Creates a new <code>OneToManyMappingComposite</code>.
+ *
+ * @param subjectHolder The holder of the subject <code>IOneToManyMapping</code>
+ * @param parent The parent container
+ * @param widgetFactory The factory used to create various common widgets
+ */
+ public OneToManyMappingComposite(PropertyValueModel<? extends OneToManyMapping> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+
+ super(subjectHolder, parent, widgetFactory);
+ }
+
+ @Override
+ protected void initializeOneToManySection(Composite container) {
+ new TargetEntityComposite(this, container);
+ new FetchTypeComposite(this, container);
+ new CascadeComposite(this, buildCascadeHolder(), addSubPane(container, 5));
+ }
+} \ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/OneToOneJoiningStrategyPane.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/OneToOneJoiningStrategyPane.java
new file mode 100644
index 0000000000..f18f0971cb
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/OneToOneJoiningStrategyPane.java
@@ -0,0 +1,96 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 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.ui.internal.details;
+
+import org.eclipse.jpt.common.ui.internal.widgets.Pane;
+import org.eclipse.jpt.common.utility.internal.model.value.SimplePropertyValueModel;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.OneToOneRelationship;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * Here is the layout of this pane:
+ * <pre>
+ * -----------------------------------------------------------------------------
+ * | - Joining Strategy ------------------------------------------------------ |
+ * | | | |
+ * | | o MappedByJoiningStrategyPane _______________________________________ | |
+ * | | | | | |
+ * | | | | | |
+ * | | --------------------------------------------------------------------- | |
+ * | | o JoinColumnStrategyPane ____________________________________________ | |
+ * | | | | | |
+ * | | | | | |
+ * | | --------------------------------------------------------------------- | |
+ * | | o PrimaryKeyJoinColumnStrategyPane __________________________________ | |
+ * | | | | | |
+ * | | | | | |
+ * | | --------------------------------------------------------------------- | |
+ * | ------------------------------------------------------------------------- |
+ * -----------------------------------------------------------------------------</pre>
+ *
+ * @see {@link OneToOneMapping}
+ * @see {@link OneToOneRelationship}
+ * @see {@link OneToOneMappingComposite}
+ * @see {@link MappedByStrategyPane}
+ * @see {@link JoinColumnStrategyPane}
+ * @see {@link PrimaryKeyJoinColumnStrategyPane}
+ *
+ * @version 2.3
+ * @since 2.1
+ */
+public class OneToOneJoiningStrategyPane
+ extends Pane<OneToOneRelationship>
+{
+ public OneToOneJoiningStrategyPane(
+ Pane<?> parentPane,
+ PropertyValueModel<? extends OneToOneRelationship> subjectHolder,
+ Composite parent) {
+
+ super(parentPane, subjectHolder, parent);
+ }
+
+
+ @Override
+ protected void initializeLayout(Composite container) {
+ Composite composite = addCollapsibleSection(
+ container,
+ JptUiDetailsMessages.Joining_title,
+ new SimplePropertyValueModel<Boolean>(Boolean.TRUE));
+
+
+ addRadioButton(
+ composite,
+ JptUiDetailsMessages.Joining_mappedByLabel,
+ MappedByJoiningStrategyPane.buildUsesMappedByJoiningStrategyHolder(getSubjectHolder()),
+ null);
+
+ new MappedByJoiningStrategyPane(this, composite);
+
+ addRadioButton(
+ composite,
+ JptUiDetailsMessages.Joining_primaryKeyJoinColumnJoiningLabel,
+ PrimaryKeyJoinColumnJoiningStrategyPane.buildUsesPrimaryKeyJoinColumnJoiningStrategyHolder(getSubjectHolder()),
+ null);
+
+ new PrimaryKeyJoinColumnJoiningStrategyPane(this, composite);
+
+ addRadioButton(
+ composite,
+ JptUiDetailsMessages.Joining_joinColumnJoiningLabel,
+ JoinColumnJoiningStrategyPane.buildUsesJoinColumnJoiningStrategyHolder(getSubjectHolder()),
+ null);
+
+ JoinColumnJoiningStrategyPane.
+ buildJoinColumnJoiningStrategyPaneWithIncludeOverrideCheckBox(this, composite);
+
+ addSubPane(composite, 5);
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/OneToOneMappingComposite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/OneToOneMappingComposite.java
new file mode 100644
index 0000000000..128da9596e
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/OneToOneMappingComposite.java
@@ -0,0 +1,85 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 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.ui.internal.details;
+
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.OneToOneMapping;
+import org.eclipse.jpt.jpa.core.context.OneToOneRelationship;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * Here the layout of this pane:
+ * <pre>
+ * -----------------------------------------------------------------------------
+ * | ------------------------------------------------------------------------- |
+ * | | | |
+ * | | TargetEntityComposite | |
+ * | | | |
+ * | ------------------------------------------------------------------------- |
+ * | ------------------------------------------------------------------------- |
+ * | | | |
+ * | | JoiningStrategyComposite | |
+ * | | | |
+ * | ------------------------------------------------------------------------- |
+ * | ------------------------------------------------------------------------- |
+ * | | | |
+ * | | FetchTypeComposite | |
+ * | | | |
+ * | ------------------------------------------------------------------------- |
+ * | ------------------------------------------------------------------------- |
+ * | | | |
+ * | | OptionalComposite | |
+ * | | | |
+ * | ------------------------------------------------------------------------- |
+ * | ------------------------------------------------------------------------- |
+ * | | | |
+ * | | CascadeComposite | |
+ * | | | |
+ * | ------------------------------------------------------------------------- |
+ * -----------------------------------------------------------------------------</pre>
+ *
+ * @see OneToOneMapping
+ * @see TargetEntityComposite
+ * @see JoiningStrategyComposite
+ * @see FetchTypeComposite
+ * @see OptionalComposite
+ * @see CascadeComposite
+ *
+ * @version 2.3
+ * @since 1.0
+ */
+public class OneToOneMappingComposite
+ extends AbstractOneToOneMappingComposite<OneToOneMapping, OneToOneRelationship>
+{
+ /**
+ * Creates a new <code>OneToOneMappingComposite</code>.
+ *
+ * @param subjectHolder The holder of the subject <code>IOneToOneMapping</code>
+ * @param parent The parent container
+ * @param widgetFactory The factory used to create various common widgets
+ */
+ public OneToOneMappingComposite(PropertyValueModel<? extends OneToOneMapping> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+
+ super(subjectHolder, parent, widgetFactory);
+ }
+
+ @Override
+ protected void initializeOneToOneSection(Composite container) {
+ new TargetEntityComposite(this, container);
+ new FetchTypeComposite(this, container);
+ new OptionalComposite(this, container);
+ new CascadeComposite(this, buildCascadeHolder(), addSubPane(container, 5));
+ }
+
+
+} \ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/OptionalComposite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/OptionalComposite.java
new file mode 100644
index 0000000000..1ed91c256b
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/OptionalComposite.java
@@ -0,0 +1,102 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2010 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.ui.internal.details;
+
+import org.eclipse.jpt.common.ui.internal.JptCommonUiMessages;
+import org.eclipse.jpt.common.ui.internal.widgets.Pane;
+import org.eclipse.jpt.common.utility.internal.model.value.PropertyAspectAdapter;
+import org.eclipse.jpt.common.utility.internal.model.value.TransformationPropertyValueModel;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.common.utility.model.value.WritablePropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.OptionalMapping;
+import org.eclipse.jpt.jpa.ui.internal.JpaHelpContextIds;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * This composite simply shows a tri-state check box for the Optional option.
+ *
+ * @see BasicMapping
+ * @see BasicMappingComposite - A container of this pane
+ * @see ManyToOneMappingComposite - A container of this pane
+ * @see OneToOneMappingComposite - A container of this pane
+ *
+ * @version 1.0
+ * @since 2.0
+ */
+public class OptionalComposite extends Pane<OptionalMapping>
+{
+ /**
+ * Creates a new <code>OptionalComposite</code>.
+ *
+ * @param parentPane The parent container of this one
+ * @param parent The parent container
+ */
+ public OptionalComposite(Pane<? extends OptionalMapping> parentPane,
+ Composite parent)
+ {
+ super(parentPane, parent);
+ }
+
+ @Override
+ protected void initializeLayout(Composite container) {
+
+ addTriStateCheckBoxWithDefault(
+ addSubPane(container, 4),
+ JptUiDetailsMessages.BasicGeneralSection_optionalLabel,
+ buildOptionalHolder(),
+ buildOptionalStringHolder(),
+ JpaHelpContextIds.MAPPING_OPTIONAL
+ );
+ }
+ private WritablePropertyValueModel<Boolean> buildOptionalHolder() {
+ return new PropertyAspectAdapter<OptionalMapping, Boolean>(getSubjectHolder(), OptionalMapping.SPECIFIED_OPTIONAL_PROPERTY) {
+ @Override
+ protected Boolean buildValue_() {
+ return this.subject.getSpecifiedOptional();
+ }
+
+ @Override
+ protected void setValue_(Boolean value) {
+ this.subject.setSpecifiedOptional(value);
+ }
+ };
+ }
+
+ private PropertyValueModel<String> buildOptionalStringHolder() {
+ return new TransformationPropertyValueModel<Boolean, String>(buildDefaultOptionalHolder()) {
+ @Override
+ protected String transform(Boolean value) {
+ if (value != null) {
+ String defaultStringValue = value.booleanValue() ? JptCommonUiMessages.Boolean_True : JptCommonUiMessages.Boolean_False;
+ return NLS.bind(JptUiDetailsMessages.BasicGeneralSection_optionalLabelDefault, defaultStringValue);
+ }
+ return JptUiDetailsMessages.BasicGeneralSection_optionalLabel;
+ }
+ };
+ }
+
+
+ private PropertyValueModel<Boolean> buildDefaultOptionalHolder() {
+ return new PropertyAspectAdapter<OptionalMapping, Boolean>(
+ getSubjectHolder(),
+ OptionalMapping.SPECIFIED_OPTIONAL_PROPERTY,
+ OptionalMapping.DEFAULT_OPTIONAL_PROPERTY)
+ {
+ @Override
+ protected Boolean buildValue_() {
+ if (this.subject.getSpecifiedOptional() != null) {
+ return null;
+ }
+ return Boolean.valueOf(this.subject.isDefaultOptional());
+ }
+ };
+ }
+} \ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/OrderingComposite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/OrderingComposite.java
new file mode 100644
index 0000000000..661e8c2ce0
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/OrderingComposite.java
@@ -0,0 +1,115 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2010 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.ui.internal.details;
+
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.ui.internal.widgets.Pane;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.CollectionMapping;
+import org.eclipse.jpt.jpa.core.context.Orderable;
+import org.eclipse.jpt.jpa.ui.internal.JpaHelpContextIds;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * Here the layout of this pane:
+ * <pre>
+ * -----------------------------------------------------------------------------
+ * | - Ordering -------------------------------------------------------------- |
+ * | | | |
+ * | | o None | |
+ * | | | |
+ * | | o Primary Key | |
+ * | | | |
+ * | | o Custom | |
+ * | | ------------------------------------------------------------------- | |
+ * | | | I | | |
+ * | | ------------------------------------------------------------------- | |
+ * | ------------------------------------------------------------------------- |
+ * -----------------------------------------------------------------------------</pre>
+ *
+ * @see CollectionMapping
+ * @see ManyToManyMappingComposite - A container of this pane
+ * @see OneToManyMappingComposite - A container of this pane
+ *
+ * @version 3.0
+ * @since 1.0
+ */
+public class OrderingComposite extends AbstractOrderingComposite
+{
+ /**
+ * Creates a new <code>OrderingComposite</code>.
+ *
+ * @param parentPane The parent container of this one
+ * @param parent The parent container
+ */
+ public OrderingComposite(Pane<? extends CollectionMapping> parentPane,
+ Composite parent) {
+
+ super(parentPane, parent);
+ }
+
+ /**
+ * Creates a new <code>OrderingComposite</code>.
+ *
+ * @param subjectHolder The holder of the subject <code>IMultiRelationshipMapping</code>
+ * @param parent The parent container
+ * @param widgetFactory The factory used to create various common widgets
+ */
+ public OrderingComposite(PropertyValueModel<? extends CollectionMapping> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+
+ super(subjectHolder, parent, widgetFactory);
+ }
+
+ @Override
+ protected void initializeLayout(Composite container) {
+ PropertyValueModel<Orderable> orderableHolder = buildOrderableHolder();
+
+ container = addCollapsibleSection(
+ container,
+ JptUiDetailsMessages.OrderingComposite_orderingGroup
+ );
+
+ // No Ordering radio button
+ addRadioButton(
+ container,
+ JptUiDetailsMessages.OrderingComposite_none,
+ buildNoOrderingHolder(orderableHolder),
+ JpaHelpContextIds.MAPPING_ORDER_BY_NO_ORDERING
+ );
+
+ // Order by Primary Key radio button
+ addRadioButton(
+ container,
+ JptUiDetailsMessages.OrderingComposite_primaryKey,
+ buildPrimaryKeyOrderingHolder(orderableHolder),
+ JpaHelpContextIds.MAPPING_ORDER_BY_PRIMARY_KEY_ORDERING
+ );
+
+ // Custom Ordering radio button
+ addRadioButton(
+ container,
+ JptUiDetailsMessages.OrderingComposite_custom,
+ buildCustomOrderingHolder(orderableHolder),
+ JpaHelpContextIds.MAPPING_ORDER_BY_CUSTOM_ORDERING
+ );
+
+ // Custom Ordering text field
+ addText(
+ addSubPane(container, 0, 16),
+ buildSpecifiedOrderByHolder(orderableHolder),
+ JpaHelpContextIds.MAPPING_ORDER_BY,
+ buildCustomOrderingHolder(orderableHolder)
+ );
+ }
+
+
+} \ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/PersistentAttributeDetailsPage.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/PersistentAttributeDetailsPage.java
new file mode 100644
index 0000000000..9f23f7f924
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/PersistentAttributeDetailsPage.java
@@ -0,0 +1,182 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2009 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.ui.internal.details;
+
+import java.util.HashMap;
+import java.util.Map;
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.ui.internal.Tracing;
+import org.eclipse.jpt.common.ui.internal.util.ControlSwitcher;
+import org.eclipse.jpt.common.utility.Filter;
+import org.eclipse.jpt.common.utility.internal.Transformer;
+import org.eclipse.jpt.common.utility.internal.model.value.FilteringPropertyValueModel;
+import org.eclipse.jpt.common.utility.internal.model.value.PropertyAspectAdapter;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.common.utility.model.value.WritablePropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.AttributeMapping;
+import org.eclipse.jpt.jpa.core.context.PersistentAttribute;
+import org.eclipse.jpt.jpa.core.context.ReadOnlyPersistentAttribute;
+import org.eclipse.jpt.jpa.ui.details.JpaComposite;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.ui.part.PageBook;
+
+/**
+ * The abstract definition of the details page responsible to show the
+ * information for an persistent attribute.
+ *
+ * @see PersistentAttribute
+ *
+ * @version 2.2
+ * @since 1.0
+ */
+public abstract class PersistentAttributeDetailsPage<A extends ReadOnlyPersistentAttribute>
+ extends AbstractJpaDetailsPage<A>
+{
+ private Map<String, JpaComposite> mappingComposites;
+ private PageBook mappingPageBook;
+
+ private PropertyValueModel<AttributeMapping> mappingHolder;
+
+ /**
+ * Creates a new <code>PersistentAttributeDetailsPage</code>.
+ *
+ * @param parent The parent container
+ * @param widgetFactory The factory used to create various common widgets
+ */
+ protected PersistentAttributeDetailsPage(
+ Composite parent,
+ WidgetFactory widgetFactory) {
+
+ super(parent, widgetFactory);
+ }
+
+
+ @Override
+ protected void initialize() {
+ super.initialize();
+ this.mappingComposites = new HashMap<String, JpaComposite>();
+ }
+
+ protected PageBook buildMappingPageBook(Composite parent) {
+ this.mappingPageBook = new PageBook(parent, SWT.NONE);
+ this.mappingPageBook.showPage(this.addLabel(this.mappingPageBook, "")); //$NON-NLS-1$
+
+ GridData gridData = new GridData();
+ gridData.horizontalAlignment = SWT.FILL;
+ gridData.verticalAlignment = SWT.TOP;
+ gridData.grabExcessHorizontalSpace = true;
+ gridData.grabExcessVerticalSpace = true;
+
+ this.mappingPageBook.setLayoutData(gridData);
+
+ this.mappingHolder = this.buildMappingHolder();
+ new ControlSwitcher(this.mappingHolder, this.buildPaneTransformer(), this.mappingPageBook);
+
+ return this.mappingPageBook;
+ }
+
+ private Transformer<AttributeMapping, Control> buildPaneTransformer() {
+ return new Transformer<AttributeMapping, Control>() {
+ public Control transform(AttributeMapping attributeMapping) {
+ if (attributeMapping == null) {
+ return null;
+ }
+ return getMappingComposite(attributeMapping.getKey()).getControl();
+ }
+ };
+ }
+
+ protected JpaComposite getMappingComposite(String key) {
+ JpaComposite composite = this.mappingComposites.get(key);
+ if (composite != null) {
+ return composite;
+ }
+
+ composite = buildMappingComposite(this.mappingPageBook, key);
+
+ if (composite != null) {
+ this.mappingComposites.put(key, composite);
+ }
+
+ return composite;
+ }
+
+ protected JpaComposite buildMappingComposite(PageBook pageBook, String key) {
+ return getJpaPlatformUi().buildAttributeMappingComposite(
+ getSubject().getResourceType(),
+ key,
+ pageBook,
+ buildMappingHolder(key),
+ getWidgetFactory());
+ }
+
+ private PropertyValueModel<AttributeMapping> buildMappingHolder(final String key) {
+ return new FilteringPropertyValueModel<AttributeMapping>(
+ this.mappingHolder,
+ buildMappingFilter(key)
+ );
+ }
+
+ private Filter<AttributeMapping> buildMappingFilter(String mappingKey) {
+ return new MappingFilter(mappingKey);
+ }
+
+
+ private WritablePropertyValueModel<AttributeMapping> buildMappingHolder() {
+ return new PropertyAspectAdapter<A, AttributeMapping>(
+ getSubjectHolder(),
+ PersistentAttribute.DEFAULT_MAPPING_KEY_PROPERTY,
+ PersistentAttribute.MAPPING_PROPERTY)
+ {
+ @Override
+ protected AttributeMapping buildValue_() {
+ return this.subject.getMapping();
+ }
+ };
+ }
+
+ @Override
+ public void dispose() {
+ log(Tracing.UI_DETAILS_VIEW, "PersistentAttributeDetailsPage.dispose()"); //$NON-NLS-1$
+
+ for (JpaComposite mappingComposite : this.mappingComposites.values()) {
+ mappingComposite.dispose();
+ }
+ this.mappingComposites.clear();
+ super.dispose();
+ }
+
+ @Override
+ protected void log(String flag, String message) {
+ super.log(flag, message);
+
+ if (Tracing.UI_DETAILS_VIEW.equals(flag) &&
+ Tracing.booleanDebugOption(Tracing.UI_DETAILS_VIEW))
+ {
+ Tracing.log(message);
+ }
+ }
+
+ private class MappingFilter implements Filter<AttributeMapping> {
+ private String mappingKey;
+
+ MappingFilter(String mappingKey) {
+ super();
+ this.mappingKey = mappingKey;
+ }
+
+ public boolean accept(AttributeMapping mapping) {
+ return (mapping == null || this.mappingKey == null) || this.mappingKey.equals(mapping.getKey());
+ }
+ }
+} \ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/PersistentAttributeMapAsComposite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/PersistentAttributeMapAsComposite.java
new file mode 100644
index 0000000000..01ce1c600c
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/PersistentAttributeMapAsComposite.java
@@ -0,0 +1,134 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2009 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.ui.internal.details;
+
+import java.util.Collection;
+import java.util.Iterator;
+import org.eclipse.jpt.common.ui.internal.widgets.Pane;
+import org.eclipse.jpt.jpa.core.MappingKeys;
+import org.eclipse.jpt.jpa.core.context.PersistentAttribute;
+import org.eclipse.jpt.jpa.core.context.ReadOnlyPersistentAttribute;
+import org.eclipse.jpt.jpa.ui.details.DefaultMappingUiDefinition;
+import org.eclipse.jpt.jpa.ui.details.MappingUiDefinition;
+import org.eclipse.jpt.jpa.ui.internal.details.orm.UnsupportedOrmMappingUiDefinition;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * This "Map As" composite is responsible for showing the mapping name and
+ * mapping type for an attribute.
+ *
+ * @see JavaPersistentAttributeMapAsComposite
+ * @see OrmPersistentAttributeMapAsComposite
+ */
+public class PersistentAttributeMapAsComposite
+ extends MapAsComposite<ReadOnlyPersistentAttribute>
+{
+ /**
+ * Creates a new <code>PersistentAttributeMapAsComposite</code>.
+ *
+ * @param parentPane The parent pane of this one
+ * @param parent The parent container
+ */
+ public PersistentAttributeMapAsComposite(
+ Pane<? extends ReadOnlyPersistentAttribute> parentPane,
+ Composite parent) {
+
+ super(parentPane, parent);
+ }
+
+
+ @Override
+ protected String getMappingKey() {
+ return getSubject().getMappingKey();
+ }
+
+ @Override
+ protected MappingChangeHandler buildMappingChangeHandler() {
+ return new MappingChangeHandler() {
+
+ public String getLabelText() {
+ String mappingKey = getMappingKey();
+
+ if (mappingKey != MappingKeys.NULL_ATTRIBUTE_MAPPING_KEY) {
+ return JptUiDetailsMessages.MapAsComposite_mappedAttributeText;
+ }
+ if (getSubject().isVirtual()) {
+ return JptUiDetailsMessages.MapAsComposite_virtualAttributeText;
+ }
+
+ return JptUiDetailsMessages.MapAsComposite_unmappedAttributeText;
+ }
+
+ public String getMappingText() {
+ String mappingKey = getMappingKey();
+
+ if (mappingKey == null) {
+ return JptUiDetailsMessages.MapAsComposite_changeMappingType;
+ }
+
+ return getSubject().getMapping().isDefault() ?
+ getDefaultDefinition(getSubject().getDefaultMappingKey()).getLinkLabel() :
+ getMappingUiDefinition(mappingKey).getLinkLabel();
+ }
+
+ public void morphMapping(MappingUiDefinition definition) {
+ ((PersistentAttribute) getSubject()).setMappingKey(definition.getKey());
+ }
+
+ public String getName() {
+ return getSubject().getName();
+ }
+
+ public Iterator<? extends MappingUiDefinition<? extends ReadOnlyPersistentAttribute, ?>> mappingUiDefinitions() {
+ return attributeMappingUiDefinitions();
+ }
+ };
+ }
+
+ protected Iterator<? extends MappingUiDefinition<? extends ReadOnlyPersistentAttribute, ?>> attributeMappingUiDefinitions() {
+ return getJpaPlatformUi().attributeMappingUiDefinitions(getSubject().getResourceType());
+ }
+
+ @Override
+ protected DefaultMappingUiDefinition getDefaultDefinition() {
+ return getDefaultDefinition(getSubject().getDefaultMappingKey());
+ }
+
+ @Override
+ protected DefaultMappingUiDefinition getDefaultDefinition(String mappingKey) {
+ return getJpaPlatformUi().getDefaultAttributeMappingUiDefinition(getSubject().getMapping().getResourceType(), mappingKey);
+ }
+
+ @Override
+ protected MappingUiDefinition getMappingUiDefinition(String mappingKey) {
+ MappingUiDefinition definition = super.getMappingUiDefinition(mappingKey);
+ return (definition != null) ? definition : UnsupportedOrmMappingUiDefinition.instance();
+ }
+
+ @Override
+ protected void addPropertyNames(Collection<String> propertyNames) {
+ super.addPropertyNames(propertyNames);
+ propertyNames.add(ReadOnlyPersistentAttribute.DEFAULT_MAPPING_KEY_PROPERTY);
+ propertyNames.add(ReadOnlyPersistentAttribute.MAPPING_PROPERTY);
+ propertyNames.add(ReadOnlyPersistentAttribute.NAME_PROPERTY);
+ }
+
+ @Override
+ protected void propertyChanged(String propertyName) {
+ super.propertyChanged(propertyName);
+
+ if (propertyName == ReadOnlyPersistentAttribute.MAPPING_PROPERTY ||
+ propertyName == ReadOnlyPersistentAttribute.DEFAULT_MAPPING_KEY_PROPERTY ||
+ propertyName == ReadOnlyPersistentAttribute.NAME_PROPERTY) {
+
+ updateDescription();
+ }
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/PersistentTypeDetailsPage.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/PersistentTypeDetailsPage.java
new file mode 100644
index 0000000000..e9402d8a6a
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/PersistentTypeDetailsPage.java
@@ -0,0 +1,169 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2009 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.ui.internal.details;
+
+import java.util.HashMap;
+import java.util.Map;
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.ui.internal.Tracing;
+import org.eclipse.jpt.common.ui.internal.util.ControlSwitcher;
+import org.eclipse.jpt.common.utility.Filter;
+import org.eclipse.jpt.common.utility.internal.Transformer;
+import org.eclipse.jpt.common.utility.internal.model.value.FilteringPropertyValueModel;
+import org.eclipse.jpt.common.utility.internal.model.value.PropertyAspectAdapter;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.PersistentType;
+import org.eclipse.jpt.jpa.core.context.TypeMapping;
+import org.eclipse.jpt.jpa.ui.details.JpaComposite;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.ui.part.PageBook;
+
+/**
+ * The abstract definition of the details page responsible to show the
+ * information for an persistent type.
+ *
+ * @see PersistentType
+ *
+ * @version 2.2
+ * @since 1.0
+ */
+@SuppressWarnings("nls")
+public class PersistentTypeDetailsPage extends AbstractJpaDetailsPage<PersistentType>
+{
+ private Map<String, JpaComposite> mappingComposites;
+ private PageBook mappingPageBook;
+ private PropertyValueModel<TypeMapping> mappingHolder;
+
+ /**
+ * Creates a new <code>PersistentTypeDetailsPage</code>.
+ *
+ * @param parent The parent container
+ * @param widgetFactory The factory used to create various common widgets
+ */
+ public PersistentTypeDetailsPage(Composite parent,
+ WidgetFactory widgetFactory) {
+
+ super(parent, widgetFactory);
+ }
+
+ @Override
+ protected void initialize() {
+ super.initialize();
+ this.mappingComposites = new HashMap<String, JpaComposite>();
+ }
+
+ @Override
+ protected void initializeLayout(Composite container) {
+
+ // Map As composite
+ new PersistentTypeMapAsComposite(
+ this,
+ addSubPane(container, 0, 0, 5, 0)
+ );
+
+ // Type properties page
+ buildMappingPageBook(container);
+ }
+
+ protected PageBook buildMappingPageBook(Composite parent) {
+
+ this.mappingPageBook = new PageBook(parent, SWT.NONE);
+ this.mappingPageBook.showPage(this.addLabel(this.mappingPageBook, ""));
+
+ GridData gridData = new GridData();
+ gridData.horizontalAlignment = SWT.FILL;
+ gridData.verticalAlignment = SWT.TOP;
+ gridData.grabExcessHorizontalSpace = true;
+ gridData.grabExcessVerticalSpace = true;
+
+ this.mappingPageBook.setLayoutData(gridData);
+
+ this.mappingHolder = this.buildMappingHolder();
+ new ControlSwitcher(this.mappingHolder, this.buildPaneTransformer(), this.mappingPageBook);
+
+ return this.mappingPageBook;
+ }
+
+ private Transformer<TypeMapping, Control> buildPaneTransformer() {
+ return new Transformer<TypeMapping, Control>() {
+ public Control transform(TypeMapping typeMapping) {
+ if (typeMapping == null) {
+ return null;
+ }
+ return getMappingComposite(typeMapping.getKey()).getControl();
+ }
+ };
+ }
+
+ protected PropertyValueModel<TypeMapping> buildMappingHolder(String key) {
+ return new FilteringPropertyValueModel<TypeMapping>(
+ this.mappingHolder,
+ buildMappingFilter(key)
+ );
+ }
+
+ private PropertyAspectAdapter<PersistentType, TypeMapping> buildMappingHolder() {
+ return new PropertyAspectAdapter<PersistentType, TypeMapping>(getSubjectHolder(), PersistentType.MAPPING_PROPERTY) {
+ @Override
+ protected TypeMapping buildValue_() {
+ return this.subject.getMapping();
+ }
+ };
+ }
+
+ private Filter<TypeMapping> buildMappingFilter(final String key) {
+ return new Filter<TypeMapping>() {
+ public boolean accept(TypeMapping mapping) {
+ return (mapping == null || key == null) || key.equals(mapping.getKey());
+ }
+ };
+ }
+
+
+ private JpaComposite getMappingComposite(String key) {
+ JpaComposite mappingComposite = this.mappingComposites.get(key);
+ if (mappingComposite != null) {
+ return mappingComposite;
+ }
+
+ mappingComposite = buildMappingComposite(this.mappingPageBook, key);
+
+ if (mappingComposite != null) {
+ this.mappingComposites.put(key, mappingComposite);
+ }
+
+ return mappingComposite;
+ }
+
+ protected JpaComposite buildMappingComposite(PageBook pageBook, String key) {
+ return getJpaPlatformUi().
+ buildTypeMappingComposite(
+ getSubject().getResourceType(),
+ key,
+ pageBook,
+ buildMappingHolder(key),
+ getWidgetFactory());
+ }
+
+ @Override
+ public void dispose() {
+ log(Tracing.UI_DETAILS_VIEW, "PersistentTypeDetailsPage.dispose()");
+
+ for (JpaComposite mappingComposite : this.mappingComposites.values()) {
+ mappingComposite.dispose();
+ }
+ this.mappingComposites.clear();
+ super.dispose();
+ }
+
+} \ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/PersistentTypeMapAsComposite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/PersistentTypeMapAsComposite.java
new file mode 100644
index 0000000000..c1a29c5066
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/PersistentTypeMapAsComposite.java
@@ -0,0 +1,127 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 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.ui.internal.details;
+
+import java.util.Collection;
+import java.util.Iterator;
+import org.eclipse.jpt.common.ui.internal.widgets.Pane;
+import org.eclipse.jpt.jpa.core.context.PersistentType;
+import org.eclipse.jpt.jpa.ui.details.DefaultMappingUiDefinition;
+import org.eclipse.jpt.jpa.ui.details.MappingUiDefinition;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * This "Map As" composite is responsible for showing the mapping name and
+ * mapping type for a type.
+ *
+ * @see JavaPersistentTypeMapAsComposite
+ * @see OrmPersistentTypeMapAsComposite
+ *
+ * @version 2.2
+ * @since 2.0
+ */
+public class PersistentTypeMapAsComposite
+ extends MapAsComposite<PersistentType>
+{
+ /**
+ * Creates a new <code>PersistentTypeMapAsComposite</code>.
+ *
+ * @param parentPane The parent pane of this one
+ * @param parent The parent container
+ */
+ public PersistentTypeMapAsComposite(
+ Pane<? extends PersistentType> parentPane,
+ Composite parent) {
+
+ super(parentPane, parent);
+ }
+
+
+ @Override
+ protected String getMappingKey() {
+ return getSubject().getMappingKey();
+ }
+
+ @Override
+ protected MappingChangeHandler buildMappingChangeHandler() {
+ return new MappingChangeHandler() {
+
+ public String getLabelText() {
+ String mappingKey = getMappingKey();
+
+ if (mappingKey != null) {
+ return JptUiDetailsMessages.MapAsComposite_mappedTypeText;
+ }
+
+ return JptUiDetailsMessages.MapAsComposite_unmappedTypeText;
+ }
+
+ public String getMappingText() {
+ String mappingKey = getMappingKey();
+
+ if (mappingKey == null) {
+ return JptUiDetailsMessages.MapAsComposite_changeMappingType;
+ }
+
+ return getMappingUiDefinition(mappingKey).getLinkLabel();
+ }
+
+ public void morphMapping(MappingUiDefinition definition) {
+ getSubject().setMappingKey(definition.getKey());
+ }
+
+ public String getName() {
+ return getSubject().getSimpleName();
+ }
+
+ public Iterator<? extends MappingUiDefinition<? extends PersistentType, ?>> mappingUiDefinitions() {
+ return typeMappingUiDefinitions();
+ }
+ };
+ }
+
+ /**
+ * Retrieves the list of definitions that are registered with the JPT plugin.
+ *
+ * @return The supported types of mapping
+ */
+ protected Iterator<? extends MappingUiDefinition<? extends PersistentType, ?>> typeMappingUiDefinitions() {
+ return getJpaPlatformUi().typeMappingUiDefinitions(getSubject().getResourceType());
+ }
+
+ @Override
+ protected DefaultMappingUiDefinition getDefaultDefinition() {
+ return getJpaPlatformUi().getDefaultTypeMappingUiDefinition(getSubject().getResourceType());
+ }
+
+ @Override
+ protected DefaultMappingUiDefinition getDefaultDefinition(String mappingKey) {
+ return getDefaultDefinition();
+ }
+
+ @Override
+ protected void addPropertyNames(Collection<String> propertyNames) {
+ super.addPropertyNames(propertyNames);
+ propertyNames.add(PersistentType.MAPPING_PROPERTY);
+ propertyNames.add(PersistentType.NAME_PROPERTY);
+ }
+
+ @Override
+ protected void propertyChanged(String propertyName) {
+ super.propertyChanged(propertyName);
+
+ if (propertyName == PersistentType.MAPPING_PROPERTY ||
+ propertyName == PersistentType.NAME_PROPERTY) {
+
+ updateDescription();
+ }
+ }
+
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/PrimaryKeyJoinColumnDialog.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/PrimaryKeyJoinColumnDialog.java
new file mode 100644
index 0000000000..960b9843fb
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/PrimaryKeyJoinColumnDialog.java
@@ -0,0 +1,108 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2009 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.ui.internal.details;
+
+import org.eclipse.jpt.common.ui.internal.widgets.DialogPane;
+import org.eclipse.jpt.jpa.core.context.Entity;
+import org.eclipse.jpt.jpa.core.context.PrimaryKeyJoinColumn;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Shell;
+
+/**
+ * This dialog is used to either create or edit a primary key join column that
+ * is located on an entity.
+ *
+ * @see PrimaryKeyJoinColumn
+ * @see Entity
+ * @see PrimaryKeyJoinColumnStateObject
+ * @see BaseJoinColumnDialogPane
+ *
+ * @version 2.0
+ * @since 2.0
+ */
+public class PrimaryKeyJoinColumnDialog extends BaseJoinColumnDialog<PrimaryKeyJoinColumnStateObject> {
+
+ /**
+ * Creates a new <code>PrimaryKeyJoinColumnDialog</code>.
+ *
+ * @param parent The parent shell
+ * @param entity The owner of the join column to create or where it is
+ * located
+ * @param joinColumn Either the join column to edit or <code>null</code> if
+ * this state object is used to create a new one
+ */
+ public PrimaryKeyJoinColumnDialog(Shell parent,
+ Entity entity,
+ PrimaryKeyJoinColumn joinColumn) {
+
+ super(parent, entity, joinColumn);
+ }
+
+ /*
+ * (non-Javadoc)
+ */
+ @Override
+ protected DialogPane<PrimaryKeyJoinColumnStateObject> buildLayout(Composite container) {
+ return new BaseJoinColumnDialogPane<PrimaryKeyJoinColumnStateObject>(
+ getSubjectHolder(),
+ container
+ );
+ }
+
+ /*
+ * (non-Javadoc)
+ */
+ @Override
+ protected PrimaryKeyJoinColumnStateObject buildStateObject() {
+ return new PrimaryKeyJoinColumnStateObject(getOwner(), getJoinColumn());
+ }
+
+ /*
+ * (non-Javadoc)
+ */
+ @Override
+ protected String getDescriptionTitle() {
+
+ if (getJoinColumn() == null) {
+ return JptUiDetailsMessages.PrimaryKeyJoinColumnDialog_addDescriptionTitle;
+ }
+
+ return JptUiDetailsMessages.PrimaryKeyJoinColumnDialog_editDescriptionTitle;
+ }
+
+ /*
+ * (non-Javadoc)
+ */
+ @Override
+ public PrimaryKeyJoinColumn getJoinColumn() {
+ return (PrimaryKeyJoinColumn) super.getJoinColumn();
+ }
+
+ /*
+ * (non-Javadoc)
+ */
+ @Override
+ protected Entity getOwner() {
+ return (Entity) super.getOwner();
+ }
+
+ /*
+ * (non-Javadoc)
+ */
+ @Override
+ protected String getTitle() {
+
+ if (getJoinColumn() == null) {
+ return JptUiDetailsMessages.PrimaryKeyJoinColumnDialog_addTitle;
+ }
+
+ return JptUiDetailsMessages.PrimaryKeyJoinColumnDialog_editTitle;
+ }
+} \ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/PrimaryKeyJoinColumnInSecondaryTableDialog.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/PrimaryKeyJoinColumnInSecondaryTableDialog.java
new file mode 100644
index 0000000000..257bc5f1ee
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/PrimaryKeyJoinColumnInSecondaryTableDialog.java
@@ -0,0 +1,111 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 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.ui.internal.details;
+
+import org.eclipse.jpt.common.ui.internal.widgets.DialogPane;
+import org.eclipse.jpt.jpa.core.context.PrimaryKeyJoinColumn;
+import org.eclipse.jpt.jpa.core.context.SecondaryTable;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Shell;
+
+/**
+ * This dialog is used to either create or edit a primary key joing column that
+ * is within a secondary table.
+ *
+ * @see PrimaryKeyJoinColumn
+ * @see SecondaryTable
+ * @see BaseJoinColumnDialogPane
+ * @see PrimaryKeyJoinColumnInSecondaryTableStateObject
+ *
+ * @version 2.0
+ * @since 2.0
+ */
+public class PrimaryKeyJoinColumnInSecondaryTableDialog extends BaseJoinColumnDialog<PrimaryKeyJoinColumnInSecondaryTableStateObject> {
+
+ /**
+ * Creates a new <code>PrimaryKeyJoinColumnInSecondaryTableDialog</code>.
+ *
+ * @param parent The parent shell
+ * @param secondaryTable The owner of the join column to create or where it
+ * is located
+ * @param joinColumn Either the join column to edit or <code>null</code> if
+ * this state object is used to create a new one
+ */
+ public PrimaryKeyJoinColumnInSecondaryTableDialog(Shell parent,
+ SecondaryTable secondaryTable,
+ PrimaryKeyJoinColumn joinColumn) {
+
+ super(parent, secondaryTable, joinColumn);
+ }
+
+ /*
+ * (non-Javadoc)
+ */
+ @Override
+ protected DialogPane<PrimaryKeyJoinColumnInSecondaryTableStateObject> buildLayout(Composite container) {
+ return new BaseJoinColumnDialogPane<PrimaryKeyJoinColumnInSecondaryTableStateObject>(
+ getSubjectHolder(),
+ container
+ );
+ }
+
+ /*
+ * (non-Javadoc)
+ */
+ @Override
+ protected PrimaryKeyJoinColumnInSecondaryTableStateObject buildStateObject() {
+ return new PrimaryKeyJoinColumnInSecondaryTableStateObject(
+ getOwner(),
+ getJoinColumn()
+ );
+ }
+
+ /*
+ * (non-Javadoc)
+ */
+ @Override
+ protected String getDescriptionTitle() {
+
+ if (getJoinColumn() == null) {
+ return JptUiDetailsMessages.PrimaryKeyJoinColumnInSecondaryTableDialog_addDescriptionTitle;
+ }
+
+ return JptUiDetailsMessages.PrimaryKeyJoinColumnInSecondaryTableDialog_editDescriptionTitle;
+ }
+
+ /*
+ * (non-Javadoc)
+ */
+ @Override
+ public PrimaryKeyJoinColumn getJoinColumn() {
+ return (PrimaryKeyJoinColumn) super.getJoinColumn();
+ }
+
+ /*
+ * (non-Javadoc)
+ */
+ @Override
+ protected SecondaryTable getOwner() {
+ return (SecondaryTable) super.getOwner();
+ }
+
+ /*
+ * (non-Javadoc)
+ */
+ @Override
+ protected String getTitle() {
+
+ if (getJoinColumn() == null) {
+ return JptUiDetailsMessages.PrimaryKeyJoinColumnInSecondaryTableDialog_addTitle;
+ }
+
+ return JptUiDetailsMessages.PrimaryKeyJoinColumnInSecondaryTableDialog_editTitle;
+ }
+} \ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/PrimaryKeyJoinColumnInSecondaryTableStateObject.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/PrimaryKeyJoinColumnInSecondaryTableStateObject.java
new file mode 100644
index 0000000000..21d1b0a915
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/PrimaryKeyJoinColumnInSecondaryTableStateObject.java
@@ -0,0 +1,99 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2009 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.ui.internal.details;
+
+import java.util.ListIterator;
+import org.eclipse.jpt.common.utility.internal.iterators.SingleElementListIterator;
+import org.eclipse.jpt.jpa.core.context.PrimaryKeyJoinColumn;
+import org.eclipse.jpt.jpa.core.context.SecondaryTable;
+import org.eclipse.jpt.jpa.db.Table;
+
+/**
+ * The state object used to create or edit a primary key join column on an
+ * secondary table.
+ *
+ * @see PrimaryKeyJoinColumn
+ * @see SecondaryTable
+ * @see PrimaryKeyJoinColumnInSecondaryTableDialog
+ *
+ * @version 2.0
+ * @since 2.0
+ */
+public class PrimaryKeyJoinColumnInSecondaryTableStateObject extends BaseJoinColumnStateObject
+{
+ /**
+ * Creates a new <code>PrimaryKeyJoinColumnInSecondaryTableStateObject</code>.
+ *
+ * @param secondaryTable The owner of the join column to create or where it
+ * is located
+ * @param joinColumn The join column to edit or <code>null</code> if it is to
+ * create a new one
+ */
+ public PrimaryKeyJoinColumnInSecondaryTableStateObject(SecondaryTable secondaryTable,
+ PrimaryKeyJoinColumn joinColumn) {
+
+ super(secondaryTable, joinColumn);
+ }
+
+ /*
+ * (non-Javadoc)
+ */
+ @Override
+ public String getDefaultTable() {
+ return null;
+ }
+
+ /*
+ * (non-Javadoc)
+ */
+ @Override
+ public PrimaryKeyJoinColumn getJoinColumn() {
+ return (PrimaryKeyJoinColumn) super.getJoinColumn();
+ }
+
+ /*
+ * (non-Javadoc)
+ */
+ @Override
+ public Table getNameTable() {
+ return getOwner().getDbTable();
+ }
+
+ /*
+ * (non-Javadoc)
+ */
+ @Override
+ public SecondaryTable getOwner() {
+ return (SecondaryTable) super.getOwner();
+ }
+
+ /* (non-Javadoc)
+ */
+ @Override
+ public Table getReferencedNameTable() {
+ return getOwner().getParent().getPrimaryDbTable();
+ }
+
+ /*
+ * (non-Javadoc)
+ */
+ @Override
+ protected String getInitialTable() {
+ return getOwner().getName();
+ }
+
+ /*
+ * (non-Javadoc)
+ */
+ @Override
+ public ListIterator<String> tables() {
+ return new SingleElementListIterator<String>(getInitialTable());
+ }
+} \ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/PrimaryKeyJoinColumnJoiningStrategyPane.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/PrimaryKeyJoinColumnJoiningStrategyPane.java
new file mode 100644
index 0000000000..acb1c3337e
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/PrimaryKeyJoinColumnJoiningStrategyPane.java
@@ -0,0 +1,86 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 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.ui.internal.details;
+
+import org.eclipse.jpt.common.ui.internal.widgets.Pane;
+import org.eclipse.jpt.common.utility.internal.model.value.PropertyAspectAdapter;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.common.utility.model.value.WritablePropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.PrimaryKeyJoinColumnRelationship;
+import org.eclipse.jpt.jpa.core.context.PrimaryKeyJoinColumnRelationshipStrategy;
+import org.eclipse.jpt.jpa.core.context.ReadOnlyRelationship;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * Here is the layout of this pane:
+ * <pre>
+ * -----------------------------------------------------------------------------
+ * | o Primary key join columns ______________________________________________ |
+ * | | (no actual content) | |
+ * | ------------------------------------------------------------------------- |
+ * -----------------------------------------------------------------------------</pre>
+ *
+ * @see {@link PrimaryKeyJoinColumnRelationship}
+ * @see {@link PrimaryKeyJoinColumnRelationshipStrategy}
+ * @see {@link OneToOneJoiningStrategyPane}
+ *
+ * @version 2.3
+ * @since 2.1
+ */
+public class PrimaryKeyJoinColumnJoiningStrategyPane
+ extends AbstractJoiningStrategyPane
+ <PrimaryKeyJoinColumnRelationship, PrimaryKeyJoinColumnRelationshipStrategy>
+{
+ public PrimaryKeyJoinColumnJoiningStrategyPane(
+ Pane<? extends PrimaryKeyJoinColumnRelationship> parentPane,
+ Composite parent) {
+ super(parentPane, parent);
+ }
+
+ @Override
+ protected WritablePropertyValueModel<Boolean> buildUsesStrategyHolder() {
+ return buildUsesPrimaryKeyJoinColumnJoiningStrategyHolder(getSubjectHolder());
+ }
+
+ protected PropertyValueModel<PrimaryKeyJoinColumnRelationshipStrategy> buildPrimaryKeyJoinColumnJoiningStrategyHolder() {
+ return new PropertyAspectAdapter
+ <PrimaryKeyJoinColumnRelationship, PrimaryKeyJoinColumnRelationshipStrategy>(
+ getSubjectHolder()) {
+ @Override
+ protected PrimaryKeyJoinColumnRelationshipStrategy buildValue_() {
+ return this.subject.getPrimaryKeyJoinColumnStrategy();
+ }
+ };
+ }
+
+ @Override
+ protected Composite buildStrategyDetailsComposite(Composite parent) {
+ return null;
+ }
+
+ public static WritablePropertyValueModel<Boolean> buildUsesPrimaryKeyJoinColumnJoiningStrategyHolder(PropertyValueModel<? extends PrimaryKeyJoinColumnRelationship> subjectHolder) {
+ return new PropertyAspectAdapter<PrimaryKeyJoinColumnRelationship, Boolean>(
+ subjectHolder, ReadOnlyRelationship.STRATEGY_PROPERTY) {
+ @Override
+ protected Boolean buildValue() {
+ return (this.subject == null) ? Boolean.FALSE :
+ Boolean.valueOf(this.subject.strategyIsPrimaryKeyJoinColumn());
+ }
+
+ @Override
+ protected void setValue_(Boolean value) {
+ if (value == Boolean.TRUE) {
+ this.subject.setStrategyToPrimaryKeyJoinColumn();
+ }
+ //value == FALSE - selection of another radio button causes this strategy to get unset
+ }
+ };
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/PrimaryKeyJoinColumnStateObject.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/PrimaryKeyJoinColumnStateObject.java
new file mode 100644
index 0000000000..4f1e8f9b8a
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/PrimaryKeyJoinColumnStateObject.java
@@ -0,0 +1,101 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2009 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.ui.internal.details;
+
+import java.util.ListIterator;
+import org.eclipse.jpt.common.utility.internal.iterators.SingleElementListIterator;
+import org.eclipse.jpt.jpa.core.context.Entity;
+import org.eclipse.jpt.jpa.core.context.PrimaryKeyJoinColumn;
+import org.eclipse.jpt.jpa.db.Table;
+
+/**
+ * The state object used to create or edit a primary key join column on an
+ * entity.
+ *
+ * @see PrimaryKeyJoinColumn
+ * @see Entity
+ * @see PrimaryKeyJoinColumnDialog
+ * @see PrimaryKeyJoinColumnDialogPane
+ *
+ * @version 2.0
+ * @since 2.0
+ */
+public class PrimaryKeyJoinColumnStateObject extends BaseJoinColumnStateObject
+{
+ /**
+ * Creates a new <code>PrimaryKeyJoinColumnStateObject</code>.
+ *
+ * @param entity The owner of the join column to create or where it is
+ * located
+ * @param joinColumn The join column to edit or <code>null</code> if this is
+ * used to create a new one
+ */
+ public PrimaryKeyJoinColumnStateObject(Entity entity,
+ PrimaryKeyJoinColumn joinColumn) {
+ super(entity, joinColumn);
+ }
+
+ /*
+ * (non-Javadoc)
+ */
+ @Override
+ public String getDefaultTable() {
+ return null;
+ }
+
+ /*
+ * (non-Javadoc)
+ */
+ @Override
+ public PrimaryKeyJoinColumn getJoinColumn() {
+ return (PrimaryKeyJoinColumn) super.getJoinColumn();
+ }
+
+ /*
+ * (non-Javadoc)
+ */
+ @Override
+ public Table getNameTable() {
+ return getOwner().getPrimaryDbTable();
+ }
+
+ /*
+ * (non-Javadoc)
+ */
+ @Override
+ public Entity getOwner() {
+ return (Entity) super.getOwner();
+ }
+
+ /*
+ * (non-Javadoc)
+ */
+ @Override
+ public Table getReferencedNameTable() {
+ Entity parentEntity = getOwner().getParentEntity();
+ return (parentEntity == null) ? getOwner().getPrimaryDbTable() : parentEntity.getPrimaryDbTable();
+ }
+
+ /*
+ * (non-Javadoc)
+ */
+ @Override
+ protected String getInitialTable() {
+ return getOwner().getPrimaryTableName();
+ }
+
+ /*
+ * (non-Javadoc)
+ */
+ @Override
+ public ListIterator<String> tables() {
+ return new SingleElementListIterator<String>(getInitialTable());
+ }
+} \ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/PrimaryKeyJoinColumnsInSecondaryTableComposite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/PrimaryKeyJoinColumnsInSecondaryTableComposite.java
new file mode 100644
index 0000000000..26b2fd287d
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/PrimaryKeyJoinColumnsInSecondaryTableComposite.java
@@ -0,0 +1,414 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2010 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.ui.internal.details;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.ListIterator;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.ui.internal.util.PaneEnabler;
+import org.eclipse.jpt.common.ui.internal.widgets.AddRemoveListPane;
+import org.eclipse.jpt.common.ui.internal.widgets.AddRemovePane;
+import org.eclipse.jpt.common.ui.internal.widgets.Pane;
+import org.eclipse.jpt.common.ui.internal.widgets.PostExecution;
+import org.eclipse.jpt.common.utility.internal.iterators.SuperListIteratorWrapper;
+import org.eclipse.jpt.common.utility.internal.model.value.CompositeListValueModel;
+import org.eclipse.jpt.common.utility.internal.model.value.ItemPropertyListValueModelAdapter;
+import org.eclipse.jpt.common.utility.internal.model.value.ListAspectAdapter;
+import org.eclipse.jpt.common.utility.internal.model.value.ListPropertyValueModelAdapter;
+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.SimplePropertyValueModel;
+import org.eclipse.jpt.common.utility.internal.model.value.TransformationPropertyValueModel;
+import org.eclipse.jpt.common.utility.internal.model.value.swing.ObjectListSelectionModel;
+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.core.context.PrimaryKeyJoinColumn;
+import org.eclipse.jpt.jpa.core.context.ReadOnlyBaseJoinColumn;
+import org.eclipse.jpt.jpa.core.context.ReadOnlyNamedColumn;
+import org.eclipse.jpt.jpa.core.context.ReadOnlyPrimaryKeyJoinColumn;
+import org.eclipse.jpt.jpa.core.context.ReadOnlySecondaryTable;
+import org.eclipse.jpt.jpa.core.context.SecondaryTable;
+import org.eclipse.jpt.jpa.ui.internal.JpaHelpContextIds;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Group;
+
+/**
+ * Here the layout of this pane:
+ * <pre>
+ * -----------------------------------------------------------------------------
+ * | - Join Columns ---------------------------------------------------------- |
+ * | | | |
+ * | | x Override Default | |
+ * | | | |
+ * | | --------------------------------------------------------------------- | |
+ * | | | | | |
+ * | | | AddRemoveListPane | | |
+ * | | | | | |
+ * | | --------------------------------------------------------------------- | |
+ * | ------------------------------------------------------------------------- |
+ * -----------------------------------------------------------------------------</pre>
+ *
+ * @see SecondaryTable
+ * @see AddRemoveListPane
+ *
+ * @version 2.0
+ * @since 1.0
+ */
+public class PrimaryKeyJoinColumnsInSecondaryTableComposite extends Pane<ReadOnlySecondaryTable>
+{
+ private WritablePropertyValueModel<ReadOnlyPrimaryKeyJoinColumn> joinColumnHolder;
+
+ /**
+ * Creates a new <code>PrimaryKeyJoinColumnsInSecondaryTableComposite</code>.
+ *
+ * @param parentPane The parent container of this one
+ * @param subjectHolder The holder of this pane's subject
+ * @param parent The parent container
+ */
+ public PrimaryKeyJoinColumnsInSecondaryTableComposite(Pane<?> parentPane,
+ PropertyValueModel<? extends ReadOnlySecondaryTable> subjectHolder,
+ Composite parent) {
+
+ super(parentPane, subjectHolder, parent);
+ }
+
+ /**
+ * Creates a new <code>PrimaryKeyJoinColumnsInSecondaryTableComposite</code>.
+ *
+ * @param subjectHolder The holder of the subject <code>ISecondaryTable</code>
+ * @param parent The parent container
+ * @param widgetFactory The factory used to create various common widgets
+ */
+ public PrimaryKeyJoinColumnsInSecondaryTableComposite(PropertyValueModel<? extends ReadOnlySecondaryTable> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+
+ super(subjectHolder, parent, widgetFactory);
+ }
+
+ void addJoinColumn(PrimaryKeyJoinColumnInSecondaryTableStateObject stateObject) {
+
+ SecondaryTable secondaryTable = stateObject.getOwner();
+ int index = secondaryTable.specifiedPrimaryKeyJoinColumnsSize();
+
+ PrimaryKeyJoinColumn joinColumn = secondaryTable.addSpecifiedPrimaryKeyJoinColumn(index);
+ stateObject.updateJoinColumn(joinColumn);
+ }
+
+ void addPrimaryKeyJoinColumn() {
+
+ PrimaryKeyJoinColumnInSecondaryTableDialog dialog =
+ new PrimaryKeyJoinColumnInSecondaryTableDialog(getShell(), (SecondaryTable) getSubject(), null);
+
+ dialog.openDialog(buildAddPrimaryKeyJoinColumnPostExecution());
+ }
+
+ private PostExecution<PrimaryKeyJoinColumnInSecondaryTableDialog> buildAddPrimaryKeyJoinColumnPostExecution() {
+ return new PostExecution<PrimaryKeyJoinColumnInSecondaryTableDialog>() {
+ public void execute(PrimaryKeyJoinColumnInSecondaryTableDialog dialog) {
+ if (dialog.wasConfirmed()) {
+ addJoinColumn(dialog.getSubject());
+ }
+ }
+ };
+ }
+
+ private PropertyValueModel<Boolean> buildControlBooleanHolder() {
+ return new TransformationPropertyValueModel<ReadOnlySecondaryTable, Boolean>(getSubjectHolder()) {
+ @Override
+ protected Boolean transform(ReadOnlySecondaryTable value) {
+ if (value == null) {
+ return Boolean.FALSE;
+ }
+ return Boolean.valueOf(!value.isVirtual());
+ }
+ };
+ }
+
+ private PropertyValueModel<ReadOnlyPrimaryKeyJoinColumn> buildDefaultJoinColumnHolder() {
+ return new PropertyAspectAdapter<ReadOnlySecondaryTable, ReadOnlyPrimaryKeyJoinColumn>(getSubjectHolder(), ReadOnlySecondaryTable.DEFAULT_PRIMARY_KEY_JOIN_COLUMN) {
+ @Override
+ protected ReadOnlyPrimaryKeyJoinColumn buildValue_() {
+ return this.subject.getDefaultPrimaryKeyJoinColumn();
+ }
+ };
+ }
+
+ private ListValueModel<ReadOnlyPrimaryKeyJoinColumn> buildDefaultJoinColumnListHolder() {
+ return new PropertyListValueModelAdapter<ReadOnlyPrimaryKeyJoinColumn>(
+ buildDefaultJoinColumnHolder()
+ );
+ }
+
+ private PostExecution<PrimaryKeyJoinColumnInSecondaryTableDialog> buildEditPrimaryKeyJoinColumnPostExecution() {
+ return new PostExecution<PrimaryKeyJoinColumnInSecondaryTableDialog>() {
+ public void execute(PrimaryKeyJoinColumnInSecondaryTableDialog dialog) {
+ if (dialog.wasConfirmed()) {
+ editPrimaryKeyJoinColumn(dialog.getSubject());
+ }
+ }
+ };
+ }
+
+ String buildJoinColumnLabel(ReadOnlyPrimaryKeyJoinColumn joinColumn) {
+
+ if (joinColumn.isDefault()) {
+ return NLS.bind(
+ JptUiDetailsMessages.PrimaryKeyJoinColumnsComposite_mappingBetweenTwoParamsDefault,
+ joinColumn.getName(),
+ joinColumn.getReferencedColumnName()
+ );
+ }
+
+ if (joinColumn.getSpecifiedName() == null) {
+ if (joinColumn.getSpecifiedReferencedColumnName() == null) {
+ return NLS.bind(
+ JptUiDetailsMessages.PrimaryKeyJoinColumnsComposite_mappingBetweenTwoParamsBothDefault,
+ joinColumn.getName(),
+ joinColumn.getReferencedColumnName()
+ );
+ }
+
+ return NLS.bind(
+ JptUiDetailsMessages.PrimaryKeyJoinColumnsComposite_mappingBetweenTwoParamsFirstDefault,
+ joinColumn.getName(),
+ joinColumn.getReferencedColumnName()
+ );
+ }
+
+ if (joinColumn.getSpecifiedReferencedColumnName() == null) {
+ return NLS.bind(
+ JptUiDetailsMessages.PrimaryKeyJoinColumnsComposite_mappingBetweenTwoParamsSecDefault,
+ joinColumn.getName(),
+ joinColumn.getReferencedColumnName()
+ );
+ }
+
+ return NLS.bind(
+ JptUiDetailsMessages.PrimaryKeyJoinColumnsComposite_mappingBetweenTwoParams,
+ joinColumn.getName(),
+ joinColumn.getReferencedColumnName()
+ );
+ }
+
+ private ILabelProvider buildJoinColumnsListLabelProvider() {
+ return new LabelProvider() {
+ @Override
+ public String getText(Object element) {
+ ReadOnlyPrimaryKeyJoinColumn joinColumn = (ReadOnlyPrimaryKeyJoinColumn) element;
+ return buildJoinColumnLabel(joinColumn);
+ }
+ };
+ }
+
+ private WritablePropertyValueModel<Boolean> buildOverrideDefaultJoinColumnHolder() {
+ return new OverrideDefaultJoinColumnHolder();
+ }
+
+ private AddRemovePane.Adapter buildPrimaryKeyJoinColumnAdapter() {
+ return new AddRemovePane.AbstractAdapter() {
+ public void addNewItem(ObjectListSelectionModel listSelectionModel) {
+ addPrimaryKeyJoinColumn();
+ }
+
+ @Override
+ public boolean hasOptionalButton() {
+ return true;
+ }
+
+ @Override
+ public String optionalButtonText() {
+ return JptUiDetailsMessages.PrimaryKeyJoinColumnsComposite_edit;
+ }
+
+ @Override
+ public void optionOnSelection(ObjectListSelectionModel listSelectionModel) {
+ editPrimaryKeyJoinColumn(listSelectionModel);
+ }
+
+ public void removeSelectedItems(ObjectListSelectionModel listSelectionModel) {
+ removePrimaryKeyJoinColumn(listSelectionModel);
+ }
+ };
+ }
+
+ private WritablePropertyValueModel<ReadOnlyPrimaryKeyJoinColumn> buildPrimaryKeyJoinColumnHolder() {
+ return new SimplePropertyValueModel<ReadOnlyPrimaryKeyJoinColumn>();
+ }
+
+ private ListValueModel<ReadOnlyPrimaryKeyJoinColumn> buildPrimaryKeyJoinColumnsListHolder() {
+ List<ListValueModel<ReadOnlyPrimaryKeyJoinColumn>> list = new ArrayList<ListValueModel<ReadOnlyPrimaryKeyJoinColumn>>();
+ list.add(buildSpecifiedJoinColumnsListHolder());
+ list.add(buildDefaultJoinColumnListHolder());
+ return new CompositeListValueModel<ListValueModel<ReadOnlyPrimaryKeyJoinColumn>, ReadOnlyPrimaryKeyJoinColumn>(list);
+ }
+
+ private ListValueModel<ReadOnlyPrimaryKeyJoinColumn> buildPrimaryKeyJoinColumnsListModel() {
+ return new ItemPropertyListValueModelAdapter<ReadOnlyPrimaryKeyJoinColumn>(
+ buildPrimaryKeyJoinColumnsListHolder(),
+ ReadOnlyNamedColumn.SPECIFIED_NAME_PROPERTY,
+ ReadOnlyNamedColumn.DEFAULT_NAME_PROPERTY,
+ ReadOnlyBaseJoinColumn.SPECIFIED_REFERENCED_COLUMN_NAME_PROPERTY,
+ ReadOnlyBaseJoinColumn.DEFAULT_REFERENCED_COLUMN_NAME_PROPERTY
+ );
+ }
+
+ ListValueModel<ReadOnlyPrimaryKeyJoinColumn> buildSpecifiedJoinColumnsListHolder() {
+ return new ListAspectAdapter<ReadOnlySecondaryTable, ReadOnlyPrimaryKeyJoinColumn>(getSubjectHolder(), ReadOnlySecondaryTable.SPECIFIED_PRIMARY_KEY_JOIN_COLUMNS_LIST) {
+ @Override
+ protected ListIterator<ReadOnlyPrimaryKeyJoinColumn> listIterator_() {
+ return new SuperListIteratorWrapper<ReadOnlyPrimaryKeyJoinColumn>(subject.specifiedPrimaryKeyJoinColumns());
+ }
+
+ @Override
+ protected int size_() {
+ return subject.specifiedPrimaryKeyJoinColumnsSize();
+ }
+ };
+ }
+
+ void editPrimaryKeyJoinColumn(ObjectListSelectionModel listSelectionModel) {
+
+ PrimaryKeyJoinColumn joinColumn = (PrimaryKeyJoinColumn) listSelectionModel.selectedValue();
+
+ PrimaryKeyJoinColumnInSecondaryTableDialog dialog =
+ new PrimaryKeyJoinColumnInSecondaryTableDialog(
+ getShell(),
+ (SecondaryTable) getSubject(),
+ joinColumn
+ );
+
+ dialog.openDialog(buildEditPrimaryKeyJoinColumnPostExecution());
+ }
+
+ void editPrimaryKeyJoinColumn(PrimaryKeyJoinColumnInSecondaryTableStateObject stateObject) {
+ stateObject.updateJoinColumn(stateObject.getJoinColumn());
+ }
+
+ @Override
+ protected void initialize() {
+ super.initialize();
+ joinColumnHolder = buildPrimaryKeyJoinColumnHolder();
+ }
+
+ @Override
+ protected void initializeLayout(Composite container) {
+
+ // Primary Key Join Columns group pane
+ Group groupPane = addTitledGroup(
+ container,
+ JptUiDetailsMessages.PrimaryKeyJoinColumnsComposite_primaryKeyJoinColumn
+ );
+
+ // Override Default check box
+ addCheckBox(
+ addSubPane(groupPane, 8),
+ JptUiDetailsMessages.PrimaryKeyJoinColumnsComposite_overrideDefaultPrimaryKeyJoinColumns,
+ buildOverrideDefaultJoinColumnHolder(),
+ null,
+ buildControlBooleanHolder()
+ );
+
+ // Primary Key Join Columns list pane
+ AddRemoveListPane<ReadOnlySecondaryTable> joinColumnsPane = new AddRemoveListPane<ReadOnlySecondaryTable>(
+ this,
+ groupPane,
+ buildPrimaryKeyJoinColumnAdapter(),
+ buildPrimaryKeyJoinColumnsListModel(),
+ joinColumnHolder,
+ buildJoinColumnsListLabelProvider(),
+ JpaHelpContextIds.MAPPING_JOIN_TABLE_COLUMNS
+ );
+
+ installPrimaryKeyJoinColumnListPaneEnabler(joinColumnsPane);
+ }
+
+ private void installPrimaryKeyJoinColumnListPaneEnabler(AddRemoveListPane<ReadOnlySecondaryTable> pkJoinColumnListPane) {
+
+ new PaneEnabler(
+ buildOverrideDefaultJoinColumnHolder(),
+ pkJoinColumnListPane
+ );
+ }
+
+ void removePrimaryKeyJoinColumn(ObjectListSelectionModel listSelectionModel) {
+ int[] selectedIndices = listSelectionModel.selectedIndices();
+
+ for (int index = selectedIndices.length; --index >= 0; ) {
+ ((SecondaryTable) getSubject()).removeSpecifiedPrimaryKeyJoinColumn(selectedIndices[index]);
+ }
+ }
+
+ void updateJoinColumns(boolean selected) {
+
+ if (isPopulating()) {
+ return;
+ }
+
+ setPopulating(true);
+
+ try {
+ SecondaryTable secondaryTable = (SecondaryTable) getSubject();
+
+ // Add a join column by creating a specified one using the default
+ // one if it exists
+ if (selected) {
+
+ PrimaryKeyJoinColumn defaultJoinColumn = secondaryTable.getDefaultPrimaryKeyJoinColumn();
+
+ if (defaultJoinColumn != null) {
+ String columnName = defaultJoinColumn.getDefaultName();
+ String referencedColumnName = defaultJoinColumn.getDefaultReferencedColumnName();
+
+ PrimaryKeyJoinColumn pkJoinColumn = secondaryTable.addSpecifiedPrimaryKeyJoinColumn(0);
+ pkJoinColumn.setSpecifiedName(columnName);
+ pkJoinColumn.setSpecifiedReferencedColumnName(referencedColumnName);
+
+ joinColumnHolder.setValue(pkJoinColumn);
+ }
+ }
+ else {
+ for (int index = secondaryTable.specifiedPrimaryKeyJoinColumnsSize(); --index >= 0; ) {
+ secondaryTable.removeSpecifiedPrimaryKeyJoinColumn(index);
+ }
+ }
+ }
+ finally {
+ setPopulating(false);
+ }
+ }
+
+ private class OverrideDefaultJoinColumnHolder extends ListPropertyValueModelAdapter<Boolean>
+ implements WritablePropertyValueModel<Boolean> {
+
+ public OverrideDefaultJoinColumnHolder() {
+ super(buildSpecifiedJoinColumnsListHolder());
+ }
+
+ @Override
+ protected Boolean buildValue() {
+ return Boolean.valueOf(this.buildValue_());
+ }
+
+ protected boolean buildValue_() {
+ ReadOnlySecondaryTable table = getSubject();
+ return (table != null) && ! table.isVirtual() && listHolder.size() > 0;
+ }
+
+ public void setValue(Boolean value) {
+ updateJoinColumns(value.booleanValue());
+ }
+ }
+} \ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/QueriesComposite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/QueriesComposite.java
new file mode 100644
index 0000000000..6c3c949a65
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/QueriesComposite.java
@@ -0,0 +1,313 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 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.ui.internal.details;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.ListIterator;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.window.Window;
+import org.eclipse.jpt.common.ui.internal.util.ControlSwitcher;
+import org.eclipse.jpt.common.ui.internal.widgets.AddRemoveListPane;
+import org.eclipse.jpt.common.ui.internal.widgets.Pane;
+import org.eclipse.jpt.common.ui.internal.widgets.AddRemovePane.Adapter;
+import org.eclipse.jpt.common.utility.internal.CollectionTools;
+import org.eclipse.jpt.common.utility.internal.Transformer;
+import org.eclipse.jpt.common.utility.internal.model.value.CompositeListValueModel;
+import org.eclipse.jpt.common.utility.internal.model.value.ItemPropertyListValueModelAdapter;
+import org.eclipse.jpt.common.utility.internal.model.value.ListAspectAdapter;
+import org.eclipse.jpt.common.utility.internal.model.value.SimplePropertyValueModel;
+import org.eclipse.jpt.common.utility.internal.model.value.TransformationPropertyValueModel;
+import org.eclipse.jpt.common.utility.internal.model.value.swing.ObjectListSelectionModel;
+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.core.context.NamedNativeQuery;
+import org.eclipse.jpt.jpa.core.context.NamedQuery;
+import org.eclipse.jpt.jpa.core.context.Query;
+import org.eclipse.jpt.jpa.core.context.QueryContainer;
+import org.eclipse.jpt.jpa.ui.internal.JpaHelpContextIds;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.ui.part.PageBook;
+
+/**
+ * This pane shows the list of named queries and named native queries.
+ * <p>
+ * Here the layout of this pane:
+ * <pre>
+ * -----------------------------------------------------------------------------
+ * | ------------------------------------------------------------------------- |
+ * | | | |
+ * | | AddRemoveListPane | |
+ * | | | |
+ * | ------------------------------------------------------------------------- |
+ * | ------------------------------------------------------------------------- |
+ * | | | |
+ * | | NamedQueryPropertyComposite or NamedNativeQueryPropertyComposite | |
+ * | | | |
+ * | ------------------------------------------------------------------------- |
+ * -----------------------------------------------------------------------------</pre>
+ *
+ * @see Entity
+ * @see Query
+ * @see NamedNativeQuery
+ * @see NamedQuery
+ * @see AbstractEntityComposite - The parent container
+ * @see NamedNativeQueryPropertyComposite
+ * @see NamedQueryPropertyComposite
+ *
+ * @version 2.0
+ * @since 2.0
+ */
+public class QueriesComposite extends Pane<QueryContainer>
+{
+ private AddRemoveListPane<QueryContainer> listPane;
+ NamedNativeQueryPropertyComposite namedNativeQueryPane;
+ NamedQueryPropertyComposite<? extends NamedQuery> namedQueryPane;
+ private WritablePropertyValueModel<Query> queryHolder;
+
+
+ public QueriesComposite(
+ Pane<?> parentPane,
+ PropertyValueModel<? extends QueryContainer> subjectHolder,
+ Composite parent) {
+
+ super(parentPane, subjectHolder, parent, false);
+ }
+
+ void addQuery() {
+ addQueryFromDialog(buildAddQueryDialog());
+ }
+
+ protected AddQueryDialog buildAddQueryDialog() {
+ return new AddQueryDialog(getShell(), this.getSubject().getPersistenceUnit());
+ }
+
+ protected void addQueryFromDialog(AddQueryDialog dialog) {
+ if (dialog.open() != Window.OK) {
+ return;
+ }
+ String queryType = dialog.getQueryType();
+ Query query;
+ if (queryType == AddQueryDialog.NAMED_QUERY) {
+ query = this.getSubject().addNamedQuery();
+ }
+ else if (queryType == AddQueryDialog.NAMED_NATIVE_QUERY) {
+ query = this.getSubject().addNamedNativeQuery();
+ }
+ else {
+ throw new IllegalArgumentException();
+ }
+ query.setName(dialog.getName());
+ this.getQueryHolder().setValue(query);//so that it gets selected in the List for the user to edit
+ }
+
+ private ListValueModel<Query> buildDisplayableQueriesListHolder() {
+ return new ItemPropertyListValueModelAdapter<Query>(
+ buildQueriesListHolder(),
+ Query.NAME_PROPERTY
+ );
+ }
+
+ private AddRemoveListPane<QueryContainer> addListPane(Composite container) {
+
+ return new AddRemoveListPane<QueryContainer>(
+ this,
+ container,
+ buildQueriesAdapter(),
+ buildDisplayableQueriesListHolder(),
+ this.getQueryHolder(),
+ buildQueriesListLabelProvider(),
+ JpaHelpContextIds.MAPPING_NAMED_QUERIES
+ );
+ }
+
+ private ListValueModel<NamedNativeQuery> buildNamedNativeQueriesListHolder() {
+ return new ListAspectAdapter<QueryContainer, NamedNativeQuery>(
+ getSubjectHolder(),
+ QueryContainer.NAMED_NATIVE_QUERIES_LIST)
+ {
+ @Override
+ protected ListIterator<NamedNativeQuery> listIterator_() {
+ return this.subject.namedNativeQueries();
+ }
+
+ @Override
+ protected int size_() {
+ return this.subject.namedNativeQueriesSize();
+ }
+ };
+ }
+
+ private PropertyValueModel<NamedNativeQuery> buildNamedNativeQueryHolder() {
+ return new TransformationPropertyValueModel<Query, NamedNativeQuery>(this.getQueryHolder()) {
+ @Override
+ protected NamedNativeQuery transform_(Query value) {
+ return (value instanceof NamedNativeQuery) ? (NamedNativeQuery) value : null;
+ }
+ };
+ }
+
+ private ListValueModel<NamedQuery> buildNamedQueriesListHolder() {
+ return new ListAspectAdapter<QueryContainer, NamedQuery>(
+ getSubjectHolder(),
+ QueryContainer.NAMED_QUERIES_LIST)
+ {
+ @Override
+ protected ListIterator<NamedQuery> listIterator_() {
+ return this.subject.namedQueries();
+ }
+
+ @Override
+ protected int size_() {
+ return this.subject.namedQueriesSize();
+ }
+ };
+ }
+
+ private PropertyValueModel<NamedQuery> buildNamedQueryHolder() {
+ return new TransformationPropertyValueModel<Query, NamedQuery>(this.getQueryHolder()) {
+ @Override
+ protected NamedQuery transform_(Query value) {
+ return (value instanceof NamedQuery) ? (NamedQuery) value : null;
+ }
+ };
+ }
+
+ private Transformer<Query, Control> buildPaneTransformer() {
+ return new Transformer<Query, Control>() {
+ public Control transform(Query query) {
+
+ if (query == null) {
+ return null;
+ }
+
+ if (query instanceof NamedNativeQuery) {
+ return QueriesComposite.this.namedNativeQueryPane.getControl();
+ }
+
+ return QueriesComposite.this.namedQueryPane.getControl();
+ }
+ };
+ }
+
+ private Adapter buildQueriesAdapter() {
+
+ return new AddRemoveListPane.AbstractAdapter() {
+
+ public void addNewItem(ObjectListSelectionModel listSelectionModel) {
+ addQuery();
+ }
+
+ public void removeSelectedItems(ObjectListSelectionModel listSelectionModel) {
+ for (Object item : listSelectionModel.selectedValues()) {
+ if (item instanceof NamedQuery) {
+ getSubject().removeNamedQuery((NamedQuery) item);
+ }
+ else {
+ getSubject().removeNamedNativeQuery((NamedNativeQuery) item);
+ }
+ }
+ }
+ };
+ }
+
+ private ListValueModel<Query> buildQueriesListHolder() {
+ List<ListValueModel<? extends Query>> list = new ArrayList<ListValueModel<? extends Query>>();
+ list.add(buildNamedQueriesListHolder());
+ list.add(buildNamedNativeQueriesListHolder());
+ return new CompositeListValueModel<ListValueModel<? extends Query>, Query>(list);
+ }
+
+ private ILabelProvider buildQueriesListLabelProvider() {
+ return new LabelProvider() {
+ @Override
+ public String getText(Object element) {
+ Query query = (Query) element;
+ String name = query.getName();
+
+ if (name == null) {
+ int index = -1;
+
+ if (query instanceof NamedQuery) {
+ index = CollectionTools.indexOf(getSubject().namedQueries(), query);
+ }
+ else {
+ index = CollectionTools.indexOf(getSubject().namedNativeQueries(), query);
+ }
+
+ name = NLS.bind(JptUiDetailsMessages.QueriesComposite_displayString, Integer.valueOf(index));
+ }
+
+ return name;
+ }
+ };
+ }
+
+ private WritablePropertyValueModel<Query> buildQueryHolder() {
+ return new SimplePropertyValueModel<Query>();
+ }
+
+ @Override
+ public void enableWidgets(boolean enabled) {
+ super.enableWidgets(enabled);
+ this.listPane.enableWidgets(enabled);
+ }
+
+ @Override
+ protected void initialize() {
+ super.initialize();
+ this.queryHolder = buildQueryHolder();
+ }
+
+ @Override
+ protected void initializeLayout(Composite container) {
+
+ // List pane
+ this.listPane = this.addListPane(container);
+
+ // Property pane
+ PageBook pageBook = new PageBook(container, SWT.NULL);
+ pageBook.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+ // Named Query property pane
+ this.namedQueryPane = this.buildNamedQueryPropertyComposite(pageBook);
+
+ // Named Native Query property pane
+ this.namedNativeQueryPane = new NamedNativeQueryPropertyComposite(
+ this,
+ this.buildNamedNativeQueryHolder(),
+ pageBook
+ );
+
+ installPaneSwitcher(pageBook);
+ }
+
+ protected NamedQueryPropertyComposite<? extends NamedQuery> buildNamedQueryPropertyComposite(PageBook pageBook) {
+ return new NamedQueryPropertyComposite<NamedQuery>(
+ this,
+ this.buildNamedQueryHolder(),
+ pageBook
+ );
+ }
+
+ private void installPaneSwitcher(PageBook pageBook) {
+ new ControlSwitcher(this.getQueryHolder(), this.buildPaneTransformer(), pageBook);
+ }
+
+ protected WritablePropertyValueModel<Query> getQueryHolder() {
+ return queryHolder;
+ }
+} \ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/QueryHintsComposite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/QueryHintsComposite.java
new file mode 100644
index 0000000000..c1f21e2eeb
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/QueryHintsComposite.java
@@ -0,0 +1,339 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 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.ui.internal.details;
+
+import org.eclipse.jface.viewers.CellEditor;
+import org.eclipse.jface.viewers.IBaseLabelProvider;
+import org.eclipse.jface.viewers.ICellModifier;
+import org.eclipse.jface.viewers.ITableLabelProvider;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.jface.viewers.TextCellEditor;
+import org.eclipse.jpt.common.ui.internal.swt.ColumnAdapter;
+import org.eclipse.jpt.common.ui.internal.util.PaneEnabler;
+import org.eclipse.jpt.common.ui.internal.widgets.AddRemoveTablePane;
+import org.eclipse.jpt.common.ui.internal.widgets.Pane;
+import org.eclipse.jpt.common.ui.internal.widgets.AddRemovePane.Adapter;
+import org.eclipse.jpt.common.utility.internal.iterables.ListIterable;
+import org.eclipse.jpt.common.utility.internal.model.value.ListAspectAdapter;
+import org.eclipse.jpt.common.utility.internal.model.value.PropertyAspectAdapter;
+import org.eclipse.jpt.common.utility.internal.model.value.SimplePropertyValueModel;
+import org.eclipse.jpt.common.utility.internal.model.value.TransformationPropertyValueModel;
+import org.eclipse.jpt.common.utility.internal.model.value.swing.ObjectListSelectionModel;
+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.core.context.NamedQuery;
+import org.eclipse.jpt.jpa.core.context.Query;
+import org.eclipse.jpt.jpa.core.context.QueryHint;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.TableItem;
+
+/**
+ * Here the layout of this pane:
+ * <pre>
+ * -----------------------------------------------------------------------------
+ * | |
+ * | AddRemoveTablePane |
+ * | |
+ * -----------------------------------------------------------------------------</pre>
+ *
+ * @see Query
+ * @see QueryHint
+ * @see AddRemoveTablePane
+ *
+ * @version 2.0
+ * @since 2.0
+ */
+@SuppressWarnings("nls")
+public class QueryHintsComposite extends Pane<Query>
+{
+ private WritablePropertyValueModel<QueryHint> queryHintHolder;
+
+ /**
+ * Creates a new <code>QueryHintsComposite</code>.
+ *
+ * @param parentPane The parent pane of this one
+ * @param parent The parent container
+ */
+ public QueryHintsComposite(Pane<? extends Query> parentPane,
+ Composite container) {
+
+ super(parentPane, container);
+ }
+
+ private PropertyValueModel<Boolean> buildPaneEnableHolder() {
+ return new TransformationPropertyValueModel<Query, Boolean>(getSubjectHolder()) {
+ @Override
+ protected Boolean transform(Query query) {
+ return (query != null);
+ }
+ };
+ }
+
+ private Adapter buildQueryHintAdapter() {
+ return new AddRemoveTablePane.AbstractAdapter() {
+ public void addNewItem(ObjectListSelectionModel listSelectionModel) {
+ QueryHint queryHint = getSubject().addHint(getSubject().getHintsSize());
+ queryHintHolder.setValue(queryHint);
+ }
+
+ public void removeSelectedItems(ObjectListSelectionModel listSelectionModel) {
+ for (Object item : listSelectionModel.selectedValues()) {
+ getSubject().removeHint((QueryHint) item);
+ }
+ }
+ };
+ }
+
+ private WritablePropertyValueModel<QueryHint> buildQueryHintHolder() {
+ return new SimplePropertyValueModel<QueryHint>();
+ };
+
+ private ITableLabelProvider buildQueryHintLabelProvider() {
+ return new TableLabelProvider();
+ }
+
+ private ListValueModel<QueryHint> buildQueryHintListHolder() {
+ return new ListAspectAdapter<Query, QueryHint>(getSubjectHolder(), NamedQuery.HINTS_LIST) {
+ @Override
+ protected ListIterable<QueryHint> getListIterable() {
+ return subject.getHints();
+ }
+
+ @Override
+ protected int size_() {
+ return subject.getHintsSize();
+ }
+ };
+ }
+
+ /*
+ * (non-Javadoc)
+ */
+ @Override
+ protected void initialize() {
+ super.initialize();
+ queryHintHolder = buildQueryHintHolder();
+ }
+
+ /*
+ * (non-Javadoc)
+ */
+ @Override
+ protected void initializeLayout(Composite container) {
+
+ TablePane tablePane = new TablePane(container);
+ installPaneEnabler(tablePane);
+ }
+
+ private PaneEnabler installPaneEnabler(TablePane tablePane) {
+ return new PaneEnabler(buildPaneEnableHolder(), tablePane);
+ }
+
+ private static class QueryHintColumnAdapter implements ColumnAdapter<QueryHint> {
+
+ static final int COLUMN_COUNT = 2;
+ static final int NAME_COLUMN_INDEX = 0;
+ static final int VALUE_COLUMN_INDEX = 1;
+
+ private WritablePropertyValueModel<String> buildNameHolder(QueryHint subject) {
+ return new PropertyAspectAdapter<QueryHint, String>(QueryHint.NAME_PROPERTY, subject) {
+ @Override
+ protected String buildValue_() {
+ return subject.getName();
+ }
+
+ @Override
+ protected void setValue_(String value) {
+ subject.setName(value);
+ }
+ };
+ }
+
+ private WritablePropertyValueModel<?> buildValueHolder(QueryHint subject) {
+ return new PropertyAspectAdapter<QueryHint, String>(QueryHint.VALUE_PROPERTY, subject) {
+ @Override
+ protected String buildValue_() {
+ return subject.getValue();
+ }
+
+ @Override
+ protected void setValue_(String value) {
+ subject.setValue(value);
+ }
+ };
+ }
+
+ public WritablePropertyValueModel<?>[] cellModels(QueryHint subject) {
+ WritablePropertyValueModel<?>[] models = new WritablePropertyValueModel<?>[COLUMN_COUNT];
+ models[NAME_COLUMN_INDEX] = buildNameHolder(subject);
+ models[VALUE_COLUMN_INDEX] = buildValueHolder(subject);
+ return models;
+ }
+
+ public int columnCount() {
+ return COLUMN_COUNT;
+ }
+
+ public String columnName(int columnIndex) {
+
+ switch (columnIndex) {
+ case QueryHintColumnAdapter.NAME_COLUMN_INDEX: {
+ return JptUiDetailsMessages.QueryHintsComposite_nameColumn;
+ }
+
+ case QueryHintColumnAdapter.VALUE_COLUMN_INDEX: {
+ return JptUiDetailsMessages.QueryHintsComposite_valueColumn;
+ }
+
+ default: {
+ return null;
+ }
+ }
+ }
+ }
+
+ private class TableLabelProvider extends LabelProvider
+ implements ITableLabelProvider {
+
+ public Image getColumnImage(Object element, int columnIndex) {
+ return null;
+ }
+
+ public String getColumnText(Object element, int columnIndex) {
+
+ QueryHint queryHint = (QueryHint) element;
+ String value = "";
+
+ switch (columnIndex) {
+ case QueryHintColumnAdapter.NAME_COLUMN_INDEX: {
+ value = queryHint.getName();
+ break;
+ }
+
+ case QueryHintColumnAdapter.VALUE_COLUMN_INDEX: {
+ value = queryHint.getValue();
+ break;
+ }
+ }
+
+ if (value == null) {
+ value = "";
+ }
+
+ return value;
+ }
+ }
+
+ private class TablePane extends AddRemoveTablePane<Query> {
+
+ private TablePane(Composite parent) {
+ super(QueryHintsComposite.this,
+ parent,
+ buildQueryHintAdapter(),
+ buildQueryHintListHolder(),
+ queryHintHolder,
+ buildQueryHintLabelProvider());
+ }
+
+ private CellEditor[] buildCellEditors(Table table) {
+ return new CellEditor[] {
+ new TextCellEditor(table),
+ new TextCellEditor(table)
+ };
+ }
+
+ private ICellModifier buildCellModifier() {
+ return new ICellModifier() {
+
+ public boolean canModify(Object element, String property) {
+ return true;
+ }
+
+ public Object getValue(Object element, String property) {
+ QueryHint queryHint = (QueryHint) element;
+ String value = "";
+
+ if (property == QueryHint.NAME_PROPERTY) {
+ value = queryHint.getName();
+ }
+ else if (property == QueryHint.VALUE_PROPERTY) {
+ value = queryHint.getValue();
+ }
+
+ if (value == null) {
+ value = "";
+ }
+
+ return value;
+ }
+
+ public void modify(Object element, String property, Object value) {
+ QueryHint queryHint;
+
+ if (element instanceof TableItem) {
+ TableItem tableItem = (TableItem) element;
+ queryHint = (QueryHint) tableItem.getData();
+ }
+ else {
+ queryHint = (QueryHint) element;
+ }
+
+ if (property == QueryHint.NAME_PROPERTY) {
+ queryHint.setName(value.toString());
+ }
+ else if (property == QueryHint.VALUE_PROPERTY) {
+ queryHint.setValue(value.toString());
+ }
+ }
+ };
+ }
+
+ @Override
+ protected ColumnAdapter<?> buildColumnAdapter() {
+ return new QueryHintColumnAdapter();
+ }
+
+ private String[] buildColumnProperties() {
+ return new String[] {
+ QueryHint.NAME_PROPERTY,
+ QueryHint.VALUE_PROPERTY
+ };
+ }
+
+ @Override
+ protected void initializeMainComposite(Composite container,
+ Adapter adapter,
+ ListValueModel<?> listHolder,
+ WritablePropertyValueModel<?> selectedItemHolder,
+ IBaseLabelProvider labelProvider,
+ String helpId) {
+
+ super.initializeMainComposite(
+ container,
+ adapter,
+ listHolder,
+ selectedItemHolder,
+ labelProvider,
+ helpId
+ );
+
+ Table table = getMainControl();
+
+ TableViewer tableViewer = new TableViewer(table);
+ tableViewer.setCellEditors(buildCellEditors(table));
+ tableViewer.setCellModifier(buildCellModifier());
+ tableViewer.setColumnProperties(buildColumnProperties());
+ }
+ }
+} \ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/ReferenceTableComposite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/ReferenceTableComposite.java
new file mode 100644
index 0000000000..371764dbd8
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/ReferenceTableComposite.java
@@ -0,0 +1,436 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2010 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.ui.internal.details;
+
+import java.util.Collection;
+import java.util.ListIterator;
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.ui.internal.widgets.Pane;
+import org.eclipse.jpt.common.ui.internal.widgets.PostExecution;
+import org.eclipse.jpt.common.utility.internal.iterators.SuperListIteratorWrapper;
+import org.eclipse.jpt.common.utility.internal.model.value.CachingTransformationPropertyValueModel;
+import org.eclipse.jpt.common.utility.internal.model.value.ListAspectAdapter;
+import org.eclipse.jpt.common.utility.internal.model.value.ListPropertyValueModelAdapter;
+import org.eclipse.jpt.common.utility.internal.model.value.ReadOnlyWritablePropertyValueModelWrapper;
+import org.eclipse.jpt.common.utility.internal.model.value.ValueListAdapter;
+import org.eclipse.jpt.common.utility.model.event.StateChangeEvent;
+import org.eclipse.jpt.common.utility.model.listener.StateChangeListener;
+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.core.context.JoinColumn;
+import org.eclipse.jpt.jpa.core.context.ReadOnlyJoinColumn;
+import org.eclipse.jpt.jpa.core.context.ReadOnlyReferenceTable;
+import org.eclipse.jpt.jpa.core.context.ReadOnlyTable;
+import org.eclipse.jpt.jpa.core.context.ReferenceTable;
+import org.eclipse.jpt.jpa.db.Schema;
+import org.eclipse.jpt.jpa.db.SchemaContainer;
+import org.eclipse.jpt.jpa.ui.internal.details.JoinColumnsComposite.JoinColumnsEditor;
+import org.eclipse.jpt.jpa.ui.internal.details.db.CatalogCombo;
+import org.eclipse.jpt.jpa.ui.internal.details.db.SchemaCombo;
+import org.eclipse.jpt.jpa.ui.internal.details.db.TableCombo;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+
+
+public abstract class ReferenceTableComposite<T extends ReadOnlyReferenceTable>
+ extends Pane<T>
+{
+ protected Button overrideDefaultJoinColumnsCheckBox;
+
+ protected JoinColumnsComposite<T> joinColumnsComposite;
+
+ /**
+ * Creates a new <code>ReferenceTableComposite</code>.
+ *
+ * @param parentPane The parent container of this one
+ * @param subjectHolder The holder of this pane's subject
+ * @param parent The parent container
+ */
+ protected ReferenceTableComposite(
+ Pane<?> parentPane,
+ PropertyValueModel<? extends T> subjectHolder,
+ Composite parent) {
+
+ super(parentPane, subjectHolder, parent, false);
+ }
+
+ /**
+ * Creates a new <code>ReferenceTableComposite</code>.
+ *
+ * @param subjectHolder The holder of the subject <code>CollectionTable2_0</code>
+ * @param parent The parent container
+ * @param widgetFactory The factory used to create various common widgets
+ */
+ protected ReferenceTableComposite(PropertyValueModel<? extends T> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+
+ super(subjectHolder, parent, widgetFactory);
+ }
+
+
+ protected void installJoinColumnsPaneEnabler(JoinColumnsComposite<T> pane) {
+ pane.installJoinColumnsPaneEnabler(new JoinColumnPaneEnablerHolder());
+ }
+
+ void addJoinColumn(T referenceTable) {
+
+ JoinColumnInReferenceTableDialog dialog =
+ new JoinColumnInReferenceTableDialog(getShell(), referenceTable, null);
+
+ dialog.openDialog(buildAddJoinColumnPostExecution());
+ }
+
+ void addJoinColumnFromDialog(JoinColumnInReferenceTableStateObject stateObject) {
+ JoinColumn joinColumn = ((ReferenceTable) getSubject()).addSpecifiedJoinColumn();
+ stateObject.updateJoinColumn(joinColumn);
+ this.setSelectedJoinColumn(joinColumn);
+ }
+
+ private void setSelectedJoinColumn(JoinColumn joinColumn) {
+ this.joinColumnsComposite.setSelectedJoinColumn(joinColumn);
+ }
+
+ private PostExecution<JoinColumnInReferenceTableDialog> buildAddJoinColumnPostExecution() {
+ return new PostExecution<JoinColumnInReferenceTableDialog>() {
+ public void execute(JoinColumnInReferenceTableDialog dialog) {
+ if (dialog.wasConfirmed()) {
+ addJoinColumnFromDialog(dialog.getSubject());
+ }
+ }
+ };
+ }
+
+ private PostExecution<JoinColumnInReferenceTableDialog> buildEditJoinColumnPostExecution() {
+ return new PostExecution<JoinColumnInReferenceTableDialog>() {
+ public void execute(JoinColumnInReferenceTableDialog dialog) {
+ if (dialog.wasConfirmed()) {
+ editJoinColumn(dialog.getSubject());
+ }
+ }
+ };
+ }
+
+ protected JoinColumnsProvider buildJoinColumnsEditor() {
+ return new JoinColumnsProvider();
+ }
+
+ protected WritablePropertyValueModel<Boolean> buildOverrideDefaultJoinColumnHolder() {
+ return new OverrideDefaultJoinColumnHolder();
+ }
+
+ ListValueModel<ReadOnlyJoinColumn> buildSpecifiedJoinColumnsListHolder() {
+ return new ListAspectAdapter<T, ReadOnlyJoinColumn>(getSubjectHolder(), ReadOnlyReferenceTable.SPECIFIED_JOIN_COLUMNS_LIST) {
+ @Override
+ protected ListIterator<ReadOnlyJoinColumn> listIterator_() {
+ return new SuperListIteratorWrapper<ReadOnlyJoinColumn>(this.subject.specifiedJoinColumns());
+ }
+
+ @Override
+ protected int size_() {
+ return this.subject.specifiedJoinColumnsSize();
+ }
+ };
+ }
+
+ protected Composite addPane(Composite container, int groupBoxMargin) {
+ return addSubPane(container, 0, groupBoxMargin, 10, groupBoxMargin);
+ }
+
+ protected TableCombo<T> addTableCombo(Composite container) {
+
+ return new TableCombo<T>(this, container) {
+
+ @Override
+ protected void addPropertyNames(Collection<String> propertyNames) {
+ super.addPropertyNames(propertyNames);
+ propertyNames.add(ReadOnlyTable.DEFAULT_NAME_PROPERTY);
+ propertyNames.add(ReadOnlyTable.SPECIFIED_NAME_PROPERTY);
+ propertyNames.add(ReadOnlyTable.DEFAULT_SCHEMA_PROPERTY);
+ propertyNames.add(ReadOnlyTable.SPECIFIED_SCHEMA_PROPERTY);
+ propertyNames.add(ReadOnlyTable.DEFAULT_CATALOG_PROPERTY);
+ propertyNames.add(ReadOnlyTable.SPECIFIED_CATALOG_PROPERTY);
+ }
+
+ @Override
+ protected void propertyChanged(String propertyName) {
+ super.propertyChanged(propertyName);
+ if (propertyName == ReadOnlyTable.DEFAULT_SCHEMA_PROPERTY
+ || propertyName == ReadOnlyTable.SPECIFIED_SCHEMA_PROPERTY
+ || propertyName == ReadOnlyTable.DEFAULT_CATALOG_PROPERTY
+ || propertyName == ReadOnlyTable.SPECIFIED_CATALOG_PROPERTY ) {
+ repopulate();
+ }
+ }
+
+ @Override
+ protected String getDefaultValue() {
+ return this.getSubject().getDefaultName();
+ }
+
+ @Override
+ protected void setValue(String value) {
+ ((ReferenceTable) this.getSubject()).setSpecifiedName(value);
+ }
+
+ @Override
+ protected String getValue() {
+ return this.getSubject().getSpecifiedName();
+ }
+
+ @Override
+ protected Schema getDbSchema_() {
+ ReferenceTable table = this.getTable();
+ return (table == null) ? null : table.getDbSchema();
+ }
+
+ protected ReferenceTable getTable() {
+ ReadOnlyReferenceTable table = this.getSubject();
+ return (table instanceof ReferenceTable) ? (ReferenceTable) table : null;
+ }
+ };
+ }
+
+ protected SchemaCombo<T> addSchemaCombo(Composite container) {
+
+ return new SchemaCombo<T>(this, container) {
+
+ @Override
+ protected void addPropertyNames(Collection<String> propertyNames) {
+ super.addPropertyNames(propertyNames);
+ propertyNames.add(ReadOnlyTable.DEFAULT_SCHEMA_PROPERTY);
+ propertyNames.add(ReadOnlyTable.SPECIFIED_SCHEMA_PROPERTY);
+ propertyNames.add(ReadOnlyTable.DEFAULT_CATALOG_PROPERTY);
+ propertyNames.add(ReadOnlyTable.SPECIFIED_CATALOG_PROPERTY);
+ }
+
+ @Override
+ protected void propertyChanged(String propertyName) {
+ super.propertyChanged(propertyName);
+ if (propertyName == ReadOnlyTable.DEFAULT_CATALOG_PROPERTY
+ || propertyName == ReadOnlyTable.SPECIFIED_CATALOG_PROPERTY ) {
+ repopulate();
+ }
+ }
+
+ @Override
+ protected String getDefaultValue() {
+ return this.getSubject().getDefaultSchema();
+ }
+
+ @Override
+ protected void setValue(String value) {
+ ((ReferenceTable) this.getSubject()).setSpecifiedSchema(value);
+ }
+
+ @Override
+ protected String getValue() {
+ return this.getSubject().getSpecifiedSchema();
+ }
+
+ @Override
+ protected SchemaContainer getDbSchemaContainer_() {
+ ReferenceTable table = this.getTable();
+ return (table == null) ? null : table.getDbSchemaContainer();
+ }
+
+ protected ReferenceTable getTable() {
+ ReadOnlyReferenceTable table = this.getSubject();
+ return (table instanceof ReferenceTable) ? (ReferenceTable) table : null;
+ }
+ };
+ }
+
+ protected CatalogCombo<T> addCatalogCombo(Composite container) {
+
+ return new CatalogCombo<T>(this, container) {
+
+ @Override
+ protected void addPropertyNames(Collection<String> propertyNames) {
+ super.addPropertyNames(propertyNames);
+ propertyNames.add(ReadOnlyTable.DEFAULT_CATALOG_PROPERTY);
+ propertyNames.add(ReadOnlyTable.SPECIFIED_CATALOG_PROPERTY);
+ }
+
+ @Override
+ protected String getDefaultValue() {
+ return this.getSubject().getDefaultCatalog();
+ }
+
+ @Override
+ protected void setValue(String value) {
+ ((ReferenceTable) this.getSubject()).setSpecifiedCatalog(value);
+ }
+
+ @Override
+ protected String getValue() {
+ return this.getSubject().getSpecifiedCatalog();
+ }
+ };
+ }
+
+ void editJoinColumn(ReadOnlyJoinColumn joinColumn) {
+
+ JoinColumnInReferenceTableDialog dialog =
+ new JoinColumnInReferenceTableDialog(getShell(), getSubject(), joinColumn);
+
+ dialog.openDialog(buildEditJoinColumnPostExecution());
+ }
+
+ void editJoinColumn(JoinColumnInReferenceTableStateObject stateObject) {
+ stateObject.updateJoinColumn(stateObject.getJoinColumn());
+ }
+
+ void updateJoinColumns() {
+ if (this.isPopulating()) {
+ return;
+ }
+
+ ReferenceTable referenceTable = (ReferenceTable) this.getSubject();
+ if (referenceTable == null) {
+ return;
+ }
+
+ boolean selected = this.overrideDefaultJoinColumnsCheckBox.getSelection();
+ this.setPopulating(true);
+
+ try {
+ if (selected) {
+ referenceTable.convertDefaultToSpecifiedJoinColumn();
+ setSelectedJoinColumn(referenceTable.specifiedJoinColumns().next());
+ } else {
+ for (int index = referenceTable.specifiedJoinColumnsSize(); --index >= 0; ) {
+ referenceTable.removeSpecifiedJoinColumn(index);
+ }
+ }
+ } finally {
+ this.setPopulating(false);
+ }
+ }
+
+ class JoinColumnsProvider implements JoinColumnsEditor<T> {
+
+ public void addJoinColumn(T subject) {
+ ReferenceTableComposite.this.addJoinColumn(subject);
+ }
+
+ public ReadOnlyJoinColumn getDefaultJoinColumn(T subject) {
+ return subject.getDefaultJoinColumn();
+ }
+
+ public String getDefaultPropertyName() {
+ return ReadOnlyReferenceTable.DEFAULT_JOIN_COLUMN_PROPERTY;
+ }
+
+ public void editJoinColumn(T subject, ReadOnlyJoinColumn joinColumn) {
+ ReferenceTableComposite.this.editJoinColumn(joinColumn);
+ }
+
+ public boolean hasSpecifiedJoinColumns(T subject) {
+ return subject.hasSpecifiedJoinColumns();
+ }
+
+ public void removeJoinColumns(T subject, int[] selectedIndices) {
+ for (int index = selectedIndices.length; index-- > 0; ) {
+ ((ReferenceTable) subject).removeSpecifiedJoinColumn(selectedIndices[index]);
+ }
+ }
+
+ public ListIterator<ReadOnlyJoinColumn> specifiedJoinColumns(T subject) {
+ return new SuperListIteratorWrapper<ReadOnlyJoinColumn>(subject.specifiedJoinColumns());
+ }
+
+ public int specifiedJoinColumnsSize(T subject) {
+ return subject.specifiedJoinColumnsSize();
+ }
+
+ public String getSpecifiedJoinColumnsListPropertyName() {
+ return ReadOnlyReferenceTable.SPECIFIED_JOIN_COLUMNS_LIST;
+ }
+ }
+
+
+ private class OverrideDefaultJoinColumnHolder extends ListPropertyValueModelAdapter<Boolean>
+ implements WritablePropertyValueModel<Boolean> {
+
+ public OverrideDefaultJoinColumnHolder() {
+ super(buildSpecifiedJoinColumnsListHolder());
+ }
+
+ @Override
+ protected Boolean buildValue() {
+ return Boolean.valueOf(this.listHolder.size() > 0);
+ }
+
+ public void setValue(Boolean value) {
+ updateJoinColumns();
+ }
+ }
+
+
+ private class JoinColumnPaneEnablerHolder
+ extends CachingTransformationPropertyValueModel<T, Boolean>
+ {
+ private StateChangeListener stateChangeListener;
+
+
+ public JoinColumnPaneEnablerHolder() {
+ super(
+ new ValueListAdapter<T>(
+ new ReadOnlyWritablePropertyValueModelWrapper<T>(getSubjectHolder()),
+ ReadOnlyReferenceTable.SPECIFIED_JOIN_COLUMNS_LIST));
+ this.stateChangeListener = buildStateChangeListener();
+ }
+
+
+ private StateChangeListener buildStateChangeListener() {
+ return new StateChangeListener() {
+ public void stateChanged(StateChangeEvent event) {
+ valueStateChanged();
+ }
+ };
+ }
+
+ void valueStateChanged() {
+ Object oldValue = this.cachedValue;
+ Object newValue = transformNew(this.valueHolder.getValue());
+ firePropertyChanged(VALUE, oldValue, newValue);
+ }
+
+ @Override
+ protected Boolean transform(T value) {
+ if (value == null) {
+ return Boolean.FALSE;
+ }
+ return super.transform(value);
+ }
+
+ @Override
+ protected Boolean transform_(T value) {
+ boolean virtual = ReferenceTableComposite.this.tableIsVirtual(value);
+ return Boolean.valueOf(! virtual && value.specifiedJoinColumnsSize() > 0);
+ }
+
+ @Override
+ protected void engageModel() {
+ super.engageModel();
+ this.valueHolder.addStateChangeListener(this.stateChangeListener);
+ }
+
+ @Override
+ protected void disengageModel() {
+ this.valueHolder.removeStateChangeListener(this.stateChangeListener);
+ super.disengageModel();
+ }
+ }
+
+ protected abstract boolean tableIsVirtual(T referenceTable);
+} \ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/SecondaryTableDialog.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/SecondaryTableDialog.java
new file mode 100644
index 0000000000..6bbf03d4a7
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/SecondaryTableDialog.java
@@ -0,0 +1,450 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2009 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.ui.internal.details;
+
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.jpt.common.utility.internal.StringTools;
+import org.eclipse.jpt.jpa.core.JpaProject;
+import org.eclipse.jpt.jpa.core.context.SecondaryTable;
+import org.eclipse.jpt.jpa.db.Database;
+import org.eclipse.jpt.jpa.db.Schema;
+import org.eclipse.jpt.jpa.db.SchemaContainer;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Shell;
+
+/**
+ * Clients can use this dialog to prompt the user for SecondaryTable settings.
+ * Use the following once the dialog is closed:
+ * @see #getSelectedTable()
+ * @see #getSelectedCatalog()
+ * @see #getSelectedSchema()
+ */
+public class SecondaryTableDialog extends Dialog {
+
+ private final JpaProject jpaProject;
+
+ /**
+ * when creating a new SecondaryTable, 'secondaryTable' will be null
+ */
+ private final SecondaryTable secondaryTable;
+ private final String defaultCatalog;
+ private final String defaultSchema;
+
+ protected Combo tableCombo;
+ protected Combo catalogCombo;
+ protected Combo schemaCombo;
+
+ // these values are set upon close
+ private String selectedTable;
+ private String selectedSchema;
+ private String selectedCatalog;
+
+
+ // ********** constructors **********
+
+ /**
+ * Use this constructor to create a new secondary table
+ */
+ public SecondaryTableDialog(Shell parent, JpaProject jpaProject, String defaultCatalog, String defaultSchema) {
+ this(parent, jpaProject, null, defaultCatalog, defaultSchema);
+ }
+
+ /**
+ * Use this constructor to edit an existing secondary table
+ */
+ public SecondaryTableDialog(Shell parent, JpaProject jpaProject, SecondaryTable secondaryTable) {
+ this(parent, jpaProject, secondaryTable, secondaryTable.getDefaultCatalog(), secondaryTable.getDefaultSchema());
+ }
+
+ /**
+ * internal constructor
+ */
+ protected SecondaryTableDialog(Shell parent, JpaProject jpaProject, SecondaryTable secondaryTable, String defaultCatalog, String defaultSchema) {
+ super(parent);
+ this.jpaProject = jpaProject;
+ this.secondaryTable = secondaryTable;
+ this.defaultCatalog = defaultCatalog;
+ this.defaultSchema = defaultSchema;
+ }
+
+
+ // ********** open **********
+
+ @Override
+ protected Point getInitialSize() {
+ Point size = super.getInitialSize();
+ size.x = this.convertWidthInCharsToPixels(50); // ???
+ return size;
+ }
+
+ @Override
+ protected void configureShell(Shell shell) {
+ super.configureShell(shell);
+ shell.setText(this.getTitle());
+ }
+
+ protected String getTitle() {
+ return (this.secondaryTable == null) ?
+ JptUiDetailsMessages.SecondaryTableDialog_addSecondaryTable
+ :
+ JptUiDetailsMessages.SecondaryTableDialog_editSecondaryTable;
+ }
+
+ @Override
+ protected Control createDialogArea(Composite parent) {
+ Composite composite = (Composite) super.createDialogArea(parent);
+ GridLayout gridLayout = (GridLayout) composite.getLayout();
+ gridLayout.numColumns = 2;
+
+ // table
+ Label tableLabel = new Label(composite, SWT.LEFT);
+ tableLabel.setText(JptUiDetailsMessages.SecondaryTableDialog_name);
+ GridData gridData = new GridData();
+ tableLabel.setLayoutData(gridData);
+
+ this.tableCombo = new Combo(composite, SWT.LEFT);
+ gridData = new GridData();
+ gridData.grabExcessHorizontalSpace = true;
+ gridData.horizontalAlignment = SWT.FILL;
+ this.tableCombo.setLayoutData(gridData);
+
+ // catalog
+ Label catalogLabel = new Label(composite, SWT.LEFT);
+ catalogLabel.setText(JptUiDetailsMessages.SecondaryTableDialog_catalog);
+ gridData = new GridData();
+ catalogLabel.setLayoutData(gridData);
+
+ this.catalogCombo = new Combo(composite, SWT.LEFT);
+ gridData = new GridData();
+ gridData.grabExcessHorizontalSpace = true;
+ gridData.horizontalAlignment = SWT.FILL;
+ this.catalogCombo.setLayoutData(gridData);
+
+ // schema
+ Label schemaLabel = new Label(composite, SWT.LEFT);
+ schemaLabel.setText(JptUiDetailsMessages.SecondaryTableDialog_schema);
+ gridData = new GridData();
+ schemaLabel.setLayoutData(gridData);
+
+ this.schemaCombo = new Combo(composite, SWT.LEFT);
+ gridData = new GridData();
+ gridData.grabExcessHorizontalSpace = true;
+ gridData.horizontalAlignment = SWT.FILL;
+ this.schemaCombo.setLayoutData(gridData);
+
+ this.initializeCatalogCombo();
+ this.initializeSchemaCombo();
+ this.initializeTableCombo();
+
+ return composite;
+ }
+
+ @Override
+ protected Control createContents(Composite parent) {
+ Composite composite = (Composite) super.createContents(parent);
+
+ this.tableCombo.addModifyListener(buildTableModifyListener());
+ this.catalogCombo.addSelectionListener(this.buildCatalogSelectionListener());
+ this.schemaCombo.addSelectionListener(this.buildSchemaSelectionListener());
+ this.refreshButtons();
+ return composite;
+ }
+
+ protected void initializeCatalogCombo() {
+ this.populateCatalogCombo();
+
+ if (this.isAddDialog()) {
+ this.catalogCombo.select(0); // out-of-bounds index is ignored
+ } else {
+ String specifiedCatalog = this.secondaryTable.getSpecifiedCatalog();
+ if (specifiedCatalog == null) {
+ this.catalogCombo.select(0); // out-of-bounds index is ignored
+ } else {
+ this.catalogCombo.setText(specifiedCatalog);
+ }
+ }
+ }
+
+ protected void populateCatalogCombo() {
+ Database database = this.getDatabase();
+ if ((database != null) && ! database.supportsCatalogs()) {
+ this.catalogCombo.setEnabled(false);
+ return;
+ }
+
+ // add the default catalog first
+ if (this.defaultCatalog != null) {
+ this.catalogCombo.add(NLS.bind(JptUiDetailsMessages.SecondaryTableDialog_defaultCatalog, this.defaultCatalog));
+ }
+
+ if (database != null) {
+ for (String identifier : database.getSortedCatalogIdentifiers()) {
+ this.catalogCombo.add(identifier);
+ }
+ }
+ }
+
+ protected void initializeSchemaCombo() {
+ this.populateSchemaCombo();
+
+ if (this.isAddDialog()) {
+ this.schemaCombo.select(0); // out-of-bounds index is ignored
+ } else {
+ String specifiedSchema = this.secondaryTable.getSpecifiedSchema();
+ if (specifiedSchema == null) {
+ this.schemaCombo.select(0); // out-of-bounds index is ignored
+ } else {
+ this.schemaCombo.setText(specifiedSchema);
+ }
+ }
+ }
+
+ // assume the catalog combo has been populated by now
+ protected void populateSchemaCombo() {
+ // add the default schema first
+ if (this.defaultSchema != null) {
+ this.schemaCombo.add(NLS.bind(JptUiDetailsMessages.SecondaryTableDialog_defaultSchema, this.defaultSchema));
+ }
+
+ SchemaContainer sc = this.getCurrentDbSchemaContainer();
+ if (sc != null) {
+ for (String identifier : sc.getSortedSchemaIdentifiers()) {
+ this.schemaCombo.add(identifier);
+ }
+ }
+ }
+
+ protected void initializeTableCombo() {
+ this.populateTableCombo();
+
+ if (this.isEditDialog()) {
+ String specifiedName = this.secondaryTable.getSpecifiedName();
+ if (specifiedName != null) {
+ this.tableCombo.setText(specifiedName);
+ }
+ }
+ }
+
+ // assume the schema combo has been populated by now
+ protected void populateTableCombo() {
+ // we don't need to add a "default" to the table combo
+ Schema dbSchema = this.getCurrentDbSchema();
+ if (dbSchema != null) {
+ for (String identifier : dbSchema.getSortedTableIdentifiers()) {
+ this.tableCombo.add(identifier);
+ }
+ }
+ }
+
+
+ // ********** listeners **********
+
+ protected SelectionListener buildCatalogSelectionListener() {
+ return new SelectionListener() {
+ public void widgetSelected(SelectionEvent event) {
+ SecondaryTableDialog.this.selectedCatalogChanged();
+ }
+ public void widgetDefaultSelected(SelectionEvent e) {
+ SecondaryTableDialog.this.selectedCatalogChanged();
+ }
+ @Override
+ public String toString() {
+ return "catalog selection listener"; //$NON-NLS-1$
+ }
+ };
+ }
+
+ protected void selectedCatalogChanged() {
+ this.refreshSchemaCombo();
+ this.refreshTableCombo();
+ }
+
+ protected void refreshSchemaCombo() {
+ String schema = this.schemaCombo.getText();
+ this.schemaCombo.removeAll();
+ this.populateSchemaCombo();
+ this.schemaCombo.setText(schema);
+ }
+
+ protected SelectionListener buildSchemaSelectionListener() {
+ return new SelectionListener() {
+ public void widgetSelected(SelectionEvent event) {
+ SecondaryTableDialog.this.selectedSchemaChanged();
+ }
+ public void widgetDefaultSelected(SelectionEvent e) {
+ SecondaryTableDialog.this.selectedSchemaChanged();
+ }
+ @Override
+ public String toString() {
+ return "schema selection listener"; //$NON-NLS-1$
+ }
+ };
+ }
+
+ protected void selectedSchemaChanged() {
+ this.refreshTableCombo();
+ }
+
+ protected void refreshTableCombo() {
+ String table = this.tableCombo.getText();
+ this.tableCombo.removeAll();
+ this.populateTableCombo();
+ this.tableCombo.setText(table);
+ }
+
+ protected ModifyListener buildTableModifyListener() {
+ return new ModifyListener() {
+ public void modifyText(ModifyEvent event) {
+ SecondaryTableDialog.this.tableChanged();
+ }
+ @Override
+ public String toString() {
+ return "table modify listener"; //$NON-NLS-1$
+ }
+ };
+ }
+
+ protected void tableChanged() {
+ this.refreshButtons();
+ }
+
+ // ********** convenience methods **********
+
+ protected boolean isAddDialog() {
+ return this.secondaryTable == null;
+ }
+
+ protected boolean isEditDialog() {
+ return ! this.isAddDialog();
+ }
+
+ protected Database getDatabase() {
+ return this.jpaProject.getDataSource().getDatabase();
+ }
+
+ protected SchemaContainer getCurrentDbSchemaContainer() {
+ Database database = this.getDatabase();
+ if (database == null) {
+ return null;
+ }
+ if ( ! database.supportsCatalogs()) {
+ return database;
+ }
+ String catalog = this.getCurrentCatalog();
+ return (catalog == null) ? null : database.getCatalogForIdentifier(catalog);
+ }
+
+ protected String getCurrentCatalog() {
+ if ((this.defaultCatalog != null) && (this.catalogCombo.getSelectionIndex() == 0)) {
+ return this.defaultCatalog;
+ }
+ return convertText(this.catalogCombo);
+ }
+
+ protected Schema getCurrentDbSchema() {
+ String schema = this.getCurrentSchema();
+ if (schema == null) {
+ return null;
+ }
+ SchemaContainer sc = this.getCurrentDbSchemaContainer();
+ return (sc == null) ? null : sc.getSchemaForIdentifier(schema);
+ }
+
+ protected String getCurrentSchema() {
+ if ((this.defaultSchema != null) && (this.schemaCombo.getSelectionIndex() == 0)) {
+ return this.defaultSchema;
+ }
+ return convertText(this.schemaCombo);
+ }
+
+ protected void refreshButtons() {
+ this.getButton(IDialogConstants.OK_ID).setEnabled(this.validateEntryValues());
+ }
+
+ protected boolean validateEntryValues() {
+ return ! StringTools.stringIsEmpty(this.tableCombo.getText());
+ }
+
+
+ // ********** close **********
+
+ /**
+ * set all the various values queried by clients once the dialog is closed
+ */
+ @Override
+ public boolean close() {
+ this.selectedTable = this.tableCombo.getText();
+ this.selectedCatalog = convertText(this.catalogCombo, this.defaultCatalog);
+ this.selectedSchema = convertText(this.schemaCombo, this.defaultSchema);
+ return super.close();
+ }
+
+ /**
+ * return null if:
+ * - the default value is selected
+ * - the combo's text is empty
+ */
+ protected static String convertText(Combo combo, String defaultText) {
+ // if the default text is present, then it will be the combo's first selection
+ if ((defaultText != null) && (combo.getSelectionIndex() == 0)) {
+ return null;
+ }
+ return convertText(combo);
+ }
+
+ /**
+ * return null if the combo's text is empty
+ */
+ protected static String convertText(Combo combo) {
+ String text = combo.getText();
+ return (text.length() == 0) ? null : text;
+ }
+
+
+ // ********** public API **********
+
+ /**
+ * Return the selected table. Return an empty string if nothing
+ * is selected (since there is no default).
+ */
+ public String getSelectedTable() {
+ return this.selectedTable;
+ }
+
+ /**
+ * Return the selected catalog. Return null if either nothing or
+ * the default catalog is selected.
+ */
+ public String getSelectedCatalog() {
+ return this.selectedCatalog;
+ }
+
+ /**
+ * Return the selected schema. Return null if either nothing or
+ * the default schema is selected.
+ */
+ public String getSelectedSchema() {
+ return this.selectedSchema;
+ }
+
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/SequenceGeneratorComposite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/SequenceGeneratorComposite.java
new file mode 100644
index 0000000000..585a418f98
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/SequenceGeneratorComposite.java
@@ -0,0 +1,136 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 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.ui.internal.details;
+
+import java.util.Collection;
+import org.eclipse.jpt.common.ui.internal.widgets.Pane;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.JpaProject;
+import org.eclipse.jpt.jpa.core.context.GeneratorContainer;
+import org.eclipse.jpt.jpa.core.context.IdMapping;
+import org.eclipse.jpt.jpa.core.context.SequenceGenerator;
+import org.eclipse.jpt.jpa.db.Schema;
+import org.eclipse.jpt.jpa.ui.internal.JpaHelpContextIds;
+import org.eclipse.jpt.jpa.ui.internal.details.db.SequenceCombo;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * Here the layout of this pane:
+ * <pre>
+ * -----------------------------------------------------------------------------
+ * | ----------------------------------------------------- |
+ * | Name: | I | |
+ * | ----------------------------------------------------- |
+ * | ----------------------------------------------------- |
+ * | Sequence Generator: | SequenceCombo | |
+ * | ----------------------------------------------------- |
+ * | ------------- |
+ * | Allocation Size: | I |I| |
+ * | ------------- |
+ * | ------------- |
+ * | Initial Value: | |I| |
+ * | ------------- |
+ * -----------------------------------------------------------------------------</pre>
+ *
+ * @see IdMapping
+ * @see SequenceGenerator
+ * @see IdMappingGenerationComposite - The parent container
+ * @see SequenceCombo
+ *
+ * @version 2.2
+ * @since 1.0
+ */
+public class SequenceGeneratorComposite extends GeneratorComposite<SequenceGenerator>
+{
+
+ public SequenceGeneratorComposite(Pane<?> parentPane,
+ PropertyValueModel<SequenceGenerator> subjectHolder,
+ Composite parent,
+ GeneratorBuilder<SequenceGenerator> builder) {
+
+ super(parentPane, subjectHolder, parent, builder);
+ }
+
+ @Override
+ protected String getPropertyName() {
+ return GeneratorContainer.SEQUENCE_GENERATOR_PROPERTY;
+ }
+
+ @Override
+ protected void initializeLayout(Composite container) {
+
+ // Name widgets
+ addLabeledText(
+ container,
+ JptUiDetailsMessages.SequenceGeneratorComposite_name,
+ buildGeneratorNameHolder(),
+ JpaHelpContextIds.MAPPING_SEQUENCE_GENERATOR_NAME
+ );
+
+ // Sequence Generator widgets
+ addLabeledComposite(
+ container,
+ JptUiDetailsMessages.SequenceGeneratorComposite_sequence,
+ buildSequenceNameCombo(container),
+ JpaHelpContextIds.MAPPING_SEQUENCE_GENERATOR_SEQUENCE
+ );
+
+ addAllocationSizeCombo(container);
+ addInitialValueCombo(container);
+ }
+
+ protected SequenceCombo<SequenceGenerator> buildSequenceNameCombo(Composite parent) {
+
+ return new SequenceCombo<SequenceGenerator>(this, getSubjectHolder(), parent) {
+
+ @Override
+ protected void addPropertyNames(Collection<String> propertyNames) {
+ super.addPropertyNames(propertyNames);
+ propertyNames.add(SequenceGenerator.DEFAULT_SEQUENCE_NAME_PROPERTY);
+ propertyNames.add(SequenceGenerator.SPECIFIED_SEQUENCE_NAME_PROPERTY);
+ }
+
+ @Override
+ protected String getDefaultValue() {
+ return this.getSubject().getDefaultSequenceName();
+ }
+
+ @Override
+ protected void setValue(String value) {
+ retrieveGenerator().setSpecifiedSequenceName(value);
+ }
+
+ @Override
+ protected String getValue() {
+ return (getSubject() == null) ? null : getSubject().getSpecifiedSequenceName();
+ }
+
+ @Override
+ protected boolean nullSubjectIsAllowed() {
+ return true;
+ }
+
+ /**
+ * subject may be null, so delegate to the composite
+ */
+ @Override
+ protected JpaProject getJpaProject() {
+ return SequenceGeneratorComposite.this.getJpaProject();
+ }
+
+ @Override
+ protected Schema getDbSchema_() {
+ return this.getSubject().getDbSchema();
+ }
+
+ };
+ }
+
+} \ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/TableComposite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/TableComposite.java
new file mode 100644
index 0000000000..7c3ada7fe6
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/TableComposite.java
@@ -0,0 +1,239 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2010 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.ui.internal.details;
+
+import java.util.Collection;
+
+import org.eclipse.jpt.common.ui.internal.util.PaneEnabler;
+import org.eclipse.jpt.common.ui.internal.widgets.Pane;
+import org.eclipse.jpt.common.utility.internal.model.value.PropertyAspectAdapter;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.common.utility.model.value.WritablePropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.Entity;
+import org.eclipse.jpt.jpa.core.context.Table;
+import org.eclipse.jpt.jpa.db.Schema;
+import org.eclipse.jpt.jpa.db.SchemaContainer;
+import org.eclipse.jpt.jpa.ui.internal.JpaHelpContextIds;
+import org.eclipse.jpt.jpa.ui.internal.details.db.CatalogCombo;
+import org.eclipse.jpt.jpa.ui.internal.details.db.SchemaCombo;
+import org.eclipse.jpt.jpa.ui.internal.details.db.TableCombo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Group;
+
+/**
+ * Here the layout of this pane:
+ * <pre>
+ * -----------------------------------------------------------------------------
+ * | |
+ * | - Table ----------------------------------------------------------------- |
+ * | | ------------------------------------------------------------ | |
+ * | | Table: | TableCombo | | |
+ * | | ------------------------------------------------------------ | |
+ * | | ------------------------------------------------------------ | |
+ * | | Catalog: | CatalogCombo | | |
+ * | | ------------------------------------------------------------ | |
+ * | | ------------------------------------------------------------ | |
+ * | | Schema: | SchemaCombo | | |
+ * | | ------------------------------------------------------------ | |
+ * | ------------------------------------------------------------------------- |
+ * -----------------------------------------------------------------------------</pre>
+ *
+ * @see Table
+ * @see EntityComposite - The parent container
+ * @see TableCombo
+ * @see CatalogCombo
+ * @see SchemaCombo
+ *
+ * @TODO repopulate this panel based on the Entity table changing
+ *
+ * @version 2.0
+ * @since 1.0
+ */
+public class TableComposite extends Pane<Entity>
+{
+ /**
+ * Creates a new <code>TableComposite</code>.
+ *
+ * @param parentPane The parent container of this one
+ * @param subjectHolder The holder of the subject
+ * @param parent The parent container
+ */
+ public TableComposite(Pane<? extends Entity> parentPane,
+ Composite parent) {
+
+ super(parentPane, parent, false);
+ }
+
+ @Override
+ protected void initializeLayout(Composite container) {
+
+ // Table group pane
+ Group tableGroupPane = addTitledGroup(
+ container,
+ JptUiDetailsMessages.TableComposite_tableSection
+ );
+
+ PropertyValueModel<Table> subjectHolder = buildTableHolder();
+ // Table widgets
+ addLabeledComposite(
+ tableGroupPane,
+ JptUiDetailsMessages.TableChooser_label,
+ addTableCombo(subjectHolder, tableGroupPane),
+ JpaHelpContextIds.ENTITY_TABLE
+ );
+
+ // Catalog widgets
+ addLabeledComposite(
+ tableGroupPane,
+ JptUiDetailsMessages.CatalogChooser_label,
+ addCatalogCombo(subjectHolder, tableGroupPane),
+ JpaHelpContextIds.ENTITY_CATALOG
+ );
+
+ // Schema widgets
+ addLabeledComposite(
+ tableGroupPane,
+ JptUiDetailsMessages.SchemaChooser_label,
+ addSchemaCombo(subjectHolder, tableGroupPane),
+ JpaHelpContextIds.ENTITY_SCHEMA
+ );
+
+ new PaneEnabler(buildTableEnabledHolder(), this);
+ }
+
+ protected WritablePropertyValueModel<Table> buildTableHolder() {
+
+ return new PropertyAspectAdapter<Entity, Table>(getSubjectHolder(), Entity.TABLE_IS_UNDEFINED_PROPERTY) {
+ @Override
+ protected Table buildValue_() {
+ return this.subject.tableIsUndefined() ? null : this.subject.getTable();
+ }
+ };
+ }
+
+ protected WritablePropertyValueModel<Boolean> buildTableEnabledHolder() {
+ return new PropertyAspectAdapter<Entity, Boolean>(getSubjectHolder(), Entity.SPECIFIED_TABLE_IS_ALLOWED_PROPERTY) {
+ @Override
+ protected Boolean buildValue_() {
+ return Boolean.valueOf(this.subject.specifiedTableIsAllowed());
+ }
+ };
+ }
+
+ private CatalogCombo<Table> addCatalogCombo(PropertyValueModel<Table> tableHolder, Composite container) {
+
+ return new CatalogCombo<Table>(this, tableHolder, container) {
+
+ @Override
+ protected void addPropertyNames(Collection<String> propertyNames) {
+ super.addPropertyNames(propertyNames);
+ propertyNames.add(Table.DEFAULT_CATALOG_PROPERTY);
+ propertyNames.add(Table.SPECIFIED_CATALOG_PROPERTY);
+ }
+
+ @Override
+ protected String getDefaultValue() {
+ return getSubject().getDefaultCatalog();
+ }
+
+ @Override
+ protected void setValue(String value) {
+ getSubject().setSpecifiedCatalog(value);
+ }
+
+ @Override
+ protected String getValue() {
+ return getSubject().getSpecifiedCatalog();
+ }
+ };
+ }
+
+ private SchemaCombo<Table> addSchemaCombo(PropertyValueModel<Table> subjectHolder, Composite container) {
+
+ return new SchemaCombo<Table>(this, subjectHolder, container) {
+
+ @Override
+ protected void addPropertyNames(Collection<String> propertyNames) {
+ super.addPropertyNames(propertyNames);
+ propertyNames.add(Table.DEFAULT_SCHEMA_PROPERTY);
+ propertyNames.add(Table.SPECIFIED_SCHEMA_PROPERTY);
+ }
+
+ @Override
+ protected String getDefaultValue() {
+ return getSubject().getDefaultSchema();
+ }
+
+ @Override
+ protected void setValue(String value) {
+ getSubject().setSpecifiedSchema(value);
+ }
+
+ @Override
+ protected String getValue() {
+ return getSubject().getSpecifiedSchema();
+ }
+
+ @Override
+ protected SchemaContainer getDbSchemaContainer_() {
+ return this.getSubject().getDbSchemaContainer();
+ }
+ };
+ }
+
+ private TableCombo<Table> addTableCombo(PropertyValueModel<Table> subjectHolder, Composite container) {
+
+ return new TableCombo<Table>(this, subjectHolder, container) {
+
+ @Override
+ protected void addPropertyNames(Collection<String> propertyNames) {
+ super.addPropertyNames(propertyNames);
+ propertyNames.add(Table.DEFAULT_NAME_PROPERTY);
+ propertyNames.add(Table.SPECIFIED_NAME_PROPERTY);
+ propertyNames.add(Table.DEFAULT_SCHEMA_PROPERTY);
+ propertyNames.add(Table.SPECIFIED_SCHEMA_PROPERTY);
+ propertyNames.add(Table.DEFAULT_CATALOG_PROPERTY);
+ propertyNames.add(Table.SPECIFIED_CATALOG_PROPERTY);
+ }
+
+ @Override
+ protected void propertyChanged(String propertyName) {
+ super.propertyChanged(propertyName);
+ if (propertyName == Table.DEFAULT_SCHEMA_PROPERTY
+ || propertyName == Table.SPECIFIED_SCHEMA_PROPERTY
+ || propertyName == Table.DEFAULT_CATALOG_PROPERTY
+ || propertyName == Table.SPECIFIED_CATALOG_PROPERTY ) {
+ repopulate();
+ }
+ }
+
+ @Override
+ protected String getDefaultValue() {
+ return this.getSubject().getDefaultName();
+ }
+
+ @Override
+ protected void setValue(String value) {
+ this.getSubject().setSpecifiedName(value);
+ }
+
+ @Override
+ protected String getValue() {
+ return this.getSubject().getSpecifiedName();
+ }
+
+ @Override
+ protected Schema getDbSchema_() {
+ return this.getSubject().getDbSchema();
+ }
+ };
+ }
+
+} \ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/TableGeneratorComposite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/TableGeneratorComposite.java
new file mode 100644
index 0000000000..3cc2853ef4
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/TableGeneratorComposite.java
@@ -0,0 +1,499 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 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.ui.internal.details;
+
+import java.util.Collection;
+import org.eclipse.jpt.common.ui.internal.widgets.Pane;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.JpaProject;
+import org.eclipse.jpt.jpa.core.context.GeneratorContainer;
+import org.eclipse.jpt.jpa.core.context.IdMapping;
+import org.eclipse.jpt.jpa.core.context.TableGenerator;
+import org.eclipse.jpt.jpa.db.Schema;
+import org.eclipse.jpt.jpa.db.SchemaContainer;
+import org.eclipse.jpt.jpa.db.Table;
+import org.eclipse.jpt.jpa.ui.internal.JpaHelpContextIds;
+import org.eclipse.jpt.jpa.ui.internal.details.db.CatalogCombo;
+import org.eclipse.jpt.jpa.ui.internal.details.db.ColumnCombo;
+import org.eclipse.jpt.jpa.ui.internal.details.db.SchemaCombo;
+import org.eclipse.jpt.jpa.ui.internal.details.db.TableCombo;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * Here the layout of this pane:
+ * <pre>
+ * -----------------------------------------------------------------------------
+ * | ----------------------------------------------- |
+ * | Name: | I | |
+ * | ----------------------------------------------- |
+ * | ----------------------------------------------- |
+ * | Table: | TableCombo | |
+ * | ----------------------------------------------- |
+ * | ----------------------------------------------- |
+ * | Catalog: | CatalogCombo | |
+ * | ----------------------------------------------- |
+ * | ----------------------------------------------- |
+ * | Schema: | SchemaCombo | |
+ * | ----------------------------------------------- |
+ * | ----------------------------------------------- |
+ * | Primary Key Column: | ColumnCombo | |
+ * | ----------------------------------------------- |
+ * | ----------------------------------------------- |
+ * | Value Column: | ColumnCombo | |
+ * | ----------------------------------------------- |
+ * | ----------------------------------------------- |
+ * | Primary Key Column Value: | ColumnCombo | |
+ * | ----------------------------------------------- |
+ * | ------------- |
+ * | Allocation Size: | I |I| Default (XX) |
+ * | ------------- |
+ * | ------------- |
+ * | Initial Value: | I |I| Default (XX) |
+ * | ------------- |
+ * -----------------------------------------------------------------------------</pre>
+ *
+ * @see IdMapping
+ * @see TableGenerator
+ * @see IdMappingGenerationComposite - The parent container
+ * @see CatalogCombo
+ * @see ColumnCombo
+ * @see SchemaCombo
+ * @see TableCombo
+ *
+ * @version 2.2
+ * @since 1.0
+ */
+public class TableGeneratorComposite extends GeneratorComposite<TableGenerator>
+{
+
+
+ public TableGeneratorComposite(Pane<?> parentPane,
+ PropertyValueModel<TableGenerator> subjectHolder,
+ Composite parent,
+ GeneratorBuilder<TableGenerator> builder) {
+
+ super(parentPane, subjectHolder, parent, builder);
+ }
+
+ @Override
+ protected String getPropertyName() {
+ return GeneratorContainer.TABLE_GENERATOR_PROPERTY;
+ }
+
+
+ @Override
+ protected void initializeLayout(Composite container) {
+
+ // Name widgets
+ addLabeledText(
+ container,
+ JptUiDetailsMessages.TableGeneratorComposite_name,
+ buildGeneratorNameHolder(),
+ JpaHelpContextIds.MAPPING_TABLE_GENERATOR_NAME
+ );
+
+ // Table widgets
+ addLabeledComposite(
+ container,
+ JptUiDetailsMessages.TableGeneratorComposite_table,
+ addTableNameCombo(container),
+ JpaHelpContextIds.MAPPING_TABLE_GENERATOR_TABLE
+ );
+
+ // Schema widgets
+ addLabeledComposite(
+ container,
+ JptUiDetailsMessages.TableGeneratorComposite_schema,
+ addSchemaCombo(container),
+ JpaHelpContextIds.MAPPING_TABLE_GENERATOR_SCHEMA
+ );
+
+ // Catalog widgets
+ addLabeledComposite(
+ container,
+ JptUiDetailsMessages.TableGeneratorComposite_catalog,
+ addCatalogCombo(container),
+ JpaHelpContextIds.MAPPING_TABLE_GENERATOR_CATALOG
+ );
+
+ // Primary Key Column widgets
+ addLabeledComposite(
+ container,
+ JptUiDetailsMessages.TableGeneratorComposite_pkColumn,
+ addPkColumnNameCombo(container),
+ JpaHelpContextIds.MAPPING_TABLE_GENERATOR_PRIMARY_KEY_COLUMN
+ );
+
+ // Value Column widgets
+ addLabeledComposite(
+ container,
+ JptUiDetailsMessages.TableGeneratorComposite_valueColumn,
+ addValueColumnCombo(container),
+ JpaHelpContextIds.MAPPING_TABLE_GENERATOR_VALUE_COLUMN
+ );
+
+ // Primary Key Column Value widgets
+ addLabeledComposite(
+ container,
+ JptUiDetailsMessages.TableGeneratorComposite_pkColumnValue,
+ addPkColumnValueCombo(container),
+ JpaHelpContextIds.MAPPING_TABLE_GENERATOR_PRIMARY_KEY_COLUMN_VALUE
+ );
+
+ addAllocationSizeCombo(container);
+ addInitialValueCombo(container);
+ }
+
+ private CatalogCombo<TableGenerator> addCatalogCombo(Composite container) {
+
+ return new CatalogCombo<TableGenerator>(this, getSubjectHolder(), container) {
+
+ @Override
+ protected void addPropertyNames(Collection<String> propertyNames) {
+ super.addPropertyNames(propertyNames);
+ propertyNames.add(TableGenerator.DEFAULT_CATALOG_PROPERTY);
+ propertyNames.add(TableGenerator.SPECIFIED_CATALOG_PROPERTY);
+ }
+
+ @Override
+ protected String getDefaultValue() {
+ return getSubject().getDefaultCatalog();
+ }
+
+ @Override
+ protected boolean nullSubjectIsAllowed() {
+ return true;
+ }
+
+ /**
+ * subject may be null, so delegate to the composite
+ */
+ @Override
+ protected JpaProject getJpaProject() {
+ return TableGeneratorComposite.this.getJpaProject();
+ }
+
+ @Override
+ protected void setValue(String value) {
+ retrieveGenerator().setSpecifiedCatalog(value);
+ }
+
+ @Override
+ protected String getValue() {
+ return getSubject().getSpecifiedCatalog();
+ }
+ };
+ }
+
+ private ColumnCombo<TableGenerator> addPkColumnNameCombo(Composite parent) {
+
+ return new ColumnCombo<TableGenerator>(this, getSubjectHolder(), parent) {
+
+ @Override
+ protected void addPropertyNames(Collection<String> propertyNames) {
+ super.addPropertyNames(propertyNames);
+ propertyNames.add(TableGenerator.DEFAULT_PK_COLUMN_NAME_PROPERTY);
+ propertyNames.add(TableGenerator.SPECIFIED_PK_COLUMN_NAME_PROPERTY);
+ propertyNames.add(TableGenerator.DEFAULT_TABLE_PROPERTY);
+ propertyNames.add(TableGenerator.SPECIFIED_TABLE_PROPERTY);
+ }
+
+ @Override
+ protected void propertyChanged(String propertyName) {
+ if (propertyName == TableGenerator.DEFAULT_TABLE_PROPERTY ||
+ propertyName == TableGenerator.SPECIFIED_TABLE_PROPERTY) {
+ this.repopulateComboBox();
+ } else {
+ super.propertyChanged(propertyName);
+ }
+ }
+
+ @Override
+ protected String getDefaultValue() {
+ return getSubject().getDefaultPkColumnName();
+ }
+
+ @Override
+ protected boolean nullSubjectIsAllowed() {
+ return true;
+ }
+
+ /**
+ * subject may be null, so delegate to the composite
+ */
+ @Override
+ protected JpaProject getJpaProject() {
+ return TableGeneratorComposite.this.getJpaProject();
+ }
+
+ @Override
+ protected void setValue(String value) {
+ retrieveGenerator().setSpecifiedPkColumnName(value);
+ }
+
+ @Override
+ protected Table getDbTable_() {
+ return getSubject().getDbTable();
+ }
+
+ @Override
+ protected String getValue() {
+ return getSubject().getSpecifiedPkColumnName();
+ }
+ };
+ }
+
+ private ColumnCombo<TableGenerator> addPkColumnValueCombo(Composite parent) {
+
+ return new ColumnCombo<TableGenerator>(this, getSubjectHolder(), parent) {
+
+ @Override
+ protected void addPropertyNames(Collection<String> propertyNames) {
+ super.addPropertyNames(propertyNames);
+ propertyNames.add(TableGenerator.DEFAULT_PK_COLUMN_VALUE_PROPERTY);
+ propertyNames.add(TableGenerator.SPECIFIED_PK_COLUMN_VALUE_PROPERTY);
+ }
+
+ @Override
+ protected String getDefaultValue() {
+ return getSubject().getDefaultPkColumnValue();
+ }
+
+ @Override
+ protected boolean nullSubjectIsAllowed() {
+ return true;
+ }
+
+ /**
+ * subject may be null, so delegate to the composite
+ */
+ @Override
+ protected JpaProject getJpaProject() {
+ return TableGeneratorComposite.this.getJpaProject();
+ }
+
+ @Override
+ protected void setValue(String value) {
+ retrieveGenerator().setSpecifiedPkColumnValue(value);
+ }
+
+ @Override
+ protected Table getDbTable_() {
+ return getSubject().getDbTable();
+ }
+
+ @Override
+ protected String getValue() {
+ return getSubject().getSpecifiedPkColumnValue();
+ }
+ };
+ }
+
+ private SchemaCombo<TableGenerator> addSchemaCombo(Composite container) {
+
+ return new SchemaCombo<TableGenerator>(this, getSubjectHolder(), container) {
+
+ @Override
+ protected void addPropertyNames(Collection<String> propertyNames) {
+ super.addPropertyNames(propertyNames);
+ propertyNames.add(TableGenerator.DEFAULT_SCHEMA_PROPERTY);
+ propertyNames.add(TableGenerator.SPECIFIED_SCHEMA_PROPERTY);
+ propertyNames.add(TableGenerator.DEFAULT_CATALOG_PROPERTY);
+ propertyNames.add(TableGenerator.SPECIFIED_CATALOG_PROPERTY);
+ }
+
+ @Override
+ protected void propertyChanged(String propertyName) {
+ if (propertyName == TableGenerator.DEFAULT_CATALOG_PROPERTY
+ || propertyName == TableGenerator.SPECIFIED_CATALOG_PROPERTY ) {
+ repopulateComboBox();
+ }
+ else {
+ super.propertyChanged(propertyName);
+ }
+ }
+
+ @Override
+ protected String getDefaultValue() {
+ return getSubject().getDefaultSchema();
+ }
+
+ @Override
+ protected boolean nullSubjectIsAllowed() {
+ return true;
+ }
+
+ /**
+ * subject may be null, so delegate to the composite
+ */
+ @Override
+ protected JpaProject getJpaProject() {
+ return TableGeneratorComposite.this.getJpaProject();
+ }
+
+ @Override
+ protected void setValue(String value) {
+ retrieveGenerator().setSpecifiedSchema(value);
+ }
+
+ @Override
+ protected String getValue() {
+ return getSubject().getSpecifiedSchema();
+ }
+
+ @Override
+ protected SchemaContainer getDbSchemaContainer() {
+ TableGenerator tg = this.getSubject();
+ if (tg != null) {
+ return tg.getDbSchemaContainer();
+ }
+ return TableGeneratorComposite.this.getSubject().getContextDefaultDbSchemaContainer();
+ }
+
+ @Override
+ protected SchemaContainer getDbSchemaContainer_() {
+ // we overrode #getDbSchemaContainer() instead
+ throw new UnsupportedOperationException();
+ }
+ };
+ }
+
+ private TableCombo<TableGenerator> addTableNameCombo(Composite parent) {
+
+ return new TableCombo<TableGenerator>(this, getSubjectHolder(), parent) {
+
+ @Override
+ protected void addPropertyNames(Collection<String> propertyNames) {
+ super.addPropertyNames(propertyNames);
+ propertyNames.add(TableGenerator.DEFAULT_TABLE_PROPERTY);
+ propertyNames.add(TableGenerator.SPECIFIED_TABLE_PROPERTY);
+ propertyNames.add(TableGenerator.DEFAULT_SCHEMA_PROPERTY);
+ propertyNames.add(TableGenerator.SPECIFIED_SCHEMA_PROPERTY);
+ propertyNames.add(TableGenerator.DEFAULT_CATALOG_PROPERTY);
+ propertyNames.add(TableGenerator.SPECIFIED_CATALOG_PROPERTY);
+ }
+
+ @Override
+ protected void propertyChanged(String propertyName) {
+ if (propertyName == TableGenerator.DEFAULT_SCHEMA_PROPERTY
+ || propertyName == TableGenerator.SPECIFIED_SCHEMA_PROPERTY
+ || propertyName == TableGenerator.DEFAULT_CATALOG_PROPERTY
+ || propertyName == TableGenerator.SPECIFIED_CATALOG_PROPERTY ) {
+ repopulateComboBox();
+ }
+ else {
+ super.propertyChanged(propertyName);
+ }
+ }
+
+ @Override
+ protected String getDefaultValue() {
+ return this.getSubject().getDefaultTable();
+ }
+
+ @Override
+ protected boolean nullSubjectIsAllowed() {
+ return true;
+ }
+
+ /**
+ * subject may be null, so delegate to the composite
+ */
+ @Override
+ protected JpaProject getJpaProject() {
+ return TableGeneratorComposite.this.getJpaProject();
+ }
+
+ @Override
+ protected void setValue(String value) {
+ retrieveGenerator().setSpecifiedTable(value);
+ }
+
+ @Override
+ protected String getValue() {
+ return this.getSubject().getSpecifiedTable();
+ }
+
+ @Override
+ protected Schema getDbSchema() {
+ TableGenerator tg = this.getSubject();
+ if (tg != null) {
+ return tg.getDbSchema();
+ }
+ return TableGeneratorComposite.this.getSubject().getContextDefaultDbSchema();
+ }
+
+ @Override
+ protected Schema getDbSchema_() {
+ // we overrode #getDbSchema() instead
+ throw new UnsupportedOperationException();
+ }
+
+ };
+ }
+
+ private ColumnCombo<TableGenerator> addValueColumnCombo(Composite parent) {
+
+ return new ColumnCombo<TableGenerator>(this, getSubjectHolder(), parent) {
+
+ @Override
+ protected void addPropertyNames(Collection<String> propertyNames) {
+ super.addPropertyNames(propertyNames);
+ propertyNames.add(TableGenerator.DEFAULT_VALUE_COLUMN_NAME_PROPERTY);
+ propertyNames.add(TableGenerator.SPECIFIED_VALUE_COLUMN_NAME_PROPERTY);
+ propertyNames.add(TableGenerator.DEFAULT_TABLE_PROPERTY);
+ propertyNames.add(TableGenerator.SPECIFIED_TABLE_PROPERTY);
+ }
+
+ @Override
+ protected void propertyChanged(String propertyName) {
+ if (propertyName == TableGenerator.DEFAULT_TABLE_PROPERTY ||
+ propertyName == TableGenerator.SPECIFIED_TABLE_PROPERTY) {
+ this.repopulateComboBox();
+ } else {
+ super.propertyChanged(propertyName);
+ }
+ }
+
+ @Override
+ protected String getDefaultValue() {
+ return getSubject().getDefaultValueColumnName();
+ }
+
+ @Override
+ protected boolean nullSubjectIsAllowed() {
+ return true;
+ }
+
+ /**
+ * subject may be null, so delegate to the composite
+ */
+ @Override
+ protected JpaProject getJpaProject() {
+ return TableGeneratorComposite.this.getJpaProject();
+ }
+
+ @Override
+ protected void setValue(String value) {
+ retrieveGenerator().setSpecifiedValueColumnName(value);
+ }
+
+ @Override
+ protected Table getDbTable_() {
+ return getSubject().getDbTable();
+ }
+
+ @Override
+ protected String getValue() {
+ return getSubject().getSpecifiedValueColumnName();
+ }
+ };
+ }
+} \ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/TargetEntityComposite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/TargetEntityComposite.java
new file mode 100644
index 0000000000..20e4b4ad09
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/TargetEntityComposite.java
@@ -0,0 +1,131 @@
+/*******************************************************************************
+* 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.ui.internal.details;
+
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jpt.common.ui.internal.JptCommonUiMessages;
+import org.eclipse.jpt.common.ui.internal.widgets.ClassChooserComboPane;
+import org.eclipse.jpt.common.ui.internal.widgets.Pane;
+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.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.core.context.RelationshipMapping;
+import org.eclipse.jpt.jpa.ui.internal.JpaHelpContextIds;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * target entity hyperlink label, combo and browse button
+ */
+public class TargetEntityComposite
+ extends ClassChooserComboPane<RelationshipMapping>
+{
+ /**
+ * Creates a new <code>TargetEntityComposite</code>.
+ *
+ * @param parentPane The parent container of this one
+ * @param parent The parent container
+ */
+ public TargetEntityComposite(
+ Pane<? extends RelationshipMapping> parentPane,
+ Composite parent) {
+
+ super(parentPane, parent);
+ }
+
+
+ @Override
+ protected String getClassName() {
+ return getSubject().getTargetEntity();
+ }
+
+ @Override
+ protected void setClassName(String className) {
+ this.getSubject().setSpecifiedTargetEntity(className);
+ }
+
+ @Override
+ protected String getLabelText() {
+ return JptUiDetailsMessages.TargetEntityChooser_label;
+ }
+
+ @Override
+ protected String getHelpId() {
+ return JpaHelpContextIds.MAPPING_TARGET_ENTITY;
+ }
+
+ @Override
+ protected IJavaProject getJavaProject() {
+ return getSubject().getJpaProject().getJavaProject();
+ }
+
+ @Override
+ protected char getEnclosingTypeSeparator() {
+ return getSubject().getTargetEntityEnclosingTypeSeparator();
+ }
+
+ @Override
+ protected WritablePropertyValueModel<String> buildTextHolder() {
+ return new PropertyAspectAdapter<RelationshipMapping, String>(this.getSubjectHolder(), RelationshipMapping.SPECIFIED_TARGET_ENTITY_PROPERTY) {
+ @Override
+ protected String buildValue_() {
+
+ String name = this.subject.getSpecifiedTargetEntity();
+ if (name == null) {
+ name = TargetEntityComposite.this.getDefaultValue(this.subject);
+ }
+ return name;
+ }
+
+ @Override
+ protected void setValue_(String value) {
+
+ if (getDefaultValue(this.subject).equals(value)) {
+ value = null;
+ }
+ this.subject.setSpecifiedTargetEntity(value);
+ }
+ };
+ }
+
+ @Override
+ protected ListValueModel<String> buildClassListHolder() {
+ return this.buildDefaultProfilerListHolder();
+ }
+
+ private ListValueModel<String> buildDefaultProfilerListHolder() {
+ return new PropertyListValueModelAdapter<String>(
+ this.buildDefaultProfilerHolder()
+ );
+ }
+
+ private PropertyValueModel<String> buildDefaultProfilerHolder() {
+ return new PropertyAspectAdapter<RelationshipMapping, String>(this.getSubjectHolder(), RelationshipMapping.DEFAULT_TARGET_ENTITY_PROPERTY) {
+ @Override
+ protected String buildValue_() {
+ return TargetEntityComposite.this.getDefaultValue(this.subject);
+ }
+ };
+ }
+
+ private String getDefaultValue(RelationshipMapping subject) {
+ String defaultValue = subject.getDefaultTargetEntity();
+
+ if (defaultValue != null) {
+ return NLS.bind(
+ JptCommonUiMessages.DefaultWithOneParam,
+ defaultValue
+ );
+ }
+ return JptCommonUiMessages.DefaultEmpty;
+ }
+} \ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/TemporalTypeComposite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/TemporalTypeComposite.java
new file mode 100644
index 0000000000..65c6d2fc46
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/TemporalTypeComposite.java
@@ -0,0 +1,139 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2010 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.ui.internal.details;
+
+import java.util.Comparator;
+import java.util.List;
+
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.ui.internal.util.SWTUtil;
+import org.eclipse.jpt.common.ui.internal.widgets.Pane;
+import org.eclipse.jpt.common.utility.internal.CollectionTools;
+import org.eclipse.jpt.common.utility.internal.StringConverter;
+import org.eclipse.jpt.common.utility.internal.model.value.PropertyAspectAdapter;
+import org.eclipse.jpt.common.utility.internal.model.value.SimpleListValueModel;
+import org.eclipse.jpt.common.utility.internal.model.value.TransformationPropertyValueModel;
+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.core.context.TemporalConverter;
+import org.eclipse.jpt.jpa.core.context.TemporalType;
+import org.eclipse.swt.widgets.Composite;
+
+import com.ibm.icu.text.Collator;
+
+/**
+ * Here the layout of this pane:
+ * <pre>
+ * -----------------------------------------------------------------------------
+ * | --------------------------------------------------------------- |
+ * | Temporal: | |v| |
+ * | --------------------------------------------------------------- |
+ * -----------------------------------------------------------------------------</pre>
+ *
+ * @see ColumnMapping
+ * @see TemporalType
+ * @see BasicMappingComposite - A container of this pane
+ * @see IdMappingComposite - A container of this pane
+ * @see VersionMappingComposite - A container of this pane
+ *
+ * @version 2.0
+ * @since 1.0
+ */
+public class TemporalTypeComposite extends Pane<TemporalConverter> {
+
+ /**
+ * Creates a new <code>TemporalTypeComposite</code>.
+ *
+ * @param parentPane The parent container of this one
+ * @param parent The parent container
+ */
+ public TemporalTypeComposite(PropertyValueModel<? extends TemporalConverter> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+
+ super(subjectHolder, parent, widgetFactory);
+ }
+
+ @Override
+ protected void initializeLayout(Composite container) {
+
+ this.addCombo(
+ container,
+ buildTemporalTypeListHolder(),
+ buildTemporalTypeHolder(),
+ buildTemporalTypeConverter(),
+ buildBooleanHolder()
+ );
+ }
+
+ private WritablePropertyValueModel<TemporalType> buildTemporalTypeHolder() {
+ return new PropertyAspectAdapter<TemporalConverter, TemporalType>(getSubjectHolder(), TemporalConverter.TEMPORAL_TYPE_PROPERTY) {
+ @Override
+ protected TemporalType buildValue_() {
+ return subject.getTemporalType();
+ }
+
+ @Override
+ protected void setValue_(TemporalType value) {
+ subject.setTemporalType(value);
+ }
+ };
+ }
+
+ private ListValueModel<TemporalType> buildTemporalTypeListHolder() {
+ return new SimpleListValueModel<TemporalType>(
+ buildSortedTemporalTypeList()
+ );
+ }
+
+ private List<TemporalType> buildSortedTemporalTypeList() {
+ return CollectionTools.sort(CollectionTools.list(TemporalType.values()), this.buildTemporalTypeComparator());
+ }
+
+ private Comparator<TemporalType> buildTemporalTypeComparator() {
+ return new Comparator<TemporalType>() {
+ public int compare(TemporalType type1, TemporalType type2) {
+ String displayString1 = displayString(type1);
+ String displayString2 = displayString(type2);
+ return Collator.getInstance().compare(displayString1, displayString2);
+ }
+ };
+ }
+
+ private StringConverter<TemporalType> buildTemporalTypeConverter() {
+ return new StringConverter<TemporalType>() {
+ public String convertToString(TemporalType value) {
+ return (value == null) ? null : displayString(value);
+ }
+ };
+ }
+
+ String displayString(TemporalType temporalType) {
+ return SWTUtil.buildDisplayString(
+ JptUiDetailsMessages.class,
+ TemporalTypeComposite.this,
+ temporalType.name()
+ );
+ }
+
+ protected PropertyValueModel<Boolean> buildBooleanHolder() {
+ return new TransformationPropertyValueModel<TemporalConverter, Boolean>(getSubjectHolder()) {
+ @Override
+ protected Boolean transform(TemporalConverter value) {
+ if (getSubject() != null && getSubject().getParent().getPersistentAttribute().isVirtual()) {
+ return Boolean.FALSE;
+ }
+ return Boolean.valueOf(value != null);
+ }
+ };
+ }
+
+} \ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/TransientMappingComposite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/TransientMappingComposite.java
new file mode 100644
index 0000000000..f6768f3d1f
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/TransientMappingComposite.java
@@ -0,0 +1,50 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2010 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.ui.internal.details;
+
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.ui.internal.widgets.Pane;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.TransientMapping;
+import org.eclipse.jpt.jpa.ui.details.JpaComposite;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * This pane does not have any widgets.
+ *
+ * @see TransientMapping
+ *
+ * @version 2.0
+ * @since 1.0
+ */
+public class TransientMappingComposite extends Pane<TransientMapping>
+ implements JpaComposite
+{
+ /**
+ * Creates a new <code>TransientMappingComposite</code>.
+ *
+ * @param subjectHolder The holder of the subject <code>ITransientMapping</code>
+ * @param parent The parent container
+ * @param widgetFactory The factory used to create various common widgets
+ */
+ public TransientMappingComposite(PropertyValueModel<? extends TransientMapping> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+
+ super(subjectHolder, parent, widgetFactory);
+ }
+
+ /*
+ * (non-Javadoc)
+ */
+ @Override
+ protected void initializeLayout(Composite container) {
+ }
+} \ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/VersionMappingComposite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/VersionMappingComposite.java
new file mode 100644
index 0000000000..1d5c4a60b4
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/VersionMappingComposite.java
@@ -0,0 +1,61 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2010 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.ui.internal.details;
+
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.VersionMapping;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * Here the layout of this pane:
+ * <pre>
+ * -----------------------------------------------------------------------------
+ * | ------------------------------------------------------------------------- |
+ * | | | |
+ * | | ColumnComposite | |
+ * | | | |
+ * | ------------------------------------------------------------------------- |
+ * | ------------------------------------------------------------------------- |
+ * | | | |
+ * | | TemporalTypeComposite | |
+ * | | | |
+ * | ------------------------------------------------------------------------- |
+ * -----------------------------------------------------------------------------</pre>
+ *
+ * @see VersionMapping
+ * @see ColumnComposite
+ * @see TemporalTypeComposite
+ *
+ * @version 2.3
+ * @since 1.0
+ */
+public class VersionMappingComposite
+ extends AbstractVersionMappingComposite<VersionMapping>
+{
+ /**
+ * Creates a new <code>VersionMappingComposite</code>.
+ *
+ * @param subjectHolder The holder of the subject <code>IVersionMapping</code>
+ * @param parent The parent container
+ * @param widgetFactory The factory used to create various common widgets
+ */
+ public VersionMappingComposite(PropertyValueModel<? extends VersionMapping> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+
+ super(subjectHolder, parent, widgetFactory);
+ }
+
+ @Override
+ protected void initializeVersionSection(Composite container) {
+ new ColumnComposite(this, buildColumnHolder(), container);
+ }
+} \ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/db/CatalogCombo.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/db/CatalogCombo.java
new file mode 100644
index 0000000000..dff170cb8f
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/db/CatalogCombo.java
@@ -0,0 +1,44 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2009 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.ui.internal.details.db;
+
+import org.eclipse.jpt.common.ui.internal.widgets.Pane;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.JpaNode;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * This combo-box displays the database's catalogs.
+ */
+public abstract class CatalogCombo<T extends JpaNode>
+ extends DatabaseObjectCombo<T>
+{
+ public CatalogCombo(
+ Pane<? extends T> parentPane,
+ Composite parent) {
+
+ super(parentPane, parent);
+ }
+
+ public CatalogCombo(
+ Pane<?> parentPane,
+ PropertyValueModel<? extends T> subjectHolder,
+ Composite parent) {
+
+ super(parentPane, subjectHolder, parent);
+ }
+
+
+ @Override
+ protected Iterable<String> getValues_() {
+ return this.getDatabase().getSortedCatalogIdentifiers();
+ }
+
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/db/ColumnCombo.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/db/ColumnCombo.java
new file mode 100644
index 0000000000..99243ac41a
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/db/ColumnCombo.java
@@ -0,0 +1,63 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2009 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.ui.internal.details.db;
+
+import org.eclipse.jpt.common.ui.internal.widgets.Pane;
+import org.eclipse.jpt.common.utility.internal.iterables.EmptyIterable;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.JpaNode;
+import org.eclipse.jpt.jpa.db.Table;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * This combo-box displays a table's columns.
+ */
+public abstract class ColumnCombo<T extends JpaNode>
+ extends DatabaseObjectCombo<T>
+{
+ public ColumnCombo(
+ Pane<? extends T> parentPane,
+ Composite parent) {
+
+ super(parentPane, parent);
+ }
+
+ public ColumnCombo(
+ Pane<?> parentPane,
+ PropertyValueModel<? extends T> subjectHolder,
+ Composite parent) {
+
+ super(parentPane, subjectHolder, parent);
+ }
+
+
+ @Override
+ protected Iterable<String> getValues_() {
+ Table dbTable = this.getDbTable();
+ return (dbTable != null) ? dbTable.getSortedColumnIdentifiers() : EmptyIterable.<String>instance();
+ }
+
+ protected Table getDbTable() {
+ return (this.getSubject() == null) ? null : this.getDbTable_();
+ }
+
+ /**
+ * Assume the subject is not null.
+ */
+ protected abstract Table getDbTable_();
+
+ @Override
+ protected void tableChanged_(Table table) {
+ super.tableChanged_(table);
+ if (this.getDbTable() == table) {
+ this.doPopulate();
+ }
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/db/DatabaseObjectCombo.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/db/DatabaseObjectCombo.java
new file mode 100644
index 0000000000..1a670e1ee3
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/db/DatabaseObjectCombo.java
@@ -0,0 +1,349 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 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.ui.internal.details.db;
+
+import org.eclipse.jpt.common.ui.internal.Tracing;
+import org.eclipse.jpt.common.ui.internal.listeners.SWTPropertyChangeListenerWrapper;
+import org.eclipse.jpt.common.ui.internal.widgets.ComboPane;
+import org.eclipse.jpt.common.ui.internal.widgets.Pane;
+import org.eclipse.jpt.common.utility.internal.iterables.EmptyIterable;
+import org.eclipse.jpt.common.utility.model.event.PropertyChangeEvent;
+import org.eclipse.jpt.common.utility.model.listener.PropertyChangeListener;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.JpaDataSource;
+import org.eclipse.jpt.jpa.core.JpaNode;
+import org.eclipse.jpt.jpa.core.JpaProject;
+import org.eclipse.jpt.jpa.db.Catalog;
+import org.eclipse.jpt.jpa.db.Column;
+import org.eclipse.jpt.jpa.db.ConnectionListener;
+import org.eclipse.jpt.jpa.db.ConnectionProfile;
+import org.eclipse.jpt.jpa.db.Database;
+import org.eclipse.jpt.jpa.db.ForeignKey;
+import org.eclipse.jpt.jpa.db.Schema;
+import org.eclipse.jpt.jpa.db.Sequence;
+import org.eclipse.jpt.jpa.db.Table;
+import org.eclipse.jpt.jpa.ui.internal.listeners.SWTConnectionListenerWrapper;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * This abstract pane keeps a combo in sync with the database objects
+ * when a connection is active.
+ *
+ * @see CatalogCombo
+ * @see ColumnCombo
+ * @see SchemaCombo
+ * @see SequenceCombo
+ * @see TableCombo
+ */
+@SuppressWarnings("nls")
+public abstract class DatabaseObjectCombo<T extends JpaNode>
+ extends ComboPane<T>
+{
+ /**
+ * The listener added to the <code>ConnectionProfile</code>.
+ * It keeps the combo in sync with the database metadata.
+ */
+ private ConnectionListener connectionListener;
+
+ private PropertyChangeListener connectionProfileListener;
+
+
+ // ********** constructors **********
+
+ protected DatabaseObjectCombo(
+ Pane<? extends T> parentPane,
+ Composite parent) {
+
+ super(parentPane, parent);
+ }
+
+ protected DatabaseObjectCombo(
+ Pane<?> parentPane,
+ PropertyValueModel<? extends T> subjectHolder,
+ Composite parent) {
+
+ super(parentPane, subjectHolder, parent);
+ }
+
+
+ // ********** initialization **********
+
+ @Override
+ protected void initialize() {
+ super.initialize();
+ this.connectionListener = this.buildConnectionListener();
+ this.connectionProfileListener = this.buildConnectionProfileListener();
+ }
+
+ protected ConnectionListener buildConnectionListener() {
+ return new SWTConnectionListenerWrapper(this.buildConnectionListener_());
+ }
+
+ protected ConnectionListener buildConnectionListener_() {
+ return new LocalConnectionListener();
+ }
+
+ protected PropertyChangeListener buildConnectionProfileListener() {
+ return new SWTPropertyChangeListenerWrapper(this.buildConnectionProfileListener_());
+ }
+
+ protected PropertyChangeListener buildConnectionProfileListener_() {
+ return new PropertyChangeListener(){
+
+ public void propertyChanged(PropertyChangeEvent event) {
+ connectionProfileChanged(event);
+ }
+ };
+ }
+
+ protected void connectionProfileChanged(PropertyChangeEvent event) {
+ if (event.getOldValue() != null) {
+ ((ConnectionProfile) event.getOldValue()).removeConnectionListener(this.connectionListener);
+ }
+ if (event.getNewValue() != null) {
+ ((ConnectionProfile) event.getNewValue()).addConnectionListener(this.connectionListener);
+ }
+ this.repopulateComboBox();
+ }
+
+
+ // ********** overrides **********
+
+ @Override
+ protected void engageListeners_(T subject) {
+ super.engageListeners_(subject);
+
+ subject.getJpaProject().getDataSource().addPropertyChangeListener(JpaDataSource.CONNECTION_PROFILE_PROPERTY, this.connectionProfileListener);
+ ConnectionProfile cp = subject.getJpaProject().getConnectionProfile();
+ if (cp != null) {
+ cp.addConnectionListener(this.connectionListener);
+ }
+ }
+
+ @Override
+ protected void disengageListeners_(T subject) {
+ ConnectionProfile cp = subject.getJpaProject().getConnectionProfile();
+ if (cp != null) {
+ cp.removeConnectionListener(this.connectionListener);
+ }
+ subject.getJpaProject().getDataSource().removePropertyChangeListener(JpaDataSource.CONNECTION_PROFILE_PROPERTY, this.connectionProfileListener);
+
+ super.disengageListeners_(subject);
+ }
+
+ @Override
+ protected final Iterable<String> getValues() {
+ return this.connectionProfileIsActive() ? this.getValues_() : EmptyIterable.<String>instance();
+ }
+
+ /**
+ * Called only when connection profile is active
+ */
+ protected abstract Iterable<String> getValues_();
+
+
+ // ********** convenience methods **********
+
+ /**
+ * Return the subject's JPA project.
+ * Allow subclasses to override this method, so we can still get the JPA
+ * project even when the subject is null.
+ */
+ protected JpaProject getJpaProject() {
+ T subject = this.getSubject();
+ return (subject == null) ? null : subject.getJpaProject();
+ }
+
+ /**
+ * Return the subject's connection profile.
+ */
+ protected final ConnectionProfile getConnectionProfile() {
+ JpaProject jpaProject = this.getJpaProject();
+ return (jpaProject == null) ? null : jpaProject.getConnectionProfile();
+ }
+
+ /**
+ * Return whether the subject's connection profile is active.
+ */
+ protected final boolean connectionProfileIsActive() {
+ ConnectionProfile cp = this.getConnectionProfile();
+ return (cp != null) && cp.isActive();
+ }
+
+ /**
+ * Returns the subject's database.
+ */
+ protected final Database getDatabase() {
+ ConnectionProfile cp = this.getConnectionProfile();
+ return (cp == null) ? null : cp.getDatabase();
+ }
+
+
+ // ********** connection listener callbacks **********
+
+ protected final void databaseChanged(Database database) {
+ if ( ! this.comboBox.isDisposed()) {
+ this.databaseChanged_(database);
+ }
+ }
+
+ protected void databaseChanged_(@SuppressWarnings("unused") Database database) {
+ // do nothing by default
+ }
+
+ protected final void catalogChanged(Catalog catalog) {
+ if ( ! this.comboBox.isDisposed()) {
+ this.catalogChanged_(catalog);
+ }
+ }
+
+ protected void catalogChanged_(@SuppressWarnings("unused") Catalog catalog) {
+ // do nothing by default
+ }
+
+ protected final void schemaChanged(Schema schema) {
+ if ( ! this.comboBox.isDisposed()) {
+ this.schemaChanged_(schema);
+ }
+ }
+
+ protected void schemaChanged_(@SuppressWarnings("unused") Schema schema) {
+ // do nothing by default
+ }
+
+ protected final void sequenceChanged(Sequence sequence) {
+ if ( ! this.comboBox.isDisposed()) {
+ this.sequenceChanged_(sequence);
+ }
+ }
+
+ protected void sequenceChanged_(@SuppressWarnings("unused") Sequence sequence) {
+ // do nothing by default
+ }
+
+ protected final void tableChanged(Table table) {
+ if ( ! this.comboBox.isDisposed()) {
+ this.tableChanged_(table);
+ }
+ }
+
+ protected void tableChanged_(@SuppressWarnings("unused") Table table) {
+ // do nothing by default
+ }
+
+ protected final void columnChanged(Column column) {
+ if ( ! this.comboBox.isDisposed()) {
+ this.columnChanged_(column);
+ }
+ }
+
+ protected void columnChanged_(@SuppressWarnings("unused") Column column) {
+ // do nothing by default
+ }
+
+ protected final void foreignKeyChanged(ForeignKey foreignKey) {
+ if ( ! this.comboBox.isDisposed()) {
+ this.foreignKeyChanged_(foreignKey);
+ }
+ }
+
+ protected void foreignKeyChanged_(@SuppressWarnings("unused") ForeignKey foreignKey) {
+ // do nothing by default
+ }
+
+ @Override
+ protected void log(String flag, String message) {
+ if (flag.equals(Tracing.UI_DB) && Tracing.booleanDebugOption(Tracing.UI_DB)) {
+ this.log(message);
+ } else {
+ super.log(flag, message);
+ }
+ }
+
+ // broaden accessibility a bit
+ @Override
+ protected void repopulateComboBox() {
+ super.repopulateComboBox();
+ }
+
+
+ // ********** connection listener **********
+
+ protected class LocalConnectionListener
+ implements ConnectionListener
+ {
+ protected LocalConnectionListener() {
+ super();
+ }
+
+ public void opened(ConnectionProfile profile) {
+ this.log("opened: " + profile.getName());
+ DatabaseObjectCombo.this.repopulateComboBox();
+ }
+
+ public void modified(ConnectionProfile profile) {
+ this.log("modified: " + profile.getName());
+ DatabaseObjectCombo.this.repopulateComboBox();
+ }
+
+ public boolean okToClose(ConnectionProfile profile) {
+ this.log("OK to close: " + profile.getName());
+ return true;
+ }
+
+ public void aboutToClose(ConnectionProfile profile) {
+ this.log("about to close: " + profile.getName());
+ }
+
+ public void closed(ConnectionProfile profile) {
+ this.log("closed: " + profile.getName());
+ DatabaseObjectCombo.this.repopulateComboBox();
+ }
+
+ public void databaseChanged(ConnectionProfile profile, Database database) {
+ this.log("database changed: " + database.getName());
+ DatabaseObjectCombo.this.databaseChanged(database);
+ }
+
+ public void catalogChanged(ConnectionProfile profile, Catalog catalog) {
+ this.log("catalog changed: " + catalog.getName());
+ DatabaseObjectCombo.this.catalogChanged(catalog);
+ }
+
+ public void schemaChanged(ConnectionProfile profile, Schema schema) {
+ this.log("schema changed: " + schema.getName());
+ DatabaseObjectCombo.this.schemaChanged(schema);
+ }
+
+ public void sequenceChanged(ConnectionProfile profile, Sequence sequence) {
+ this.log("sequence changed: " + sequence.getName());
+ DatabaseObjectCombo.this.sequenceChanged(sequence);
+ }
+
+ public void tableChanged(ConnectionProfile profile, Table table) {
+ this.log("table changed: " + table.getName());
+ DatabaseObjectCombo.this.tableChanged(table);
+ }
+
+ public void columnChanged(ConnectionProfile profile, Column column) {
+ this.log("column changed: " + column.getName());
+ DatabaseObjectCombo.this.columnChanged(column);
+ }
+
+ public void foreignKeyChanged(ConnectionProfile profile, ForeignKey foreignKey) {
+ this.log("foreign key changed: " + foreignKey.getName());
+ DatabaseObjectCombo.this.foreignKeyChanged(foreignKey);
+ }
+
+ protected void log(String message) {
+ DatabaseObjectCombo.this.log(Tracing.UI_DB, message);
+ }
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/db/SchemaCombo.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/db/SchemaCombo.java
new file mode 100644
index 0000000000..cf3605efe6
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/db/SchemaCombo.java
@@ -0,0 +1,56 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2009 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.ui.internal.details.db;
+
+import org.eclipse.jpt.common.ui.internal.widgets.Pane;
+import org.eclipse.jpt.common.utility.internal.iterables.EmptyIterable;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.JpaNode;
+import org.eclipse.jpt.jpa.db.SchemaContainer;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * This combo-box displays a schema container's schemata.
+ */
+public abstract class SchemaCombo<T extends JpaNode>
+ extends DatabaseObjectCombo<T>
+{
+ public SchemaCombo(
+ Pane<? extends T> parentPane,
+ Composite parent) {
+
+ super(parentPane, parent);
+ }
+
+ public SchemaCombo(
+ Pane<?> parentPane,
+ PropertyValueModel<? extends T> subjectHolder,
+ Composite parent) {
+
+ super(parentPane, subjectHolder, parent);
+ }
+
+
+ @Override
+ protected Iterable<String> getValues_() {
+ SchemaContainer sc = this.getDbSchemaContainer();
+ return (sc != null) ? sc.getSortedSchemaIdentifiers() : EmptyIterable.<String>instance();
+ }
+
+ protected SchemaContainer getDbSchemaContainer() {
+ return (this.getSubject() == null) ? null : this.getDbSchemaContainer_();
+ }
+
+ /**
+ * Assume the subject is not null.
+ */
+ protected abstract SchemaContainer getDbSchemaContainer_();
+
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/db/SequenceCombo.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/db/SequenceCombo.java
new file mode 100644
index 0000000000..c54ec57d03
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/db/SequenceCombo.java
@@ -0,0 +1,49 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2009 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.ui.internal.details.db;
+
+import org.eclipse.jpt.common.ui.internal.widgets.Pane;
+import org.eclipse.jpt.common.utility.internal.iterables.EmptyIterable;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.JpaNode;
+import org.eclipse.jpt.jpa.db.Schema;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * This combo-box displays a schema's sequences.
+ */
+public abstract class SequenceCombo<T extends JpaNode>
+ extends DatabaseObjectCombo<T>
+{
+ public SequenceCombo(
+ Pane<?> parentPane,
+ PropertyValueModel<? extends T> subjectHolder,
+ Composite parent) {
+
+ super(parentPane, subjectHolder, parent);
+ }
+
+
+ @Override
+ protected Iterable<String> getValues_() {
+ Schema dbSchema = this.getDbSchema();
+ return (dbSchema != null) ? dbSchema.getSortedSequenceIdentifiers() : EmptyIterable.<String>instance();
+ }
+
+ protected Schema getDbSchema() {
+ return (this.getSubject() == null) ? null : this.getDbSchema_();
+ }
+
+ /**
+ * Assume the subject is not null.
+ */
+ protected abstract Schema getDbSchema_();
+
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/db/TableCombo.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/db/TableCombo.java
new file mode 100644
index 0000000000..c347b77c82
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/db/TableCombo.java
@@ -0,0 +1,56 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2009 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.ui.internal.details.db;
+
+import org.eclipse.jpt.common.ui.internal.widgets.Pane;
+import org.eclipse.jpt.common.utility.internal.iterables.EmptyIterable;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.JpaNode;
+import org.eclipse.jpt.jpa.db.Schema;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * This combo-box displays a schema's tables.
+ */
+public abstract class TableCombo<T extends JpaNode>
+ extends DatabaseObjectCombo<T>
+{
+ public TableCombo(
+ Pane<? extends T> parentPane,
+ Composite parent) {
+
+ super(parentPane, parent);
+ }
+
+ public TableCombo(
+ Pane<?> parentPane,
+ PropertyValueModel<? extends T> subjectHolder,
+ Composite parent) {
+
+ super(parentPane, subjectHolder, parent);
+ }
+
+
+ @Override
+ protected Iterable<String> getValues_() {
+ Schema dbSchema = this.getDbSchema();
+ return (dbSchema != null) ? dbSchema.getSortedTableIdentifiers() : EmptyIterable.<String>instance();
+ }
+
+ protected Schema getDbSchema() {
+ return (this.getSubject() == null) ? null : this.getDbSchema_();
+ }
+
+ /**
+ * Assume the subject is not null.
+ */
+ protected abstract Schema getDbSchema_();
+
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/java/AbstractJavaResourceUiDefinition.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/java/AbstractJavaResourceUiDefinition.java
new file mode 100644
index 0000000000..6fc1e31081
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/java/AbstractJavaResourceUiDefinition.java
@@ -0,0 +1,242 @@
+/*******************************************************************************
+ * Copyright (c) 2009 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.ui.internal.details.java;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.ListIterator;
+import org.eclipse.jpt.common.core.JptCommonCorePlugin;
+import org.eclipse.jpt.common.core.JptResourceType;
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.utility.internal.Tools;
+import org.eclipse.jpt.common.utility.internal.iterators.ArrayIterator;
+import org.eclipse.jpt.common.utility.internal.iterators.ArrayListIterator;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.AttributeMapping;
+import org.eclipse.jpt.jpa.core.context.PersistentType;
+import org.eclipse.jpt.jpa.core.context.ReadOnlyPersistentAttribute;
+import org.eclipse.jpt.jpa.core.context.TypeMapping;
+import org.eclipse.jpt.jpa.ui.MappingResourceUiDefinition;
+import org.eclipse.jpt.jpa.ui.details.JpaComposite;
+import org.eclipse.jpt.jpa.ui.details.MappingUiDefinition;
+import org.eclipse.jpt.jpa.ui.details.java.DefaultJavaAttributeMappingUiDefinition;
+import org.eclipse.jpt.jpa.ui.details.java.DefaultJavaTypeMappingUiDefinition;
+import org.eclipse.jpt.jpa.ui.details.java.JavaAttributeMappingUiDefinition;
+import org.eclipse.jpt.jpa.ui.details.java.JavaTypeMappingUiDefinition;
+import org.eclipse.jpt.jpa.ui.details.java.JavaUiFactory;
+import org.eclipse.jpt.jpa.ui.internal.structure.JavaResourceModelStructureProvider;
+import org.eclipse.jpt.jpa.ui.structure.JpaStructureProvider;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * All the state in the definition should be "static" (i.e. unchanging once it is initialized).
+ */
+public abstract class AbstractJavaResourceUiDefinition
+ implements MappingResourceUiDefinition
+{
+ private JavaTypeMappingUiDefinition<? extends TypeMapping>[] specifiedTypeMappingUiDefinitions;
+
+ private JavaAttributeMappingUiDefinition<? extends AttributeMapping>[] specifiedAttributeMappingUiDefinitions;
+
+ private DefaultJavaAttributeMappingUiDefinition<?>[] defaultAttributeMappingUiDefinitions;
+
+ private final JavaUiFactory factory;
+
+
+ /**
+ * zero-argument constructor
+ */
+ protected AbstractJavaResourceUiDefinition() {
+ super();
+ this.factory = buildJavaUiFactory();
+ }
+
+
+ protected abstract JavaUiFactory buildJavaUiFactory();
+
+ public JavaUiFactory getFactory() {
+ return this.factory;
+ }
+
+ public boolean providesUi(JptResourceType resourceType) {
+ return resourceType.equals(JptCommonCorePlugin.JAVA_SOURCE_RESOURCE_TYPE);
+ }
+
+ public JpaStructureProvider getStructureProvider() {
+ return JavaResourceModelStructureProvider.instance();
+ }
+
+
+
+ // ********** type mapping ui definitions **********
+
+ public JpaComposite buildTypeMappingComposite(
+ String key,
+ PropertyValueModel<TypeMapping> mappingHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+
+ JavaTypeMappingUiDefinition<TypeMapping> mappingUiDefinition = getJavaTypeMappingUiDefinition(mappingHolder.getValue());
+ return mappingUiDefinition.buildTypeMappingComposite(
+ getFactory(),
+ mappingHolder,
+ parent,
+ widgetFactory);
+ }
+
+ @SuppressWarnings("unchecked")
+ protected JavaTypeMappingUiDefinition<TypeMapping> getJavaTypeMappingUiDefinition(TypeMapping typeMapping) {
+ if (typeMapping == null || typeMapping.getKey() == null) {
+ return (JavaTypeMappingUiDefinition<TypeMapping>) getDefaultTypeMappingUiDefinition();
+ }
+ return (JavaTypeMappingUiDefinition<TypeMapping>) getSpecifiedJavaTypeMappingUiDefinition(typeMapping.getKey());
+ }
+
+ protected JavaTypeMappingUiDefinition<? extends TypeMapping> getSpecifiedJavaTypeMappingUiDefinition(String mappingKey) {
+ for (JavaTypeMappingUiDefinition<? extends TypeMapping> definition : getSpecifiedTypeMappingUiDefinitions()) {
+ if (Tools.valuesAreEqual(definition.getKey(), mappingKey)) {
+ return definition;
+ }
+ }
+ throw new IllegalArgumentException("Illegal type mapping key: " + mappingKey); //$NON-NLS-1$
+ }
+
+ public Iterator<MappingUiDefinition<PersistentType, ? extends TypeMapping>> typeMappingUiDefinitions() {
+ return new ArrayIterator<MappingUiDefinition<PersistentType, ? extends TypeMapping>>(
+ getSpecifiedTypeMappingUiDefinitions());
+ }
+
+ protected synchronized JavaTypeMappingUiDefinition<? extends TypeMapping>[] getSpecifiedTypeMappingUiDefinitions() {
+ if (this.specifiedTypeMappingUiDefinitions == null) {
+ this.specifiedTypeMappingUiDefinitions = buildSpecifiedTypeMappingUiDefinitions();
+ }
+ return this.specifiedTypeMappingUiDefinitions;
+ }
+
+ /**
+ * Return an array of mapping definitions to use for types in mapping files of this type.
+ * The order is unimportant.
+ */
+ protected JavaTypeMappingUiDefinition<? extends TypeMapping>[] buildSpecifiedTypeMappingUiDefinitions() {
+ ArrayList<JavaTypeMappingUiDefinition<? extends TypeMapping>> definitions =
+ new ArrayList<JavaTypeMappingUiDefinition<? extends TypeMapping>>();
+ addSpecifiedTypeMappingUiDefinitionsTo(definitions);
+ @SuppressWarnings("unchecked")
+ JavaTypeMappingUiDefinition<? extends TypeMapping>[] definitionArray =
+ definitions.toArray(new JavaTypeMappingUiDefinition[definitions.size()]);
+ return definitionArray;
+ }
+
+ protected abstract void addSpecifiedTypeMappingUiDefinitionsTo(
+ List<JavaTypeMappingUiDefinition<? extends TypeMapping>> definitions);
+
+ public DefaultJavaTypeMappingUiDefinition<? extends TypeMapping> getDefaultTypeMappingUiDefinition() {
+ return NullJavaTypeMappingUiDefinition.instance();
+ }
+
+
+ // ********** attributes mapping UI definitions **********
+
+ public JpaComposite buildAttributeMappingComposite(
+ String key,
+ PropertyValueModel<AttributeMapping> mappingHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+
+ JavaAttributeMappingUiDefinition<AttributeMapping> mappingUiDefinition =
+ getAttributeMappingUiDefinition(mappingHolder.getValue());
+ return mappingUiDefinition.buildAttributeMappingComposite(
+ getFactory(),
+ mappingHolder,
+ parent,
+ widgetFactory);
+ }
+
+ @SuppressWarnings("unchecked")
+ protected JavaAttributeMappingUiDefinition<AttributeMapping> getAttributeMappingUiDefinition(AttributeMapping attributeMapping) {
+ String key = attributeMapping == null ? null : attributeMapping.getKey();
+ if (attributeMapping == null || attributeMapping.isDefault()) {
+ return (JavaAttributeMappingUiDefinition<AttributeMapping>) getDefaultAttributeMappingUiDefinition(key);
+ }
+ return (JavaAttributeMappingUiDefinition<AttributeMapping>) getSpecifiedAttributeMappingUiDefinition(key);
+ }
+
+ protected JavaAttributeMappingUiDefinition<? extends AttributeMapping> getSpecifiedAttributeMappingUiDefinition(String mappingKey) {
+ for (JavaAttributeMappingUiDefinition<? extends AttributeMapping> definition : getSpecifiedAttributeMappingUiDefinitions()) {
+ if (Tools.valuesAreEqual(definition.getKey(), mappingKey)) {
+ return definition;
+ }
+ }
+ throw new IllegalArgumentException("Illegal attribute mapping key: " + mappingKey); //$NON-NLS-1$
+ }
+
+ public ListIterator<MappingUiDefinition<ReadOnlyPersistentAttribute, ? extends AttributeMapping>>
+ attributeMappingUiDefinitions() {
+
+ return new ArrayListIterator<MappingUiDefinition<ReadOnlyPersistentAttribute, ? extends AttributeMapping>>(
+ getSpecifiedAttributeMappingUiDefinitions());
+ }
+
+ protected synchronized JavaAttributeMappingUiDefinition<? extends AttributeMapping>[] getSpecifiedAttributeMappingUiDefinitions() {
+ if (this.specifiedAttributeMappingUiDefinitions == null) {
+ this.specifiedAttributeMappingUiDefinitions = buildSpecifiedAttributeMappingUiDefinitions();
+ }
+ return this.specifiedAttributeMappingUiDefinitions;
+ }
+
+ /**
+ * Return an array of mapping definitions to use for attributes in mapping files of this type.
+ * The order is unimportant.
+ */
+ protected JavaAttributeMappingUiDefinition<? extends AttributeMapping>[] buildSpecifiedAttributeMappingUiDefinitions() {
+ ArrayList<JavaAttributeMappingUiDefinition<? extends AttributeMapping>> definitions =
+ new ArrayList<JavaAttributeMappingUiDefinition<? extends AttributeMapping>>();
+ addSpecifiedAttributeMappingUiDefinitionsTo(definitions);
+ @SuppressWarnings("unchecked")
+ JavaAttributeMappingUiDefinition<? extends AttributeMapping>[] definitionArray =
+ definitions.toArray(new JavaAttributeMappingUiDefinition[definitions.size()]);
+ return definitionArray;
+ }
+
+ protected abstract void addSpecifiedAttributeMappingUiDefinitionsTo(
+ List<JavaAttributeMappingUiDefinition<? extends AttributeMapping>> definitions);
+
+
+ // ********** default Java attribute mapping UI providers **********
+
+ public DefaultJavaAttributeMappingUiDefinition<? extends AttributeMapping> getDefaultAttributeMappingUiDefinition(String key) {
+ for (DefaultJavaAttributeMappingUiDefinition<? extends AttributeMapping> definition : getDefaultAttributeMappingUiDefinitions()) {
+ if (Tools.valuesAreEqual(definition.getDefaultKey(), key)) {
+ return definition;
+ }
+ }
+ throw new IllegalArgumentException("Illegal attribute mapping key: " + key); //$NON-NLS-1$
+ }
+
+ protected synchronized DefaultJavaAttributeMappingUiDefinition<? extends AttributeMapping>[] getDefaultAttributeMappingUiDefinitions() {
+ if (this.defaultAttributeMappingUiDefinitions == null) {
+ this.defaultAttributeMappingUiDefinitions = this.buildDefaultAttributeMappingUiDefinitions();
+ }
+ return this.defaultAttributeMappingUiDefinitions;
+ }
+
+ protected DefaultJavaAttributeMappingUiDefinition<?>[] buildDefaultAttributeMappingUiDefinitions() {
+ ArrayList<DefaultJavaAttributeMappingUiDefinition<?>> definitions =
+ new ArrayList<DefaultJavaAttributeMappingUiDefinition<?>>();
+ addDefaultAttributeMappingUiDefinitionsTo(definitions);
+ DefaultJavaAttributeMappingUiDefinition<?>[] definitionArray =
+ definitions.toArray(new DefaultJavaAttributeMappingUiDefinition[definitions.size()]);
+ return definitionArray;
+ }
+
+ protected abstract void addDefaultAttributeMappingUiDefinitionsTo(
+ List<DefaultJavaAttributeMappingUiDefinition<?>> definitions);
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/java/BaseJavaUiFactory.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/java/BaseJavaUiFactory.java
new file mode 100644
index 0000000000..df7051717d
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/java/BaseJavaUiFactory.java
@@ -0,0 +1,173 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2010 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.ui.internal.details.java;
+
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.java.JavaBasicMapping;
+import org.eclipse.jpt.jpa.core.context.java.JavaEmbeddable;
+import org.eclipse.jpt.jpa.core.context.java.JavaEmbeddedIdMapping;
+import org.eclipse.jpt.jpa.core.context.java.JavaEmbeddedMapping;
+import org.eclipse.jpt.jpa.core.context.java.JavaEntity;
+import org.eclipse.jpt.jpa.core.context.java.JavaIdMapping;
+import org.eclipse.jpt.jpa.core.context.java.JavaManyToManyMapping;
+import org.eclipse.jpt.jpa.core.context.java.JavaManyToOneMapping;
+import org.eclipse.jpt.jpa.core.context.java.JavaMappedSuperclass;
+import org.eclipse.jpt.jpa.core.context.java.JavaOneToManyMapping;
+import org.eclipse.jpt.jpa.core.context.java.JavaOneToOneMapping;
+import org.eclipse.jpt.jpa.core.context.java.JavaTransientMapping;
+import org.eclipse.jpt.jpa.core.context.java.JavaVersionMapping;
+import org.eclipse.jpt.jpa.core.context.orm.OrmEmbeddable;
+import org.eclipse.jpt.jpa.core.context.orm.OrmEntity;
+import org.eclipse.jpt.jpa.core.context.orm.OrmMappedSuperclass;
+import org.eclipse.jpt.jpa.ui.details.JpaComposite;
+import org.eclipse.jpt.jpa.ui.details.java.JavaUiFactory;
+import org.eclipse.jpt.jpa.ui.internal.details.BasicMappingComposite;
+import org.eclipse.jpt.jpa.ui.internal.details.EmbeddedIdMappingComposite;
+import org.eclipse.jpt.jpa.ui.internal.details.IdMappingComposite;
+import org.eclipse.jpt.jpa.ui.internal.details.ManyToManyMappingComposite;
+import org.eclipse.jpt.jpa.ui.internal.details.ManyToOneMappingComposite;
+import org.eclipse.jpt.jpa.ui.internal.details.OneToManyMappingComposite;
+import org.eclipse.jpt.jpa.ui.internal.details.OneToOneMappingComposite;
+import org.eclipse.jpt.jpa.ui.internal.details.TransientMappingComposite;
+import org.eclipse.jpt.jpa.ui.internal.details.VersionMappingComposite;
+import org.eclipse.jpt.jpa.ui.internal.details.orm.OrmEmbeddableComposite;
+import org.eclipse.jpt.jpa.ui.internal.details.orm.OrmEntityComposite;
+import org.eclipse.jpt.jpa.ui.internal.details.orm.OrmMappedSuperclassComposite;
+import org.eclipse.jpt.jpa.ui.internal.jpa2.details.java.JavaEmbeddedMapping2_0Composite;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * The default implementation of the UI factory required to show the information
+ * related to a JPA mapping (type or attribute).
+ */
+public abstract class BaseJavaUiFactory implements JavaUiFactory
+{
+
+ // **************** java type mapping composites ***************************
+
+ public JpaComposite createJavaMappedSuperclassComposite(
+ PropertyValueModel<JavaMappedSuperclass> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+ return new JavaMappedSuperclassComposite(subjectHolder, parent, widgetFactory);
+ }
+
+ public JpaComposite createJavaEntityComposite(
+ PropertyValueModel<JavaEntity> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+ return new JavaEntityComposite(subjectHolder, parent, widgetFactory);
+ }
+
+ public JpaComposite createJavaEmbeddableComposite(
+ PropertyValueModel<JavaEmbeddable> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+ return new JavaEmbeddableComposite(subjectHolder, parent, widgetFactory);
+ }
+
+
+ // **************** orm type mapping composites ****************************
+
+ public JpaComposite createOrmMappedSuperclassComposite(
+ PropertyValueModel<OrmMappedSuperclass> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+ return new OrmMappedSuperclassComposite(subjectHolder, parent, widgetFactory);
+ }
+
+ public JpaComposite createOrmEntityComposite(
+ PropertyValueModel<OrmEntity> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+ return new OrmEntityComposite(subjectHolder, parent, widgetFactory);
+ }
+
+ public JpaComposite createOrmEmbeddableComposite(
+ PropertyValueModel<OrmEmbeddable> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+ return new OrmEmbeddableComposite(subjectHolder, parent, widgetFactory);
+ }
+
+
+ // **************** java attribute mapping composites **********************
+
+ public JpaComposite createJavaIdMappingComposite(
+ PropertyValueModel<JavaIdMapping> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+ return new IdMappingComposite(subjectHolder, parent, widgetFactory);
+ }
+
+ public JpaComposite createJavaEmbeddedIdMappingComposite(
+ PropertyValueModel<JavaEmbeddedIdMapping> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+ return new EmbeddedIdMappingComposite(subjectHolder, parent, widgetFactory);
+ }
+
+ public JpaComposite createJavaBasicMappingComposite(
+ PropertyValueModel<JavaBasicMapping> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+ return new BasicMappingComposite(subjectHolder, parent, widgetFactory);
+ }
+
+ public JpaComposite createJavaVersionMappingComposite(
+ PropertyValueModel<JavaVersionMapping> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+ return new VersionMappingComposite(subjectHolder, parent, widgetFactory);
+ }
+
+ public JpaComposite createJavaManyToOneMappingComposite(
+ PropertyValueModel<JavaManyToOneMapping> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+ return new ManyToOneMappingComposite(subjectHolder, parent, widgetFactory);
+ }
+
+ public JpaComposite createJavaOneToManyMappingComposite(
+ PropertyValueModel<JavaOneToManyMapping> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+ return new OneToManyMappingComposite(subjectHolder, parent, widgetFactory);
+ }
+
+ public JpaComposite createJavaOneToOneMappingComposite(
+ PropertyValueModel<JavaOneToOneMapping> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+ return new OneToOneMappingComposite(subjectHolder, parent, widgetFactory);
+ }
+
+ public JpaComposite createJavaManyToManyMappingComposite(
+ PropertyValueModel<JavaManyToManyMapping> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+ return new ManyToManyMappingComposite(subjectHolder, parent, widgetFactory);
+ }
+
+ public JpaComposite createJavaEmbeddedMappingComposite(
+ PropertyValueModel<JavaEmbeddedMapping> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+ return new JavaEmbeddedMapping2_0Composite(subjectHolder, parent, widgetFactory);
+ }
+
+ public JpaComposite createJavaTransientMappingComposite(
+ PropertyValueModel<JavaTransientMapping> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+ return new TransientMappingComposite(subjectHolder, parent, widgetFactory);
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/java/DefaultBasicMappingUiDefinition.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/java/DefaultBasicMappingUiDefinition.java
new file mode 100644
index 0000000000..fbed33d2a0
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/java/DefaultBasicMappingUiDefinition.java
@@ -0,0 +1,83 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2009 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.ui.internal.details.java;
+
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.MappingKeys;
+import org.eclipse.jpt.jpa.core.context.ReadOnlyPersistentAttribute;
+import org.eclipse.jpt.jpa.core.context.java.JavaBasicMapping;
+import org.eclipse.jpt.jpa.ui.details.JpaComposite;
+import org.eclipse.jpt.jpa.ui.details.java.DefaultJavaAttributeMappingUiDefinition;
+import org.eclipse.jpt.jpa.ui.details.java.JavaUiFactory;
+import org.eclipse.jpt.jpa.ui.internal.JpaMappingImageHelper;
+import org.eclipse.jpt.jpa.ui.internal.details.AbstractBasicMappingUiDefinition;
+import org.eclipse.jpt.jpa.ui.internal.details.JptUiDetailsMessages;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.widgets.Composite;
+
+public class DefaultBasicMappingUiDefinition
+ extends AbstractBasicMappingUiDefinition<ReadOnlyPersistentAttribute, JavaBasicMapping>
+ implements DefaultJavaAttributeMappingUiDefinition<JavaBasicMapping>
+{
+ // singleton
+ private static final DefaultBasicMappingUiDefinition INSTANCE =
+ new DefaultBasicMappingUiDefinition();
+
+
+ /**
+ * Return the singleton.
+ */
+ public static DefaultJavaAttributeMappingUiDefinition<JavaBasicMapping> instance() {
+ return INSTANCE;
+ }
+
+
+ /**
+ * Ensure single instance.
+ */
+ private DefaultBasicMappingUiDefinition() {
+ super();
+ }
+
+
+ @Override
+ public String getKey() {
+ return null;
+ }
+
+ public String getDefaultKey() {
+ return MappingKeys.BASIC_ATTRIBUTE_MAPPING_KEY;
+ }
+
+ @Override
+ public String getLabel() {
+ return JptUiDetailsMessages.DefaultBasicMappingUiProvider_label;
+ }
+
+ @Override
+ public String getLinkLabel() {
+ return JptUiDetailsMessages.DefaultBasicMappingUiProvider_linkLabel;
+ }
+
+ @Override
+ public Image getImage() {
+ return JpaMappingImageHelper.imageForAttributeMapping(getDefaultKey());
+ }
+
+ public JpaComposite buildAttributeMappingComposite(
+ JavaUiFactory factory,
+ PropertyValueModel<JavaBasicMapping> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+
+ return factory.createJavaBasicMappingComposite(subjectHolder, parent, widgetFactory);
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/java/DefaultEmbeddedMappingUiDefinition.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/java/DefaultEmbeddedMappingUiDefinition.java
new file mode 100644
index 0000000000..6fed137b00
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/java/DefaultEmbeddedMappingUiDefinition.java
@@ -0,0 +1,83 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2009 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.ui.internal.details.java;
+
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.MappingKeys;
+import org.eclipse.jpt.jpa.core.context.ReadOnlyPersistentAttribute;
+import org.eclipse.jpt.jpa.core.context.java.JavaEmbeddedMapping;
+import org.eclipse.jpt.jpa.ui.details.JpaComposite;
+import org.eclipse.jpt.jpa.ui.details.java.DefaultJavaAttributeMappingUiDefinition;
+import org.eclipse.jpt.jpa.ui.details.java.JavaUiFactory;
+import org.eclipse.jpt.jpa.ui.internal.JpaMappingImageHelper;
+import org.eclipse.jpt.jpa.ui.internal.details.AbstractEmbeddedMappingUiDefinition;
+import org.eclipse.jpt.jpa.ui.internal.details.JptUiDetailsMessages;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.widgets.Composite;
+
+public class DefaultEmbeddedMappingUiDefinition
+ extends AbstractEmbeddedMappingUiDefinition<ReadOnlyPersistentAttribute, JavaEmbeddedMapping>
+ implements DefaultJavaAttributeMappingUiDefinition<JavaEmbeddedMapping>
+{
+ // singleton
+ private static final DefaultEmbeddedMappingUiDefinition INSTANCE =
+ new DefaultEmbeddedMappingUiDefinition();
+
+
+ /**
+ * Return the singleton.
+ */
+ public static DefaultJavaAttributeMappingUiDefinition<JavaEmbeddedMapping> instance() {
+ return INSTANCE;
+ }
+
+
+ /**
+ * Ensure single instance.
+ */
+ private DefaultEmbeddedMappingUiDefinition() {
+ super();
+ }
+
+
+ @Override
+ public String getKey() {
+ return null;
+ }
+
+ public String getDefaultKey() {
+ return MappingKeys.EMBEDDED_ATTRIBUTE_MAPPING_KEY;
+ }
+
+ @Override
+ public String getLabel() {
+ return JptUiDetailsMessages.DefaultEmbeddedMappingUiProvider_label;
+ }
+
+ @Override
+ public String getLinkLabel() {
+ return JptUiDetailsMessages.DefaultEmbeddedMappingUiProvider_linkLabel;
+ }
+
+ @Override
+ public Image getImage() {
+ return JpaMappingImageHelper.imageForAttributeMapping(getDefaultKey());
+ }
+
+ public JpaComposite buildAttributeMappingComposite(
+ JavaUiFactory factory,
+ PropertyValueModel<JavaEmbeddedMapping> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+
+ return factory.createJavaEmbeddedMappingComposite(subjectHolder, parent, widgetFactory);
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/java/GenericJavaResourceUiDefinition.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/java/GenericJavaResourceUiDefinition.java
new file mode 100644
index 0000000000..48cbee1fb8
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/java/GenericJavaResourceUiDefinition.java
@@ -0,0 +1,75 @@
+/*******************************************************************************
+ * Copyright (c) 2009 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.ui.internal.details.java;
+
+import java.util.List;
+import org.eclipse.jpt.jpa.core.context.AttributeMapping;
+import org.eclipse.jpt.jpa.core.context.TypeMapping;
+import org.eclipse.jpt.jpa.ui.ResourceUiDefinition;
+import org.eclipse.jpt.jpa.ui.details.java.DefaultJavaAttributeMappingUiDefinition;
+import org.eclipse.jpt.jpa.ui.details.java.JavaAttributeMappingUiDefinition;
+import org.eclipse.jpt.jpa.ui.details.java.JavaTypeMappingUiDefinition;
+import org.eclipse.jpt.jpa.ui.details.java.JavaUiFactory;
+
+public class GenericJavaResourceUiDefinition extends AbstractJavaResourceUiDefinition
+{
+ // singleton
+ private static final ResourceUiDefinition INSTANCE = new GenericJavaResourceUiDefinition();
+
+ /**
+ * Return the singleton.
+ */
+ public static ResourceUiDefinition instance() {
+ return INSTANCE;
+ }
+
+
+ /**
+ * zero-argument constructor
+ */
+ protected GenericJavaResourceUiDefinition() {
+ super();
+ }
+
+ @Override
+ protected JavaUiFactory buildJavaUiFactory() {
+ return new GenericJavaUiFactory();
+ }
+
+ @Override
+ protected void addSpecifiedAttributeMappingUiDefinitionsTo(
+ List<JavaAttributeMappingUiDefinition<? extends AttributeMapping>> definitions) {
+
+ definitions.add(JavaIdMappingUiDefinition.instance());
+ definitions.add(JavaEmbeddedIdMappingUDefinition.instance());
+ definitions.add(JavaBasicMappingUiDefinition.instance());
+ definitions.add(JavaVersionMappingUiDefinition.instance());
+ definitions.add(JavaManyToOneMappingUiDefinition.instance());
+ definitions.add(JavaOneToManyMappingUiDefinition.instance());
+ definitions.add(JavaOneToOneMappingUiDefinition.instance());
+ definitions.add(JavaManyToManyMappingUiDefinition.instance());
+ definitions.add(JavaEmbeddedMappingUiDefinition.instance());
+ definitions.add(JavaTransientMappingUiDefinition.instance());
+ }
+
+ @Override
+ protected void addDefaultAttributeMappingUiDefinitionsTo(List<DefaultJavaAttributeMappingUiDefinition<?>> definitions) {
+ definitions.add(DefaultBasicMappingUiDefinition.instance());
+ definitions.add(DefaultEmbeddedMappingUiDefinition.instance());
+ definitions.add(NullJavaAttributeMappingUiDefinition.instance());
+ }
+
+ @Override
+ protected void addSpecifiedTypeMappingUiDefinitionsTo(List<JavaTypeMappingUiDefinition<? extends TypeMapping>> definitions) {
+ definitions.add(JavaEntityUiDefinition.instance());
+ definitions.add(JavaMappedSuperclassUiDefinition.instance());
+ definitions.add(JavaEmbeddableUiDefinition.instance());
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/java/GenericJavaUiFactory.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/java/GenericJavaUiFactory.java
new file mode 100644
index 0000000000..7de34d3485
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/java/GenericJavaUiFactory.java
@@ -0,0 +1,23 @@
+/*******************************************************************************
+ * Copyright (c) 2009 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.ui.internal.details.java;
+
+/**
+ * The default implementation of the Java UI factory required to show the information
+ * related to a JPA mapping (type or attribute).
+ *
+ * @see JavaUiFactory
+ *
+ * @version 3.0
+ * @since 3.0
+ */
+public class GenericJavaUiFactory extends BaseJavaUiFactory
+{
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/java/JavaBasicMappingUiDefinition.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/java/JavaBasicMappingUiDefinition.java
new file mode 100644
index 0000000000..466f197087
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/java/JavaBasicMappingUiDefinition.java
@@ -0,0 +1,55 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2009 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.ui.internal.details.java;
+
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.ReadOnlyPersistentAttribute;
+import org.eclipse.jpt.jpa.core.context.java.JavaBasicMapping;
+import org.eclipse.jpt.jpa.ui.details.JpaComposite;
+import org.eclipse.jpt.jpa.ui.details.java.JavaAttributeMappingUiDefinition;
+import org.eclipse.jpt.jpa.ui.details.java.JavaUiFactory;
+import org.eclipse.jpt.jpa.ui.internal.details.AbstractBasicMappingUiDefinition;
+import org.eclipse.swt.widgets.Composite;
+
+public class JavaBasicMappingUiDefinition
+ extends AbstractBasicMappingUiDefinition<ReadOnlyPersistentAttribute, JavaBasicMapping>
+ implements JavaAttributeMappingUiDefinition<JavaBasicMapping>
+{
+ // singleton
+ private static final JavaBasicMappingUiDefinition INSTANCE =
+ new JavaBasicMappingUiDefinition();
+
+
+ /**
+ * Return the singleton.
+ */
+ public static JavaAttributeMappingUiDefinition<JavaBasicMapping> instance() {
+ return INSTANCE;
+ }
+
+
+ /**
+ * Ensure single instance.
+ */
+ private JavaBasicMappingUiDefinition() {
+ super();
+ }
+
+
+ public JpaComposite buildAttributeMappingComposite(
+ JavaUiFactory factory,
+ PropertyValueModel<JavaBasicMapping> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+
+ return factory.createJavaBasicMappingComposite(subjectHolder, parent, widgetFactory);
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/java/JavaEmbeddableComposite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/java/JavaEmbeddableComposite.java
new file mode 100644
index 0000000000..18e1e4e806
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/java/JavaEmbeddableComposite.java
@@ -0,0 +1,45 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2010 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.ui.internal.details.java;
+
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.Embeddable;
+import org.eclipse.jpt.jpa.ui.details.JpaComposite;
+import org.eclipse.jpt.jpa.ui.internal.details.AbstractEmbeddableComposite;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * This pane does not have any widgets.
+ *
+ * @see Embeddable
+ * @see EmbeddableUiProvider
+ *
+ * @version 2.3
+ * @since 2.0
+ */
+public class JavaEmbeddableComposite extends AbstractEmbeddableComposite<Embeddable>
+ implements JpaComposite
+{
+ /**
+ * Creates a new <code>EmbeddableComposite</code>.
+ *
+ * @param subjectHolder The holder of this pane's subject
+ * @param parent The parent container
+ * @param widgetFactory The factory used to create various common widgets
+ */
+ public JavaEmbeddableComposite(PropertyValueModel<? extends Embeddable> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+
+ super(subjectHolder, parent, widgetFactory);
+ }
+
+} \ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/java/JavaEmbeddableUiDefinition.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/java/JavaEmbeddableUiDefinition.java
new file mode 100644
index 0000000000..1c08a85eed
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/java/JavaEmbeddableUiDefinition.java
@@ -0,0 +1,54 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2009 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.ui.internal.details.java;
+
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.PersistentType;
+import org.eclipse.jpt.jpa.core.context.java.JavaEmbeddable;
+import org.eclipse.jpt.jpa.ui.details.JpaComposite;
+import org.eclipse.jpt.jpa.ui.details.java.JavaTypeMappingUiDefinition;
+import org.eclipse.jpt.jpa.ui.details.java.JavaUiFactory;
+import org.eclipse.jpt.jpa.ui.internal.details.AbstractEmbeddableUiDefinition;
+import org.eclipse.swt.widgets.Composite;
+
+public class JavaEmbeddableUiDefinition
+ extends AbstractEmbeddableUiDefinition<PersistentType, JavaEmbeddable>
+ implements JavaTypeMappingUiDefinition<JavaEmbeddable>
+{
+ // singleton
+ private static final JavaEmbeddableUiDefinition INSTANCE = new JavaEmbeddableUiDefinition();
+
+
+ /**
+ * Return the singleton.
+ */
+ public static JavaTypeMappingUiDefinition<JavaEmbeddable> instance() {
+ return INSTANCE;
+ }
+
+
+ /**
+ * Ensure single instance.
+ */
+ private JavaEmbeddableUiDefinition() {
+ super();
+ }
+
+
+ public JpaComposite buildTypeMappingComposite(
+ JavaUiFactory factory,
+ PropertyValueModel<JavaEmbeddable> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+
+ return factory.createJavaEmbeddableComposite(subjectHolder, parent, widgetFactory);
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/java/JavaEmbeddedIdMappingUDefinition.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/java/JavaEmbeddedIdMappingUDefinition.java
new file mode 100644
index 0000000000..4dc119c813
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/java/JavaEmbeddedIdMappingUDefinition.java
@@ -0,0 +1,55 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 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.ui.internal.details.java;
+
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.ReadOnlyPersistentAttribute;
+import org.eclipse.jpt.jpa.core.context.java.JavaEmbeddedIdMapping;
+import org.eclipse.jpt.jpa.ui.details.JpaComposite;
+import org.eclipse.jpt.jpa.ui.details.java.JavaAttributeMappingUiDefinition;
+import org.eclipse.jpt.jpa.ui.details.java.JavaUiFactory;
+import org.eclipse.jpt.jpa.ui.internal.details.AbstractEmbeddedIdMappingUiDefinition;
+import org.eclipse.swt.widgets.Composite;
+
+public class JavaEmbeddedIdMappingUDefinition
+ extends AbstractEmbeddedIdMappingUiDefinition<ReadOnlyPersistentAttribute, JavaEmbeddedIdMapping>
+ implements JavaAttributeMappingUiDefinition<JavaEmbeddedIdMapping>
+{
+ // singleton
+ private static final JavaEmbeddedIdMappingUDefinition INSTANCE =
+ new JavaEmbeddedIdMappingUDefinition();
+
+
+ /**
+ * Return the singleton.
+ */
+ public static JavaAttributeMappingUiDefinition<JavaEmbeddedIdMapping> instance() {
+ return INSTANCE;
+ }
+
+
+ /**
+ * Ensure single instance.
+ */
+ private JavaEmbeddedIdMappingUDefinition() {
+ super();
+ }
+
+
+ public JpaComposite buildAttributeMappingComposite(
+ JavaUiFactory factory,
+ PropertyValueModel<JavaEmbeddedIdMapping> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+
+ return factory.createJavaEmbeddedIdMappingComposite(subjectHolder, parent, widgetFactory);
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/java/JavaEmbeddedMappingUiDefinition.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/java/JavaEmbeddedMappingUiDefinition.java
new file mode 100644
index 0000000000..ca1c784d1a
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/java/JavaEmbeddedMappingUiDefinition.java
@@ -0,0 +1,55 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 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.ui.internal.details.java;
+
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.ReadOnlyPersistentAttribute;
+import org.eclipse.jpt.jpa.core.context.java.JavaEmbeddedMapping;
+import org.eclipse.jpt.jpa.ui.details.JpaComposite;
+import org.eclipse.jpt.jpa.ui.details.java.JavaAttributeMappingUiDefinition;
+import org.eclipse.jpt.jpa.ui.details.java.JavaUiFactory;
+import org.eclipse.jpt.jpa.ui.internal.details.AbstractEmbeddedMappingUiDefinition;
+import org.eclipse.swt.widgets.Composite;
+
+public class JavaEmbeddedMappingUiDefinition
+ extends AbstractEmbeddedMappingUiDefinition<ReadOnlyPersistentAttribute, JavaEmbeddedMapping>
+ implements JavaAttributeMappingUiDefinition<JavaEmbeddedMapping>
+{
+ // singleton
+ private static final JavaEmbeddedMappingUiDefinition INSTANCE =
+ new JavaEmbeddedMappingUiDefinition();
+
+
+ /**
+ * Return the singleton.
+ */
+ public static JavaAttributeMappingUiDefinition<JavaEmbeddedMapping> instance() {
+ return INSTANCE;
+ }
+
+
+ /**
+ * Ensure single instance.
+ */
+ private JavaEmbeddedMappingUiDefinition() {
+ super();
+ }
+
+
+ public JpaComposite buildAttributeMappingComposite(
+ JavaUiFactory factory,
+ PropertyValueModel<JavaEmbeddedMapping> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+
+ return factory.createJavaEmbeddedMappingComposite(subjectHolder, parent, widgetFactory);
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/java/JavaEntityComposite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/java/JavaEntityComposite.java
new file mode 100644
index 0000000000..92c7659fc3
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/java/JavaEntityComposite.java
@@ -0,0 +1,53 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2010 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.ui.internal.details.java;
+
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.java.JavaEntity;
+import org.eclipse.jpt.jpa.ui.internal.details.AbstractEntityComposite;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * The pane used for a Java entity.
+ *
+ * @see JavaEntity
+ * @see JavaUiFactory - The factory creating this pane
+ * @see JavaSecondaryTablesComposite
+ *
+ * @version 2.3
+ * @since 1.0
+ */
+public class JavaEntityComposite extends AbstractEntityComposite<JavaEntity>
+{
+ /**
+ * Creates a new <code>JavaEntityComposite</code>.
+ *
+ * @param subjectHolder The holder of the subject <code>JavaEntity</code>
+ * @param parent The parent container
+ * @param widgetFactory The factory used to create various common widgets
+ */
+ public JavaEntityComposite(PropertyValueModel<? extends JavaEntity> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+
+ super(subjectHolder, parent, widgetFactory);
+ }
+
+ @Override
+ protected void initializeSecondaryTablesSection(Composite container) {
+ new JavaSecondaryTablesComposite(this, container);
+ }
+
+ @Override
+ protected void initializeInheritanceSection(Composite container) {
+ new JavaInheritanceComposite(this, container);
+ }
+} \ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/java/JavaEntityUiDefinition.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/java/JavaEntityUiDefinition.java
new file mode 100644
index 0000000000..2ec685800a
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/java/JavaEntityUiDefinition.java
@@ -0,0 +1,55 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2009 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.ui.internal.details.java;
+
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.PersistentType;
+import org.eclipse.jpt.jpa.core.context.java.JavaEntity;
+import org.eclipse.jpt.jpa.ui.details.JpaComposite;
+import org.eclipse.jpt.jpa.ui.details.java.JavaTypeMappingUiDefinition;
+import org.eclipse.jpt.jpa.ui.details.java.JavaUiFactory;
+import org.eclipse.jpt.jpa.ui.internal.details.AbstractEntityUiDefinition;
+import org.eclipse.swt.widgets.Composite;
+
+public class JavaEntityUiDefinition
+ extends AbstractEntityUiDefinition<PersistentType, JavaEntity>
+ implements JavaTypeMappingUiDefinition<JavaEntity>
+{
+ // singleton
+ private static final JavaEntityUiDefinition INSTANCE =
+ new JavaEntityUiDefinition();
+
+
+ /**
+ * Return the singleton.
+ */
+ public static JavaTypeMappingUiDefinition<JavaEntity> instance() {
+ return INSTANCE;
+ }
+
+
+ /**
+ * Ensure single instance.
+ */
+ private JavaEntityUiDefinition() {
+ super();
+ }
+
+
+ public JpaComposite buildTypeMappingComposite(
+ JavaUiFactory factory,
+ PropertyValueModel<JavaEntity> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+
+ return factory.createJavaEntityComposite(subjectHolder, parent, widgetFactory);
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/java/JavaIdMappingUiDefinition.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/java/JavaIdMappingUiDefinition.java
new file mode 100644
index 0000000000..929c049a43
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/java/JavaIdMappingUiDefinition.java
@@ -0,0 +1,55 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2009 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.ui.internal.details.java;
+
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.ReadOnlyPersistentAttribute;
+import org.eclipse.jpt.jpa.core.context.java.JavaIdMapping;
+import org.eclipse.jpt.jpa.ui.details.JpaComposite;
+import org.eclipse.jpt.jpa.ui.details.java.JavaAttributeMappingUiDefinition;
+import org.eclipse.jpt.jpa.ui.details.java.JavaUiFactory;
+import org.eclipse.jpt.jpa.ui.internal.details.AbstractIdMappingUiDefinition;
+import org.eclipse.swt.widgets.Composite;
+
+public class JavaIdMappingUiDefinition
+ extends AbstractIdMappingUiDefinition<ReadOnlyPersistentAttribute, JavaIdMapping>
+ implements JavaAttributeMappingUiDefinition<JavaIdMapping>
+{
+ // singleton
+ private static final JavaIdMappingUiDefinition INSTANCE =
+ new JavaIdMappingUiDefinition();
+
+
+ /**
+ * Return the singleton.
+ */
+ public static JavaAttributeMappingUiDefinition<JavaIdMapping> instance() {
+ return INSTANCE;
+ }
+
+
+ /**
+ * Ensure single instance.
+ */
+ protected JavaIdMappingUiDefinition() {
+ super();
+ }
+
+
+ public JpaComposite buildAttributeMappingComposite(
+ JavaUiFactory factory,
+ PropertyValueModel<JavaIdMapping> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+
+ return factory.createJavaIdMappingComposite(subjectHolder, parent, widgetFactory);
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/java/JavaInheritanceComposite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/java/JavaInheritanceComposite.java
new file mode 100644
index 0000000000..d029097866
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/java/JavaInheritanceComposite.java
@@ -0,0 +1,44 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 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.ui.internal.details.java;
+
+import org.eclipse.jpt.common.ui.internal.widgets.Pane;
+import org.eclipse.jpt.jpa.core.context.java.JavaEntity;
+import org.eclipse.jpt.jpa.ui.internal.details.AbstractInheritanceComposite;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * The pane used for java inheritance.
+ *
+ * @see JavaEntity
+ * @see JavaPrimaryKeyJoinColumnsComposite
+ *
+ * @version 2.0
+ * @since 1.0
+ */
+public class JavaInheritanceComposite extends AbstractInheritanceComposite<JavaEntity> {
+
+ /**
+ * Creates a new <code>JavaInheritanceComposite</code>.
+ *
+ * @param parentPane The parent container of this one
+ * @param parent The parent container
+ */
+ public JavaInheritanceComposite(Pane<? extends JavaEntity> parentPane,
+ Composite parent) {
+
+ super(parentPane, parent);
+ }
+
+ @Override
+ protected void addPrimaryKeyJoinColumnsComposite(Composite container) {
+ new JavaPrimaryKeyJoinColumnsComposite(this, container);
+ }
+} \ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/java/JavaManyToManyMappingUiDefinition.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/java/JavaManyToManyMappingUiDefinition.java
new file mode 100644
index 0000000000..900ce26972
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/java/JavaManyToManyMappingUiDefinition.java
@@ -0,0 +1,55 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2009 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.ui.internal.details.java;
+
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.ReadOnlyPersistentAttribute;
+import org.eclipse.jpt.jpa.core.context.java.JavaManyToManyMapping;
+import org.eclipse.jpt.jpa.ui.details.JpaComposite;
+import org.eclipse.jpt.jpa.ui.details.java.JavaAttributeMappingUiDefinition;
+import org.eclipse.jpt.jpa.ui.details.java.JavaUiFactory;
+import org.eclipse.jpt.jpa.ui.internal.details.AbstractManyToManyMappingUiDefinition;
+import org.eclipse.swt.widgets.Composite;
+
+public class JavaManyToManyMappingUiDefinition
+ extends AbstractManyToManyMappingUiDefinition<ReadOnlyPersistentAttribute, JavaManyToManyMapping>
+ implements JavaAttributeMappingUiDefinition<JavaManyToManyMapping>
+{
+ // singleton
+ private static final JavaManyToManyMappingUiDefinition INSTANCE =
+ new JavaManyToManyMappingUiDefinition();
+
+
+ /**
+ * Return the singleton.
+ */
+ public static JavaAttributeMappingUiDefinition<JavaManyToManyMapping> instance() {
+ return INSTANCE;
+ }
+
+
+ /**
+ * Ensure single instance.
+ */
+ private JavaManyToManyMappingUiDefinition() {
+ super();
+ }
+
+
+ public JpaComposite buildAttributeMappingComposite(
+ JavaUiFactory factory,
+ PropertyValueModel<JavaManyToManyMapping> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+
+ return factory.createJavaManyToManyMappingComposite(subjectHolder, parent, widgetFactory);
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/java/JavaManyToOneMappingUiDefinition.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/java/JavaManyToOneMappingUiDefinition.java
new file mode 100644
index 0000000000..23e70b258b
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/java/JavaManyToOneMappingUiDefinition.java
@@ -0,0 +1,55 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2009 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.ui.internal.details.java;
+
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.ReadOnlyPersistentAttribute;
+import org.eclipse.jpt.jpa.core.context.java.JavaManyToOneMapping;
+import org.eclipse.jpt.jpa.ui.details.JpaComposite;
+import org.eclipse.jpt.jpa.ui.details.java.JavaAttributeMappingUiDefinition;
+import org.eclipse.jpt.jpa.ui.details.java.JavaUiFactory;
+import org.eclipse.jpt.jpa.ui.internal.details.AbstractManyToOneMappingUiDefinition;
+import org.eclipse.swt.widgets.Composite;
+
+public class JavaManyToOneMappingUiDefinition
+ extends AbstractManyToOneMappingUiDefinition<ReadOnlyPersistentAttribute, JavaManyToOneMapping>
+ implements JavaAttributeMappingUiDefinition<JavaManyToOneMapping>
+{
+ // singleton
+ private static final JavaManyToOneMappingUiDefinition INSTANCE =
+ new JavaManyToOneMappingUiDefinition();
+
+
+ /**
+ * Return the singleton.
+ */
+ public static JavaAttributeMappingUiDefinition<JavaManyToOneMapping> instance() {
+ return INSTANCE;
+ }
+
+
+ /**
+ * Ensure single instance.
+ */
+ private JavaManyToOneMappingUiDefinition() {
+ super();
+ }
+
+
+ public JpaComposite buildAttributeMappingComposite(
+ JavaUiFactory factory,
+ PropertyValueModel<JavaManyToOneMapping> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+
+ return factory.createJavaManyToOneMappingComposite(subjectHolder, parent, widgetFactory);
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/java/JavaMappedSuperclassComposite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/java/JavaMappedSuperclassComposite.java
new file mode 100644
index 0000000000..11dd635e2a
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/java/JavaMappedSuperclassComposite.java
@@ -0,0 +1,54 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2010 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.ui.internal.details.java;
+
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.MappedSuperclass;
+import org.eclipse.jpt.jpa.core.context.java.JavaMappedSuperclass;
+import org.eclipse.jpt.jpa.ui.details.java.JavaUiFactory;
+import org.eclipse.jpt.jpa.ui.internal.details.AbstractMappedSuperclassComposite;
+import org.eclipse.jpt.jpa.ui.internal.details.IdClassComposite;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * Here the layout of this pane:
+ * <pre>
+ * -----------------------------------------------------------------------------
+ * | |
+ * | IdClassComposite |
+ * | |
+ * -----------------------------------------------------------------------------</pre>
+ *
+ * @see MappedSuperclass
+ * @see JavaUiFactory - The factory creating this pane
+ * @see IdClassComposite
+ *
+ * @version 2.3
+ * @since 2.0
+ */
+public class JavaMappedSuperclassComposite
+ extends AbstractMappedSuperclassComposite<JavaMappedSuperclass>
+{
+ /**
+ * Creates a new <code>MappedSuperclassComposite</code>.
+ *
+ * @param subjectHolder The holder of this pane's subject
+ * @param parent The parent container
+ * @param widgetFactory The factory used to create various common widgets
+ */
+ public JavaMappedSuperclassComposite(
+ PropertyValueModel<? extends JavaMappedSuperclass> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+
+ super(subjectHolder, parent, widgetFactory);
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/java/JavaMappedSuperclassUiDefinition.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/java/JavaMappedSuperclassUiDefinition.java
new file mode 100644
index 0000000000..14d0c967d3
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/java/JavaMappedSuperclassUiDefinition.java
@@ -0,0 +1,55 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2009 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.ui.internal.details.java;
+
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.PersistentType;
+import org.eclipse.jpt.jpa.core.context.java.JavaMappedSuperclass;
+import org.eclipse.jpt.jpa.ui.details.JpaComposite;
+import org.eclipse.jpt.jpa.ui.details.java.JavaTypeMappingUiDefinition;
+import org.eclipse.jpt.jpa.ui.details.java.JavaUiFactory;
+import org.eclipse.jpt.jpa.ui.internal.details.AbstractMappedSuperclassUiDefinition;
+import org.eclipse.swt.widgets.Composite;
+
+public class JavaMappedSuperclassUiDefinition
+ extends AbstractMappedSuperclassUiDefinition<PersistentType, JavaMappedSuperclass>
+ implements JavaTypeMappingUiDefinition<JavaMappedSuperclass>
+{
+ // singleton
+ private static final JavaMappedSuperclassUiDefinition INSTANCE =
+ new JavaMappedSuperclassUiDefinition();
+
+
+ /**
+ * Return the singleton.
+ */
+ public static JavaTypeMappingUiDefinition<JavaMappedSuperclass> instance() {
+ return INSTANCE;
+ }
+
+
+ /**
+ * Ensure single instance.
+ */
+ private JavaMappedSuperclassUiDefinition() {
+ super();
+ }
+
+
+ public JpaComposite buildTypeMappingComposite(
+ JavaUiFactory factory,
+ PropertyValueModel<JavaMappedSuperclass> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+
+ return factory.createJavaMappedSuperclassComposite(subjectHolder, parent, widgetFactory);
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/java/JavaOneToManyMappingUiDefinition.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/java/JavaOneToManyMappingUiDefinition.java
new file mode 100644
index 0000000000..ca30448137
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/java/JavaOneToManyMappingUiDefinition.java
@@ -0,0 +1,55 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2009 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.ui.internal.details.java;
+
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.ReadOnlyPersistentAttribute;
+import org.eclipse.jpt.jpa.core.context.java.JavaOneToManyMapping;
+import org.eclipse.jpt.jpa.ui.details.JpaComposite;
+import org.eclipse.jpt.jpa.ui.details.java.JavaAttributeMappingUiDefinition;
+import org.eclipse.jpt.jpa.ui.details.java.JavaUiFactory;
+import org.eclipse.jpt.jpa.ui.internal.details.AbstractOneToManyMappingUiDefinition;
+import org.eclipse.swt.widgets.Composite;
+
+public class JavaOneToManyMappingUiDefinition
+ extends AbstractOneToManyMappingUiDefinition<ReadOnlyPersistentAttribute, JavaOneToManyMapping>
+ implements JavaAttributeMappingUiDefinition<JavaOneToManyMapping>
+{
+ // singleton
+ private static final JavaOneToManyMappingUiDefinition INSTANCE =
+ new JavaOneToManyMappingUiDefinition();
+
+
+ /**
+ * Return the singleton.
+ */
+ public static JavaAttributeMappingUiDefinition<JavaOneToManyMapping> instance() {
+ return INSTANCE;
+ }
+
+
+ /**
+ * Ensure single instance.
+ */
+ private JavaOneToManyMappingUiDefinition() {
+ super();
+ }
+
+
+ public JpaComposite buildAttributeMappingComposite(
+ JavaUiFactory factory,
+ PropertyValueModel<JavaOneToManyMapping> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+
+ return factory.createJavaOneToManyMappingComposite(subjectHolder, parent, widgetFactory);
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/java/JavaOneToOneMappingUiDefinition.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/java/JavaOneToOneMappingUiDefinition.java
new file mode 100644
index 0000000000..d96ee6166f
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/java/JavaOneToOneMappingUiDefinition.java
@@ -0,0 +1,55 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 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.ui.internal.details.java;
+
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.ReadOnlyPersistentAttribute;
+import org.eclipse.jpt.jpa.core.context.java.JavaOneToOneMapping;
+import org.eclipse.jpt.jpa.ui.details.JpaComposite;
+import org.eclipse.jpt.jpa.ui.details.java.JavaAttributeMappingUiDefinition;
+import org.eclipse.jpt.jpa.ui.details.java.JavaUiFactory;
+import org.eclipse.jpt.jpa.ui.internal.details.AbstractOneToOneMappingUiDefinition;
+import org.eclipse.swt.widgets.Composite;
+
+public class JavaOneToOneMappingUiDefinition
+ extends AbstractOneToOneMappingUiDefinition<ReadOnlyPersistentAttribute, JavaOneToOneMapping>
+ implements JavaAttributeMappingUiDefinition<JavaOneToOneMapping>
+{
+ // singleton
+ private static final JavaOneToOneMappingUiDefinition INSTANCE =
+ new JavaOneToOneMappingUiDefinition();
+
+
+ /**
+ * Return the singleton.
+ */
+ public static JavaAttributeMappingUiDefinition<JavaOneToOneMapping> instance() {
+ return INSTANCE;
+ }
+
+
+ /**
+ * Ensure single instance.
+ */
+ private JavaOneToOneMappingUiDefinition() {
+ super();
+ }
+
+
+ public JpaComposite buildAttributeMappingComposite(
+ JavaUiFactory factory,
+ PropertyValueModel<JavaOneToOneMapping> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+
+ return factory.createJavaOneToOneMappingComposite(subjectHolder, parent, widgetFactory);
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/java/JavaPersistentAttributeDetailsPage.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/java/JavaPersistentAttributeDetailsPage.java
new file mode 100644
index 0000000000..80046d9cbc
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/java/JavaPersistentAttributeDetailsPage.java
@@ -0,0 +1,69 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2009 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.ui.internal.details.java;
+
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.jpa.core.context.java.JavaPersistentAttribute;
+import org.eclipse.jpt.jpa.ui.internal.details.PersistentAttributeDetailsPage;
+import org.eclipse.jpt.jpa.ui.internal.details.PersistentAttributeMapAsComposite;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * The default implementation of the details page used for the Java persistent
+ * attribute.
+ * <p>
+ * Here the layout of this pane:
+ * <pre>
+ * -----------------------------------------------------------------------------
+ * | ------------------------------------------------------------------------- |
+ * | | | |
+ * | | JavaPersistentAttributeMapAsComposite | |
+ * | | | |
+ * | ------------------------------------------------------------------------- |
+ * | ------------------------------------------------------------------------- |
+ * | | | |
+ * | | Type mapping pane | |
+ * | | | |
+ * | ------------------------------------------------------------------------- |
+ * -----------------------------------------------------------------------------</pre>
+ *
+ * @see JavaPersistentAttribute
+ * @see JavaPersistentTypeMapAsComposite
+ *
+ * @version 2.2
+ * @since 2.0
+ */
+public class JavaPersistentAttributeDetailsPage
+ extends PersistentAttributeDetailsPage<JavaPersistentAttribute>
+{
+ /**
+ * Creates a new <code>JavaPersistentAttributeDetailsPage</code>.
+ *
+ * @param parent The parent container
+ * @param widgetFactory The factory used to create various common widgets
+ */
+ public JavaPersistentAttributeDetailsPage(Composite parent,
+ WidgetFactory widgetFactory) {
+
+ super(parent, widgetFactory);
+ }
+
+ @Override
+ protected void initializeLayout(Composite container) {
+
+ // Map as composite
+ new PersistentAttributeMapAsComposite(
+ this,
+ addSubPane(container, 0, 0, 5, 0)
+ );
+
+ buildMappingPageBook(container);
+ }
+} \ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/java/JavaPersistentAttributeDetailsProvider.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/java/JavaPersistentAttributeDetailsProvider.java
new file mode 100644
index 0000000000..b5b7691d46
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/java/JavaPersistentAttributeDetailsProvider.java
@@ -0,0 +1,60 @@
+/*******************************************************************************
+ * Copyright (c) 2009 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.ui.internal.details.java;
+
+import org.eclipse.jpt.common.core.JptCommonCorePlugin;
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.utility.internal.Tools;
+import org.eclipse.jpt.jpa.core.JpaStructureNode;
+import org.eclipse.jpt.jpa.core.context.java.JavaPersistentAttribute;
+import org.eclipse.jpt.jpa.core.context.java.JavaStructureNodes;
+import org.eclipse.jpt.jpa.ui.details.JpaDetailsPage;
+import org.eclipse.jpt.jpa.ui.details.JpaDetailsProvider;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * This provider is responsible for creating the <code>JpaDetailsPage</code>
+ * when the information comes from the Java source file.
+ */
+public class JavaPersistentAttributeDetailsProvider
+ implements JpaDetailsProvider
+{
+ // singleton
+ private static final JpaDetailsProvider INSTANCE = new JavaPersistentAttributeDetailsProvider();
+
+
+ /**
+ * Return the singleton
+ */
+ public static JpaDetailsProvider instance() {
+ return INSTANCE;
+ }
+
+
+ /**
+ * Enforce singleton usage
+ */
+ private JavaPersistentAttributeDetailsProvider() {
+ super();
+ }
+
+
+ public boolean providesDetails(JpaStructureNode structureNode) {
+ return Tools.valuesAreEqual(structureNode.getId(), JavaStructureNodes.PERSISTENT_ATTRIBUTE_ID)
+ && structureNode.getResourceType().getContentType().equals(JptCommonCorePlugin.JAVA_SOURCE_CONTENT_TYPE);
+ }
+
+ public JpaDetailsPage<JavaPersistentAttribute> buildDetailsPage(
+ Composite parent,
+ WidgetFactory widgetFactory) {
+
+ return new JavaPersistentAttributeDetailsPage(parent, widgetFactory);
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/java/JavaPersistentTypeDetailsProvider.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/java/JavaPersistentTypeDetailsProvider.java
new file mode 100644
index 0000000000..f44c213cce
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/java/JavaPersistentTypeDetailsProvider.java
@@ -0,0 +1,61 @@
+/*******************************************************************************
+ * Copyright (c) 2009 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.ui.internal.details.java;
+
+import org.eclipse.jpt.common.core.JptCommonCorePlugin;
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.utility.internal.Tools;
+import org.eclipse.jpt.jpa.core.JpaStructureNode;
+import org.eclipse.jpt.jpa.core.context.PersistentType;
+import org.eclipse.jpt.jpa.core.context.java.JavaStructureNodes;
+import org.eclipse.jpt.jpa.ui.details.JpaDetailsPage;
+import org.eclipse.jpt.jpa.ui.details.JpaDetailsProvider;
+import org.eclipse.jpt.jpa.ui.internal.details.PersistentTypeDetailsPage;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * This provider is responsible for creating the <code>JpaDetailsPage</code>
+ * when the information comes from the Java source file.
+ */
+public class JavaPersistentTypeDetailsProvider
+ implements JpaDetailsProvider
+{
+ // singleton
+ private static final JpaDetailsProvider INSTANCE = new JavaPersistentTypeDetailsProvider();
+
+
+ /**
+ * Return the singleton
+ */
+ public static JpaDetailsProvider instance() {
+ return INSTANCE;
+ }
+
+
+ /**
+ * Enforce singleton usage
+ */
+ private JavaPersistentTypeDetailsProvider() {
+ super();
+ }
+
+
+ public boolean providesDetails(JpaStructureNode structureNode) {
+ return Tools.valuesAreEqual(structureNode.getId(), JavaStructureNodes.PERSISTENT_TYPE_ID)
+ && structureNode.getResourceType().getContentType().equals(JptCommonCorePlugin.JAVA_SOURCE_CONTENT_TYPE);
+ }
+
+ public JpaDetailsPage<PersistentType> buildDetailsPage(
+ Composite parent,
+ WidgetFactory widgetFactory) {
+
+ return new PersistentTypeDetailsPage(parent, widgetFactory);
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/java/JavaPrimaryKeyJoinColumnsComposite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/java/JavaPrimaryKeyJoinColumnsComposite.java
new file mode 100644
index 0000000000..6e5f06c6cb
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/java/JavaPrimaryKeyJoinColumnsComposite.java
@@ -0,0 +1,67 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 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.ui.internal.details.java;
+
+import org.eclipse.jpt.common.ui.internal.widgets.Pane;
+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.model.value.ListValueModel;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.PrimaryKeyJoinColumn;
+import org.eclipse.jpt.jpa.core.context.java.JavaEntity;
+import org.eclipse.jpt.jpa.ui.internal.details.AbstractPrimaryKeyJoinColumnsComposite;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * @see JavaEntity
+ * @see JavaInheritanceComposite - The container of this pane
+ *
+ * @version 2.0
+ * @since 2.0
+ */
+public class JavaPrimaryKeyJoinColumnsComposite extends AbstractPrimaryKeyJoinColumnsComposite<JavaEntity>
+{
+ public JavaPrimaryKeyJoinColumnsComposite(Pane<? extends JavaEntity> subjectHolder,
+ Composite parent) {
+
+ super(subjectHolder, parent);
+ }
+
+ @Override
+ protected ListValueModel<PrimaryKeyJoinColumn> buildDefaultJoinColumnsListHolder() {
+ return new PropertyListValueModelAdapter<PrimaryKeyJoinColumn>(buildDefaultJoinColumnHolder());
+ }
+
+ private PropertyValueModel<PrimaryKeyJoinColumn> buildDefaultJoinColumnHolder() {
+ return new PropertyAspectAdapter<JavaEntity, PrimaryKeyJoinColumn>(getSubjectHolder(), JavaEntity.DEFAULT_PRIMARY_KEY_JOIN_COLUMN_PROPERTY) {
+ @Override
+ protected PrimaryKeyJoinColumn buildValue_() {
+ return subject.getDefaultPrimaryKeyJoinColumn();
+ }
+ };
+ }
+
+ @Override
+ protected void switchDefaultToSpecified() {
+ PrimaryKeyJoinColumn defaultJoinColumn = getSubject().getDefaultPrimaryKeyJoinColumn();
+
+ if (defaultJoinColumn != null) {
+ String columnName = defaultJoinColumn.getDefaultName();
+ String referencedColumnName = defaultJoinColumn.getDefaultReferencedColumnName();
+
+ PrimaryKeyJoinColumn pkJoinColumn = getSubject().addSpecifiedPrimaryKeyJoinColumn();
+ pkJoinColumn.setSpecifiedName(columnName);
+ pkJoinColumn.setSpecifiedReferencedColumnName(referencedColumnName);
+
+ this.joinColumnHolder.setValue(pkJoinColumn);
+ }
+ }
+
+} \ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/java/JavaSecondaryTablesComposite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/java/JavaSecondaryTablesComposite.java
new file mode 100644
index 0000000000..d10614b967
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/java/JavaSecondaryTablesComposite.java
@@ -0,0 +1,130 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2010 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.ui.internal.details.java;
+
+import java.util.ListIterator;
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.ui.internal.widgets.AddRemoveListPane;
+import org.eclipse.jpt.common.ui.internal.widgets.Pane;
+import org.eclipse.jpt.common.utility.internal.model.value.ItemPropertyListValueModelAdapter;
+import org.eclipse.jpt.common.utility.internal.model.value.ListAspectAdapter;
+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.core.context.Entity;
+import org.eclipse.jpt.jpa.core.context.ReadOnlyTable;
+import org.eclipse.jpt.jpa.core.context.SecondaryTable;
+import org.eclipse.jpt.jpa.core.context.java.JavaEntity;
+import org.eclipse.jpt.jpa.core.context.java.JavaSecondaryTable;
+import org.eclipse.jpt.jpa.ui.internal.JpaHelpContextIds;
+import org.eclipse.jpt.jpa.ui.internal.details.AbstractSecondaryTablesComposite;
+import org.eclipse.jpt.jpa.ui.internal.details.PrimaryKeyJoinColumnsInSecondaryTableComposite;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * Here the layout of this pane:
+ * <pre>
+ * -----------------------------------------------------------------------------
+ * | ------------------------------------------------------------------------- |
+ * | | | |
+ * | | AddRemoveListPane | |
+ * | | | |
+ * | ------------------------------------------------------------------------- |
+ * | ------------------------------------------------------------------------- |
+ * | | | |
+ * | | PrimaryKeyJoinColumnsInSecondaryTableComposite | |
+ * | | | |
+ * | ------------------------------------------------------------------------- |
+ * -----------------------------------------------------------------------------</pre>
+ *
+ * @see Entity
+ * @see AddRemoveListPane
+ * @see PrimaryKeyJoinColumnsInSecondaryTableComposite
+ *
+ * @version 2.0
+ * @since 1.0
+ */
+public class JavaSecondaryTablesComposite extends AbstractSecondaryTablesComposite<JavaEntity>
+{
+ /**
+ * Creates a new <code>SecondaryTablesComposite</code>.
+ *
+ * @param parentPane The parent container of this one
+ * @param parent The parent container
+ */
+ public JavaSecondaryTablesComposite(Pane<? extends JavaEntity> parentPane,
+ Composite parent) {
+
+ super(parentPane, parent);
+ }
+
+ /**
+ * Creates a new <code>SecondaryTablesComposite</code>.
+ *
+ * @param subjectHolder The holder of the subject <code>IEntity</code>
+ * @param parent The parent container
+ * @param widgetFactory The factory used to create various common widgets
+ */
+ public JavaSecondaryTablesComposite(PropertyValueModel<? extends JavaEntity> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+
+ super(subjectHolder, parent, widgetFactory);
+ }
+
+ private ListValueModel<JavaSecondaryTable> buildSecondaryTablesListModel() {
+ return new ItemPropertyListValueModelAdapter<JavaSecondaryTable>(buildSecondaryTablesListHolder(),
+ ReadOnlyTable.SPECIFIED_NAME_PROPERTY);
+ }
+
+ private ListValueModel<JavaSecondaryTable> buildSecondaryTablesListHolder() {
+ return new ListAspectAdapter<JavaEntity, JavaSecondaryTable>(getSubjectHolder(), Entity.SPECIFIED_SECONDARY_TABLES_LIST) {
+ @Override
+ protected ListIterator<JavaSecondaryTable> listIterator_() {
+ return this.subject.specifiedSecondaryTables();
+ }
+
+ @Override
+ protected int size_() {
+ return this.subject.specifiedSecondaryTablesSize();
+ }
+ };
+ }
+
+ /*
+ * (non-Javadoc)
+ */
+ @Override
+ protected void initializeLayout(Composite container) {
+
+ int groupBoxMargin = getGroupBoxMargin();
+
+ WritablePropertyValueModel<SecondaryTable> secondaryTableHolder =
+ buildSecondaryTableHolder();
+
+ // Secondary Tables add/remove list pane
+ new AddRemoveListPane<Entity>(
+ this,
+ addSubPane(container, 0, groupBoxMargin, 0, groupBoxMargin),
+ buildSecondaryTablesAdapter(),
+ buildSecondaryTablesListModel(),
+ secondaryTableHolder,
+ buildSecondaryTableLabelProvider(),
+ JpaHelpContextIds.MAPPING_JOIN_TABLE_COLUMNS//TODO need a help context id for this
+ );
+
+ // Primary Key Join Columns pane
+ new PrimaryKeyJoinColumnsInSecondaryTableComposite(
+ this,
+ secondaryTableHolder,
+ container
+ );
+ }
+} \ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/java/JavaTransientMappingUiDefinition.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/java/JavaTransientMappingUiDefinition.java
new file mode 100644
index 0000000000..657e43234f
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/java/JavaTransientMappingUiDefinition.java
@@ -0,0 +1,55 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 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.ui.internal.details.java;
+
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.ReadOnlyPersistentAttribute;
+import org.eclipse.jpt.jpa.core.context.java.JavaTransientMapping;
+import org.eclipse.jpt.jpa.ui.details.JpaComposite;
+import org.eclipse.jpt.jpa.ui.details.java.JavaAttributeMappingUiDefinition;
+import org.eclipse.jpt.jpa.ui.details.java.JavaUiFactory;
+import org.eclipse.jpt.jpa.ui.internal.details.AbstractTransientMappingUiDefinition;
+import org.eclipse.swt.widgets.Composite;
+
+public class JavaTransientMappingUiDefinition
+ extends AbstractTransientMappingUiDefinition<ReadOnlyPersistentAttribute, JavaTransientMapping>
+ implements JavaAttributeMappingUiDefinition<JavaTransientMapping>
+{
+ // singleton
+ private static final JavaTransientMappingUiDefinition INSTANCE =
+ new JavaTransientMappingUiDefinition();
+
+
+ /**
+ * Return the singleton.
+ */
+ public static JavaAttributeMappingUiDefinition<JavaTransientMapping> instance() {
+ return INSTANCE;
+ }
+
+
+ /**
+ * Ensure single instance.
+ */
+ private JavaTransientMappingUiDefinition() {
+ super();
+ }
+
+
+ public JpaComposite buildAttributeMappingComposite(
+ JavaUiFactory factory,
+ PropertyValueModel<JavaTransientMapping> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+
+ return factory.createJavaTransientMappingComposite(subjectHolder, parent, widgetFactory);
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/java/JavaVersionMappingUiDefinition.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/java/JavaVersionMappingUiDefinition.java
new file mode 100644
index 0000000000..d4f9bd94bc
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/java/JavaVersionMappingUiDefinition.java
@@ -0,0 +1,55 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 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.ui.internal.details.java;
+
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.ReadOnlyPersistentAttribute;
+import org.eclipse.jpt.jpa.core.context.java.JavaVersionMapping;
+import org.eclipse.jpt.jpa.ui.details.JpaComposite;
+import org.eclipse.jpt.jpa.ui.details.java.JavaAttributeMappingUiDefinition;
+import org.eclipse.jpt.jpa.ui.details.java.JavaUiFactory;
+import org.eclipse.jpt.jpa.ui.internal.details.AbstractVersionMappingUiDefinition;
+import org.eclipse.swt.widgets.Composite;
+
+public class JavaVersionMappingUiDefinition
+ extends AbstractVersionMappingUiDefinition<ReadOnlyPersistentAttribute, JavaVersionMapping>
+ implements JavaAttributeMappingUiDefinition<JavaVersionMapping>
+{
+ // singleton
+ private static final JavaVersionMappingUiDefinition INSTANCE =
+ new JavaVersionMappingUiDefinition();
+
+
+ /**
+ * Return the singleton.
+ */
+ public static JavaAttributeMappingUiDefinition<JavaVersionMapping> instance() {
+ return INSTANCE;
+ }
+
+
+ /**
+ * Ensure single instance.
+ */
+ private JavaVersionMappingUiDefinition() {
+ super();
+ }
+
+
+ public JpaComposite buildAttributeMappingComposite(
+ JavaUiFactory factory,
+ PropertyValueModel<JavaVersionMapping> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+
+ return factory.createJavaVersionMappingComposite(subjectHolder, parent, widgetFactory);
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/java/NullJavaAttributeMappingUiDefinition.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/java/NullJavaAttributeMappingUiDefinition.java
new file mode 100644
index 0000000000..8e2e64812b
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/java/NullJavaAttributeMappingUiDefinition.java
@@ -0,0 +1,92 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2010 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.ui.internal.details.java;
+
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.ui.internal.widgets.Pane;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.MappingKeys;
+import org.eclipse.jpt.jpa.core.context.ReadOnlyPersistentAttribute;
+import org.eclipse.jpt.jpa.core.context.java.JavaAttributeMapping;
+import org.eclipse.jpt.jpa.ui.details.JpaComposite;
+import org.eclipse.jpt.jpa.ui.details.java.DefaultJavaAttributeMappingUiDefinition;
+import org.eclipse.jpt.jpa.ui.details.java.JavaUiFactory;
+import org.eclipse.jpt.jpa.ui.internal.JpaMappingImageHelper;
+import org.eclipse.jpt.jpa.ui.internal.details.AbstractMappingUiDefinition;
+import org.eclipse.jpt.jpa.ui.internal.details.JptUiDetailsMessages;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.widgets.Composite;
+
+public class NullJavaAttributeMappingUiDefinition
+ extends AbstractMappingUiDefinition<ReadOnlyPersistentAttribute, JavaAttributeMapping>
+ implements DefaultJavaAttributeMappingUiDefinition<JavaAttributeMapping>
+{
+ // singleton
+ private static final NullJavaAttributeMappingUiDefinition INSTANCE =
+ new NullJavaAttributeMappingUiDefinition();
+
+ /**
+ * Return the singleton.
+ */
+ public static DefaultJavaAttributeMappingUiDefinition<JavaAttributeMapping> instance() {
+ return INSTANCE;
+ }
+
+
+ /**
+ * Ensure single instance.
+ */
+ private NullJavaAttributeMappingUiDefinition() {
+ super();
+ }
+
+ public Image getImage() {
+ return JpaMappingImageHelper.imageForAttributeMapping(getKey());
+ }
+
+ public String getLabel() {
+ return JptUiDetailsMessages.NullAttributeMappingUiProvider_label;
+ }
+
+ public String getLinkLabel() {
+ return null;
+ }
+
+ public String getKey() {
+ return null;
+ }
+
+ public String getDefaultKey() {
+ return MappingKeys.NULL_ATTRIBUTE_MAPPING_KEY;
+ }
+
+ public JpaComposite buildAttributeMappingComposite(
+ JavaUiFactory factory,
+ PropertyValueModel<JavaAttributeMapping> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+ return new NullComposite(subjectHolder, parent, widgetFactory);
+ }
+
+
+ public static class NullComposite extends Pane<JavaAttributeMapping>
+ implements JpaComposite
+ {
+ NullComposite(
+ PropertyValueModel<JavaAttributeMapping> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+ super(subjectHolder, parent, widgetFactory);
+ }
+
+ @Override
+ protected void initializeLayout(Composite container) {}
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/java/NullJavaTypeMappingUiDefinition.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/java/NullJavaTypeMappingUiDefinition.java
new file mode 100644
index 0000000000..bd70844d8a
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/java/NullJavaTypeMappingUiDefinition.java
@@ -0,0 +1,95 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2010 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.ui.internal.details.java;
+
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.ui.internal.widgets.Pane;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.PersistentType;
+import org.eclipse.jpt.jpa.core.context.java.JavaTypeMapping;
+import org.eclipse.jpt.jpa.ui.details.JpaComposite;
+import org.eclipse.jpt.jpa.ui.details.java.DefaultJavaTypeMappingUiDefinition;
+import org.eclipse.jpt.jpa.ui.details.java.JavaUiFactory;
+import org.eclipse.jpt.jpa.ui.internal.JpaMappingImageHelper;
+import org.eclipse.jpt.jpa.ui.internal.details.AbstractMappingUiDefinition;
+import org.eclipse.jpt.jpa.ui.internal.details.JptUiDetailsMessages;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.widgets.Composite;
+
+public class NullJavaTypeMappingUiDefinition
+ extends AbstractMappingUiDefinition<PersistentType, JavaTypeMapping>
+ implements DefaultJavaTypeMappingUiDefinition<JavaTypeMapping>
+{
+ // singleton
+ private static final NullJavaTypeMappingUiDefinition INSTANCE = new NullJavaTypeMappingUiDefinition();
+
+
+ /**
+ * Return the singleton.
+ */
+ public static DefaultJavaTypeMappingUiDefinition<JavaTypeMapping> instance() {
+ return INSTANCE;
+ }
+
+
+ /**
+ * Ensure single instance.
+ */
+ private NullJavaTypeMappingUiDefinition() {
+ super();
+ }
+
+
+ public Image getImage() {
+ return JpaMappingImageHelper.imageForTypeMapping(null);
+ }
+
+ public String getLabel() {
+ return JptUiDetailsMessages.NullTypeMappingUiProvider_label;
+ }
+
+ public String getLinkLabel() {
+ return null;
+ }
+
+ public String getKey() {
+ return null;
+ }
+
+ public String getDefaultKey() {
+ return null;
+ }
+
+ public JpaComposite buildTypeMappingComposite(
+ JavaUiFactory factory,
+ PropertyValueModel<JavaTypeMapping> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+
+ return new NullComposite(subjectHolder, parent, widgetFactory);
+ }
+
+ public static class NullComposite
+ extends Pane<JavaTypeMapping>
+ implements JpaComposite
+ {
+ NullComposite(
+ PropertyValueModel<JavaTypeMapping> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+
+ super(subjectHolder, parent, widgetFactory);
+ }
+
+
+ @Override
+ protected void initializeLayout(Composite container) {}
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/AbstractEntityMappingsDetailsPage.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/AbstractEntityMappingsDetailsPage.java
new file mode 100644
index 0000000000..bc78d9cc89
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/AbstractEntityMappingsDetailsPage.java
@@ -0,0 +1,268 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2010 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.ui.internal.details.orm;
+
+import java.util.Collection;
+
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.ui.internal.widgets.EnumFormComboViewer;
+import org.eclipse.jpt.common.utility.internal.model.value.SimplePropertyValueModel;
+import org.eclipse.jpt.common.utility.internal.model.value.TransformationPropertyValueModel;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.AccessType;
+import org.eclipse.jpt.jpa.core.context.orm.EntityMappings;
+import org.eclipse.jpt.jpa.core.context.orm.OrmPersistenceUnitMetadata;
+import org.eclipse.jpt.jpa.db.SchemaContainer;
+import org.eclipse.jpt.jpa.ui.internal.JpaHelpContextIds;
+import org.eclipse.jpt.jpa.ui.internal.details.AbstractJpaDetailsPage;
+import org.eclipse.jpt.jpa.ui.internal.details.db.CatalogCombo;
+import org.eclipse.jpt.jpa.ui.internal.details.db.SchemaCombo;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * Here the layout of this pane:
+ * <pre>
+ * -----------------------------------------------------------------------------
+ * | ------------------------------------------------------------------------- |
+ * | | | |
+ * | | XmlPackageChooser | |
+ * | | | |
+ * | ------------------------------------------------------------------------- |
+ * | ------------------------------------------------------------ |
+ * | Schema: | SchemaCombo | |
+ * | ------------------------------------------------------------ |
+ * | ------------------------------------------------------------ |
+ * | Catalog: | CatalogCombo | |
+ * | ------------------------------------------------------------ |
+ * | ------------------------------------------------------------ |
+ * | Access Type: | |v| |
+ * | ------------------------------------------------------------ |
+ * | |
+ * | ------------------------------------------------------------------------- |
+ * | | | |
+ * | | PersistenceUnitMetadataComposite | |
+ * | | | |
+ * | ------------------------------------------------------------------------- |
+ * | ------------------------------------------------------------------------- |
+ * | | | |
+ * | | OrmGeneratorsComposite | |
+ * | | | |
+ * | ------------------------------------------------------------------------- |
+ * | ------------------------------------------------------------------------- |
+ * | | | |
+ * | | OrmQueriesComposite | |
+ * | | | |
+ * | ------------------------------------------------------------------------- |
+ * -----------------------------------------------------------------------------</pre>
+ *
+ * @see EntityMappings
+ * @see AbstractEntityMappingsDetailsPage - The parent container
+ * @see CatalogCombo
+ * @see EnumFormComboViewer
+ * @see EntityMappingsGeneratorsComposite
+ * @see OrmPackageChooser
+ * @see OrmQueriesComposite
+ * @see PersistenceUnitMetadataComposite
+ * @see SchemaCombo
+ *
+ * @version 2.3
+ * @since 2.0
+ */
+public abstract class AbstractEntityMappingsDetailsPage extends AbstractJpaDetailsPage<EntityMappings>
+{
+ /**
+ * Creates a new <code>EntityMappingsDetailsPage</code>.
+ *
+ * @param parent The parent container
+ * @param widgetFactory The factory used to create various common widgets
+ */
+ protected AbstractEntityMappingsDetailsPage(Composite parent,
+ WidgetFactory widgetFactory) {
+
+ super(parent, widgetFactory);
+ }
+
+ @Override
+ protected void initializeLayout(Composite container) {
+ this.initializeEntityMappingsCollapsibleSection(container);
+ this.initializePersistenceUnitMetadataCollapsibleSection(container);
+ this.initializeGeneratorsCollapsibleSection(container);
+ this.initializeQueriesCollapsibleSection(container);
+ }
+
+ protected void initializeEntityMappingsCollapsibleSection(Composite container) {
+ container = addCollapsibleSection(
+ container,
+ JptUiDetailsOrmMessages.EntityMappingsSection_title,
+ new SimplePropertyValueModel<Boolean>(Boolean.TRUE)
+ );
+
+ this.initializeEntityMappingsSection(container);
+ }
+
+ protected void initializeEntityMappingsSection(Composite container) {
+ // Package widgets
+ new OrmPackageChooser(this, container);
+
+ // Schema widgets
+ addLabeledComposite(
+ container,
+ JptUiDetailsOrmMessages.EntityMappingsDetailsPage_schema,
+ addSchemaCombo(container),
+ JpaHelpContextIds.ENTITY_ORM_SCHEMA
+ );
+
+ // Catalog widgets
+ addLabeledComposite(
+ container,
+ JptUiDetailsOrmMessages.EntityMappingsDetailsPage_catalog,
+ addCatalogCombo(container),
+ JpaHelpContextIds.ENTITY_ORM_CATALOG
+ );
+
+ // Access Type widgets
+ addLabeledComposite(
+ container,
+ JptUiDetailsOrmMessages.EntityMappingsDetailsPage_access,
+ addAccessTypeCombo(container),
+ JpaHelpContextIds.ENTITY_ORM_ACCESS
+ );
+ }
+
+ protected void initializePersistenceUnitMetadataCollapsibleSection(Composite container) {
+ new PersistenceUnitMetadataComposite(
+ this,
+ buildPersistentUnitMetadataHolder(),
+ addSubPane(container, 5)
+ );
+ }
+
+ protected EnumFormComboViewer<EntityMappings, AccessType> addAccessTypeCombo(Composite container) {
+
+ return new EnumFormComboViewer<EntityMappings, AccessType>(this, container) {
+
+ @Override
+ protected void addPropertyNames(Collection<String> propertyNames) {
+ super.addPropertyNames(propertyNames);
+ propertyNames.add(EntityMappings.DEFAULT_ACCESS_PROPERTY);
+ propertyNames.add(EntityMappings.SPECIFIED_ACCESS_PROPERTY);
+ }
+
+ @Override
+ protected AccessType[] getChoices() {
+ return AccessType.values();
+ }
+
+ @Override
+ protected AccessType getDefaultValue() {
+ return getSubject().getDefaultAccess();
+ }
+
+ @Override
+ protected String displayString(AccessType value) {
+ return value == AccessType.FIELD ?
+ JptUiDetailsOrmMessages.EntityMappingsDetailsPage_field :
+ JptUiDetailsOrmMessages.EntityMappingsDetailsPage_property;
+ }
+
+ @Override
+ protected AccessType getValue() {
+ return getSubject().getSpecifiedAccess();
+ }
+
+ @Override
+ protected void setValue(AccessType value) {
+ getSubject().setSpecifiedAccess(value);
+ }
+ };
+ }
+
+ protected CatalogCombo<EntityMappings> addCatalogCombo(Composite container) {
+
+ return new CatalogCombo<EntityMappings>(this, container) {
+
+ @Override
+ protected void addPropertyNames(Collection<String> propertyNames) {
+ super.addPropertyNames(propertyNames);
+ propertyNames.add(EntityMappings.DEFAULT_CATALOG_PROPERTY);
+ propertyNames.add(EntityMappings.SPECIFIED_CATALOG_PROPERTY);
+ }
+
+ @Override
+ protected String getDefaultValue() {
+ return getSubject().getDefaultCatalog();
+ }
+
+ @Override
+ protected void setValue(String value) {
+ getSubject().setSpecifiedCatalog(value);
+ }
+
+ @Override
+ protected String getValue() {
+ return getSubject().getSpecifiedCatalog();
+ }
+ };
+ }
+
+ protected PropertyValueModel<OrmPersistenceUnitMetadata> buildPersistentUnitMetadataHolder() {
+ return new TransformationPropertyValueModel<EntityMappings, OrmPersistenceUnitMetadata>(getSubjectHolder()) {
+ @Override
+ protected OrmPersistenceUnitMetadata transform_(EntityMappings value) {
+ return value.getPersistenceUnitMetadata();
+ }
+ };
+ }
+
+ protected SchemaCombo<EntityMappings> addSchemaCombo(Composite container) {
+
+ return new SchemaCombo<EntityMappings>(this, container) {
+
+ @Override
+ protected void addPropertyNames(Collection<String> propertyNames) {
+ super.addPropertyNames(propertyNames);
+ propertyNames.add(EntityMappings.DEFAULT_SCHEMA_PROPERTY);
+ propertyNames.add(EntityMappings.SPECIFIED_SCHEMA_PROPERTY);
+ }
+
+ @Override
+ protected String getDefaultValue() {
+ return getSubject().getDefaultSchema();
+ }
+
+ @Override
+ protected void setValue(String value) {
+ getSubject().setSpecifiedSchema(value);
+ }
+
+ @Override
+ protected String getValue() {
+ return getSubject().getSpecifiedSchema();
+ }
+
+ @Override
+ protected SchemaContainer getDbSchemaContainer_() {
+ return this.getSubject().getDbSchemaContainer();
+ }
+
+ };
+ }
+
+ protected void initializeGeneratorsCollapsibleSection(Composite container) {
+ new EntityMappingsGeneratorsComposite(
+ this,
+ container
+ );
+ }
+
+ protected void initializeQueriesCollapsibleSection(Composite container) {
+ new OrmQueriesComposite(this, container);
+ }
+} \ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/AbstractOrmEntityComposite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/AbstractOrmEntityComposite.java
new file mode 100644
index 0000000000..97d8424fe4
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/AbstractOrmEntityComposite.java
@@ -0,0 +1,90 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 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.ui.internal.details.orm;
+
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.utility.internal.model.value.PropertyAspectAdapter;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.AccessHolder;
+import org.eclipse.jpt.jpa.core.context.orm.OrmEntity;
+import org.eclipse.jpt.jpa.ui.internal.details.AbstractEntityComposite;
+import org.eclipse.jpt.jpa.ui.internal.details.AccessTypeComposite;
+import org.eclipse.jpt.jpa.ui.internal.details.EntityNameComposite;
+import org.eclipse.jpt.jpa.ui.internal.details.IdClassComposite;
+import org.eclipse.jpt.jpa.ui.internal.details.TableComposite;
+import org.eclipse.jpt.jpa.ui.internal.details.java.BaseJavaUiFactory;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * The pane used for an ORM entity.
+ *
+ * @see OrmEntity
+ * @see BaseJavaUiFactory - The factory creating this pane
+ *
+ * @version 2.3
+ * @since 1.0
+ */
+public abstract class AbstractOrmEntityComposite extends AbstractEntityComposite<OrmEntity>
+{
+ /**
+ * Creates a new <code>OrmEntityComposite</code>.
+ *
+ * @param subjectHolder The holder of the subject <code>OrmEntity</code>
+ * @param parent The parent container
+ * @param widgetFactory The factory used to create various common widgets
+ */
+ protected AbstractOrmEntityComposite(
+ PropertyValueModel<? extends OrmEntity> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+
+ super(subjectHolder, parent, widgetFactory);
+ }
+
+
+ @Override
+ protected void initializeLayout(Composite container) {
+ this.initializeEntityCollapsibleSection(container);
+ this.initializeQueriesCollapsibleSection(container);
+ this.initializeInheritanceCollapsibleSection(container);
+ this.initializeAttributeOverridesCollapsibleSection(container);
+ this.initializeGeneratorsCollapsibleSection(container);
+ this.initializeSecondaryTablesCollapsibleSection(container);
+ }
+
+ @Override
+ protected void initializeEntitySection(Composite container) {
+ new OrmJavaClassChooser(this, getSubjectHolder(), container, false);
+ new TableComposite(this, container);
+ new EntityNameComposite(this, container);
+ new AccessTypeComposite(this, buildAccessHolder(), container);
+ new IdClassComposite(this, buildIdClassReferenceHolder(), container);
+ new MetadataCompleteComposite(this, getSubjectHolder(), container);
+ }
+
+ protected PropertyValueModel<AccessHolder> buildAccessHolder() {
+ return new PropertyAspectAdapter<OrmEntity, AccessHolder>(getSubjectHolder()){
+ @Override
+ protected AccessHolder buildValue_() {
+ return this.subject.getPersistentType();
+ }
+ };
+ }
+
+ @Override
+ protected void initializeSecondaryTablesSection(Composite container) {
+ new OrmSecondaryTablesComposite(this, container);
+ }
+
+ @Override
+ protected void initializeInheritanceSection(Composite container) {
+ new OrmInheritanceComposite(this, container);
+ }
+} \ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/AbstractOrmXmlResourceUiDefinition.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/AbstractOrmXmlResourceUiDefinition.java
new file mode 100644
index 0000000000..db11562274
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/AbstractOrmXmlResourceUiDefinition.java
@@ -0,0 +1,174 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 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.ui.internal.details.orm;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.ListIterator;
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.utility.internal.Tools;
+import org.eclipse.jpt.common.utility.internal.iterators.ArrayIterator;
+import org.eclipse.jpt.common.utility.internal.iterators.ArrayListIterator;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.AttributeMapping;
+import org.eclipse.jpt.jpa.core.context.PersistentType;
+import org.eclipse.jpt.jpa.core.context.ReadOnlyPersistentAttribute;
+import org.eclipse.jpt.jpa.core.context.TypeMapping;
+import org.eclipse.jpt.jpa.ui.MappingResourceUiDefinition;
+import org.eclipse.jpt.jpa.ui.details.DefaultMappingUiDefinition;
+import org.eclipse.jpt.jpa.ui.details.JpaComposite;
+import org.eclipse.jpt.jpa.ui.details.MappingUiDefinition;
+import org.eclipse.jpt.jpa.ui.details.orm.OrmAttributeMappingUiDefinition;
+import org.eclipse.jpt.jpa.ui.details.orm.OrmTypeMappingUiDefinition;
+import org.eclipse.jpt.jpa.ui.details.orm.OrmXmlUiFactory;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * All the state in the definition should be "static" (i.e. unchanging once it is initialized).
+ */
+public abstract class AbstractOrmXmlResourceUiDefinition
+ implements MappingResourceUiDefinition
+{
+
+ private OrmTypeMappingUiDefinition<? extends TypeMapping>[] ormTypeMappingUiDefinitions;
+
+ private OrmAttributeMappingUiDefinition<? extends AttributeMapping>[] ormAttributeMappingUiDefinitions;
+
+ private final OrmXmlUiFactory factory;
+
+
+ /**
+ * zero-argument constructor
+ */
+ protected AbstractOrmXmlResourceUiDefinition() {
+ super();
+ this.factory = buildOrmXmlUiFactory();
+ }
+
+
+ protected abstract OrmXmlUiFactory buildOrmXmlUiFactory();
+
+ public OrmXmlUiFactory getFactory() {
+ return this.factory;
+ }
+
+
+ // ********** ORM type mappings **********
+
+ public JpaComposite buildTypeMappingComposite(String key, PropertyValueModel<TypeMapping> mappingHolder, Composite parent, WidgetFactory widgetFactory) {
+ OrmTypeMappingUiDefinition<TypeMapping> mappingUiDefinition =
+ (OrmTypeMappingUiDefinition<TypeMapping>) getOrmTypeMappingUiDefinition(key);
+ return mappingUiDefinition.buildTypeMappingComposite(
+ getFactory(),
+ mappingHolder,
+ parent,
+ widgetFactory
+ );
+ }
+
+ protected OrmTypeMappingUiDefinition<? extends TypeMapping> getOrmTypeMappingUiDefinition(String mappingKey) {
+ for (OrmTypeMappingUiDefinition<? extends TypeMapping> definition : getOrmTypeMappingUiDefinitions()) {
+ if (Tools.valuesAreEqual(definition.getKey(), mappingKey)) {
+ return definition;
+ }
+ }
+ throw new IllegalArgumentException("Illegal type mapping key: " + mappingKey); //$NON-NLS-1$
+ }
+
+ public Iterator<MappingUiDefinition<PersistentType, ? extends TypeMapping>>
+ typeMappingUiDefinitions() {
+
+ return new ArrayIterator<MappingUiDefinition<PersistentType, ? extends TypeMapping>>(
+ getOrmTypeMappingUiDefinitions());
+ }
+
+ protected synchronized OrmTypeMappingUiDefinition<? extends TypeMapping>[] getOrmTypeMappingUiDefinitions() {
+ if (this.ormTypeMappingUiDefinitions == null) {
+ this.ormTypeMappingUiDefinitions = this.buildOrmTypeMappingUiDefinitions();
+ }
+ return this.ormTypeMappingUiDefinitions;
+ }
+
+
+ /**
+ * Return an array of mapping definitions to use for types in mapping files of this type.
+ * The order is unimportant.
+ */
+ protected OrmTypeMappingUiDefinition<? extends TypeMapping>[] buildOrmTypeMappingUiDefinitions() {
+ ArrayList<OrmTypeMappingUiDefinition<? extends TypeMapping>> definitions = new ArrayList<OrmTypeMappingUiDefinition<? extends TypeMapping>>();
+ this.addOrmTypeMappingUiDefinitionsTo(definitions);
+ @SuppressWarnings("unchecked")
+ OrmTypeMappingUiDefinition<? extends TypeMapping>[] definitionArray = definitions.toArray(new OrmTypeMappingUiDefinition[definitions.size()]);
+ return definitionArray;
+ }
+
+ protected abstract void addOrmTypeMappingUiDefinitionsTo(
+ List<OrmTypeMappingUiDefinition<? extends TypeMapping>> definitions);
+
+ public DefaultMappingUiDefinition<PersistentType, ? extends TypeMapping> getDefaultTypeMappingUiDefinition() {
+ //there is no way to choose an type in the orm.xml that doesn't have a specified mapping so we can return null here
+ return null;
+ }
+
+ // ********** ORM attribute mappings **********
+
+ public JpaComposite buildAttributeMappingComposite(String key, PropertyValueModel<AttributeMapping> mappingHolder, Composite parent, WidgetFactory widgetFactory) {
+
+ OrmAttributeMappingUiDefinition<AttributeMapping> mappingUiDefinition =
+ (OrmAttributeMappingUiDefinition<AttributeMapping>) getOrmAttributeMappingUiDefinition(key);
+ return mappingUiDefinition.buildAttributeMappingComposite(
+ getFactory(),
+ mappingHolder,
+ parent,
+ widgetFactory
+ );
+ }
+
+ protected OrmAttributeMappingUiDefinition<? extends AttributeMapping> getOrmAttributeMappingUiDefinition(String mappingKey) {
+ for (OrmAttributeMappingUiDefinition<? extends AttributeMapping> definition : getOrmAttributeMappingUiDefinitions()) {
+ if (Tools.valuesAreEqual(definition.getKey(), mappingKey)) {
+ return definition;
+ }
+ }
+ return UnsupportedOrmMappingUiDefinition.instance();
+ }
+
+ public ListIterator<MappingUiDefinition<ReadOnlyPersistentAttribute, ? extends AttributeMapping>> attributeMappingUiDefinitions() {
+ return new ArrayListIterator<MappingUiDefinition<ReadOnlyPersistentAttribute, ? extends AttributeMapping>>(
+ getOrmAttributeMappingUiDefinitions());
+ }
+
+ protected synchronized OrmAttributeMappingUiDefinition<? extends AttributeMapping>[] getOrmAttributeMappingUiDefinitions() {
+ if (this.ormAttributeMappingUiDefinitions == null) {
+ this.ormAttributeMappingUiDefinitions = this.buildOrmAttributeMappingUiDefinitions();
+ }
+ return this.ormAttributeMappingUiDefinitions;
+ }
+
+ /**
+ * Return an array of mapping definitions to use for attributes in mapping files of this type.
+ * The order is unimportant.
+ */
+ protected OrmAttributeMappingUiDefinition<? extends AttributeMapping>[] buildOrmAttributeMappingUiDefinitions() {
+ ArrayList<OrmAttributeMappingUiDefinition<? extends AttributeMapping>> definitions = new ArrayList<OrmAttributeMappingUiDefinition<? extends AttributeMapping>>();
+ this.addOrmAttributeMappingUiDefinitionsTo(definitions);
+ @SuppressWarnings("unchecked")
+ OrmAttributeMappingUiDefinition<? extends AttributeMapping>[] definitionArray = definitions.toArray(new OrmAttributeMappingUiDefinition[definitions.size()]);
+ return definitionArray;
+ }
+
+ protected abstract void addOrmAttributeMappingUiDefinitionsTo(
+ List<OrmAttributeMappingUiDefinition<? extends AttributeMapping>> definitions);
+
+ public DefaultMappingUiDefinition<ReadOnlyPersistentAttribute, ? extends AttributeMapping> getDefaultAttributeMappingUiDefinition(String key) {
+ return null;
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/AddGeneratorDialog.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/AddGeneratorDialog.java
new file mode 100644
index 0000000000..25619e5913
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/AddGeneratorDialog.java
@@ -0,0 +1,194 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2010 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.ui.internal.details.orm;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.jpt.common.ui.internal.widgets.DialogPane;
+import org.eclipse.jpt.common.ui.internal.widgets.ValidatingDialog;
+import org.eclipse.jpt.common.utility.internal.StringConverter;
+import org.eclipse.jpt.common.utility.internal.model.value.PropertyAspectAdapter;
+import org.eclipse.jpt.common.utility.internal.model.value.StaticListValueModel;
+import org.eclipse.jpt.common.utility.model.value.ListValueModel;
+import org.eclipse.jpt.common.utility.model.value.WritablePropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.persistence.PersistenceUnit;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Text;
+
+/**
+ * Clients can use this dialog to prompt the user for SecondaryTable settings.
+ * Use the following once the dialog is closed:
+ * @see #getSelectedTable()
+ * @see #getSelectedCatalog()
+ * @see #getSelectedSchema()
+ * @version 2.1
+ * @since 2.1
+ */
+public class AddGeneratorDialog extends ValidatingDialog<AddGeneratorStateObject> {
+ public static final String SEQUENCE_GENERATOR = "sequenceGenerator"; //$NON-NLS-1$
+ public static final String TABLE_GENERATOR = "tableGenerator"; //$NON-NLS-1$
+
+ /**
+ * The associated persistence unit
+ */
+ private PersistenceUnit pUnit;
+
+ // ********** constructors **********
+
+ /**
+ * Use this constructor to edit an existing conversion value
+ */
+ public AddGeneratorDialog(Shell parent, PersistenceUnit pUnit) {
+ super(parent);
+ this.pUnit = pUnit;
+ }
+
+ @Override
+ protected AddGeneratorStateObject buildStateObject() {
+ return new AddGeneratorStateObject(this.pUnit);
+ }
+
+ // ********** open **********
+
+ @Override
+ protected void configureShell(Shell shell) {
+ super.configureShell(shell);
+ shell.setText(this.getTitle());
+ }
+
+ @Override
+ protected String getTitle() {
+ return JptUiDetailsOrmMessages.AddGeneratorDialog_title;
+ }
+
+ @Override
+ protected String getDescriptionTitle() {
+ return JptUiDetailsOrmMessages.AddGeneratorDialog_descriptionTitle;
+ }
+
+ @Override
+ protected String getDescription() {
+ return JptUiDetailsOrmMessages.AddGeneratorDialog_description;
+ }
+
+ @Override
+ protected DialogPane<AddGeneratorStateObject> buildLayout(Composite container) {
+ return new GeneratorDialogPane(container);
+ }
+
+ @Override
+ public void create() {
+ super.create();
+
+ GeneratorDialogPane pane = (GeneratorDialogPane) getPane();
+ pane.selectAll();
+
+ getButton(OK).setEnabled(false);
+ }
+
+
+ // ********** public API **********
+
+ /**
+ * Return the data value set in the text widget.
+ */
+ public String getName() {
+ return getSubject().getName();
+ }
+
+ /**
+ * Return the object value set in the text widget.
+ */
+ public String getGeneratorType() {
+ return getSubject().getGeneratorType();
+ }
+
+ private class GeneratorDialogPane extends DialogPane<AddGeneratorStateObject> {
+
+ private Text nameText;
+
+ GeneratorDialogPane(Composite parent) {
+ super(AddGeneratorDialog.this.getSubjectHolder(), parent);
+ }
+
+ @Override
+ protected void initializeLayout(Composite container) {
+ this.nameText = addLabeledText(
+ container,
+ JptUiDetailsOrmMessages.AddGeneratorDialog_name,
+ buildNameHolder()
+ );
+
+ addLabeledCombo(
+ container,
+ JptUiDetailsOrmMessages.AddGeneratorDialog_generatorType,
+ buildGeneratorTypeListHolder(),
+ buildGeneratorTypeHolder(),
+ buildStringConverter(),
+ null);
+ }
+
+ protected ListValueModel<String> buildGeneratorTypeListHolder() {
+ List<String> generatorTypes = new ArrayList<String>();
+ generatorTypes.add(TABLE_GENERATOR);
+ generatorTypes.add(SEQUENCE_GENERATOR);
+
+ return new StaticListValueModel<String>(generatorTypes);
+ }
+
+ private StringConverter<String> buildStringConverter() {
+ return new StringConverter<String>() {
+ public String convertToString(String value) {
+ if (value == TABLE_GENERATOR) {
+ return JptUiDetailsOrmMessages.AddGeneratorDialog_tableGenerator;
+ }
+ if (value == SEQUENCE_GENERATOR) {
+ return JptUiDetailsOrmMessages.AddGeneratorDialog_sequenceGenerator;
+ }
+ return value;
+ }
+ };
+ }
+
+ private WritablePropertyValueModel<String> buildNameHolder() {
+ return new PropertyAspectAdapter<AddGeneratorStateObject, String>(getSubjectHolder(), AddGeneratorStateObject.NAME_PROPERTY) {
+ @Override
+ protected String buildValue_() {
+ return this.subject.getName();
+ }
+
+ @Override
+ protected void setValue_(String value) {
+ this.subject.setName(value);
+ }
+ };
+ }
+
+ private WritablePropertyValueModel<String> buildGeneratorTypeHolder() {
+ return new PropertyAspectAdapter<AddGeneratorStateObject, String>(getSubjectHolder(), AddGeneratorStateObject.GENERATOR_TYPE_PROPERTY) {
+ @Override
+ protected String buildValue_() {
+ return this.subject.getGeneratorType();
+ }
+
+ @Override
+ protected void setValue_(String value) {
+ this.subject.setGeneratorType(value);
+ }
+ };
+ }
+
+ void selectAll() {
+ this.nameText.selectAll();
+ }
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/AddGeneratorStateObject.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/AddGeneratorStateObject.java
new file mode 100644
index 0000000000..31b092782d
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/AddGeneratorStateObject.java
@@ -0,0 +1,146 @@
+/*******************************************************************************
+ * Copyright (c) 2009 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.ui.internal.details.orm;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import org.eclipse.jface.dialogs.IMessageProvider;
+import org.eclipse.jpt.common.utility.internal.StringTools;
+import org.eclipse.jpt.common.utility.internal.node.AbstractNode;
+import org.eclipse.jpt.common.utility.internal.node.Node;
+import org.eclipse.jpt.common.utility.internal.node.Problem;
+import org.eclipse.jpt.jpa.core.context.Generator;
+import org.eclipse.jpt.jpa.core.context.persistence.PersistenceUnit;
+
+/**
+ * This is the state object used by the <code>AddGeneratorDialog</code>, which stores
+ * the current name and validates it when it is modified.
+ *
+ * @see AddGeneratorDialog
+ *
+ * @version 2.1
+ * @since 2.1
+ */
+final class AddGeneratorStateObject extends AbstractNode
+{
+ /**
+ * The initial name or <code>null</code>
+ */
+ private String name;
+
+ /**
+ * The initial generatorType or <code>null</code>
+ */
+ private String generatorType;
+
+ /**
+ * The <code>Validator</code> used to validate this state object.
+ */
+ private Validator validator;
+
+ /**
+ * The associated persistence unit
+ */
+ private PersistenceUnit pUnit;
+
+ /**
+ * Notifies a change in the data value property.
+ */
+ static final String NAME_PROPERTY = "nameProperty"; //$NON-NLS-1$
+
+ /**
+ * Notifies a change in the generator type property.
+ */
+ static final String GENERATOR_TYPE_PROPERTY = "generatorTypeProperty"; //$NON-NLS-1$
+
+ /**
+ * Creates a new <code>NewNameStateObject</code>.
+ *
+ * @param name The initial input or <code>null</code> if no initial value can
+ * be specified
+ * @param names The collection of names that can't be used or an empty
+ * collection if none are available
+ */
+ AddGeneratorStateObject(PersistenceUnit pUnit) {
+ super(null);
+ this.pUnit = pUnit;
+ }
+
+ private void addNameProblemsTo(List<Problem> currentProblems) {
+ if (StringTools.stringIsEmpty(this.name)) {
+ currentProblems.add(buildProblem(JptUiDetailsOrmMessages.GeneratorStateObject_nameMustBeSpecified, IMessageProvider.ERROR));
+ }
+ else if (names().contains(this.name)){
+ currentProblems.add(buildProblem(JptUiDetailsOrmMessages.GeneratorStateObject_nameExists, IMessageProvider.WARNING));
+ }
+ }
+
+ private void addGeneratorTypeProblemsTo(List<Problem> currentProblems) {
+ if (StringTools.stringIsEmpty(this.generatorType)) {
+ currentProblems.add(buildProblem(JptUiDetailsOrmMessages.GeneratorStateObject_typeMustBeSpecified, IMessageProvider.ERROR));
+ }
+ }
+
+ @Override
+ protected void addProblemsTo(List<Problem> currentProblems) {
+ super.addProblemsTo(currentProblems);
+ addNameProblemsTo(currentProblems);
+ addGeneratorTypeProblemsTo(currentProblems);
+ }
+
+ private List<String> names() {
+ List<String> names = new ArrayList<String>();
+ for (Iterator<Generator> generators = this.pUnit.generators(); generators.hasNext();){
+ String name = generators.next().getName();
+ names.add(name);
+ }
+ return names;
+ }
+
+ @Override
+ protected void checkParent(Node parentNode) {
+ //no parent
+ }
+
+ public String displayString() {
+ return null;
+ }
+
+ String getName() {
+ return this.name;
+ }
+
+ String getGeneratorType() {
+ return this.generatorType;
+ }
+
+ public void setName(String newName) {
+ String oldName = this.name;
+ this.name = newName;
+ firePropertyChanged(NAME_PROPERTY, oldName, newName);
+ }
+
+ public void setGeneratorType(String newGeneratorType) {
+ String old = this.generatorType;
+ this.generatorType = newGeneratorType;
+ firePropertyChanged(GENERATOR_TYPE_PROPERTY, old, newGeneratorType);
+ }
+
+ @Override
+ public void setValidator(Validator validator) {
+ this.validator = validator;
+ }
+
+ @Override
+ public Validator getValidator() {
+ return this.validator;
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/BaseOrmXmlUiFactory.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/BaseOrmXmlUiFactory.java
new file mode 100644
index 0000000000..d44d8d6e49
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/BaseOrmXmlUiFactory.java
@@ -0,0 +1,134 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2010 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.ui.internal.details.orm;
+
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.orm.OrmBasicMapping;
+import org.eclipse.jpt.jpa.core.context.orm.OrmEmbeddable;
+import org.eclipse.jpt.jpa.core.context.orm.OrmEmbeddedIdMapping;
+import org.eclipse.jpt.jpa.core.context.orm.OrmEmbeddedMapping;
+import org.eclipse.jpt.jpa.core.context.orm.OrmEntity;
+import org.eclipse.jpt.jpa.core.context.orm.OrmIdMapping;
+import org.eclipse.jpt.jpa.core.context.orm.OrmManyToManyMapping;
+import org.eclipse.jpt.jpa.core.context.orm.OrmManyToOneMapping;
+import org.eclipse.jpt.jpa.core.context.orm.OrmMappedSuperclass;
+import org.eclipse.jpt.jpa.core.context.orm.OrmOneToManyMapping;
+import org.eclipse.jpt.jpa.core.context.orm.OrmOneToOneMapping;
+import org.eclipse.jpt.jpa.core.context.orm.OrmTransientMapping;
+import org.eclipse.jpt.jpa.core.context.orm.OrmVersionMapping;
+import org.eclipse.jpt.jpa.ui.details.JpaComposite;
+import org.eclipse.jpt.jpa.ui.details.orm.OrmXmlUiFactory;
+import org.eclipse.jpt.jpa.ui.internal.details.TransientMappingComposite;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * The default implementation of the Orm Xml UI factory required to show the information
+ * related to a JPA mapping (type or attribute).
+ */
+public abstract class BaseOrmXmlUiFactory implements OrmXmlUiFactory
+{
+
+ // **************** orm type mapping composites ****************************
+
+ public JpaComposite createOrmMappedSuperclassComposite(
+ PropertyValueModel<OrmMappedSuperclass> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+ return new OrmMappedSuperclassComposite(subjectHolder, parent, widgetFactory);
+ }
+
+ public JpaComposite createOrmEntityComposite(
+ PropertyValueModel<OrmEntity> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+ return new OrmEntityComposite(subjectHolder, parent, widgetFactory);
+ }
+
+ public JpaComposite createOrmEmbeddableComposite(
+ PropertyValueModel<OrmEmbeddable> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+ return new OrmEmbeddableComposite(subjectHolder, parent, widgetFactory);
+ }
+
+
+ // **************** orm attribute mapping composites ***********************
+
+ public JpaComposite createOrmIdMappingComposite(
+ PropertyValueModel<OrmIdMapping> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+ return new OrmIdMappingComposite(subjectHolder, parent, widgetFactory);
+ }
+
+ public JpaComposite createOrmEmbeddedIdMappingComposite(
+ PropertyValueModel<OrmEmbeddedIdMapping> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+ return new OrmEmbeddedIdMappingComposite(subjectHolder, parent, widgetFactory);
+ }
+
+ public JpaComposite createOrmBasicMappingComposite(
+ PropertyValueModel<OrmBasicMapping> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+ return new OrmBasicMappingComposite(subjectHolder, parent, widgetFactory);
+ }
+
+ public JpaComposite createOrmVersionMappingComposite(
+ PropertyValueModel<OrmVersionMapping> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+ return new OrmVersionMappingComposite(subjectHolder, parent, widgetFactory);
+ }
+
+ public JpaComposite createOrmManyToOneMappingComposite(
+ PropertyValueModel<OrmManyToOneMapping> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+ return new OrmManyToOneMappingComposite(subjectHolder, parent, widgetFactory);
+ }
+
+ public JpaComposite createOrmOneToManyMappingComposite(
+ PropertyValueModel<OrmOneToManyMapping> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+ return new OrmOneToManyMappingComposite(subjectHolder, parent, widgetFactory);
+ }
+
+ public JpaComposite createOrmOneToOneMappingComposite(
+ PropertyValueModel<OrmOneToOneMapping> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+ return new OrmOneToOneMappingComposite(subjectHolder, parent, widgetFactory);
+ }
+
+ public JpaComposite createOrmManyToManyMappingComposite(
+ PropertyValueModel<OrmManyToManyMapping> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+ return new OrmManyToManyMappingComposite(subjectHolder, parent, widgetFactory);
+ }
+
+ public JpaComposite createOrmEmbeddedMappingComposite(
+ PropertyValueModel<OrmEmbeddedMapping> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+ return new OrmEmbeddedMappingComposite(subjectHolder, parent, widgetFactory);
+ }
+
+ public JpaComposite createOrmTransientMappingComposite(
+ PropertyValueModel<OrmTransientMapping> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+ return new TransientMappingComposite(subjectHolder, parent, widgetFactory);
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/EntityMappingsDetailsPage.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/EntityMappingsDetailsPage.java
new file mode 100644
index 0000000000..0c9ec4c6df
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/EntityMappingsDetailsPage.java
@@ -0,0 +1,82 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2009 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.ui.internal.details.orm;
+
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.ui.internal.widgets.EnumFormComboViewer;
+import org.eclipse.jpt.jpa.core.context.orm.EntityMappings;
+import org.eclipse.jpt.jpa.ui.internal.details.db.CatalogCombo;
+import org.eclipse.jpt.jpa.ui.internal.details.db.SchemaCombo;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * Here the layout of this pane:
+ * <pre>
+ * -----------------------------------------------------------------------------
+ * | ------------------------------------------------------------------------- |
+ * | | | |
+ * | | XmlPackageChooser | |
+ * | | | |
+ * | ------------------------------------------------------------------------- |
+ * | ------------------------------------------------------------ |
+ * | Schema: | SchemaCombo | |
+ * | ------------------------------------------------------------ |
+ * | ------------------------------------------------------------ |
+ * | Catalog: | CatalogCombo | |
+ * | ------------------------------------------------------------ |
+ * | ------------------------------------------------------------ |
+ * | Access Type: | |v| |
+ * | ------------------------------------------------------------ |
+ * | |
+ * | ------------------------------------------------------------------------- |
+ * | | | |
+ * | | PersistenceUnitMetadataComposite | |
+ * | | | |
+ * | ------------------------------------------------------------------------- |
+ * | ------------------------------------------------------------------------- |
+ * | | | |
+ * | | OrmGeneratorsComposite | |
+ * | | | |
+ * | ------------------------------------------------------------------------- |
+ * | ------------------------------------------------------------------------- |
+ * | | | |
+ * | | OrmQueriesComposite | |
+ * | | | |
+ * | ------------------------------------------------------------------------- |
+ * -----------------------------------------------------------------------------</pre>
+ *
+ * @see EntityMappings
+ * @see EntityMappingsDetailsPage - The parent container
+ * @see CatalogCombo
+ * @see EnumFormComboViewer
+ * @see EntityMappingsGeneratorsComposite
+ * @see OrmPackageChooser
+ * @see OrmQueriesComposite
+ * @see PersistenceUnitMetadataComposite
+ * @see SchemaCombo
+ *
+ * @version 2.2
+ * @since 2.0
+ */
+public class EntityMappingsDetailsPage extends AbstractEntityMappingsDetailsPage
+{
+ /**
+ * Creates a new <code>EntityMappingsDetailsPage</code>.
+ *
+ * @param parent The parent container
+ * @param widgetFactory The factory used to create various common widgets
+ */
+ public EntityMappingsDetailsPage(Composite parent,
+ WidgetFactory widgetFactory) {
+
+ super(parent, widgetFactory);
+ }
+
+} \ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/EntityMappingsDetailsProvider.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/EntityMappingsDetailsProvider.java
new file mode 100644
index 0000000000..0d9435573c
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/EntityMappingsDetailsProvider.java
@@ -0,0 +1,60 @@
+/*******************************************************************************
+ * Copyright (c) 2009 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.ui.internal.details.orm;
+
+import org.eclipse.jpt.common.core.JptResourceType;
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.jpa.core.JptJpaCorePlugin;
+import org.eclipse.jpt.jpa.core.context.orm.EntityMappings;
+import org.eclipse.jpt.jpa.ui.details.JpaDetailsPage;
+import org.eclipse.jpt.jpa.ui.details.JpaDetailsProvider;
+import org.eclipse.jpt.jpa.ui.internal.details.AbstractEntityMappingsDetailsProvider;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * This provider is responsible for creating the {@link JpaDetailsPage}
+ * when the information comes from the XML file (either from the persistence
+ * configuration or from the Mappings Descriptor).
+ */
+public class EntityMappingsDetailsProvider
+ extends AbstractEntityMappingsDetailsProvider
+{
+ // singleton
+ private static final JpaDetailsProvider INSTANCE = new EntityMappingsDetailsProvider();
+
+
+ /**
+ * Return the singleton
+ */
+ public static JpaDetailsProvider instance() {
+ return INSTANCE;
+ }
+
+
+ /**
+ * Enforce singleton usage
+ */
+ private EntityMappingsDetailsProvider() {
+ super();
+ }
+
+
+ @Override
+ protected boolean providesDetails(JptResourceType resourceType) {
+ return resourceType.equals(JptJpaCorePlugin.ORM_XML_1_0_RESOURCE_TYPE);
+ }
+
+ public JpaDetailsPage<EntityMappings> buildDetailsPage(
+ Composite parent,
+ WidgetFactory widgetFactory) {
+
+ return new EntityMappingsDetailsPage(parent, widgetFactory);
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/EntityMappingsGeneratorsComposite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/EntityMappingsGeneratorsComposite.java
new file mode 100644
index 0000000000..0519124a20
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/EntityMappingsGeneratorsComposite.java
@@ -0,0 +1,371 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 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.ui.internal.details.orm;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.window.Window;
+import org.eclipse.jpt.common.ui.internal.util.ControlSwitcher;
+import org.eclipse.jpt.common.ui.internal.util.PaneEnabler;
+import org.eclipse.jpt.common.ui.internal.widgets.AddRemoveListPane;
+import org.eclipse.jpt.common.ui.internal.widgets.Pane;
+import org.eclipse.jpt.common.ui.internal.widgets.AddRemovePane.Adapter;
+import org.eclipse.jpt.common.utility.internal.CollectionTools;
+import org.eclipse.jpt.common.utility.internal.Transformer;
+import org.eclipse.jpt.common.utility.internal.iterables.ListIterable;
+import org.eclipse.jpt.common.utility.internal.model.value.CompositeListValueModel;
+import org.eclipse.jpt.common.utility.internal.model.value.ItemPropertyListValueModelAdapter;
+import org.eclipse.jpt.common.utility.internal.model.value.ListAspectAdapter;
+import org.eclipse.jpt.common.utility.internal.model.value.SimplePropertyValueModel;
+import org.eclipse.jpt.common.utility.internal.model.value.TransformationPropertyValueModel;
+import org.eclipse.jpt.common.utility.internal.model.value.swing.ObjectListSelectionModel;
+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.core.context.JpaNamedContextNode;
+import org.eclipse.jpt.jpa.core.context.SequenceGenerator;
+import org.eclipse.jpt.jpa.core.context.TableGenerator;
+import org.eclipse.jpt.jpa.core.context.orm.EntityMappings;
+import org.eclipse.jpt.jpa.core.context.orm.OrmGenerator;
+import org.eclipse.jpt.jpa.core.context.orm.OrmSequenceGenerator;
+import org.eclipse.jpt.jpa.core.context.orm.OrmTableGenerator;
+import org.eclipse.jpt.jpa.ui.internal.details.GeneratorComposite;
+import org.eclipse.jpt.jpa.ui.internal.details.SequenceGeneratorComposite;
+import org.eclipse.jpt.jpa.ui.internal.details.TableGeneratorComposite;
+import org.eclipse.jpt.jpa.ui.internal.details.GeneratorComposite.GeneratorBuilder;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.ui.part.PageBook;
+
+/**
+ * This pane shows the list of named queries and named native queries.
+ * <p>
+ * Here the layout of this pane:
+ * <pre>
+ * -----------------------------------------------------------------------------
+ * | ------------------------------------------------------------------------- |
+ * | | | |
+ * | | AddRemoveListPane | |
+ * | | | |
+ * | ------------------------------------------------------------------------- |
+ * | ------------------------------------------------------------------------- |
+ * | | | |
+ * | | OrmSequenceGeneratorComposite or OrmTableGeneratorComposite | |
+ * | | | |
+ * | ------------------------------------------------------------------------- |
+ * -----------------------------------------------------------------------------</pre>
+ *
+ * @see EntityMappings
+ * @see OrmGenerator
+ * @see OrmSequenceGenerator
+ * @see OrmTableGenerator
+ * @see EntityComposite - The parent container
+ * @see OrmSequenceGeneratorComposite
+ * @see OrmTableGeneratorComposite
+ *
+ * @version 2.2
+ * @since 2.0
+ */
+public class EntityMappingsGeneratorsComposite extends Pane<EntityMappings>
+{
+ private WritablePropertyValueModel<OrmGenerator> generatorHolder;
+ GeneratorComposite<SequenceGenerator> sequenceGeneratorPane;
+ TableGeneratorComposite tableGeneratorPane;
+ private AddRemoveListPane<EntityMappings> listPane;
+
+ /**
+ * Creates a new <code>EntityMappingsGeneratorsComposite</code>.
+ *
+ * @param parentPane The parent container of this one
+ * @param parent The parent container
+ */
+ public EntityMappingsGeneratorsComposite(
+ Pane<? extends EntityMappings> parentPane,
+ Composite parent) {
+
+ super(parentPane, parent, false);
+ }
+
+ void addGenerator(ObjectListSelectionModel listSelectionModel) {
+ addGeneratorFromDialog(listSelectionModel, buildAddGeneratorDialog());
+ }
+
+ protected AddGeneratorDialog buildAddGeneratorDialog() {
+ return new AddGeneratorDialog(getShell(), this.getSubject().getPersistenceUnit());
+ }
+
+ protected void addGeneratorFromDialog(ObjectListSelectionModel listSelectionModel, AddGeneratorDialog dialog) {
+ if (dialog.open() != Window.OK) {
+ return;
+ }
+ String generatorType = dialog.getGeneratorType();
+ OrmGenerator generator;
+ if (generatorType == AddGeneratorDialog.TABLE_GENERATOR) {
+ generator = this.getSubject().addTableGenerator();
+ }
+ else if (generatorType == AddGeneratorDialog.SEQUENCE_GENERATOR) {
+ generator = this.getSubject().addSequenceGenerator();
+ }
+ else {
+ throw new IllegalArgumentException();
+ }
+ generator.setName(dialog.getName());
+ this.generatorHolder.setValue(generator);//so that it gets selected in the List for the user to edit
+ listSelectionModel.setSelectedValue(generator);
+ }
+
+ private ListValueModel<OrmGenerator> buildDisplayableGeneratorListHolder() {
+ return new ItemPropertyListValueModelAdapter<OrmGenerator>(
+ buildGeneratorsListHolder(),
+ JpaNamedContextNode.NAME_PROPERTY
+ );
+ }
+
+ private Adapter buildGeneratorAdapter() {
+
+ return new AddRemoveListPane.AbstractAdapter() {
+
+ public void addNewItem(ObjectListSelectionModel listSelectionModel) {
+ addGenerator(listSelectionModel);
+ }
+
+
+ public void removeSelectedItems(ObjectListSelectionModel listSelectionModel) {
+ for (Object item : listSelectionModel.selectedValues()) {
+ if (item instanceof OrmSequenceGenerator) {
+ getSubject().removeSequenceGenerator((OrmSequenceGenerator) item);
+ }
+ else {
+ getSubject().removeTableGenerator((OrmTableGenerator) item);
+ }
+ }
+ }
+ };
+ }
+
+ private WritablePropertyValueModel<OrmGenerator> buildGeneratorHolder() {
+ return new SimplePropertyValueModel<OrmGenerator>();
+ }
+
+ private ILabelProvider buildGeneratorLabelProvider() {
+ return new LabelProvider() {
+ @Override
+ public String getText(Object element) {
+ OrmGenerator generator = (OrmGenerator) element;
+ String name = generator.getName();
+
+ if (name == null) {
+ int index = -1;
+
+ if (generator instanceof OrmSequenceGenerator) {
+ index = CollectionTools.indexOf(getSubject().getSequenceGenerators(), generator);
+ }
+ else {
+ index = CollectionTools.indexOf(getSubject().getTableGenerators(), generator);
+ }
+
+ name = NLS.bind(JptUiDetailsOrmMessages.OrmGeneratorsComposite_displayString, Integer.valueOf(index));
+ }
+
+ return name;
+ }
+ };
+ }
+
+ private ListValueModel<OrmGenerator> buildGeneratorsListHolder() {
+ List<ListValueModel<? extends OrmGenerator>> list = new ArrayList<ListValueModel<? extends OrmGenerator>>();
+ list.add(buildSequenceGeneratorListHolder());
+ list.add(buildTableGeneratorListHolder());
+ return new CompositeListValueModel<ListValueModel<? extends OrmGenerator>, OrmGenerator>(list);
+ }
+
+ private PropertyValueModel<Boolean> buildPaneEnablerHolder() {
+ return new TransformationPropertyValueModel<EntityMappings, Boolean>(getSubjectHolder()) {
+ @Override
+ protected Boolean transform(EntityMappings value) {
+ return Boolean.valueOf(value != null);
+ }
+ };
+ }
+
+ private Transformer<OrmGenerator, Control> buildPaneTransformer() {
+ return new Transformer<OrmGenerator, Control>() {
+ public Control transform(OrmGenerator generator) {
+
+ if (generator == null) {
+ return null;
+ }
+
+ if (generator instanceof OrmSequenceGenerator) {
+ return EntityMappingsGeneratorsComposite.this.sequenceGeneratorPane.getControl();
+ }
+
+ return EntityMappingsGeneratorsComposite.this.tableGeneratorPane.getControl();
+ }
+ };
+ }
+
+ private PropertyValueModel<SequenceGenerator> buildSequenceGeneratorHolder() {
+ return new TransformationPropertyValueModel<OrmGenerator, SequenceGenerator>(this.generatorHolder) {
+ @Override
+ protected SequenceGenerator transform_(OrmGenerator value) {
+ return (value instanceof SequenceGenerator) ? (SequenceGenerator) value : null;
+ }
+ };
+ }
+
+ private ListValueModel<OrmSequenceGenerator> buildSequenceGeneratorListHolder() {
+ return new ListAspectAdapter<EntityMappings, OrmSequenceGenerator>(
+ getSubjectHolder(),
+ EntityMappings.SEQUENCE_GENERATORS_LIST)
+ {
+ @Override
+ protected ListIterable<OrmSequenceGenerator> getListIterable() {
+ return this.subject.getSequenceGenerators();
+ }
+ @Override
+ protected int size_() {
+ return this.subject.getSequenceGeneratorsSize();
+ }
+ };
+ }
+
+ private PropertyValueModel<TableGenerator> buildTableGeneratorHolder() {
+ return new TransformationPropertyValueModel<OrmGenerator, TableGenerator>(this.generatorHolder) {
+ @Override
+ protected TableGenerator transform_(OrmGenerator value) {
+ return (value instanceof TableGenerator) ? (TableGenerator) value : null;
+ }
+ };
+ }
+
+ private ListValueModel<OrmTableGenerator> buildTableGeneratorListHolder() {
+ return new ListAspectAdapter<EntityMappings, OrmTableGenerator>(
+ getSubjectHolder(),
+ EntityMappings.TABLE_GENERATORS_LIST)
+ {
+ @Override
+ protected ListIterable<OrmTableGenerator> getListIterable() {
+ return this.subject.getTableGenerators();
+ }
+ @Override
+ protected int size_() {
+ return this.subject.getTableGeneratorsSize();
+ }
+ };
+ }
+
+
+ @Override
+ protected void initialize() {
+ super.initialize();
+ this.generatorHolder = buildGeneratorHolder();
+ }
+
+ @Override
+ protected void initializeLayout(Composite container) {
+
+ container = addCollapsibleSection(
+ container,
+ JptUiDetailsOrmMessages.OrmGeneratorsComposite_groupBox
+ );
+
+ // List pane
+ this.listPane = addListPane(container);
+ this.installPaneEnabler();
+
+ // Property pane
+ PropertyValueModel<SequenceGenerator> sequenceGeneratorHolder =
+ this.buildSequenceGeneratorHolder();
+ PropertyValueModel<TableGenerator> tableGeneratorHolder =
+ this.buildTableGeneratorHolder();
+
+ PageBook pageBook = new PageBook(container, SWT.NULL);
+ pageBook.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+ // Sequence Generator property pane
+ this.sequenceGeneratorPane = this.buildSequenceGeneratorComposite(
+ pageBook,
+ sequenceGeneratorHolder,
+ this.buildSequenceGeneratorBuilder()
+ );
+
+ // Table Generator property pane
+ this.tableGeneratorPane = new TableGeneratorComposite(
+ this,
+ tableGeneratorHolder,
+ pageBook,
+ this.buildTableGeneratorBuilder()
+ );
+
+ this.addAlignRight(this.sequenceGeneratorPane);
+ this.addAlignRight(this.tableGeneratorPane);
+ this.installPaneSwitcher(pageBook);
+ }
+
+ protected GeneratorComposite<SequenceGenerator> buildSequenceGeneratorComposite(
+ Composite parent,
+ PropertyValueModel<SequenceGenerator> sequenceGeneratorHolder,
+ GeneratorBuilder<SequenceGenerator> generatorBuilder) {
+
+ return new SequenceGeneratorComposite(
+ this,
+ sequenceGeneratorHolder,
+ parent,
+ generatorBuilder
+ );
+ }
+
+ private AddRemoveListPane<EntityMappings> addListPane(Composite container) {
+
+ return new AddRemoveListPane<EntityMappings>(
+ this,
+ container,
+ this.buildGeneratorAdapter(),
+ this.buildDisplayableGeneratorListHolder(),
+ this.generatorHolder,
+ this.buildGeneratorLabelProvider()
+ );
+ }
+
+ private void installPaneEnabler() {
+ new PaneEnabler(
+ this.buildPaneEnablerHolder(),
+ this.listPane
+ );
+ }
+
+ private void installPaneSwitcher(PageBook pageBook) {
+ new ControlSwitcher(this.generatorHolder, this.buildPaneTransformer(), pageBook);
+ }
+
+ private GeneratorBuilder<SequenceGenerator> buildSequenceGeneratorBuilder() {
+ return new GeneratorBuilder<SequenceGenerator>() {
+ public SequenceGenerator addGenerator() {
+ throw new UnsupportedOperationException("The sequence generator will never be null so we do not need to implement this"); //$NON-NLS-1$
+ }
+ };
+ }
+
+ private GeneratorBuilder<TableGenerator> buildTableGeneratorBuilder() {
+ return new GeneratorBuilder<TableGenerator>() {
+ public TableGenerator addGenerator() {
+ throw new UnsupportedOperationException("The table generator will never be null so we do not need to implement this"); //$NON-NLS-1$
+ }
+ };
+ }
+
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/GenericOrmXmlUiFactory.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/GenericOrmXmlUiFactory.java
new file mode 100644
index 0000000000..5ea741c22d
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/GenericOrmXmlUiFactory.java
@@ -0,0 +1,15 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 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.ui.internal.details.orm;
+
+public class GenericOrmXmlUiFactory extends BaseOrmXmlUiFactory
+{
+ //nothing
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/JptUiDetailsOrmMessages.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/JptUiDetailsOrmMessages.java
new file mode 100644
index 0000000000..e2db1608ce
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/JptUiDetailsOrmMessages.java
@@ -0,0 +1,76 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2010 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.ui.internal.details.orm;
+
+import org.eclipse.osgi.util.NLS;
+
+/**
+ * Localized messages used by Dali ORM widgets.
+ *
+ * @version 2.2
+ * @since 1.0
+ */
+public class JptUiDetailsOrmMessages {
+
+ public static String EntityMappingsSection_title;
+ public static String EntityMappingsDetailsPage_access;
+ public static String EntityMappingsDetailsPage_catalog;
+ public static String EntityMappingsDetailsPage_field;
+ public static String EntityMappingsDetailsPage_package;
+ public static String EntityMappingsDetailsPage_property;
+ public static String EntityMappingsDetailsPage_schema;
+ public static String EntityMappingsPage_catalogDefault;
+ public static String EntityMappingsPage_catalogNoDefaultSpecified;
+ public static String EntityMappingsPage_schemaDefault;
+ public static String EntityMappingsPage_schemaNoDefaultSpecified;
+ public static String MetadataCompleteComposite_metadataComplete;
+ public static String MetadataCompleteComposite_metadataCompleteWithDefault;
+ public static String OrmGeneratorsComposite_displayString;
+ public static String OrmGeneratorsComposite_groupBox;
+ public static String OrmMappingNameChooser_name;
+ public static String OrmJavaClassChooser_javaClass;
+ public static String OrmQueriesComposite_groupBox;
+ public static String PersistenceUnitMetadataComposite_access;
+ public static String PersistenceUnitMetadataComposite_delimitedIdentifiersCheckBox;
+ public static String PersistenceUnitMetadataComposite_cascadePersistCheckBox;
+ public static String PersistenceUnitMetadataComposite_catalog;
+ public static String PersistenceUnitMetadataComposite_field;
+ public static String PersistenceUnitMetadataComposite_persistenceUnitSection;
+ public static String PersistenceUnitMetadataComposite_property;
+ public static String PersistenceUnitMetadataComposite_schema;
+ public static String PersistenceUnitMetadataComposite_xmlMappingMetadataCompleteCheckBox;
+ public static String PersistenceUnitMetadataSection_catalogDefault;
+ public static String PersistenceUnitMetadataSection_schemaDefault;
+
+ public static String AddGeneratorDialog_name;
+ public static String AddGeneratorDialog_generatorType;
+ public static String AddGeneratorDialog_title;
+ public static String AddGeneratorDialog_descriptionTitle;
+ public static String AddGeneratorDialog_description;
+ public static String AddGeneratorDialog_tableGenerator;
+ public static String AddGeneratorDialog_sequenceGenerator;
+ public static String GeneratorStateObject_nameExists;
+ public static String GeneratorStateObject_nameMustBeSpecified;
+ public static String GeneratorStateObject_typeMustBeSpecified;
+
+ public static String UnsupportedOrmMappingUiProvider_label;
+ public static String UnsupportedOrmMappingUiProvider_linkLabel;
+
+ private static final String BUNDLE_NAME = "jpt_ui_details_orm"; //$NON-NLS-1$
+ private static final Class<?> BUNDLE_CLASS = JptUiDetailsOrmMessages.class;
+ static {
+ NLS.initializeMessages(BUNDLE_NAME, BUNDLE_CLASS);
+ }
+
+ private JptUiDetailsOrmMessages() {
+ throw new UnsupportedOperationException();
+ }
+
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/MetadataCompleteComposite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/MetadataCompleteComposite.java
new file mode 100644
index 0000000000..62d4f60ce5
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/MetadataCompleteComposite.java
@@ -0,0 +1,89 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2010 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.ui.internal.details.orm;
+
+import org.eclipse.jpt.common.ui.internal.JptCommonUiMessages;
+import org.eclipse.jpt.common.ui.internal.widgets.Pane;
+import org.eclipse.jpt.common.utility.internal.model.value.PropertyAspectAdapter;
+import org.eclipse.jpt.common.utility.internal.model.value.TransformationPropertyValueModel;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.common.utility.model.value.WritablePropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.orm.OrmTypeMapping;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.swt.widgets.Composite;
+
+public class MetadataCompleteComposite extends Pane<OrmTypeMapping> {
+
+ public MetadataCompleteComposite(Pane<?> parentPane,
+ PropertyValueModel<? extends OrmTypeMapping> subjectHolder,
+ Composite parent) {
+
+ super(parentPane, subjectHolder, parent);
+ }
+
+ @Override
+ protected void initializeLayout(Composite container) {
+
+ // TODO not sure the is the right thing to do; since metadata complete
+ // has an "override" (from the persistence unit), not a default...
+ addTriStateCheckBoxWithDefault(
+ container,
+ JptUiDetailsOrmMessages.MetadataCompleteComposite_metadataComplete,
+ buildMetadataCompleteHolder(),
+ buildMetadataCompleteStringHolder(),
+ null
+ );
+ }
+
+ private WritablePropertyValueModel<Boolean> buildMetadataCompleteHolder() {
+ return new PropertyAspectAdapter<OrmTypeMapping, Boolean>(
+ getSubjectHolder(),
+ OrmTypeMapping.SPECIFIED_METADATA_COMPLETE_PROPERTY)
+ {
+ @Override
+ protected Boolean buildValue_() {
+ return this.subject.getSpecifiedMetadataComplete();
+ }
+
+ @Override
+ protected void setValue_(Boolean value) {
+ this.subject.setSpecifiedMetadataComplete(value);
+ }
+ };
+ }
+
+ private PropertyValueModel<String> buildMetadataCompleteStringHolder() {
+ return new TransformationPropertyValueModel<Boolean, String>(buildOverrideMetadataCompleteHolder()) {
+ @Override
+ protected String transform(Boolean value) {
+ if (value != null) {
+ String defaultStringValue = value.booleanValue() ? JptCommonUiMessages.Boolean_True : JptCommonUiMessages.Boolean_False;
+ return NLS.bind(JptUiDetailsOrmMessages.MetadataCompleteComposite_metadataCompleteWithDefault, defaultStringValue);
+ }
+ return JptUiDetailsOrmMessages.MetadataCompleteComposite_metadataComplete;
+ }
+ };
+ }
+ private PropertyValueModel<Boolean> buildOverrideMetadataCompleteHolder() {
+ return new PropertyAspectAdapter<OrmTypeMapping, Boolean>(
+ getSubjectHolder(),
+ OrmTypeMapping.SPECIFIED_METADATA_COMPLETE_PROPERTY,
+ OrmTypeMapping.OVERRIDE_METADATA_COMPLETE_PROPERTY)
+ {
+ @Override
+ protected Boolean buildValue_() {
+ if (this.subject.getSpecifiedMetadataComplete() != null) {
+ return null;
+ }
+ return Boolean.valueOf(this.subject.isOverrideMetadataComplete());
+ }
+ };
+ }
+} \ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmBasicMappingComposite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmBasicMappingComposite.java
new file mode 100644
index 0000000000..60f453b983
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmBasicMappingComposite.java
@@ -0,0 +1,45 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2010 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.ui.internal.details.orm;
+
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.BasicMapping;
+import org.eclipse.jpt.jpa.ui.internal.details.AbstractBasicMappingComposite;
+import org.eclipse.jpt.jpa.ui.internal.details.ColumnComposite;
+import org.eclipse.jpt.jpa.ui.internal.details.FetchTypeComposite;
+import org.eclipse.jpt.jpa.ui.internal.details.OptionalComposite;
+import org.eclipse.swt.widgets.Composite;
+
+public class OrmBasicMappingComposite extends AbstractBasicMappingComposite<BasicMapping>
+{
+ /**
+ * Creates a new <code>EclipseLink1_1OrmBasicMappingComposite</code>.
+ *
+ * @param subjectHolder The holder of the subject <code>BasicMapping</code>
+ * @param parent The parent container
+ * @param widgetFactory The factory used to create various common widgets
+ */
+ public OrmBasicMappingComposite(PropertyValueModel<? extends BasicMapping> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+
+ super(subjectHolder, parent, widgetFactory);
+ }
+
+ @Override
+ protected void initializeBasicSection(Composite container) {
+ new ColumnComposite(this, buildColumnHolder(), container);
+ new OrmMappingNameChooser(this, getSubjectHolder(), container);
+ new FetchTypeComposite(this, container);
+ new OptionalComposite(this, addSubPane(container, 4));
+ }
+
+} \ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmBasicMappingUiDefinition.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmBasicMappingUiDefinition.java
new file mode 100644
index 0000000000..febf82f355
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmBasicMappingUiDefinition.java
@@ -0,0 +1,54 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2009 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.ui.internal.details.orm;
+
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.ReadOnlyPersistentAttribute;
+import org.eclipse.jpt.jpa.core.context.orm.OrmBasicMapping;
+import org.eclipse.jpt.jpa.ui.details.JpaComposite;
+import org.eclipse.jpt.jpa.ui.details.orm.OrmAttributeMappingUiDefinition;
+import org.eclipse.jpt.jpa.ui.details.orm.OrmXmlUiFactory;
+import org.eclipse.jpt.jpa.ui.internal.details.AbstractBasicMappingUiDefinition;
+import org.eclipse.swt.widgets.Composite;
+
+public class OrmBasicMappingUiDefinition
+ extends AbstractBasicMappingUiDefinition<ReadOnlyPersistentAttribute, OrmBasicMapping>
+ implements OrmAttributeMappingUiDefinition<OrmBasicMapping>
+{
+ // singleton
+ private static final OrmBasicMappingUiDefinition INSTANCE =
+ new OrmBasicMappingUiDefinition();
+
+ /**
+ * Return the singleton.
+ */
+ public static OrmAttributeMappingUiDefinition<OrmBasicMapping> instance() {
+ return INSTANCE;
+ }
+
+
+ /**
+ * Ensure single instance.
+ */
+ private OrmBasicMappingUiDefinition() {
+ super();
+ }
+
+ public JpaComposite buildAttributeMappingComposite(
+ OrmXmlUiFactory factory,
+ PropertyValueModel<OrmBasicMapping> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+
+ return factory.createOrmBasicMappingComposite(subjectHolder, parent, widgetFactory);
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmEmbeddableComposite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmEmbeddableComposite.java
new file mode 100644
index 0000000000..6717dbe577
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmEmbeddableComposite.java
@@ -0,0 +1,54 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2010 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.ui.internal.details.orm;
+
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.utility.internal.model.value.PropertyAspectAdapter;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.AccessHolder;
+import org.eclipse.jpt.jpa.core.context.orm.OrmEmbeddable;
+import org.eclipse.jpt.jpa.ui.details.JpaComposite;
+import org.eclipse.jpt.jpa.ui.internal.details.AbstractEmbeddableComposite;
+import org.eclipse.jpt.jpa.ui.internal.details.AccessTypeComposite;
+import org.eclipse.swt.widgets.Composite;
+
+public class OrmEmbeddableComposite extends AbstractEmbeddableComposite<OrmEmbeddable> implements JpaComposite
+{
+ public OrmEmbeddableComposite(PropertyValueModel<? extends OrmEmbeddable> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+
+ super(subjectHolder, parent, widgetFactory);
+ }
+
+ @Override
+ protected void initializeLayout(Composite container) {
+ this.initializeEmbeddableCollapsibleSection(container);
+ }
+
+ @Override
+ protected void initializeEmbeddableSection(Composite container) {
+ new OrmJavaClassChooser(this, getSubjectHolder(), container);
+ new AccessTypeComposite(this, buildAccessHolder(), container);
+ new MetadataCompleteComposite(this, getSubjectHolder(), container);
+ }
+
+ protected PropertyValueModel<AccessHolder> buildAccessHolder() {
+ return new PropertyAspectAdapter<OrmEmbeddable, AccessHolder>(
+ getSubjectHolder())
+ {
+ @Override
+ protected AccessHolder buildValue_() {
+ return this.subject.getPersistentType();
+ }
+ };
+ }
+
+} \ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmEmbeddableUiDefinition.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmEmbeddableUiDefinition.java
new file mode 100644
index 0000000000..9d611ac30e
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmEmbeddableUiDefinition.java
@@ -0,0 +1,54 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2009 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.ui.internal.details.orm;
+
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.PersistentType;
+import org.eclipse.jpt.jpa.core.context.orm.OrmEmbeddable;
+import org.eclipse.jpt.jpa.ui.details.JpaComposite;
+import org.eclipse.jpt.jpa.ui.details.orm.OrmTypeMappingUiDefinition;
+import org.eclipse.jpt.jpa.ui.details.orm.OrmXmlUiFactory;
+import org.eclipse.jpt.jpa.ui.internal.details.AbstractEmbeddableUiDefinition;
+import org.eclipse.swt.widgets.Composite;
+
+public class OrmEmbeddableUiDefinition
+ extends AbstractEmbeddableUiDefinition<PersistentType, OrmEmbeddable>
+ implements OrmTypeMappingUiDefinition<OrmEmbeddable>
+{
+ // singleton
+ private static final OrmEmbeddableUiDefinition INSTANCE = new OrmEmbeddableUiDefinition();
+
+
+ /**
+ * Return the singleton.
+ */
+ public static OrmTypeMappingUiDefinition<OrmEmbeddable> instance() {
+ return INSTANCE;
+ }
+
+
+ /**
+ * Ensure single instance.
+ */
+ private OrmEmbeddableUiDefinition() {
+ super();
+ }
+
+
+ public JpaComposite buildTypeMappingComposite(
+ OrmXmlUiFactory factory,
+ PropertyValueModel<OrmEmbeddable> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+
+ return factory.createOrmEmbeddableComposite(subjectHolder, parent, widgetFactory);
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmEmbeddedIdMappingComposite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmEmbeddedIdMappingComposite.java
new file mode 100644
index 0000000000..939321c5d3
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmEmbeddedIdMappingComposite.java
@@ -0,0 +1,39 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2010 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.ui.internal.details.orm;
+
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.EmbeddedIdMapping;
+import org.eclipse.jpt.jpa.ui.internal.details.AbstractEmbeddedIdMappingComposite;
+import org.eclipse.jpt.jpa.ui.internal.details.EmbeddedMappingOverridesComposite;
+import org.eclipse.swt.widgets.Composite;
+
+public class OrmEmbeddedIdMappingComposite
+ extends AbstractEmbeddedIdMappingComposite<EmbeddedIdMapping>
+{
+ public OrmEmbeddedIdMappingComposite(
+ PropertyValueModel<? extends EmbeddedIdMapping> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+
+ super(subjectHolder, parent, widgetFactory);
+ }
+
+
+ @Override
+ protected void initializeEmbeddedIdSection(Composite container) {
+ new OrmMappingNameChooser(this, getSubjectHolder(), container);
+
+ new EmbeddedMappingOverridesComposite(
+ this,
+ container);
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmEmbeddedIdMappingUiDefinition.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmEmbeddedIdMappingUiDefinition.java
new file mode 100644
index 0000000000..9d8a08c1ff
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmEmbeddedIdMappingUiDefinition.java
@@ -0,0 +1,56 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2009 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.ui.internal.details.orm;
+
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.ReadOnlyPersistentAttribute;
+import org.eclipse.jpt.jpa.core.context.orm.OrmEmbeddedIdMapping;
+import org.eclipse.jpt.jpa.ui.details.JpaComposite;
+import org.eclipse.jpt.jpa.ui.details.orm.OrmAttributeMappingUiDefinition;
+import org.eclipse.jpt.jpa.ui.details.orm.OrmXmlUiFactory;
+import org.eclipse.jpt.jpa.ui.internal.details.AbstractEmbeddedIdMappingUiDefinition;
+import org.eclipse.swt.widgets.Composite;
+
+public class OrmEmbeddedIdMappingUiDefinition
+ extends AbstractEmbeddedIdMappingUiDefinition<ReadOnlyPersistentAttribute, OrmEmbeddedIdMapping>
+ implements OrmAttributeMappingUiDefinition<OrmEmbeddedIdMapping>
+{
+ // singleton
+ private static final OrmEmbeddedIdMappingUiDefinition INSTANCE =
+ new OrmEmbeddedIdMappingUiDefinition();
+
+
+ /**
+ * Return the singleton.
+ */
+ public static OrmAttributeMappingUiDefinition<OrmEmbeddedIdMapping> instance() {
+ return INSTANCE;
+ }
+
+
+ /**
+ * Ensure single instance.
+ */
+ private OrmEmbeddedIdMappingUiDefinition() {
+ super();
+ }
+
+
+ public JpaComposite buildAttributeMappingComposite(
+ OrmXmlUiFactory factory,
+ PropertyValueModel<OrmEmbeddedIdMapping> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+
+ return factory.createOrmEmbeddedIdMappingComposite(subjectHolder, parent, widgetFactory);
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmEmbeddedMappingComposite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmEmbeddedMappingComposite.java
new file mode 100644
index 0000000000..44a45c4e49
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmEmbeddedMappingComposite.java
@@ -0,0 +1,64 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2010 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.ui.internal.details.orm;
+
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.EmbeddedMapping;
+import org.eclipse.jpt.jpa.ui.internal.details.AbstractEmbeddedMappingComposite;
+import org.eclipse.jpt.jpa.ui.internal.details.EmbeddedMappingOverridesComposite;
+import org.eclipse.jpt.jpa.ui.internal.details.java.BaseJavaUiFactory;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * Here the layout of this pane:
+ * <pre>
+ * -----------------------------------------------------------------------------
+ * | ------------------------------------------------------------------------- |
+ * | | | |
+ * | | EmbeddedAttributeOverridesComposite | |
+ * | | | |
+ * | ------------------------------------------------------------------------- |
+ * -----------------------------------------------------------------------------</pre>
+ *
+ * @see EmbeddedMapping
+ * @see BaseJavaUiFactory - The factory creating this pane
+ *
+ * @version 2.3
+ * @since 2.2
+ */
+public class OrmEmbeddedMappingComposite
+ extends AbstractEmbeddedMappingComposite<EmbeddedMapping>
+{
+ /**
+ * Creates a new <code>EmbeddedMappingComposite</code>.
+ *
+ * @param subjectHolder The holder of the subject <code>EmbeddedMapping</code>
+ * @param parent The parent container
+ * @param widgetFactory The factory used to create various common widgets
+ */
+ public OrmEmbeddedMappingComposite(PropertyValueModel<? extends EmbeddedMapping> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+
+ super(subjectHolder, parent, widgetFactory);
+ }
+
+ @Override
+ protected void initializeEmbeddedSection(Composite container) {
+ new OrmMappingNameChooser(this, getSubjectHolder(), container);
+
+ new EmbeddedMappingOverridesComposite(
+ this,
+ container
+ );
+ }
+
+} \ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmEmbeddedMappingUiDefinition.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmEmbeddedMappingUiDefinition.java
new file mode 100644
index 0000000000..532f197eb0
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmEmbeddedMappingUiDefinition.java
@@ -0,0 +1,56 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2009 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.ui.internal.details.orm;
+
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.ReadOnlyPersistentAttribute;
+import org.eclipse.jpt.jpa.core.context.orm.OrmEmbeddedMapping;
+import org.eclipse.jpt.jpa.ui.details.JpaComposite;
+import org.eclipse.jpt.jpa.ui.details.orm.OrmAttributeMappingUiDefinition;
+import org.eclipse.jpt.jpa.ui.details.orm.OrmXmlUiFactory;
+import org.eclipse.jpt.jpa.ui.internal.details.AbstractEmbeddedMappingUiDefinition;
+import org.eclipse.swt.widgets.Composite;
+
+public class OrmEmbeddedMappingUiDefinition
+ extends AbstractEmbeddedMappingUiDefinition<ReadOnlyPersistentAttribute, OrmEmbeddedMapping>
+ implements OrmAttributeMappingUiDefinition<OrmEmbeddedMapping>
+{
+ // singleton
+ private static final OrmEmbeddedMappingUiDefinition INSTANCE =
+ new OrmEmbeddedMappingUiDefinition();
+
+
+ /**
+ * Return the singleton.
+ */
+ public static OrmAttributeMappingUiDefinition<OrmEmbeddedMapping> instance() {
+ return INSTANCE;
+ }
+
+
+ /**
+ * Ensure single instance.
+ */
+ private OrmEmbeddedMappingUiDefinition() {
+ super();
+ }
+
+
+ public JpaComposite buildAttributeMappingComposite(
+ OrmXmlUiFactory factory,
+ PropertyValueModel<OrmEmbeddedMapping> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+
+ return factory.createOrmEmbeddedMappingComposite(subjectHolder, parent, widgetFactory);
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmEntityComposite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmEntityComposite.java
new file mode 100644
index 0000000000..ebbbcdbcfd
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmEntityComposite.java
@@ -0,0 +1,43 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2009 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.ui.internal.details.orm;
+
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.orm.OrmEntity;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * The pane used for an ORM entity.
+ *
+ * @see OrmEntity
+ * @see BaseJavaUiFactory - The factory creating this pane
+ * @see OrmSecondaryTablesComposite
+ *
+ * @version 2.0
+ * @since 1.0
+ */
+public class OrmEntityComposite extends AbstractOrmEntityComposite
+{
+ /**
+ * Creates a new <code>OrmEntityComposite</code>.
+ *
+ * @param subjectHolder The holder of the subject <code>OrmEntity</code>
+ * @param parent The parent container
+ * @param widgetFactory The factory used to create various common widgets
+ */
+ public OrmEntityComposite(PropertyValueModel<? extends OrmEntity> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+
+ super(subjectHolder, parent, widgetFactory);
+ }
+
+} \ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmEntityUiDefinition.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmEntityUiDefinition.java
new file mode 100644
index 0000000000..28ec546536
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmEntityUiDefinition.java
@@ -0,0 +1,55 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2009 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.ui.internal.details.orm;
+
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.PersistentType;
+import org.eclipse.jpt.jpa.core.context.orm.OrmEntity;
+import org.eclipse.jpt.jpa.ui.details.JpaComposite;
+import org.eclipse.jpt.jpa.ui.details.orm.OrmTypeMappingUiDefinition;
+import org.eclipse.jpt.jpa.ui.details.orm.OrmXmlUiFactory;
+import org.eclipse.jpt.jpa.ui.internal.details.AbstractEntityUiDefinition;
+import org.eclipse.swt.widgets.Composite;
+
+public class OrmEntityUiDefinition
+ extends AbstractEntityUiDefinition<PersistentType, OrmEntity>
+ implements OrmTypeMappingUiDefinition<OrmEntity>
+{
+ // singleton
+ private static final OrmEntityUiDefinition INSTANCE =
+ new OrmEntityUiDefinition();
+
+
+ /**
+ * Return the singleton.
+ */
+ public static OrmTypeMappingUiDefinition<OrmEntity> instance() {
+ return INSTANCE;
+ }
+
+
+ /**
+ * Ensure single instance.
+ */
+ private OrmEntityUiDefinition() {
+ super();
+ }
+
+
+ public JpaComposite buildTypeMappingComposite(
+ OrmXmlUiFactory factory,
+ PropertyValueModel<OrmEntity> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+
+ return factory.createOrmEntityComposite(subjectHolder, parent, widgetFactory);
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmIdMappingComposite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmIdMappingComposite.java
new file mode 100644
index 0000000000..83fb1c9850
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmIdMappingComposite.java
@@ -0,0 +1,36 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 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.ui.internal.details.orm;
+
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.IdMapping;
+import org.eclipse.jpt.jpa.ui.internal.details.AbstractIdMappingComposite;
+import org.eclipse.jpt.jpa.ui.internal.details.ColumnComposite;
+import org.eclipse.swt.widgets.Composite;
+
+public class OrmIdMappingComposite
+ extends AbstractIdMappingComposite<IdMapping>
+{
+ public OrmIdMappingComposite(
+ PropertyValueModel<? extends IdMapping> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+
+ super(subjectHolder, parent, widgetFactory);
+ }
+
+
+ @Override
+ protected void initializeIdSection(Composite container) {
+ new ColumnComposite(this, buildColumnHolder(), container);
+ new OrmMappingNameChooser(this, getSubjectHolder(), container);
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmIdMappingUiDefinition.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmIdMappingUiDefinition.java
new file mode 100644
index 0000000000..a66e67eba2
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmIdMappingUiDefinition.java
@@ -0,0 +1,56 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2009 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.ui.internal.details.orm;
+
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.ReadOnlyPersistentAttribute;
+import org.eclipse.jpt.jpa.core.context.orm.OrmIdMapping;
+import org.eclipse.jpt.jpa.ui.details.JpaComposite;
+import org.eclipse.jpt.jpa.ui.details.orm.OrmAttributeMappingUiDefinition;
+import org.eclipse.jpt.jpa.ui.details.orm.OrmXmlUiFactory;
+import org.eclipse.jpt.jpa.ui.internal.details.AbstractIdMappingUiDefinition;
+import org.eclipse.swt.widgets.Composite;
+
+public class OrmIdMappingUiDefinition
+ extends AbstractIdMappingUiDefinition<ReadOnlyPersistentAttribute, OrmIdMapping>
+ implements OrmAttributeMappingUiDefinition<OrmIdMapping>
+{
+ // singleton
+ private static final OrmIdMappingUiDefinition INSTANCE =
+ new OrmIdMappingUiDefinition();
+
+
+ /**
+ * Return the singleton.
+ */
+ public static OrmAttributeMappingUiDefinition<OrmIdMapping> instance() {
+ return INSTANCE;
+ }
+
+
+ /**
+ * Ensure single instance.
+ */
+ private OrmIdMappingUiDefinition() {
+ super();
+ }
+
+
+ public JpaComposite buildAttributeMappingComposite(
+ OrmXmlUiFactory factory,
+ PropertyValueModel<OrmIdMapping> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+
+ return factory.createOrmIdMappingComposite(subjectHolder, parent, widgetFactory);
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmInheritanceComposite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmInheritanceComposite.java
new file mode 100644
index 0000000000..cbeadd2cd5
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmInheritanceComposite.java
@@ -0,0 +1,44 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 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.ui.internal.details.orm;
+
+import org.eclipse.jpt.common.ui.internal.widgets.Pane;
+import org.eclipse.jpt.jpa.core.context.orm.OrmEntity;
+import org.eclipse.jpt.jpa.ui.internal.details.AbstractInheritanceComposite;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * The pane used for java inheritance.
+ *
+ * @see OrmEntity
+ * @see OrmPrimaryKeyJoinColumnsComposite
+ *
+ * @version 2.0
+ * @since 1.0
+ */
+public class OrmInheritanceComposite extends AbstractInheritanceComposite<OrmEntity> {
+
+ /**
+ * Creates a new <code>OrmInheritanceComposite</code>.
+ *
+ * @param parentPane The parent container of this one
+ * @param parent The parent container
+ */
+ public OrmInheritanceComposite(Pane<? extends OrmEntity> parentPane,
+ Composite parent) {
+
+ super(parentPane, parent);
+ }
+
+ @Override
+ protected void addPrimaryKeyJoinColumnsComposite(Composite container) {
+ new OrmPrimaryKeyJoinColumnsComposite(this, container);
+ }
+} \ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmJavaClassChooser.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmJavaClassChooser.java
new file mode 100644
index 0000000000..eaadc6576c
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmJavaClassChooser.java
@@ -0,0 +1,112 @@
+/*******************************************************************************
+ * 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.ui.internal.details.orm;
+
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jpt.common.ui.internal.widgets.ClassChooserPane;
+import org.eclipse.jpt.common.ui.internal.widgets.Pane;
+import org.eclipse.jpt.common.utility.internal.model.value.PropertyAspectAdapter;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.common.utility.model.value.WritablePropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.orm.OrmTypeMapping;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * Here the layout of this pane:
+ * <pre>
+ * -----------------------------------------------------------------------------
+ * | |
+ * | ClassChooserPane |
+ * | |
+ * -----------------------------------------------------------------------------</pre>
+ *
+ * TODO possibly help the user and if they have chosen a package at the
+ * entity-mappings level only insert the class name in the xml file if they
+ * choose a class from the package.
+ * Not sure if this should be driven by the UI or by ui api in the model
+ *
+ * @see OrmTypeMapping
+ * @see OrmPersistentTypeDetailsPage - The parent container
+ * @see ClassChooserPane
+ *
+ * @version 2.0
+ * @since 1.0
+ */
+public class OrmJavaClassChooser extends Pane<OrmTypeMapping> {
+
+ /**
+ * Creates a new <code>XmlJavaClassChooser</code>.
+ *
+ * @param parentPane The parent controller of this one
+ * @param subjectHolder The holder of this pane's subject
+ * @param parent The parent container
+ */
+ public OrmJavaClassChooser(Pane<?> parentPane,
+ PropertyValueModel<? extends OrmTypeMapping> subjectHolder,
+ Composite parent) {
+
+ super(parentPane, subjectHolder, parent);
+ }
+
+ public OrmJavaClassChooser(Pane<?> parentPane,
+ PropertyValueModel<? extends OrmTypeMapping> subjectHolder,
+ Composite parent,
+ boolean automaticallyAlignWidgets) {
+
+ super(parentPane, subjectHolder, parent, automaticallyAlignWidgets);
+ }
+
+
+ private ClassChooserPane<OrmTypeMapping> addClassChooser(Composite container) {
+
+ return new ClassChooserPane<OrmTypeMapping>(this, container) {
+
+ @Override
+ protected WritablePropertyValueModel<String> buildTextHolder() {
+ return new PropertyAspectAdapter<OrmTypeMapping, String>(getSubjectHolder(), OrmTypeMapping.CLASS_PROPERTY) {
+ @Override
+ protected String buildValue_() {
+ return this.subject.getClass_();
+ }
+
+ @Override
+ protected void setValue_(String value) {
+ this.subject.setClass(value);
+ }
+ };
+ }
+
+ @Override
+ protected String getClassName() {
+ return getSubject().getClass_();
+ }
+
+ @Override
+ protected String getLabelText() {
+ return JptUiDetailsOrmMessages.OrmJavaClassChooser_javaClass;
+ }
+
+ @Override
+ protected IJavaProject getJavaProject() {
+ return getSubject().getJpaProject().getJavaProject();
+ }
+
+ @Override
+ protected void setClassName(String className) {
+ getSubject().setClass(className);
+ }
+ };
+ }
+
+ @Override
+ protected void initializeLayout(Composite container) {
+ addClassChooser(container);
+ }
+} \ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmManyToManyMappingComposite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmManyToManyMappingComposite.java
new file mode 100644
index 0000000000..21a0743a69
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmManyToManyMappingComposite.java
@@ -0,0 +1,90 @@
+/*******************************************************************************
+ * 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.ui.internal.details.orm;
+
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.ManyToManyMapping;
+import org.eclipse.jpt.jpa.core.context.ManyToManyRelationship;
+import org.eclipse.jpt.jpa.ui.internal.details.AbstractManyToManyMappingComposite;
+import org.eclipse.jpt.jpa.ui.internal.details.CascadeComposite;
+import org.eclipse.jpt.jpa.ui.internal.details.FetchTypeComposite;
+import org.eclipse.jpt.jpa.ui.internal.details.ManyToManyJoiningStrategyPane;
+import org.eclipse.jpt.jpa.ui.internal.details.OrderingComposite;
+import org.eclipse.jpt.jpa.ui.internal.details.TargetEntityComposite;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * Here the layout of this pane:
+ * <pre>
+ * -----------------------------------------------------------------------------
+ * | ------------------------------------------------------------------------- |
+ * | | | |
+ * | | TargetEntityComposite | |
+ * | | | |
+ * | ------------------------------------------------------------------------- |
+ * | ------------------------------------------------------------------------- |
+ * | | | |
+ * | | JoiningStrategyComposite | |
+ * | | | |
+ * | ------------------------------------------------------------------------- |
+ * | ------------------------------------------------------------------------- |
+ * | | | |
+ * | | FetchTypeComposite | |
+ * | | | |
+ * | ------------------------------------------------------------------------- |
+ * | ------------------------------------------------------------------------- |
+ * | | | |
+ * | | CascadeComposite | |
+ * | | | |
+ * | ------------------------------------------------------------------------- |
+ * | ------------------------------------------------------------------------- |
+ * | | | |
+ * | | OrderingComposite | |
+ * | | | |
+ * | ------------------------------------------------------------------------- |
+ * -----------------------------------------------------------------------------</pre>
+ *
+ * @see {@link ManyToManyMapping}
+ * @see {@link TargetEntityComposite}
+ * @see {@link ManyToManyJoiningStrategyPane}
+ * @see {@link FetchTypeComposite}
+ * @see {@link CascadeComposite}
+ * @see {@link OrderingComposite}
+ *
+ * @version 2.3
+ * @since 1.0
+ */
+public class OrmManyToManyMappingComposite
+ extends AbstractManyToManyMappingComposite<ManyToManyMapping, ManyToManyRelationship>
+{
+ /**
+ * Creates a new <code>ManyToManyMappingComposite</code>.
+ *
+ * @param subjectHolder The holder of the subject <code>IManyToManyMapping</code>
+ * @param parent The parent container
+ * @param widgetFactory The factory used to create various common widgets
+ */
+ public OrmManyToManyMappingComposite(PropertyValueModel<? extends ManyToManyMapping> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+
+ super(subjectHolder, parent, widgetFactory);
+ }
+
+ @Override
+ protected void initializeManyToManySection(Composite container) {
+ new TargetEntityComposite(this, container);
+ new OrmMappingNameChooser(this, getSubjectHolder(), container);
+ new FetchTypeComposite(this, container);
+ new CascadeComposite(this, buildCascadeHolder(), addSubPane(container, 5));
+ }
+
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmManyToManyMappingUiDefinition.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmManyToManyMappingUiDefinition.java
new file mode 100644
index 0000000000..ee2e44615a
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmManyToManyMappingUiDefinition.java
@@ -0,0 +1,56 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2009 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.ui.internal.details.orm;
+
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.ReadOnlyPersistentAttribute;
+import org.eclipse.jpt.jpa.core.context.orm.OrmManyToManyMapping;
+import org.eclipse.jpt.jpa.ui.details.JpaComposite;
+import org.eclipse.jpt.jpa.ui.details.orm.OrmAttributeMappingUiDefinition;
+import org.eclipse.jpt.jpa.ui.details.orm.OrmXmlUiFactory;
+import org.eclipse.jpt.jpa.ui.internal.details.AbstractManyToManyMappingUiDefinition;
+import org.eclipse.swt.widgets.Composite;
+
+public class OrmManyToManyMappingUiDefinition
+ extends AbstractManyToManyMappingUiDefinition<ReadOnlyPersistentAttribute, OrmManyToManyMapping>
+ implements OrmAttributeMappingUiDefinition<OrmManyToManyMapping>
+{
+ // singleton
+ private static final OrmManyToManyMappingUiDefinition INSTANCE =
+ new OrmManyToManyMappingUiDefinition();
+
+
+ /**
+ * Return the singleton.
+ */
+ public static OrmAttributeMappingUiDefinition<OrmManyToManyMapping> instance() {
+ return INSTANCE;
+ }
+
+
+ /**
+ * Ensure single instance.
+ */
+ private OrmManyToManyMappingUiDefinition() {
+ super();
+ }
+
+
+ public JpaComposite buildAttributeMappingComposite(
+ OrmXmlUiFactory factory,
+ PropertyValueModel<OrmManyToManyMapping> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+
+ return factory.createOrmManyToManyMappingComposite(subjectHolder, parent, widgetFactory);
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmManyToOneMappingComposite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmManyToOneMappingComposite.java
new file mode 100644
index 0000000000..8cb0a652c8
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmManyToOneMappingComposite.java
@@ -0,0 +1,92 @@
+/*******************************************************************************
+ * 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.ui.internal.details.orm;
+
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.ManyToOneMapping;
+import org.eclipse.jpt.jpa.core.context.orm.OrmManyToOneMapping;
+import org.eclipse.jpt.jpa.core.context.orm.OrmManyToOneRelationship;
+import org.eclipse.jpt.jpa.ui.internal.details.AbstractManyToOneMappingComposite;
+import org.eclipse.jpt.jpa.ui.internal.details.CascadeComposite;
+import org.eclipse.jpt.jpa.ui.internal.details.FetchTypeComposite;
+import org.eclipse.jpt.jpa.ui.internal.details.ManyToOneJoiningStrategyPane;
+import org.eclipse.jpt.jpa.ui.internal.details.OptionalComposite;
+import org.eclipse.jpt.jpa.ui.internal.details.TargetEntityComposite;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * Here the layout of this pane:
+ * <pre>
+ * -----------------------------------------------------------------------------
+ * | ------------------------------------------------------------------------- |
+ * | | | |
+ * | | TargetEntityComposite | |
+ * | | | |
+ * | ------------------------------------------------------------------------- |
+ * | ------------------------------------------------------------------------- |
+ * | | | |
+ * | | JoiningStrategyComposite | |
+ * | | | |
+ * | ------------------------------------------------------------------------- |
+ * | ------------------------------------------------------------------------- |
+ * | | | |
+ * | | FetchTypeComposite | |
+ * | | | |
+ * | ------------------------------------------------------------------------- |
+ * | ------------------------------------------------------------------------- |
+ * | | | |
+ * | | OptionalComposite | |
+ * | | | |
+ * | ------------------------------------------------------------------------- |
+ * | ------------------------------------------------------------------------- |
+ * | | | |
+ * | | CascadeComposite | |
+ * | | | |
+ * | ------------------------------------------------------------------------- |
+ * -----------------------------------------------------------------------------</pre>
+ *
+ * @see {@link ManyToOneMapping}
+ * @see {@link TargetEntityComposite}
+ * @see {@link ManyToOneJoiningStrategyPane}
+ * @see {@link FetchTypeComposite}
+ * @see {@link OptionalComposite}
+ * @see {@link CascadeComposite}
+ *
+ * @version 2.3
+ * @since 1.0
+ */
+public class OrmManyToOneMappingComposite
+ extends AbstractManyToOneMappingComposite<OrmManyToOneMapping, OrmManyToOneRelationship>
+{
+ /**
+ * Creates a new <code>ManyToOneMappingComposite</code>.
+ *
+ * @param subjectHolder The holder of the subject <code>IManyToOneMapping</code>
+ * @param parent The parent container
+ * @param widgetFactory The factory used to create various common widgets
+ */
+ public OrmManyToOneMappingComposite(PropertyValueModel<? extends OrmManyToOneMapping> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+
+ super(subjectHolder, parent, widgetFactory);
+ }
+
+ @Override
+ protected void initializeManyToOneSection(Composite container) {
+ new TargetEntityComposite(this, container);
+ new OrmMappingNameChooser(this, getSubjectHolder(), container);
+ new FetchTypeComposite(this, container);
+ new OptionalComposite(this, container);
+ new CascadeComposite(this, buildCascadeHolder(), addSubPane(container, 5));
+ }
+
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmManyToOneMappingUiDefinition.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmManyToOneMappingUiDefinition.java
new file mode 100644
index 0000000000..2738762508
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmManyToOneMappingUiDefinition.java
@@ -0,0 +1,56 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2009 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.ui.internal.details.orm;
+
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.ReadOnlyPersistentAttribute;
+import org.eclipse.jpt.jpa.core.context.orm.OrmManyToOneMapping;
+import org.eclipse.jpt.jpa.ui.details.JpaComposite;
+import org.eclipse.jpt.jpa.ui.details.orm.OrmAttributeMappingUiDefinition;
+import org.eclipse.jpt.jpa.ui.details.orm.OrmXmlUiFactory;
+import org.eclipse.jpt.jpa.ui.internal.details.AbstractManyToOneMappingUiDefinition;
+import org.eclipse.swt.widgets.Composite;
+
+public class OrmManyToOneMappingUiDefinition
+ extends AbstractManyToOneMappingUiDefinition<ReadOnlyPersistentAttribute, OrmManyToOneMapping>
+ implements OrmAttributeMappingUiDefinition<OrmManyToOneMapping>
+{
+ // singleton
+ private static final OrmManyToOneMappingUiDefinition INSTANCE =
+ new OrmManyToOneMappingUiDefinition();
+
+
+ /**
+ * Return the singleton.
+ */
+ public static OrmAttributeMappingUiDefinition<OrmManyToOneMapping> instance() {
+ return INSTANCE;
+ }
+
+
+ /**
+ * Ensure single instance.
+ */
+ private OrmManyToOneMappingUiDefinition() {
+ super();
+ }
+
+
+ public JpaComposite buildAttributeMappingComposite(
+ OrmXmlUiFactory factory,
+ PropertyValueModel<OrmManyToOneMapping> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+
+ return factory.createOrmManyToOneMappingComposite(subjectHolder, parent, widgetFactory);
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmMappedSuperclassComposite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmMappedSuperclassComposite.java
new file mode 100644
index 0000000000..b26ea5dd75
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmMappedSuperclassComposite.java
@@ -0,0 +1,51 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2010 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.ui.internal.details.orm;
+
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.utility.internal.model.value.PropertyAspectAdapter;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.AccessHolder;
+import org.eclipse.jpt.jpa.core.context.orm.OrmMappedSuperclass;
+import org.eclipse.jpt.jpa.ui.details.JpaComposite;
+import org.eclipse.jpt.jpa.ui.internal.details.AbstractMappedSuperclassComposite;
+import org.eclipse.jpt.jpa.ui.internal.details.AccessTypeComposite;
+import org.eclipse.jpt.jpa.ui.internal.details.IdClassComposite;
+import org.eclipse.swt.widgets.Composite;
+
+public class OrmMappedSuperclassComposite
+ extends AbstractMappedSuperclassComposite<OrmMappedSuperclass>
+ implements JpaComposite
+{
+ public OrmMappedSuperclassComposite(
+ PropertyValueModel<? extends OrmMappedSuperclass> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+
+ super(subjectHolder, parent, widgetFactory);
+ }
+
+ @Override
+ protected void initializeMappedSuperclassSection(Composite container) {
+ new OrmJavaClassChooser(this, getSubjectHolder(), container);
+ new AccessTypeComposite(this, buildAccessHolder(), container);
+ new IdClassComposite(this, buildIdClassReferenceHolder(), container);
+ new MetadataCompleteComposite(this, getSubjectHolder(), container);
+ }
+
+ protected PropertyValueModel<AccessHolder> buildAccessHolder() {
+ return new PropertyAspectAdapter<OrmMappedSuperclass, AccessHolder>(getSubjectHolder()) {
+ @Override
+ protected AccessHolder buildValue_() {
+ return this.subject.getPersistentType();
+ }
+ };
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmMappedSuperclassUiDefinition.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmMappedSuperclassUiDefinition.java
new file mode 100644
index 0000000000..3b919460e1
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmMappedSuperclassUiDefinition.java
@@ -0,0 +1,55 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2009 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.ui.internal.details.orm;
+
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.PersistentType;
+import org.eclipse.jpt.jpa.core.context.orm.OrmMappedSuperclass;
+import org.eclipse.jpt.jpa.ui.details.JpaComposite;
+import org.eclipse.jpt.jpa.ui.details.orm.OrmTypeMappingUiDefinition;
+import org.eclipse.jpt.jpa.ui.details.orm.OrmXmlUiFactory;
+import org.eclipse.jpt.jpa.ui.internal.details.AbstractMappedSuperclassUiDefinition;
+import org.eclipse.swt.widgets.Composite;
+
+public class OrmMappedSuperclassUiDefinition
+ extends AbstractMappedSuperclassUiDefinition<PersistentType, OrmMappedSuperclass>
+ implements OrmTypeMappingUiDefinition<OrmMappedSuperclass>
+{
+ // singleton
+ private static final OrmMappedSuperclassUiDefinition INSTANCE =
+ new OrmMappedSuperclassUiDefinition();
+
+
+ /**
+ * Return the singleton.
+ */
+ public static OrmTypeMappingUiDefinition<OrmMappedSuperclass> instance() {
+ return INSTANCE;
+ }
+
+
+ /**
+ * Ensure single instance.
+ */
+ private OrmMappedSuperclassUiDefinition() {
+ super();
+ }
+
+
+ public JpaComposite buildTypeMappingComposite(
+ OrmXmlUiFactory factory,
+ PropertyValueModel<OrmMappedSuperclass> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+
+ return factory.createOrmMappedSuperclassComposite(subjectHolder, parent, widgetFactory);
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmMappingNameChooser.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmMappingNameChooser.java
new file mode 100644
index 0000000000..1dc11a6f49
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmMappingNameChooser.java
@@ -0,0 +1,71 @@
+/*******************************************************************************
+ * 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.ui.internal.details.orm;
+
+import org.eclipse.jpt.common.ui.internal.widgets.Pane;
+import org.eclipse.jpt.common.utility.internal.model.value.PropertyAspectAdapter;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.common.utility.model.value.WritablePropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.AttributeMapping;
+import org.eclipse.jpt.jpa.core.context.orm.OrmAttributeMapping;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * @see OrmPersistentAttributeDetailsPage - The parent container
+ *
+ * @version 2.3
+ * @since 1.0
+ */
+public class OrmMappingNameChooser
+ extends Pane<AttributeMapping>
+{
+ /**
+ * Creates a new <code>XmlJavaAttributeChooser</code>.
+ *
+ * @param parentPane The parent container of this one
+ * @param subjectHolder The holder of this pane's subject
+ * @param parent The parent container
+ */
+ public OrmMappingNameChooser(Pane<?> parentPane,
+ PropertyValueModel<? extends AttributeMapping> subjectHolder,
+ Composite parent) {
+
+ super(parentPane, subjectHolder, parent);
+ }
+
+ @Override
+ protected void initializeLayout(Composite container) {
+ this.addLabeledText(
+ container,
+ JptUiDetailsOrmMessages.OrmMappingNameChooser_name,
+ buildNameHolder()
+ );
+ }
+ private WritablePropertyValueModel<String> buildNameHolder() {
+ return new PropertyAspectAdapter<AttributeMapping, String>(getSubjectHolder(), OrmAttributeMapping.NAME_PROPERTY) {
+ @Override
+ protected String buildValue_() {
+ return this.subject.getName();
+ }
+
+ @Override
+ protected void setValue_(String value) {
+ if (this.subject.getPersistentAttribute().isVirtual()) {
+ return;
+ }
+ if (value.length() == 0) {
+ value = null;
+ }
+ // we can safely cast to an orm.xml mapping since it is not virtual
+ ((OrmAttributeMapping) this.subject).setName(value);
+ }
+ };
+ }
+} \ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmOneToManyMappingComposite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmOneToManyMappingComposite.java
new file mode 100644
index 0000000000..da0df67b48
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmOneToManyMappingComposite.java
@@ -0,0 +1,89 @@
+/*******************************************************************************
+ * 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.ui.internal.details.orm;
+
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.OneToManyMapping;
+import org.eclipse.jpt.jpa.core.context.OneToManyRelationship;
+import org.eclipse.jpt.jpa.ui.internal.details.AbstractOneToManyMappingComposite;
+import org.eclipse.jpt.jpa.ui.internal.details.CascadeComposite;
+import org.eclipse.jpt.jpa.ui.internal.details.FetchTypeComposite;
+import org.eclipse.jpt.jpa.ui.internal.details.JoinTableComposite;
+import org.eclipse.jpt.jpa.ui.internal.details.OrderingComposite;
+import org.eclipse.jpt.jpa.ui.internal.details.TargetEntityComposite;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * Here the layout of this pane:
+ * <pre>
+ * -----------------------------------------------------------------------------
+ * | ------------------------------------------------------------------------- |
+ * | | | |
+ * | | TargetEntityComposite | |
+ * | | | |
+ * | ------------------------------------------------------------------------- |
+ * | ------------------------------------------------------------------------- |
+ * | | | |
+ * | | JoiningStrategyComposite | |
+ * | | | |
+ * | ------------------------------------------------------------------------- |
+ * | ------------------------------------------------------------------------- |
+ * | | | |
+ * | | FetchTypeComposite | |
+ * | | | |
+ * | ------------------------------------------------------------------------- |
+ * | ------------------------------------------------------------------------- |
+ * | | | |
+ * | | CascadeComposite | |
+ * | | | |
+ * | ------------------------------------------------------------------------- |
+ * | ------------------------------------------------------------------------- |
+ * | | | |
+ * | | OrderingComposite | |
+ * | | | |
+ * | ------------------------------------------------------------------------- |
+ * -----------------------------------------------------------------------------</pre>
+ *
+ * @see OneToManyMapping
+ * @see CascadeComposite
+ * @see FetchTypeComposite
+ * @see JoinTableComposite
+ * @see OrderingComposite
+ * @see TargetEntityComposite
+ *
+ * @version 2.3
+ * @since 1.0
+ */
+public class OrmOneToManyMappingComposite
+ extends AbstractOneToManyMappingComposite<OneToManyMapping, OneToManyRelationship>
+{
+ /**
+ * Creates a new <code>OneToManyMappingComposite</code>.
+ *
+ * @param subjectHolder The holder of the subject <code>IOneToManyMapping</code>
+ * @param parent The parent container
+ * @param widgetFactory The factory used to create various common widgets
+ */
+ public OrmOneToManyMappingComposite(PropertyValueModel<? extends OneToManyMapping> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+
+ super(subjectHolder, parent, widgetFactory);
+ }
+
+ @Override
+ protected void initializeOneToManySection(Composite container) {
+ new TargetEntityComposite(this, container);
+ new OrmMappingNameChooser(this, getSubjectHolder(), container);
+ new FetchTypeComposite(this, container);
+ new CascadeComposite(this, buildCascadeHolder(), addSubPane(container, 5));
+ }
+} \ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmOneToManyMappingUiDefinition.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmOneToManyMappingUiDefinition.java
new file mode 100644
index 0000000000..f899ac6b7c
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmOneToManyMappingUiDefinition.java
@@ -0,0 +1,56 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2009 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.ui.internal.details.orm;
+
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.ReadOnlyPersistentAttribute;
+import org.eclipse.jpt.jpa.core.context.orm.OrmOneToManyMapping;
+import org.eclipse.jpt.jpa.ui.details.JpaComposite;
+import org.eclipse.jpt.jpa.ui.details.orm.OrmAttributeMappingUiDefinition;
+import org.eclipse.jpt.jpa.ui.details.orm.OrmXmlUiFactory;
+import org.eclipse.jpt.jpa.ui.internal.details.AbstractOneToManyMappingUiDefinition;
+import org.eclipse.swt.widgets.Composite;
+
+public class OrmOneToManyMappingUiDefinition
+ extends AbstractOneToManyMappingUiDefinition<ReadOnlyPersistentAttribute, OrmOneToManyMapping>
+ implements OrmAttributeMappingUiDefinition<OrmOneToManyMapping>
+{
+ // singleton
+ private static final OrmOneToManyMappingUiDefinition INSTANCE =
+ new OrmOneToManyMappingUiDefinition();
+
+
+ /**
+ * Return the singleton.
+ */
+ public static OrmAttributeMappingUiDefinition<OrmOneToManyMapping> instance() {
+ return INSTANCE;
+ }
+
+
+ /**
+ * Ensure single instance.
+ */
+ private OrmOneToManyMappingUiDefinition() {
+ super();
+ }
+
+
+ public JpaComposite buildAttributeMappingComposite(
+ OrmXmlUiFactory factory,
+ PropertyValueModel<OrmOneToManyMapping> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+
+ return factory.createOrmOneToManyMappingComposite(subjectHolder, parent, widgetFactory);
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmOneToOneMappingComposite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmOneToOneMappingComposite.java
new file mode 100644
index 0000000000..e072ae3c81
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmOneToOneMappingComposite.java
@@ -0,0 +1,91 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 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.ui.internal.details.orm;
+
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.OneToOneMapping;
+import org.eclipse.jpt.jpa.core.context.OneToOneRelationship;
+import org.eclipse.jpt.jpa.ui.internal.details.AbstractOneToOneMappingComposite;
+import org.eclipse.jpt.jpa.ui.internal.details.CascadeComposite;
+import org.eclipse.jpt.jpa.ui.internal.details.FetchTypeComposite;
+import org.eclipse.jpt.jpa.ui.internal.details.OptionalComposite;
+import org.eclipse.jpt.jpa.ui.internal.details.TargetEntityComposite;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * Here the layout of this pane:
+ * <pre>
+ * -----------------------------------------------------------------------------
+ * | ------------------------------------------------------------------------- |
+ * | | | |
+ * | | TargetEntityComposite | |
+ * | | | |
+ * | ------------------------------------------------------------------------- |
+ * | ------------------------------------------------------------------------- |
+ * | | | |
+ * | | JoiningStrategyComposite | |
+ * | | | |
+ * | ------------------------------------------------------------------------- |
+ * | ------------------------------------------------------------------------- |
+ * | | | |
+ * | | FetchTypeComposite | |
+ * | | | |
+ * | ------------------------------------------------------------------------- |
+ * | ------------------------------------------------------------------------- |
+ * | | | |
+ * | | OptionalComposite | |
+ * | | | |
+ * | ------------------------------------------------------------------------- |
+ * | ------------------------------------------------------------------------- |
+ * | | | |
+ * | | CascadeComposite | |
+ * | | | |
+ * | ------------------------------------------------------------------------- |
+ * -----------------------------------------------------------------------------</pre>
+ *
+ * @see OneToOneMapping
+ * @see TargetEntityComposite
+ * @see JoiningStrategyComposite
+ * @see FetchTypeComposite
+ * @see OptionalComposite
+ * @see CascadeComposite
+ *
+ * @version 2.3
+ * @since 1.0
+ */
+public class OrmOneToOneMappingComposite
+ extends AbstractOneToOneMappingComposite<OneToOneMapping, OneToOneRelationship>
+{
+ /**
+ * Creates a new <code>OneToOneMappingComposite</code>.
+ *
+ * @param subjectHolder The holder of the subject <code>IOneToOneMapping</code>
+ * @param parent The parent container
+ * @param widgetFactory The factory used to create various common widgets
+ */
+ public OrmOneToOneMappingComposite(PropertyValueModel<? extends OneToOneMapping> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+
+ super(subjectHolder, parent, widgetFactory);
+ }
+
+ @Override
+ protected void initializeOneToOneSection(Composite container) {
+ new TargetEntityComposite(this, container);
+ new OrmMappingNameChooser(this, getSubjectHolder(), container);
+ new FetchTypeComposite(this, container);
+ new OptionalComposite(this, container);
+ new CascadeComposite(this, buildCascadeHolder(), addSubPane(container, 5));
+ }
+
+
+} \ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmOneToOneMappingUiDefinition.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmOneToOneMappingUiDefinition.java
new file mode 100644
index 0000000000..c37fa42c50
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmOneToOneMappingUiDefinition.java
@@ -0,0 +1,56 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2009 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.ui.internal.details.orm;
+
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.ReadOnlyPersistentAttribute;
+import org.eclipse.jpt.jpa.core.context.orm.OrmOneToOneMapping;
+import org.eclipse.jpt.jpa.ui.details.JpaComposite;
+import org.eclipse.jpt.jpa.ui.details.orm.OrmAttributeMappingUiDefinition;
+import org.eclipse.jpt.jpa.ui.details.orm.OrmXmlUiFactory;
+import org.eclipse.jpt.jpa.ui.internal.details.AbstractOneToOneMappingUiDefinition;
+import org.eclipse.swt.widgets.Composite;
+
+public class OrmOneToOneMappingUiDefinition
+ extends AbstractOneToOneMappingUiDefinition<ReadOnlyPersistentAttribute, OrmOneToOneMapping>
+ implements OrmAttributeMappingUiDefinition<OrmOneToOneMapping>
+{
+ // singleton
+ private static final OrmOneToOneMappingUiDefinition INSTANCE =
+ new OrmOneToOneMappingUiDefinition();
+
+
+ /**
+ * Return the singleton.
+ */
+ public static OrmAttributeMappingUiDefinition<OrmOneToOneMapping> instance() {
+ return INSTANCE;
+ }
+
+
+ /**
+ * Ensure single instance.
+ */
+ private OrmOneToOneMappingUiDefinition() {
+ super();
+ }
+
+
+ public JpaComposite buildAttributeMappingComposite(
+ OrmXmlUiFactory factory,
+ PropertyValueModel<OrmOneToOneMapping> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+
+ return factory.createOrmOneToOneMappingComposite(subjectHolder, parent, widgetFactory);
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmPackageChooser.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmPackageChooser.java
new file mode 100644
index 0000000000..06a93c3aae
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmPackageChooser.java
@@ -0,0 +1,98 @@
+/*******************************************************************************
+ * 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.ui.internal.details.orm;
+
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jpt.common.ui.internal.widgets.PackageChooserPane;
+import org.eclipse.jpt.common.ui.internal.widgets.Pane;
+import org.eclipse.jpt.common.utility.internal.model.value.PropertyAspectAdapter;
+import org.eclipse.jpt.common.utility.model.value.WritablePropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.orm.EntityMappings;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * Here the layout of this pane:
+ * <pre>
+ * -----------------------------------------------------------------------------
+ * | |
+ * | PackageChooserPane |
+ * | |
+ * -----------------------------------------------------------------------------</pre>
+ *
+ * @see EntityMappings
+ * @see EntityMappingsDetailsPage - The parent container
+ * @see PackageChooserPane
+ *
+ * @version 2.0
+ * @since 2.0
+ */
+public class OrmPackageChooser extends Pane<EntityMappings>
+{
+ /**
+ * Creates a new <code>XmlPackageChooser</code>.
+ *
+ * @param parentPane The parent controller of this one
+ * @param parent The parent container
+ */
+ public OrmPackageChooser(Pane<? extends EntityMappings> parentPane,
+ Composite parent) {
+
+ super(parentPane, parent);
+ }
+
+ /*
+ * (non-Javadoc)
+ */
+ @Override
+ protected void initializeLayout(Composite container) {
+
+ addPackageChooserPane(container);
+ }
+
+ private void addPackageChooserPane(Composite container) {
+
+ new PackageChooserPane<EntityMappings>(this, container) {
+ @Override
+ protected WritablePropertyValueModel<String> buildTextHolder() {
+ return new PropertyAspectAdapter<EntityMappings, String>(getSubjectHolder(), EntityMappings.PACKAGE_PROPERTY) {
+ @Override
+ protected String buildValue_() {
+ return subject.getPackage();
+ }
+
+ @Override
+ protected void setValue_(String value) {
+ subject.setPackage(value == "" ? null : value); //$NON-NLS-1$
+ }
+ };
+ }
+
+ @Override
+ protected String getLabelText() {
+ return JptUiDetailsOrmMessages.EntityMappingsDetailsPage_package;
+ }
+
+ @Override
+ protected IJavaProject getJavaProject() {
+ return getSubject().getJpaProject().getJavaProject();
+ }
+
+ @Override
+ protected String getPackageName() {
+ return getSubject().getPackage();
+ }
+
+ @Override
+ protected void setPackageName(String packageName) {
+ getSubject().setPackage(packageName);
+ }
+ };
+ }
+} \ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmPersistentAttributeDetailsPage.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmPersistentAttributeDetailsPage.java
new file mode 100644
index 0000000000..144e10cde1
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmPersistentAttributeDetailsPage.java
@@ -0,0 +1,114 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2010 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.ui.internal.details.orm;
+
+import java.util.ArrayList;
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.ui.internal.util.PaneEnabler;
+import org.eclipse.jpt.common.ui.internal.widgets.Pane;
+import org.eclipse.jpt.common.utility.internal.model.value.TransformationPropertyValueModel;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.ReadOnlyPersistentAttribute;
+import org.eclipse.jpt.jpa.core.context.orm.OrmPersistentAttribute;
+import org.eclipse.jpt.jpa.core.context.orm.OrmReadOnlyPersistentAttribute;
+import org.eclipse.jpt.jpa.ui.details.JpaComposite;
+import org.eclipse.jpt.jpa.ui.internal.details.PersistentAttributeDetailsPage;
+import org.eclipse.jpt.jpa.ui.internal.details.PersistentAttributeMapAsComposite;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * The default implementation of the details page used for the XML persistent
+ * attribute.
+ * <p>
+ * Here the layout of this pane:
+ * <pre>
+ * -----------------------------------------------------------------------------
+ * | ------------------------------------------------------------------------- |
+ * | | | |
+ * | | OrmPersistentAttributeMapAsComposite | |
+ * | | | |
+ * | ------------------------------------------------------------------------- |
+ * | ------------------------------------------------------------------------- |
+ * | | | |
+ * | | Attribute mapping pane | |
+ * | | | |
+ * | ------------------------------------------------------------------------- |
+ * -----------------------------------------------------------------------------</pre>
+ *
+ * @see OrmPersistentAttribute
+ * @see OrmPersistentAttributeMapAsComposite
+ *
+ * @version 2.3
+ * @since 2.0
+ */
+public class OrmPersistentAttributeDetailsPage
+ extends PersistentAttributeDetailsPage<OrmReadOnlyPersistentAttribute>
+{
+ /**
+ * Creates a new <code>OrmPersistentAttributeDetailsPage</code>.
+ *
+ * @param parent The parent container
+ * @param widgetFactory The factory used to create various common widgets
+ */
+ public OrmPersistentAttributeDetailsPage(Composite parent,
+ WidgetFactory widgetFactory) {
+
+ super(parent, widgetFactory);
+ }
+
+ @Override
+ protected void initializeLayout(Composite container) {
+
+ ArrayList<Pane<?>> panes = new ArrayList<Pane<?>>(2);
+
+ // Map As composite
+ Pane<?> mapAsPane = buildMapAsPane(addSubPane(container, 0, 0, 5, 0));
+ panes.add(mapAsPane);
+
+ buildMappingPageBook(container);
+
+ installPaneEnabler(panes);
+ }
+
+ protected Pane<ReadOnlyPersistentAttribute> buildMapAsPane(Composite parent) {
+ return new PersistentAttributeMapAsComposite(this, parent);
+ }
+
+ private void installPaneEnabler(ArrayList<Pane<?>> panes) {
+ new PaneEnabler(buildPaneEnablerHolder(), panes);
+ }
+
+ private PropertyValueModel<Boolean> buildPaneEnablerHolder() {
+ return new TransformationPropertyValueModel<OrmReadOnlyPersistentAttribute, Boolean>(getSubjectHolder()) {
+ @Override
+ protected Boolean transform_(OrmReadOnlyPersistentAttribute value) {
+ return Boolean.valueOf(!value.isVirtual());
+ }
+ };
+ }
+
+
+ //TODO this probably needs to change and use a PaneEnabler instead.
+ @Override
+ protected JpaComposite getMappingComposite(String key) {
+ JpaComposite mappingComposite = super.getMappingComposite(key);
+ if (mappingComposite == null) {
+ return null;
+ }
+ boolean enabled = false;
+
+ if (getSubject() != null && getSubject().getParent() != null) {
+ enabled = !getSubject().isVirtual();
+ }
+
+ mappingComposite.enableWidgets(enabled);
+ return mappingComposite;
+ }
+} \ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmPersistentAttributeDetailsProvider.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmPersistentAttributeDetailsProvider.java
new file mode 100644
index 0000000000..9527d29496
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmPersistentAttributeDetailsProvider.java
@@ -0,0 +1,61 @@
+/*******************************************************************************
+ * Copyright (c) 2009 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.ui.internal.details.orm;
+
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.utility.internal.Tools;
+import org.eclipse.jpt.jpa.core.JpaStructureNode;
+import org.eclipse.jpt.jpa.core.JptJpaCorePlugin;
+import org.eclipse.jpt.jpa.core.context.orm.OrmReadOnlyPersistentAttribute;
+import org.eclipse.jpt.jpa.core.context.orm.OrmStructureNodes;
+import org.eclipse.jpt.jpa.ui.details.JpaDetailsPage;
+import org.eclipse.jpt.jpa.ui.details.JpaDetailsProvider;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * This provider is responsible for creating the {@link JpaDetailsPage}
+ * when the information comes from the XML file (either from the persistence
+ * configuration or from the Mappings Descriptor).
+ */
+public class OrmPersistentAttributeDetailsProvider
+ implements JpaDetailsProvider
+{
+ // singleton
+ private static final JpaDetailsProvider INSTANCE = new OrmPersistentAttributeDetailsProvider();
+
+
+ /**
+ * Return the singleton
+ */
+ public static JpaDetailsProvider instance() {
+ return INSTANCE;
+ }
+
+
+ /**
+ * Enforce singleton usage
+ */
+ private OrmPersistentAttributeDetailsProvider() {
+ super();
+ }
+
+
+ public boolean providesDetails(JpaStructureNode structureNode) {
+ return Tools.valuesAreEqual(structureNode.getId(), OrmStructureNodes.PERSISTENT_ATTRIBUTE_ID)
+ && structureNode.getResourceType().getContentType().isKindOf(JptJpaCorePlugin.MAPPING_FILE_CONTENT_TYPE);
+ }
+
+ public JpaDetailsPage<OrmReadOnlyPersistentAttribute> buildDetailsPage(
+ Composite parent,
+ WidgetFactory widgetFactory) {
+
+ return new OrmPersistentAttributeDetailsPage(parent, widgetFactory);
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmPersistentTypeDetailsProvider.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmPersistentTypeDetailsProvider.java
new file mode 100644
index 0000000000..4dd48709d9
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmPersistentTypeDetailsProvider.java
@@ -0,0 +1,62 @@
+/*******************************************************************************
+ * Copyright (c) 2009 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.ui.internal.details.orm;
+
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.utility.internal.Tools;
+import org.eclipse.jpt.jpa.core.JpaStructureNode;
+import org.eclipse.jpt.jpa.core.JptJpaCorePlugin;
+import org.eclipse.jpt.jpa.core.context.PersistentType;
+import org.eclipse.jpt.jpa.core.context.orm.OrmStructureNodes;
+import org.eclipse.jpt.jpa.ui.details.JpaDetailsPage;
+import org.eclipse.jpt.jpa.ui.details.JpaDetailsProvider;
+import org.eclipse.jpt.jpa.ui.internal.details.PersistentTypeDetailsPage;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * This provider is responsible for creating the {@link JpaDetailsPage}
+ * when the information comes from the XML file (either from the persistence
+ * configuration or from the Mappings Descriptor).
+ */
+public class OrmPersistentTypeDetailsProvider
+ implements JpaDetailsProvider
+{
+ // singleton
+ private static final JpaDetailsProvider INSTANCE = new OrmPersistentTypeDetailsProvider();
+
+
+ /**
+ * Return the singleton
+ */
+ public static JpaDetailsProvider instance() {
+ return INSTANCE;
+ }
+
+
+ /**
+ * Enforce singleton usage
+ */
+ private OrmPersistentTypeDetailsProvider() {
+ super();
+ }
+
+
+ public boolean providesDetails(JpaStructureNode structureNode) {
+ return Tools.valuesAreEqual(structureNode.getId(), OrmStructureNodes.PERSISTENT_TYPE_ID)
+ && structureNode.getResourceType().getContentType().isKindOf(JptJpaCorePlugin.MAPPING_FILE_CONTENT_TYPE);
+ }
+
+ public JpaDetailsPage<PersistentType> buildDetailsPage(
+ Composite parent,
+ WidgetFactory widgetFactory) {
+
+ return new PersistentTypeDetailsPage(parent, widgetFactory);
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmPrimaryKeyJoinColumnsComposite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmPrimaryKeyJoinColumnsComposite.java
new file mode 100644
index 0000000000..2769853208
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmPrimaryKeyJoinColumnsComposite.java
@@ -0,0 +1,70 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 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.ui.internal.details.orm;
+
+import java.util.ListIterator;
+import org.eclipse.jpt.common.ui.internal.widgets.Pane;
+import org.eclipse.jpt.common.utility.internal.model.value.ListAspectAdapter;
+import org.eclipse.jpt.common.utility.model.value.ListValueModel;
+import org.eclipse.jpt.jpa.core.context.PrimaryKeyJoinColumn;
+import org.eclipse.jpt.jpa.core.context.ReadOnlyPrimaryKeyJoinColumn;
+import org.eclipse.jpt.jpa.core.context.orm.OrmEntity;
+import org.eclipse.jpt.jpa.ui.internal.details.AbstractPrimaryKeyJoinColumnsComposite;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * @see OrmEntity
+ * @see OrmInheritanceComposite - The container of this pane
+ *
+ * @version 2.0
+ * @since 2.0
+ */
+public class OrmPrimaryKeyJoinColumnsComposite extends AbstractPrimaryKeyJoinColumnsComposite<OrmEntity>
+{
+ public OrmPrimaryKeyJoinColumnsComposite(Pane<? extends OrmEntity> subjectHolder,
+ Composite parent) {
+
+ super(subjectHolder, parent);
+ }
+
+ @Override
+ protected ListValueModel<ReadOnlyPrimaryKeyJoinColumn> buildDefaultJoinColumnsListHolder() {
+ return new ListAspectAdapter<OrmEntity, ReadOnlyPrimaryKeyJoinColumn>(
+ getSubjectHolder(),
+ OrmEntity.DEFAULT_PRIMARY_KEY_JOIN_COLUMNS_LIST)
+ {
+ @Override
+ protected ListIterator<ReadOnlyPrimaryKeyJoinColumn> listIterator_() {
+ return subject.defaultPrimaryKeyJoinColumns();
+ }
+//TODO defaultPrimaryKeyJoinColumnsSize when I can change the API
+// @Override
+// protected int size_() {
+// return subject.defaultPrimaryKeyJoinColumnsSize();
+// }
+ };
+ }
+
+ @Override
+ protected void switchDefaultToSpecified() {
+ ListIterator<ReadOnlyPrimaryKeyJoinColumn> defaultJoinColumns = getSubject().defaultPrimaryKeyJoinColumns();
+
+ while (defaultJoinColumns.hasNext()) {
+ ReadOnlyPrimaryKeyJoinColumn defaultJoinColumn = defaultJoinColumns.next();
+ String columnName = defaultJoinColumn.getName();
+ String referencedColumnName = defaultJoinColumn.getReferencedColumnName();
+
+ PrimaryKeyJoinColumn pkJoinColumn = getSubject().addSpecifiedPrimaryKeyJoinColumn();
+ pkJoinColumn.setSpecifiedName(columnName);
+ pkJoinColumn.setSpecifiedReferencedColumnName(referencedColumnName);
+ }
+ }
+
+} \ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmQueriesComposite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmQueriesComposite.java
new file mode 100644
index 0000000000..98d6dbb72a
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmQueriesComposite.java
@@ -0,0 +1,94 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2009 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.ui.internal.details.orm;
+
+import org.eclipse.jpt.common.ui.internal.util.PaneEnabler;
+import org.eclipse.jpt.common.ui.internal.widgets.Pane;
+import org.eclipse.jpt.common.utility.internal.model.value.PropertyAspectAdapter;
+import org.eclipse.jpt.common.utility.internal.model.value.TransformationPropertyValueModel;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.QueryContainer;
+import org.eclipse.jpt.jpa.core.context.orm.EntityMappings;
+import org.eclipse.jpt.jpa.ui.internal.details.QueriesComposite;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * Here the layout of this pane:
+ * <pre>
+ * -----------------------------------------------------------------------------
+ * | ------------------------------------------------------------------------- |
+ * | | | |
+ * | | QueriesComposite | |
+ * | | | |
+ * | ------------------------------------------------------------------------- |
+ * -----------------------------------------------------------------------------</pre>
+ *
+ * @see EntityMappings
+ * @see EntityMappingsDetailsPage - The parent container
+ * @see QueriesComposite
+ *
+ * @version 2.0
+ * @since 2.0
+ */
+public class OrmQueriesComposite extends Pane<EntityMappings> {
+
+ /**
+ * Creates a new <code>OrmQueriesComposite</code>.
+ *
+ * @param parentPane The parent container of this one
+ * @param parent The parent container
+ */
+ public OrmQueriesComposite(Pane<? extends EntityMappings> parentPane,
+ Composite parent) {
+
+ super(parentPane, parent, false);
+ }
+
+ private PropertyValueModel<Boolean> buildPaneEnablerHolder() {
+ return new TransformationPropertyValueModel<EntityMappings, Boolean>(getSubjectHolder()) {
+ @Override
+ protected Boolean transform(EntityMappings value) {
+ return (value != null);
+ }
+ };
+ }
+
+ @Override
+ protected void initializeLayout(Composite container) {
+
+ container = this.addCollapsibleSection(
+ container,
+ JptUiDetailsOrmMessages.OrmQueriesComposite_groupBox
+ );
+
+ QueriesComposite queriesComposite = this.buildQueriesComposite(container, this.buildQueryContainerHolder());
+
+ this.installPaneEnabler(queriesComposite);
+ }
+
+ protected QueriesComposite buildQueriesComposite(Composite container, PropertyValueModel<QueryContainer> queryContainerHolder) {
+ return new QueriesComposite(this, queryContainerHolder, container);
+ }
+
+ private PropertyValueModel<QueryContainer> buildQueryContainerHolder() {
+ return new PropertyAspectAdapter<EntityMappings, QueryContainer>(getSubjectHolder()) {
+ @Override
+ protected QueryContainer buildValue_() {
+ return this.subject.getQueryContainer();
+ }
+ };
+ }
+ private void installPaneEnabler(QueriesComposite queriesComposite) {
+ new PaneEnabler(
+ buildPaneEnablerHolder(),
+ queriesComposite
+ );
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmSecondaryTablesComposite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmSecondaryTablesComposite.java
new file mode 100644
index 0000000000..397ab90092
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmSecondaryTablesComposite.java
@@ -0,0 +1,211 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2010 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.ui.internal.details.orm;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.ListIterator;
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.ui.internal.util.PaneEnabler;
+import org.eclipse.jpt.common.ui.internal.widgets.AddRemoveListPane;
+import org.eclipse.jpt.common.ui.internal.widgets.Pane;
+import org.eclipse.jpt.common.utility.internal.model.value.CompositeListValueModel;
+import org.eclipse.jpt.common.utility.internal.model.value.ItemPropertyListValueModelAdapter;
+import org.eclipse.jpt.common.utility.internal.model.value.ListAspectAdapter;
+import org.eclipse.jpt.common.utility.internal.model.value.ListPropertyValueModelAdapter;
+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.core.context.Entity;
+import org.eclipse.jpt.jpa.core.context.ReadOnlySecondaryTable;
+import org.eclipse.jpt.jpa.core.context.ReadOnlyTable;
+import org.eclipse.jpt.jpa.core.context.SecondaryTable;
+import org.eclipse.jpt.jpa.core.context.orm.OrmEntity;
+import org.eclipse.jpt.jpa.core.context.orm.OrmSecondaryTable;
+import org.eclipse.jpt.jpa.core.context.orm.OrmVirtualSecondaryTable;
+import org.eclipse.jpt.jpa.ui.internal.JpaHelpContextIds;
+import org.eclipse.jpt.jpa.ui.internal.details.AbstractSecondaryTablesComposite;
+import org.eclipse.jpt.jpa.ui.internal.details.JptUiDetailsMessages;
+import org.eclipse.jpt.jpa.ui.internal.details.PrimaryKeyJoinColumnsInSecondaryTableComposite;
+import org.eclipse.jpt.jpa.ui.internal.details.SecondaryTableDialog;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * Here the layout of this pane:
+ * <pre>
+ * -----------------------------------------------------------------------------
+ * | ------------------------------------------------------------------------- |
+ * | | | |
+ * | | AddRemoveListPane | |
+ * | | | |
+ * | ------------------------------------------------------------------------- |
+ * | ------------------------------------------------------------------------- |
+ * | | | |
+ * | | PrimaryKeyJoinColumnsInSecondaryTableComposite | |
+ * | | | |
+ * | ------------------------------------------------------------------------- |
+ * -----------------------------------------------------------------------------</pre>
+ *
+ * @see OrmEntity
+ * @see OrmEntityComposite - The container of this pane
+ * @see AddRemoveListPane
+ * @see PrimaryKeyJoinColumnsInSecondaryTableComposite
+ *
+ * @version 2.0
+ * @since 1.0
+ */
+public class OrmSecondaryTablesComposite extends AbstractSecondaryTablesComposite<OrmEntity>
+{
+ /**
+ * Creates a new <code>OrmSecondaryTablesComposite</code>.
+ *
+ * @param parentPane The parent container of this one
+ * @param parent The parent container
+ */
+ public OrmSecondaryTablesComposite(Pane<? extends OrmEntity> parentPane,
+ Composite parent) {
+
+ super(parentPane, parent);
+ }
+
+ /**
+ * Creates a new <code>SecondaryTablesComposite</code>.
+ *
+ * @param subjectHolder The holder of the subject <code>IEntity</code>
+ * @param parent The parent container
+ * @param widgetFactory The factory used to create various common widgets
+ */
+ public OrmSecondaryTablesComposite(PropertyValueModel<? extends OrmEntity> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+
+ super(subjectHolder, parent, widgetFactory);
+ }
+
+ private WritablePropertyValueModel<Boolean> buildDefineInXmlHolder() {
+ return new DefineInXmlHolder();
+ }
+
+ private ListValueModel<ReadOnlySecondaryTable> buildSecondaryTablesListHolder() {
+ List<ListValueModel<? extends ReadOnlySecondaryTable>> list = new ArrayList<ListValueModel<? extends ReadOnlySecondaryTable>>();
+ list.add(buildSpecifiedSecondaryTablesListHolder());
+ list.add(buildVirtualSecondaryTablesListHolder());
+ return new CompositeListValueModel<ListValueModel<? extends ReadOnlySecondaryTable>, ReadOnlySecondaryTable>(list);
+ }
+
+ private ListValueModel<ReadOnlySecondaryTable> buildSecondaryTablesListModel() {
+ return new ItemPropertyListValueModelAdapter<ReadOnlySecondaryTable>(buildSecondaryTablesListHolder(),
+ ReadOnlyTable.SPECIFIED_NAME_PROPERTY);
+ }
+
+ private ListValueModel<OrmSecondaryTable> buildSpecifiedSecondaryTablesListHolder() {
+ return new ListAspectAdapter<OrmEntity, OrmSecondaryTable>(getSubjectHolder(), Entity.SPECIFIED_SECONDARY_TABLES_LIST) {
+ @Override
+ protected ListIterator<OrmSecondaryTable> listIterator_() {
+ return subject.specifiedSecondaryTables();
+ }
+
+ @Override
+ protected int size_() {
+ return subject.specifiedSecondaryTablesSize();
+ }
+ };
+ }
+
+ ListValueModel<OrmVirtualSecondaryTable> buildVirtualSecondaryTablesListHolder() {
+ return new ListAspectAdapter<OrmEntity, OrmVirtualSecondaryTable>(getSubjectHolder(), OrmEntity.VIRTUAL_SECONDARY_TABLES_LIST) {
+ @Override
+ protected ListIterator<OrmVirtualSecondaryTable> listIterator_() {
+ return this.subject.virtualSecondaryTables();
+ }
+
+ @Override
+ protected int size_() {
+ return subject.virtualSecondaryTablesSize();
+ }
+ };
+ }
+
+ @Override
+ protected void initializeLayout(Composite container) {
+
+ int groupBoxMargin = getGroupBoxMargin();
+
+ WritablePropertyValueModel<SecondaryTable> secondaryTableHolder =
+ buildSecondaryTableHolder();
+
+ WritablePropertyValueModel<Boolean> defineInXmlHolder =
+ buildDefineInXmlHolder();
+
+ // Override Define In XML check box
+ addCheckBox(
+ addSubPane(container, 0, groupBoxMargin),
+ JptUiDetailsMessages.OrmSecondaryTablesComposite_defineInXml,
+ defineInXmlHolder,
+ null
+ );
+
+ // Secondary Tables add/remove list pane
+ AddRemoveListPane<Entity> listPane = new AddRemoveListPane<Entity>(
+ this,
+ addSubPane(container, 0, groupBoxMargin, 0, groupBoxMargin),
+ buildSecondaryTablesAdapter(),
+ buildSecondaryTablesListModel(),
+ secondaryTableHolder,
+ buildSecondaryTableLabelProvider(),
+ JpaHelpContextIds.MAPPING_JOIN_TABLE_COLUMNS//TODO need a help context id for this
+ );
+
+ installListPaneEnabler(defineInXmlHolder, listPane);
+
+ // Primary Key Join Columns pane
+ new PrimaryKeyJoinColumnsInSecondaryTableComposite(
+ this,
+ secondaryTableHolder,
+ container
+ );
+ }
+
+ private void installListPaneEnabler(WritablePropertyValueModel<Boolean> defineInXmlHolder,
+ AddRemoveListPane<Entity> listPane) {
+
+ new PaneEnabler(defineInXmlHolder, listPane);
+ }
+
+ @Override
+ protected SecondaryTableDialog buildSecondaryTableDialogForAdd() {
+ // defaultSchema and defaultCatalog should not be taken from the Table in this case.
+ // The table default schema could be what is the specified schema on the java table.
+ return new SecondaryTableDialog(
+ getShell(), getSubject().getJpaProject(),
+ getSubject().getMappingFileRoot().getCatalog(),
+ getSubject().getMappingFileRoot().getSchema());
+ }
+
+ private class DefineInXmlHolder extends ListPropertyValueModelAdapter<Boolean>
+ implements WritablePropertyValueModel<Boolean> {
+
+ public DefineInXmlHolder() {
+ super(buildVirtualSecondaryTablesListHolder());
+ }
+
+ @Override
+ protected Boolean buildValue() {
+ if (getSubject() == null) {
+ return Boolean.FALSE;
+ }
+ return Boolean.valueOf(getSubject().secondaryTablesAreDefinedInXml());
+ }
+
+ public void setValue(Boolean value) {
+ getSubject().setSecondaryTablesAreDefinedInXml(value.booleanValue());
+ }
+ }
+} \ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmTransientMappingUiDefinition.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmTransientMappingUiDefinition.java
new file mode 100644
index 0000000000..de38367117
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmTransientMappingUiDefinition.java
@@ -0,0 +1,56 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2009 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.ui.internal.details.orm;
+
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.ReadOnlyPersistentAttribute;
+import org.eclipse.jpt.jpa.core.context.orm.OrmTransientMapping;
+import org.eclipse.jpt.jpa.ui.details.JpaComposite;
+import org.eclipse.jpt.jpa.ui.details.orm.OrmAttributeMappingUiDefinition;
+import org.eclipse.jpt.jpa.ui.details.orm.OrmXmlUiFactory;
+import org.eclipse.jpt.jpa.ui.internal.details.AbstractTransientMappingUiDefinition;
+import org.eclipse.swt.widgets.Composite;
+
+public class OrmTransientMappingUiDefinition
+ extends AbstractTransientMappingUiDefinition<ReadOnlyPersistentAttribute, OrmTransientMapping>
+ implements OrmAttributeMappingUiDefinition<OrmTransientMapping>
+{
+ // singleton
+ private static final OrmTransientMappingUiDefinition INSTANCE =
+ new OrmTransientMappingUiDefinition();
+
+
+ /**
+ * Return the singleton.
+ */
+ public static OrmAttributeMappingUiDefinition<OrmTransientMapping> instance() {
+ return INSTANCE;
+ }
+
+
+ /**
+ * Ensure single instance.
+ */
+ private OrmTransientMappingUiDefinition() {
+ super();
+ }
+
+
+ public JpaComposite buildAttributeMappingComposite(
+ OrmXmlUiFactory factory,
+ PropertyValueModel<OrmTransientMapping> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+
+ return factory.createOrmTransientMappingComposite(subjectHolder, parent, widgetFactory);
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmVersionMappingComposite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmVersionMappingComposite.java
new file mode 100644
index 0000000000..af5bb381d1
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmVersionMappingComposite.java
@@ -0,0 +1,41 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2010 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.ui.internal.details.orm;
+
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.VersionMapping;
+import org.eclipse.jpt.jpa.ui.internal.details.AbstractVersionMappingComposite;
+import org.eclipse.jpt.jpa.ui.internal.details.ColumnComposite;
+import org.eclipse.swt.widgets.Composite;
+
+public class OrmVersionMappingComposite
+ extends AbstractVersionMappingComposite<VersionMapping>
+{
+ /**
+ * Creates a new <code>EclipseLinkOrmVersionMappingComposite</code>.
+ *
+ * @param subjectHolder The holder of the subject <code>VersionMapping</code>
+ * @param parent The parent container
+ * @param widgetFactory The factory used to create various common widgets
+ */
+ public OrmVersionMappingComposite(PropertyValueModel<? extends VersionMapping> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+
+ super(subjectHolder, parent, widgetFactory);
+ }
+
+ @Override
+ protected void initializeVersionSection(Composite container) {
+ new ColumnComposite(this, buildColumnHolder(), container);
+ new OrmMappingNameChooser(this, getSubjectHolder(), container);
+ }
+} \ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmVersionMappingUiDefinition.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmVersionMappingUiDefinition.java
new file mode 100644
index 0000000000..de8d9b3207
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmVersionMappingUiDefinition.java
@@ -0,0 +1,56 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2009 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.ui.internal.details.orm;
+
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.ReadOnlyPersistentAttribute;
+import org.eclipse.jpt.jpa.core.context.orm.OrmVersionMapping;
+import org.eclipse.jpt.jpa.ui.details.JpaComposite;
+import org.eclipse.jpt.jpa.ui.details.orm.OrmAttributeMappingUiDefinition;
+import org.eclipse.jpt.jpa.ui.details.orm.OrmXmlUiFactory;
+import org.eclipse.jpt.jpa.ui.internal.details.AbstractVersionMappingUiDefinition;
+import org.eclipse.swt.widgets.Composite;
+
+public class OrmVersionMappingUiDefinition
+ extends AbstractVersionMappingUiDefinition<ReadOnlyPersistentAttribute, OrmVersionMapping>
+ implements OrmAttributeMappingUiDefinition<OrmVersionMapping>
+{
+ // singleton
+ private static final OrmVersionMappingUiDefinition INSTANCE =
+ new OrmVersionMappingUiDefinition();
+
+
+ /**
+ * Return the singleton.
+ */
+ public static OrmAttributeMappingUiDefinition<OrmVersionMapping> instance() {
+ return INSTANCE;
+ }
+
+
+ /**
+ * Ensure single instance.
+ */
+ private OrmVersionMappingUiDefinition() {
+ super();
+ }
+
+
+ public JpaComposite buildAttributeMappingComposite(
+ OrmXmlUiFactory factory,
+ PropertyValueModel<OrmVersionMapping> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+
+ return factory.createOrmVersionMappingComposite(subjectHolder, parent, widgetFactory);
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmXmlUiDefinition.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmXmlUiDefinition.java
new file mode 100644
index 0000000000..f2758cb785
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/OrmXmlUiDefinition.java
@@ -0,0 +1,84 @@
+/*******************************************************************************
+ * Copyright (c) 2009 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.ui.internal.details.orm;
+
+import java.util.List;
+import org.eclipse.jpt.common.core.JptResourceType;
+import org.eclipse.jpt.jpa.core.JptJpaCorePlugin;
+import org.eclipse.jpt.jpa.core.context.AttributeMapping;
+import org.eclipse.jpt.jpa.core.context.TypeMapping;
+import org.eclipse.jpt.jpa.ui.ResourceUiDefinition;
+import org.eclipse.jpt.jpa.ui.details.orm.OrmAttributeMappingUiDefinition;
+import org.eclipse.jpt.jpa.ui.details.orm.OrmTypeMappingUiDefinition;
+import org.eclipse.jpt.jpa.ui.details.orm.OrmXmlUiFactory;
+import org.eclipse.jpt.jpa.ui.internal.structure.OrmResourceModelStructureProvider;
+import org.eclipse.jpt.jpa.ui.structure.JpaStructureProvider;
+
+public class OrmXmlUiDefinition extends AbstractOrmXmlResourceUiDefinition
+{
+ // singleton
+ private static final ResourceUiDefinition INSTANCE = new OrmXmlUiDefinition();
+
+
+ /**
+ * Return the singleton
+ */
+ public static ResourceUiDefinition instance() {
+ return INSTANCE;
+ }
+
+
+ /**
+ * Enforce singleton usage
+ */
+ private OrmXmlUiDefinition() {
+ super();
+ }
+
+
+ @Override
+ protected OrmXmlUiFactory buildOrmXmlUiFactory() {
+ return new GenericOrmXmlUiFactory();
+ }
+
+ public boolean providesUi(JptResourceType resourceType) {
+ return resourceType.equals(JptJpaCorePlugin.ORM_XML_1_0_RESOURCE_TYPE);
+ }
+
+ public JpaStructureProvider getStructureProvider() {
+ return OrmResourceModelStructureProvider.instance();
+ }
+
+ @Override
+ protected void addOrmAttributeMappingUiDefinitionsTo(
+ List<OrmAttributeMappingUiDefinition<? extends AttributeMapping>> definitions) {
+
+ definitions.add(OrmIdMappingUiDefinition.instance());
+ definitions.add(OrmEmbeddedIdMappingUiDefinition.instance());
+ definitions.add(OrmBasicMappingUiDefinition.instance());
+ definitions.add(OrmVersionMappingUiDefinition.instance());
+ definitions.add(OrmManyToOneMappingUiDefinition.instance());
+ definitions.add(OrmOneToManyMappingUiDefinition.instance());
+ definitions.add(OrmOneToOneMappingUiDefinition.instance());
+ definitions.add(OrmManyToManyMappingUiDefinition.instance());
+ definitions.add(OrmEmbeddedMappingUiDefinition.instance());
+ definitions.add(OrmTransientMappingUiDefinition.instance());
+ }
+
+ @Override
+ protected void addOrmTypeMappingUiDefinitionsTo(
+ List<OrmTypeMappingUiDefinition<? extends TypeMapping>> definitions) {
+
+ definitions.add(OrmEntityUiDefinition.instance());
+ definitions.add(OrmMappedSuperclassUiDefinition.instance());
+ definitions.add(OrmEmbeddableUiDefinition.instance());
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/PersistenceUnitMetadataComposite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/PersistenceUnitMetadataComposite.java
new file mode 100644
index 0000000000..cd52166754
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/PersistenceUnitMetadataComposite.java
@@ -0,0 +1,303 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2010 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.ui.internal.details.orm;
+
+import java.util.Collection;
+
+import org.eclipse.jpt.common.ui.internal.utility.swt.SWTTools;
+import org.eclipse.jpt.common.ui.internal.widgets.EnumFormComboViewer;
+import org.eclipse.jpt.common.ui.internal.widgets.Pane;
+import org.eclipse.jpt.common.utility.internal.model.value.PropertyAspectAdapter;
+import org.eclipse.jpt.common.utility.internal.model.value.TransformationPropertyValueModel;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.common.utility.model.value.WritablePropertyValueModel;
+import org.eclipse.jpt.jpa.core.JptJpaCorePlugin;
+import org.eclipse.jpt.jpa.core.context.AccessType;
+import org.eclipse.jpt.jpa.core.context.orm.OrmPersistenceUnitDefaults;
+import org.eclipse.jpt.jpa.core.context.orm.OrmPersistenceUnitMetadata;
+import org.eclipse.jpt.jpa.core.jpa2.context.orm.OrmPersistenceUnitDefaults2_0;
+import org.eclipse.jpt.jpa.db.SchemaContainer;
+import org.eclipse.jpt.jpa.ui.internal.JpaHelpContextIds;
+import org.eclipse.jpt.jpa.ui.internal.details.db.CatalogCombo;
+import org.eclipse.jpt.jpa.ui.internal.details.db.SchemaCombo;
+import org.eclipse.jpt.jpa.ui.internal.jpa2.Jpa2_0ProjectFlagModel;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * Here the layout of this pane:
+ * <pre>
+ * -----------------------------------------------------------------------------
+ * | |
+ * | - Persistence Unit ------------------------------------------------------ |
+ * | |
+ * | x XML Mapping Metadata Complete |
+ * | |
+ * | x Cascade Persist |
+ * | |
+ * | ------------------------------------------------------------ |
+ * | Schema: | SchemaCombo | |
+ * | ------------------------------------------------------------ |
+ * | ------------------------------------------------------------ |
+ * | Catalog: | CatalogCombo | |
+ * | ------------------------------------------------------------ |
+ * | ------------------------------------------------------------ |
+ * | Access Type: | |v| |
+ * | ------------------------------------------------------------ |
+ * -----------------------------------------------------------------------------</pre>
+ *
+ * @see PersistenceUnitMetadata
+ * @see OrmPersistenceUnitDefaults
+ * @see EntityMappingsDetailsPage - The parent container
+ * @see CatalogCombo
+ * @see SchemaCombo
+ * @see EnumFormComboViewer
+ *
+ * @version 2.0
+ * @since 2.0
+ */
+public class PersistenceUnitMetadataComposite extends Pane<OrmPersistenceUnitMetadata>
+{
+ /**
+ * Creates a new <code>PersistenceUnitMetadataComposite</code>.
+ *
+ * @param parentPane The parent container of this one
+ * @param subjectHolder The holder of this pane's subject
+ * @param parent The parent container
+ */
+ public PersistenceUnitMetadataComposite(Pane<?> parentPane,
+ PropertyValueModel<? extends OrmPersistenceUnitMetadata> subjectHolder,
+ Composite parent) {
+
+ super(parentPane, subjectHolder, parent, false);
+ }
+
+ private EnumFormComboViewer<OrmPersistenceUnitDefaults, AccessType> addAccessTypeCombo(Composite container) {
+
+ return new EnumFormComboViewer<OrmPersistenceUnitDefaults, AccessType>(this, buildPersistenceUnitDefaultsHolder(), container) {
+
+ @Override
+ protected void addPropertyNames(Collection<String> propertyNames) {
+ super.addPropertyNames(propertyNames);
+ propertyNames.add(OrmPersistenceUnitDefaults.ACCESS_PROPERTY);
+ }
+
+ @Override
+ protected AccessType[] getChoices() {
+ return AccessType.values();
+ }
+
+ @Override
+ protected AccessType getDefaultValue() {
+ return null;
+ }
+
+ @Override
+ protected String displayString(AccessType value) {
+ return buildDisplayString(
+ JptUiDetailsOrmMessages.class,
+ PersistenceUnitMetadataComposite.this,
+ value
+ );
+ }
+
+ @Override
+ protected AccessType getValue() {
+ return getSubject().getAccess();
+ }
+
+ @Override
+ protected void setValue(AccessType value) {
+ getSubject().setAccess(value);
+ }
+ };
+ }
+
+ private WritablePropertyValueModel<Boolean> buildCascadePersistHolder() {
+ return new PropertyAspectAdapter<OrmPersistenceUnitDefaults, Boolean>(buildPersistenceUnitDefaultsHolder(), OrmPersistenceUnitDefaults.CASCADE_PERSIST_PROPERTY) {
+ @Override
+ protected Boolean buildValue_() {
+ return Boolean.valueOf(this.subject.isCascadePersist());
+ }
+
+ @Override
+ protected void setValue_(Boolean value) {
+ this.subject.setCascadePersist(value.booleanValue());
+ }
+ };
+ }
+
+ private CatalogCombo<OrmPersistenceUnitDefaults> addCatalogCombo(Composite container) {
+
+ return new CatalogCombo<OrmPersistenceUnitDefaults>(this, buildPersistenceUnitDefaultsHolder(), container) {
+
+ @Override
+ protected void addPropertyNames(Collection<String> propertyNames) {
+ super.addPropertyNames(propertyNames);
+ propertyNames.add(OrmPersistenceUnitDefaults.DEFAULT_CATALOG_PROPERTY);
+ propertyNames.add(OrmPersistenceUnitDefaults.SPECIFIED_CATALOG_PROPERTY);
+ }
+
+ @Override
+ protected String getDefaultValue() {
+ return getSubject().getDefaultCatalog();
+ }
+
+ @Override
+ protected void setValue(String value) {
+ getSubject().setSpecifiedCatalog(value);
+ }
+
+ @Override
+ protected String getValue() {
+ return getSubject().getSpecifiedCatalog();
+ }
+ };
+ }
+
+ private PropertyValueModel<OrmPersistenceUnitDefaults> buildPersistenceUnitDefaultsHolder() {
+ return new TransformationPropertyValueModel<OrmPersistenceUnitMetadata, OrmPersistenceUnitDefaults>(getSubjectHolder()) {
+ @Override
+ protected OrmPersistenceUnitDefaults transform_(OrmPersistenceUnitMetadata value) {
+ return value.getPersistenceUnitDefaults();
+ }
+ };
+ }
+
+ private SchemaCombo<OrmPersistenceUnitDefaults> addSchemaCombo(Composite container) {
+
+ return new SchemaCombo<OrmPersistenceUnitDefaults>(this, buildPersistenceUnitDefaultsHolder(), container) {
+
+ @Override
+ protected void addPropertyNames(Collection<String> propertyNames) {
+ super.addPropertyNames(propertyNames);
+ propertyNames.add(OrmPersistenceUnitDefaults.DEFAULT_SCHEMA_PROPERTY);
+ propertyNames.add(OrmPersistenceUnitDefaults.SPECIFIED_SCHEMA_PROPERTY);
+ }
+
+ @Override
+ protected String getDefaultValue() {
+ return getSubject().getDefaultSchema();
+ }
+
+ @Override
+ protected void setValue(String value) {
+ getSubject().setSpecifiedSchema(value);
+ }
+
+ @Override
+ protected String getValue() {
+ return getSubject().getSpecifiedSchema();
+ }
+
+ @Override
+ protected SchemaContainer getDbSchemaContainer_() {
+ return this.getSubject().getDbSchemaContainer();
+ }
+
+ };
+ }
+
+ private WritablePropertyValueModel<Boolean> buildXmlMappingMetadataCompleteHolder() {
+ return new PropertyAspectAdapter<OrmPersistenceUnitMetadata, Boolean>(getSubjectHolder(), OrmPersistenceUnitMetadata.XML_MAPPING_METADATA_COMPLETE_PROPERTY) {
+ @Override
+ protected Boolean buildValue_() {
+ return Boolean.valueOf(this.subject.isXmlMappingMetadataComplete());
+ }
+
+ @Override
+ protected void setValue_(Boolean value) {
+ this.subject.setXmlMappingMetadataComplete(value.booleanValue());
+ }
+ };
+ }
+
+ private WritablePropertyValueModel<Boolean> buildDelimitedIdentifiersHolder() {
+ return new PropertyAspectAdapter<OrmPersistenceUnitDefaults, Boolean>(buildPersistenceUnitDefaultsHolder(), OrmPersistenceUnitDefaults2_0.DELIMITED_IDENTIFIERS_PROPERTY) {
+ @Override
+ protected Boolean buildValue_() {
+ return Boolean.valueOf(this.buildBooleanValue_());
+ }
+
+ protected boolean buildBooleanValue_() {
+ return JptJpaCorePlugin.nodeIsJpa2_0Compatible(this.subject) &&
+ ((OrmPersistenceUnitDefaults2_0) this.subject).isDelimitedIdentifiers();
+ }
+
+ @Override
+ protected void setValue_(Boolean value) {
+ if (JptJpaCorePlugin.nodeIsJpa2_0Compatible(this.subject)) {
+ ((OrmPersistenceUnitDefaults2_0) this.subject).setDelimitedIdentifiers(value.booleanValue());
+ }
+ }
+ };
+ }
+
+ @Override
+ protected void initializeLayout(Composite container) {
+
+ // Section
+ container = addCollapsibleSection(
+ container,
+ JptUiDetailsOrmMessages.PersistenceUnitMetadataComposite_persistenceUnitSection
+ );
+
+ // XML mapping metadata complete check box
+ addCheckBox(
+ container,
+ JptUiDetailsOrmMessages.PersistenceUnitMetadataComposite_xmlMappingMetadataCompleteCheckBox,
+ buildXmlMappingMetadataCompleteHolder(),
+ JpaHelpContextIds.ENTITY_ORM_XML
+ );
+
+ // Cascade Persist check-box
+ addCheckBox(
+ container,
+ JptUiDetailsOrmMessages.PersistenceUnitMetadataComposite_cascadePersistCheckBox,
+ buildCascadePersistHolder(),
+ JpaHelpContextIds.ENTITY_ORM_CASCADE
+ );
+
+ // Schema widgets
+ addLabeledComposite(
+ container,
+ JptUiDetailsOrmMessages.PersistenceUnitMetadataComposite_schema,
+ addSchemaCombo(container),
+ JpaHelpContextIds.ENTITY_ORM_SCHEMA
+ );
+
+ // Catalog widgets
+ addLabeledComposite(
+ container,
+ JptUiDetailsOrmMessages.PersistenceUnitMetadataComposite_catalog,
+ addCatalogCombo(container),
+ JpaHelpContextIds.ENTITY_ORM_CATALOG
+ );
+
+ // Access Type widgets
+ addLabeledComposite(
+ container,
+ JptUiDetailsOrmMessages.PersistenceUnitMetadataComposite_access,
+ addAccessTypeCombo(container),
+ JpaHelpContextIds.ENTITY_ORM_ACCESS
+ );
+
+ // Delimited Identifiers check-box
+ Button diCheckBox = this.addCheckBox(
+ container,
+ JptUiDetailsOrmMessages.PersistenceUnitMetadataComposite_delimitedIdentifiersCheckBox,
+ this.buildDelimitedIdentifiersHolder(),
+ JpaHelpContextIds.ENTITY_ORM_DELIMITED_IDENTIFIERS
+ );
+
+ SWTTools.controlVisibleState(new Jpa2_0ProjectFlagModel<OrmPersistenceUnitMetadata>(this.getSubjectHolder()), diCheckBox);
+
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/UnsupportedOrmMappingUiDefinition.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/UnsupportedOrmMappingUiDefinition.java
new file mode 100644
index 0000000000..d4a0f788e0
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/orm/UnsupportedOrmMappingUiDefinition.java
@@ -0,0 +1,89 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2010 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.ui.internal.details.orm;
+
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.ui.internal.widgets.Pane;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.java.JavaAttributeMapping;
+import org.eclipse.jpt.jpa.ui.details.JpaComposite;
+import org.eclipse.jpt.jpa.ui.details.orm.OrmAttributeMappingUiDefinition;
+import org.eclipse.jpt.jpa.ui.details.orm.OrmXmlUiFactory;
+import org.eclipse.jpt.jpa.ui.internal.JpaMappingImageHelper;
+import org.eclipse.jpt.jpa.ui.internal.details.AbstractMappingUiDefinition;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.widgets.Composite;
+
+public class UnsupportedOrmMappingUiDefinition
+ extends AbstractMappingUiDefinition
+ implements OrmAttributeMappingUiDefinition
+{
+ // singleton
+ private static final UnsupportedOrmMappingUiDefinition INSTANCE =
+ new UnsupportedOrmMappingUiDefinition();
+
+
+ /**
+ * Return the singleton.
+ */
+ public static OrmAttributeMappingUiDefinition instance() {
+ return INSTANCE;
+ }
+
+
+ /**
+ * Ensure single instance.
+ */
+ private UnsupportedOrmMappingUiDefinition() {
+ super();
+ }
+
+
+ public Image getImage() {
+ return JpaMappingImageHelper.imageForAttributeMapping(getKey());
+ }
+
+ public String getLabel() {
+ return JptUiDetailsOrmMessages.UnsupportedOrmMappingUiProvider_label;
+ }
+
+ public String getLinkLabel() {
+ return JptUiDetailsOrmMessages.UnsupportedOrmMappingUiProvider_linkLabel;
+ }
+
+ public String getKey() {
+ return null;
+ }
+
+ public JpaComposite buildAttributeMappingComposite(
+ OrmXmlUiFactory factory,
+ PropertyValueModel subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+
+ return new NullComposite(subjectHolder, parent, widgetFactory);
+ }
+
+ public static class NullComposite extends Pane<JavaAttributeMapping>
+ implements JpaComposite
+ {
+ NullComposite(
+ PropertyValueModel<JavaAttributeMapping> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+
+ super(subjectHolder, parent, widgetFactory);
+ }
+
+
+ @Override
+ protected void initializeLayout(Composite container) {}
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/dialogs/AddPersistentAttributeToXmlAndMapDialog.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/dialogs/AddPersistentAttributeToXmlAndMapDialog.java
new file mode 100644
index 0000000000..b35e5c58e7
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/dialogs/AddPersistentAttributeToXmlAndMapDialog.java
@@ -0,0 +1,197 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2009 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.ui.internal.dialogs;
+
+import java.util.Comparator;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.dialogs.StatusDialog;
+import org.eclipse.jface.viewers.ComboViewer;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.IStructuredContentProvider;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jpt.common.utility.internal.ArrayTools;
+import org.eclipse.jpt.common.utility.internal.CollectionTools;
+import org.eclipse.jpt.common.utility.internal.iterators.FilteringIterator;
+import org.eclipse.jpt.jpa.core.context.ReadOnlyPersistentAttribute;
+import org.eclipse.jpt.jpa.core.context.orm.OrmReadOnlyPersistentAttribute;
+import org.eclipse.jpt.jpa.ui.JpaPlatformUi;
+import org.eclipse.jpt.jpa.ui.JptJpaUiPlugin;
+import org.eclipse.jpt.jpa.ui.details.MappingUiDefinition;
+import org.eclipse.jpt.jpa.ui.internal.JptUiMessages;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Text;
+import com.ibm.icu.text.Collator;
+
+public class AddPersistentAttributeToXmlAndMapDialog extends StatusDialog
+{
+ private OrmReadOnlyPersistentAttribute unmappedPersistentAttribute;
+ private Text attributeText;
+ private ComboViewer mappingCombo;
+
+ public AddPersistentAttributeToXmlAndMapDialog(Shell parentShell, OrmReadOnlyPersistentAttribute unmappedPersistentAttribute) {
+ super(parentShell);
+ this.unmappedPersistentAttribute = unmappedPersistentAttribute;
+ setTitle(JptUiMessages.AddPersistentAttributeDialog_title);
+ }
+
+ @Override
+ protected Control createDialogArea(Composite parent) {
+ Composite dialogArea = (Composite) super.createDialogArea(parent);
+
+ Composite composite = new Composite(dialogArea, SWT.NULL);
+ composite.setLayoutData(new GridData(GridData.FILL_BOTH));
+ composite.setLayout(new GridLayout());
+
+ createLabel(composite, 1, JptUiMessages.AddPersistentAttributeDialog_attributeLabel);
+
+ attributeText = createText(composite, 1);
+// attributeText.addModifyListener(
+// new ModifyListener() {
+// public void modifyText(ModifyEvent e) {
+// validate();
+// }
+// }
+// );
+ attributeText.setText(unmappedPersistentAttribute.getName());
+ attributeText.setEditable(false);
+
+ createLabel(composite, 1, JptUiMessages.AddPersistentClassDialog_mappingLabel);
+
+ mappingCombo = new ComboViewer(createCombo(composite, 1));
+ mappingCombo.getCombo().setFocus();
+ mappingCombo.setContentProvider(
+ new IStructuredContentProvider() {
+ public void dispose() {}
+
+ public Object[] getElements(Object inputElement) {
+ return ArrayTools.array(
+ CollectionTools.sort(
+ new FilteringIterator<MappingUiDefinition<ReadOnlyPersistentAttribute, ?>>(
+ ((JpaPlatformUi) inputElement).attributeMappingUiDefinitions(unmappedPersistentAttribute.getResourceType())) {
+ @Override
+ protected boolean accept(MappingUiDefinition<ReadOnlyPersistentAttribute, ?> o) {
+ return o.isEnabledFor(AddPersistentAttributeToXmlAndMapDialog.this.unmappedPersistentAttribute);
+ }
+ },
+ getProvidersComparator()));
+ }
+
+ public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {}
+ });
+ mappingCombo.setLabelProvider(
+ new LabelProvider() {
+ @Override
+ public String getText(Object element) {
+ return ((MappingUiDefinition) element).getLabel();
+ }
+ });
+ mappingCombo.addSelectionChangedListener(new ISelectionChangedListener() {
+ public void selectionChanged(SelectionChangedEvent event) {
+ validate();
+ }
+ });
+ JpaPlatformUi jpaPlatformUi = JptJpaUiPlugin.instance().getJpaPlatformUi(this.unmappedPersistentAttribute.getJpaProject().getJpaPlatform());
+ mappingCombo.setInput(jpaPlatformUi);
+ mappingCombo.getCombo().select(0); // select Basic to begin
+
+ // TODO - F1 Help
+ // PlatformUI.getWorkbench().getHelpSystem().setHelp(group, IDaliHelpContextIds.NEW_JPA_PROJECT_CONTENT_PAGE_DATABASE);
+
+ //getButton(IDialogConstants.OK_ID).setEnabled(false); // disabled to start
+ applyDialogFont(dialogArea);
+
+ validate();
+
+ return dialogArea;
+ }
+
+ protected Comparator<MappingUiDefinition> getProvidersComparator() {
+ return new Comparator<MappingUiDefinition>() {
+ public int compare(MappingUiDefinition item1, MappingUiDefinition item2) {
+ String displayString1 = item1.getLabel();
+ String displayString2 = item2.getLabel();
+ return Collator.getInstance().compare(displayString1, displayString2);
+ }
+ };
+ }
+
+ private Label createLabel(Composite container, int span, String text) {
+ Label label = new Label(container, SWT.NONE);
+ label.setText(text);
+ GridData gd = new GridData();
+ gd.horizontalSpan = span;
+ label.setLayoutData(gd);
+ return label;
+ }
+
+ private Text createText(Composite container, int span) {
+ Text text = new Text(container, SWT.BORDER | SWT.SINGLE);
+ GridData gd = new GridData(GridData.FILL_HORIZONTAL);
+ gd.horizontalSpan = span;
+ gd.widthHint = 250;
+ text.setLayoutData(gd);
+ return text;
+ }
+
+ private Combo createCombo(Composite container, int span) {
+ Combo combo = new Combo(container, SWT.BORDER | SWT.SINGLE | SWT.READ_ONLY);
+ GridData gd = new GridData(GridData.FILL_HORIZONTAL);
+ gd.horizontalSpan = span;
+ combo.setLayoutData(gd);
+ return combo;
+ }
+
+ public String getAttributeName() {
+ return attributeText.getText();
+ }
+
+ public String getMappingKey() {
+ StructuredSelection selection = (StructuredSelection) mappingCombo.getSelection();
+ return (selection.isEmpty()) ? null : ((MappingUiDefinition) selection.getFirstElement()).getKey();
+ }
+
+ private void validate() {
+// if (entityMappings.containsPersistentType(type)) {
+// updateStatus(
+// new Status(
+// IStatus.WARNING, JptJpaUiPlugin.PLUGIN_ID,
+// JptUiMessages.AddPersistentClassDialog_duplicateClassWarning));
+// return;
+// }
+//
+ String mappingKey = getMappingKey();
+ if (mappingKey == null) {
+ updateStatus(
+ new Status(
+ IStatus.ERROR, JptJpaUiPlugin.PLUGIN_ID,
+ JptUiMessages.AddPersistentAttributeDialog_noMappingKeyError));
+ return;
+ }
+
+ updateStatus(Status.OK_STATUS);
+ }
+
+ @Override
+ protected void okPressed() {
+ unmappedPersistentAttribute.convertToSpecified(getMappingKey());
+ super.okPressed();
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/dialogs/AddPersistentClassDialog.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/dialogs/AddPersistentClassDialog.java
new file mode 100644
index 0000000000..aa8ea3ab21
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/dialogs/AddPersistentClassDialog.java
@@ -0,0 +1,310 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2010 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.ui.internal.dialogs;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jdt.core.IJavaElement;
+import org.eclipse.jdt.core.IPackageFragmentRoot;
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.jdt.core.search.IJavaSearchScope;
+import org.eclipse.jdt.core.search.SearchEngine;
+import org.eclipse.jdt.internal.ui.refactoring.contentassist.ControlContentAssistHelper;
+import org.eclipse.jdt.internal.ui.refactoring.contentassist.JavaTypeCompletionProcessor;
+import org.eclipse.jdt.ui.IJavaElementSearchConstants;
+import org.eclipse.jdt.ui.JavaUI;
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.jface.dialogs.StatusDialog;
+import org.eclipse.jface.fieldassist.FieldDecorationRegistry;
+import org.eclipse.jface.viewers.ComboViewer;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.IStructuredContentProvider;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.window.Window;
+import org.eclipse.jpt.common.core.internal.utility.jdt.JDTTools;
+import org.eclipse.jpt.common.utility.internal.StringTools;
+import org.eclipse.jpt.jpa.core.JpaProject;
+import org.eclipse.jpt.jpa.core.context.orm.EntityMappings;
+import org.eclipse.jpt.jpa.core.context.orm.OrmPersistentType;
+import org.eclipse.jpt.jpa.ui.JptJpaUiPlugin;
+import org.eclipse.jpt.jpa.ui.details.MappingUiDefinition;
+import org.eclipse.jpt.jpa.ui.internal.JptUiMessages;
+import org.eclipse.jpt.jpa.ui.internal.details.orm.OrmEmbeddableUiDefinition;
+import org.eclipse.jpt.jpa.ui.internal.details.orm.OrmEntityUiDefinition;
+import org.eclipse.jpt.jpa.ui.internal.details.orm.OrmMappedSuperclassUiDefinition;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.dialogs.SelectionDialog;
+import org.eclipse.ui.progress.IProgressService;
+
+public class AddPersistentClassDialog extends StatusDialog
+{
+ private EntityMappings entityMappings;
+
+ private Text classText;
+
+ private Button classBrowseButton;
+
+ private ComboViewer mappingCombo;
+
+ private OrmPersistentType addedType;
+
+
+ public AddPersistentClassDialog(Shell parentShell, EntityMappings entityMappings) {
+ super(parentShell);
+ this.entityMappings = entityMappings;
+ setTitle(JptUiMessages.AddPersistentClassDialog_title);
+ }
+
+ @Override
+ protected Control createDialogArea(Composite parent) {
+ Composite dialogArea = (Composite) super.createDialogArea(parent);
+
+ Composite composite = new Composite(dialogArea, SWT.NULL);
+ composite.setLayoutData(new GridData(GridData.FILL_BOTH));
+ composite.setLayout(new GridLayout(3, false));
+
+ createLabel(composite, JptUiMessages.AddPersistentClassDialog_classLabel);
+
+ this.classText = createText(composite);
+ this.classText.addModifyListener(
+ new ModifyListener() {
+ public void modifyText(ModifyEvent e) {
+ validate();
+ }
+ }
+ );
+
+ this.classBrowseButton = createButton(composite, JptUiMessages.General_browse);
+ this.classBrowseButton.addSelectionListener(new SelectionListener() {
+ public void widgetSelected(SelectionEvent e) {
+ IType type = chooseType();
+ if (type != null) {
+ classText.setText(type.getFullyQualifiedName('$'));
+ }
+ }
+ public void widgetDefaultSelected(SelectionEvent e) {
+ widgetSelected(e);
+ }
+ });
+
+ createLabel(composite, JptUiMessages.AddPersistentClassDialog_mappingLabel);
+
+ this.mappingCombo = new ComboViewer(createCombo(composite, 2));
+ this.mappingCombo.setContentProvider(
+ new IStructuredContentProvider() {
+ public void dispose() {}
+
+ public Object[] getElements(Object inputElement) {
+ return new Object[] {
+ OrmMappedSuperclassUiDefinition.instance(),
+ OrmEntityUiDefinition.instance(),
+ OrmEmbeddableUiDefinition.instance()
+ };
+ }
+
+ public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {}
+ });
+ this.mappingCombo.setLabelProvider(
+ new LabelProvider() {
+ @Override
+ public String getText(Object element) {
+ return ((MappingUiDefinition) element).getLabel();
+ }
+ });
+ this.mappingCombo.addSelectionChangedListener(new ISelectionChangedListener() {
+ public void selectionChanged(SelectionChangedEvent event) {
+ validate();
+ }
+ });
+ this.mappingCombo.setInput("FOO");
+ this.mappingCombo.getCombo().select(1); // select Entity to begin
+
+ // TODO - F1 Help
+ // PlatformUI.getWorkbench().getHelpSystem().setHelp(group, IDaliHelpContextIds.NEW_JPA_PROJECT_CONTENT_PAGE_DATABASE);
+
+ //getButton(IDialogConstants.OK_ID).setEnabled(false); // disabled to start
+ applyDialogFont(dialogArea);
+
+ validate();
+
+ return dialogArea;
+ }
+
+ private Label createLabel(Composite container, String text) {
+ Label label = new Label(container, SWT.NONE);
+ label.setText(text);
+ return label;
+ }
+
+ private Text createText(Composite container) {
+ // TODO bug 156185 - when this is fixed there should be api for this
+ JavaTypeCompletionProcessor javaTypeCompletionProcessor = new JavaTypeCompletionProcessor(false, false);
+ IPackageFragmentRoot pfr = getPackageFragmentRoot();
+ if (pfr != null) {
+ javaTypeCompletionProcessor.setPackageFragment(pfr.getPackageFragment(""));
+ }
+
+ Text text = new Text(container, SWT.BORDER | SWT.SINGLE);
+
+ ControlContentAssistHelper.createTextContentAssistant(
+ text,
+ javaTypeCompletionProcessor
+ );
+
+ text.setLayoutData(getFieldGridData());
+ return text;
+ }
+
+ protected GridData getFieldGridData() {
+ int margin = FieldDecorationRegistry.getDefault()
+ .getMaximumDecorationWidth();
+ GridData data = new GridData();
+ data.horizontalAlignment = SWT.FILL;
+ data.widthHint = IDialogConstants.ENTRY_FIELD_WIDTH + margin;
+ data.horizontalIndent = margin;
+ data.grabExcessHorizontalSpace = true;
+ return data;
+ }
+
+ protected IPackageFragmentRoot getPackageFragmentRoot() {
+ return JDTTools.getCodeCompletionContextRoot(getJpaProject().getJavaProject());
+ }
+
+
+ private Button createButton(Composite container, String text) {
+ Button button = new Button(container, SWT.NONE);
+ button.setText(text);
+ return button;
+ }
+
+ private Combo createCombo(Composite container, int span) {
+ Combo combo = new Combo(container, SWT.BORDER | SWT.SINGLE | SWT.READ_ONLY);
+ GridData gd = getFieldGridData();
+ gd.horizontalSpan = span;
+ combo.setLayoutData(gd);
+ return combo;
+ }
+
+ private JpaProject getJpaProject() {
+ return this.entityMappings.getJpaProject();
+ }
+
+ public String getClassName() {
+ return this.classText.getText();
+ }
+
+ public String getMappingKey() {
+ StructuredSelection selection = (StructuredSelection) this.mappingCombo.getSelection();
+ return (selection.isEmpty()) ? null : ((MappingUiDefinition) selection.getFirstElement()).getKey();
+ }
+
+ protected IType chooseType() {
+ IJavaElement[] elements= new IJavaElement[] { getJpaProject().getJavaProject() };
+ IJavaSearchScope scope= SearchEngine.createJavaSearchScope(elements);
+ IProgressService service = PlatformUI.getWorkbench().getProgressService();
+
+ SelectionDialog typeSelectionDialog;
+ try {
+ typeSelectionDialog =
+ JavaUI.createTypeDialog(
+ getShell(), service, scope,
+ IJavaElementSearchConstants.CONSIDER_CLASSES,
+ false, getClassName());
+ }
+ catch (JavaModelException e) {
+ JptJpaUiPlugin.log(e);
+ throw new RuntimeException(e);
+ }
+ typeSelectionDialog.setTitle(JptUiMessages.AddPersistentClassDialog_classDialog_title);
+ typeSelectionDialog.setMessage(JptUiMessages.AddPersistentClassDialog_classDialog_message);
+
+ if (typeSelectionDialog.open() == Window.OK) {
+ return (IType) typeSelectionDialog.getResult()[0];
+ }
+ return null;
+ }
+
+ private void validate() {
+ String className = getClassName();
+
+ if (StringTools.stringIsEmpty(className)) {
+ updateStatus(
+ new Status(
+ IStatus.ERROR, JptJpaUiPlugin.PLUGIN_ID,
+ JptUiMessages.AddPersistentClassDialog_noClassError));
+ return;
+ }
+ className = className.replace('$', '.');
+
+ IType type;
+ try {
+ type = getJpaProject().getJavaProject().findType(className);
+ }
+ catch (JavaModelException jme) {
+ type = null;
+ }
+
+ if (type == null) {
+ updateStatus(
+ new Status(
+ IStatus.WARNING, JptJpaUiPlugin.PLUGIN_ID,
+ JptUiMessages.AddPersistentClassDialog_classNotFoundWarning));
+ return;
+ }
+
+ if (this.entityMappings.containsPersistentType(className)) {
+ updateStatus(
+ new Status(
+ IStatus.WARNING, JptJpaUiPlugin.PLUGIN_ID,
+ JptUiMessages.AddPersistentClassDialog_duplicateClassWarning));
+ return;
+ }
+
+ String mappingKey = getMappingKey();
+ if (mappingKey == null) {
+ updateStatus(
+ new Status(
+ IStatus.ERROR, JptJpaUiPlugin.PLUGIN_ID,
+ JptUiMessages.AddPersistentClassDialog_noMappingKeyError));
+ return;
+ }
+
+ updateStatus(Status.OK_STATUS);
+ }
+
+ @Override
+ protected void okPressed() {
+ this.addedType = this.entityMappings.addPersistentType(getMappingKey(), getClassName());
+ super.okPressed();
+ }
+
+ public OrmPersistentType openAndReturnType() {
+ super.open();
+ return addedType;
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/editors/PersistenceContributor.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/editors/PersistenceContributor.java
new file mode 100644
index 0000000000..4b2661a898
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/editors/PersistenceContributor.java
@@ -0,0 +1,106 @@
+/*******************************************************************************
+ * Copyright (c) 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.jpa.ui.internal.editors;
+
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.action.IMenuManager;
+import org.eclipse.jface.action.IToolBarManager;
+import org.eclipse.ui.IActionBars;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.actions.ActionFactory;
+import org.eclipse.ui.ide.IDEActionFactory;
+import org.eclipse.ui.part.MultiPageEditorActionBarContributor;
+import org.eclipse.ui.texteditor.ITextEditor;
+import org.eclipse.ui.texteditor.ITextEditorActionConstants;
+
+/**
+ *
+ * @version 2.0
+ * @since 2.0
+ */
+public class PersistenceContributor extends MultiPageEditorActionBarContributor {
+
+ private IEditorPart activeEditorPart;
+
+ /**
+ * Creates a new <code>PersistenceContributor</code>.
+ */
+ public PersistenceContributor() {
+ super();
+ }
+
+ /*
+ * (non-Javadoc)
+ */
+ @Override
+ public void contributeToMenu(IMenuManager manager) {
+ }
+
+ /*
+ * (non-Javadoc)
+ */
+ @Override
+ public void contributeToToolBar(IToolBarManager manager) {
+ }
+
+ /**
+ * Returns the action registed with the given text editor.
+ * @return IAction or null if editor is null.
+ */
+ protected IAction getAction(ITextEditor editor, String actionID) {
+ return (editor == null ? null : editor.getAction(actionID));
+ }
+
+ /*
+ * (non-Javadoc)
+ */
+ @Override
+ public void setActivePage(IEditorPart part) {
+
+ if (activeEditorPart == part)
+ return;
+
+ activeEditorPart = part;
+
+ IActionBars actionBars = getActionBars();
+ if (actionBars != null) {
+
+ ITextEditor editor = (part instanceof ITextEditor) ? (ITextEditor) part : null;
+
+ actionBars.setGlobalActionHandler(
+ ActionFactory.DELETE.getId(),
+ getAction(editor, ITextEditorActionConstants.DELETE));
+ actionBars.setGlobalActionHandler(
+ ActionFactory.UNDO.getId(),
+ getAction(editor, ITextEditorActionConstants.UNDO));
+ actionBars.setGlobalActionHandler(
+ ActionFactory.REDO.getId(),
+ getAction(editor, ITextEditorActionConstants.REDO));
+ actionBars.setGlobalActionHandler(
+ ActionFactory.CUT.getId(),
+ getAction(editor, ITextEditorActionConstants.CUT));
+ actionBars.setGlobalActionHandler(
+ ActionFactory.COPY.getId(),
+ getAction(editor, ITextEditorActionConstants.COPY));
+ actionBars.setGlobalActionHandler(
+ ActionFactory.PASTE.getId(),
+ getAction(editor, ITextEditorActionConstants.PASTE));
+ actionBars.setGlobalActionHandler(
+ ActionFactory.SELECT_ALL.getId(),
+ getAction(editor, ITextEditorActionConstants.SELECT_ALL));
+ actionBars.setGlobalActionHandler(
+ ActionFactory.FIND.getId(),
+ getAction(editor, ITextEditorActionConstants.FIND));
+ actionBars.setGlobalActionHandler(
+ IDEActionFactory.BOOKMARK.getId(),
+ getAction(editor, IDEActionFactory.BOOKMARK.getId()));
+ actionBars.updateActionBars();
+ }
+ }
+} \ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/editors/PersistenceEditor.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/editors/PersistenceEditor.java
new file mode 100644
index 0000000000..4e9418bbf1
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/editors/PersistenceEditor.java
@@ -0,0 +1,436 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 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.ui.internal.editors;
+
+import java.util.ListIterator;
+
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IToolBarManager;
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.jface.resource.LocalResourceManager;
+import org.eclipse.jface.resource.ResourceManager;
+import org.eclipse.jpt.common.core.JptResourceType;
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.ui.internal.widgets.FormWidgetFactory;
+import org.eclipse.jpt.common.utility.internal.model.value.CachingTransformationPropertyValueModel;
+import org.eclipse.jpt.common.utility.internal.model.value.ListAspectAdapter;
+import org.eclipse.jpt.common.utility.internal.model.value.ListPropertyValueModelAdapter;
+import org.eclipse.jpt.common.utility.internal.model.value.PropertyAspectAdapter;
+import org.eclipse.jpt.common.utility.internal.model.value.SimplePropertyValueModel;
+import org.eclipse.jpt.common.utility.internal.model.value.TransformationPropertyValueModel;
+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.core.JpaProject;
+import org.eclipse.jpt.jpa.core.JptJpaCorePlugin;
+import org.eclipse.jpt.jpa.core.context.JpaRootContextNode;
+import org.eclipse.jpt.jpa.core.context.persistence.Persistence;
+import org.eclipse.jpt.jpa.core.context.persistence.PersistenceUnit;
+import org.eclipse.jpt.jpa.core.context.persistence.PersistenceXml;
+import org.eclipse.jpt.jpa.ui.JpaPlatformUi;
+import org.eclipse.jpt.jpa.ui.PersistenceXmlResourceUiDefinition;
+import org.eclipse.jpt.jpa.ui.details.JpaPageComposite;
+import org.eclipse.jpt.jpa.ui.internal.persistence.JptUiPersistenceMessages;
+import org.eclipse.jpt.jpa.ui.internal.platform.JpaPlatformUiRegistry;
+import org.eclipse.swt.custom.BusyIndicator;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IEditorSite;
+import org.eclipse.ui.IFileEditorInput;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.forms.IManagedForm;
+import org.eclipse.ui.forms.editor.FormEditor;
+import org.eclipse.ui.forms.editor.FormPage;
+import org.eclipse.ui.forms.widgets.ScrolledForm;
+import org.eclipse.ui.forms.widgets.TableWrapData;
+import org.eclipse.ui.forms.widgets.TableWrapLayout;
+import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetWidgetFactory;
+import org.eclipse.wst.sse.ui.StructuredTextEditor;
+
+/**
+ * This is the editor for the JPA Persistence Configuration (persistence.xml).
+ * The pages shown before the XML source editor are retrieved from the
+ * <code>JpaUiFactory</code>.
+ *
+ * @see JpaUiFactory
+ *
+ * @version 2.3
+ * @since 2.0
+ */
+@SuppressWarnings("nls")
+public class PersistenceEditor extends FormEditor
+{
+ /**
+ * The XML text editor.
+ */
+ private StructuredTextEditor editor;
+
+ /**
+ * The root of the holders used to retrieve the persistence unit and be
+ * notified when it changes.
+ */
+ private WritablePropertyValueModel<IFileEditorInput> editorInputHolder;
+
+ /**
+ * The factory used to create the various widgets.
+ */
+ private WidgetFactory widgetFactory;
+
+ private final ResourceManager resourceManager;
+
+ /**
+ * Creates a new <code>PersistenceEditor</code>.
+ */
+ public PersistenceEditor() {
+ super();
+ this.resourceManager = new LocalResourceManager(JFaceResources.getResources());
+ initialize();
+ }
+
+ @Override
+ @SuppressWarnings("unchecked")
+ public Object getAdapter(Class adapterClass) {
+ Object adapter = super.getAdapter(adapterClass);
+ if (adapter == null) {
+ adapter = editor.getAdapter(adapterClass);
+ }
+ return adapter;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ protected void addPages() {
+ addPersistenceUnitPages();
+ addXMLEditorPage();
+ }
+
+ /**
+ * Adds the pages that show the properties of the persistence configuration
+ * or its persistence units.
+ */
+ private void addPersistenceUnitPages() {
+
+ JpaProject jpaProject = getJpaProject();
+
+ // The project doesn't have JPA
+ if (jpaProject == null) {
+ return;
+ }
+
+ PersistenceXml persistenceXml = jpaProject.getRootContextNode().getPersistenceXml();
+ if (persistenceXml == null) {
+ return;
+ }
+ JptResourceType resourceType = persistenceXml.getResourceType();
+ if (resourceType == null) {
+ return; // might not ever get here... (if we have a p.xml, it probably has a resource type...)
+ }
+ String platformId = jpaProject.getJpaPlatform().getId();
+ JpaPlatformUi jpaPlatformUI = JpaPlatformUiRegistry.instance().getJpaPlatformUi(platformId);
+ PersistenceXmlResourceUiDefinition definition =
+ (PersistenceXmlResourceUiDefinition) jpaPlatformUI.getResourceUiDefinition(resourceType);
+
+ ListIterator<JpaPageComposite> pages = definition.buildPersistenceUnitComposites(
+ buildPersistenceUnitHolder(),
+ getContainer(),
+ this.widgetFactory
+ );
+
+ while (pages.hasNext()) {
+ JpaPageComposite page = pages.next();
+
+ try {
+ FormPage formPage = new Page(page);
+ addPage(formPage);
+ }
+ catch (PartInitException e) {
+ // TODO
+ }
+ }
+ }
+
+ /**
+ * Adds the page containing the XML editor.
+ */
+ private void addXMLEditorPage() {
+ try {
+ editor = new StructuredTextEditor();
+ editor.setEditorPart(this);
+ int index = addPage(editor, getEditorInput());
+ setPageText(index, JptUiPersistenceMessages.PersistenceEditor_sourceTab);
+ }
+ catch (PartInitException e) {
+ // TODO
+ }
+ }
+
+ private WritablePropertyValueModel<IFileEditorInput> buildEditorInputHolder() {
+ return new SimplePropertyValueModel<IFileEditorInput>();
+ }
+
+ private PropertyValueModel<JpaProject> buildJpaProjectHolder() {
+ return new CachingTransformationPropertyValueModel<IFileEditorInput, JpaProject>(this.editorInputHolder) {
+ @Override
+ protected JpaProject transform_(IFileEditorInput fileEditorInput) {
+ return JptJpaCorePlugin.getJpaProject(fileEditorInput.getFile().getProject());
+ }
+ };
+ }
+
+ private PropertyValueModel<Persistence> buildPersistenceHolder() {
+ return new PropertyAspectAdapter<PersistenceXml, Persistence>(buildPersistenceXmlHolder(), PersistenceXml.PERSISTENCE_PROPERTY) {
+ @Override
+ protected Persistence buildValue_() {
+ return subject.getPersistence();
+ }
+ };
+ }
+
+ private PropertyValueModel<PersistenceUnit> buildPersistenceUnitHolder() {
+ return new ListPropertyValueModelAdapter<PersistenceUnit>(buildPersistenceUnitListHolder()) {
+ @Override
+ protected PersistenceUnit buildValue() {
+ return listHolder.size() > 0 ? (PersistenceUnit) listHolder.get(0) : null;
+ }
+ };
+ }
+
+ private ListValueModel<PersistenceUnit> buildPersistenceUnitListHolder() {
+ return new ListAspectAdapter<Persistence, PersistenceUnit>(buildPersistenceHolder(), Persistence.PERSISTENCE_UNITS_LIST) {
+ @Override
+ protected ListIterator<PersistenceUnit> listIterator_() {
+ return subject.persistenceUnits();
+ }
+
+ @Override
+ protected int size_() {
+ return subject.persistenceUnitsSize();
+ }
+ };
+ }
+
+ private PropertyValueModel<PersistenceXml> buildPersistenceXmlHolder() {
+ return new PropertyAspectAdapter<JpaRootContextNode, PersistenceXml>(buildRootContextNodeHolder(), JpaRootContextNode.PERSISTENCE_XML_PROPERTY) {
+ @Override
+ protected PersistenceXml buildValue_() {
+ return subject.getPersistenceXml();
+ }
+ };
+ }
+
+ private PropertyValueModel<JpaRootContextNode> buildRootContextNodeHolder() {
+ return new TransformationPropertyValueModel<JpaProject, JpaRootContextNode>(buildJpaProjectHolder()) {
+ @Override
+ protected JpaRootContextNode transform_(JpaProject value) {
+ return value.getRootContextNode();
+ }
+ };
+ }
+
+ private WidgetFactory buildWidgetFactory() {
+ return new FormWidgetFactory(
+ new TabbedPropertySheetWidgetFactory()
+ );
+ }
+
+ @Override
+ public void dispose() {
+ this.editorInputHolder.setValue(null);
+ this.resourceManager.dispose();
+ super.dispose();
+ }
+
+ @Override
+ public void doSave(IProgressMonitor monitor) {
+ getEditor(getPageCount() - 1).doSave(monitor);
+ }
+
+ @Override
+ public void doSaveAs() {
+ }
+
+ @Override
+ public IFileEditorInput getEditorInput() {
+ return (IFileEditorInput) super.getEditorInput();
+ }
+
+ @Override
+ public void init(IEditorSite site, IEditorInput editorInput) throws PartInitException {
+ Assert.isLegal(editorInput instanceof IFileEditorInput, "Invalid Input: Must be IFileEditorInput");
+ super.init(site, editorInput);
+
+ setPartName(editorInput.getName());
+ editorInputHolder.setValue(getEditorInput());
+ }
+
+ /**
+ * Initializes this multi-page editor.
+ */
+ private void initialize() {
+
+ widgetFactory = buildWidgetFactory();
+ editorInputHolder = buildEditorInputHolder();
+ }
+
+ @Override
+ public boolean isSaveAsAllowed() {
+ return false;
+ }
+
+ /**
+ * Retrieves the JPA project associated with the project owning the editor
+ * intput file.
+ *
+ * @return The JPA project
+ */
+ protected JpaProject getJpaProject() {
+ return JptJpaCorePlugin.getJpaProject(getEditorInput().getFile().getProject());
+ }
+
+ /**
+ * This extension over <code>FormPage</code> simply complete the layout by
+ * using the <code>JpaPageComposite</code>'s control as its form content.
+ */
+ private class Page extends FormPage {
+
+ /**
+ * The wrapped page that actually contains the widgets to show with this
+ * form page.
+ */
+ private final JpaPageComposite page;
+
+ private ImageDescriptor imageDescriptor;
+
+ /**
+ * Creates a new <code>Page</code>.
+ *
+ * @param page The wrapped <code>JpaPageComposite</code>
+ */
+ private Page(JpaPageComposite page) {
+
+ super(PersistenceEditor.this,
+ page.getClass().getName(),
+ page.getPageText());
+
+ this.page = page;
+ }
+
+ @Override
+ protected void createFormContent(IManagedForm managedForm) {
+
+ ScrolledForm form = managedForm.getForm();
+ managedForm.getToolkit().decorateFormHeading(form.getForm());
+
+ // Update the text and image
+ updateForm(form);
+
+ // Update the layout
+ updateBody(form);
+
+ // This will finish the initialization of the buttons
+ updateHelpButton();
+ form.updateToolBar();
+ }
+
+ @Override
+ public void dispose() {
+ this.page.dispose();
+ if (this.imageDescriptor != null) {
+ PersistenceEditor.this.resourceManager.destroyImage(this.imageDescriptor);
+ }
+ super.dispose();
+ }
+
+ @Override
+ public void setFocus() {
+ this.page.getControl().setFocus();
+ }
+
+ /**
+ * Adds the page's control to this page.
+ *
+ * @param form The form containing the composite with which the page's
+ * control is parented
+ */
+ private void updateBody(ScrolledForm form) {
+
+ Composite body = form.getBody();
+
+ body.setLayout(new TableWrapLayout());
+
+ TableWrapData wrapData = new TableWrapData(
+ TableWrapData.FILL_GRAB,
+ TableWrapData.FILL_GRAB
+ );
+
+ this.page.getControl().setLayoutData(wrapData);
+ this.page.getControl().setParent(body);
+ }
+
+ /**
+ * Updates the text and image of the form.
+ *
+ * @param form The form to have its title bar updated by setting the text
+ * and image, the image can be <code>null</code>
+ */
+ private void updateForm(ScrolledForm form) {
+ form.setText(this.page.getPageText());
+
+ this.imageDescriptor = this.page.getPageImageDescriptor();
+ if (this.imageDescriptor != null) {
+ form.setImage(PersistenceEditor.this.resourceManager.createImage(this.imageDescriptor));
+ }
+ }
+
+ /**
+ * Adds a help button to the page's toolbar if a help ID exists.
+ */
+ private void updateHelpButton() {
+
+ String helpID = this.page.getHelpID();
+
+ if (helpID != null) {
+ Action helpAction = new HelpAction(helpID);
+
+ ScrolledForm form = getManagedForm().getForm();
+ IToolBarManager manager = form.getToolBarManager();
+ manager.add(helpAction);
+ }
+ }
+
+ private class HelpAction extends Action {
+
+ private final String helpID;
+
+ HelpAction(String helpID) {
+ super(JptUiPersistenceMessages.PersistenceEditor_page_help,
+ JFaceResources.getImageRegistry().getDescriptor(Dialog.DLG_IMG_HELP));
+
+ this.helpID = helpID;
+ }
+
+ @Override
+ public void run() {
+ BusyIndicator.showWhile(getManagedForm().getForm().getDisplay(), new Runnable() {
+ public void run() {
+ PlatformUI.getWorkbench().getHelpSystem().displayHelp(helpID);
+ }
+ });
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jface/JarFileItemLabelProvider.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jface/JarFileItemLabelProvider.java
new file mode 100644
index 0000000000..79033cccc8
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jface/JarFileItemLabelProvider.java
@@ -0,0 +1,47 @@
+/*******************************************************************************
+ * Copyright (c) 2009 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.ui.internal.jface;
+
+import org.eclipse.jpt.common.ui.internal.jface.AbstractItemLabelProvider;
+import org.eclipse.jpt.common.ui.jface.DelegatingContentAndLabelProvider;
+import org.eclipse.jpt.common.utility.internal.model.value.StaticPropertyValueModel;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.java.JarFile;
+import org.eclipse.jpt.jpa.ui.JptJpaUiPlugin;
+import org.eclipse.jpt.jpa.ui.internal.JptUiIcons;
+import org.eclipse.swt.graphics.Image;
+
+public class JarFileItemLabelProvider extends AbstractItemLabelProvider
+{
+ public JarFileItemLabelProvider(
+ JarFile jarFile, DelegatingContentAndLabelProvider labelProvider) {
+ super(jarFile, labelProvider);
+ }
+
+
+ @Override
+ protected PropertyValueModel<Image> buildImageModel() {
+ return new StaticPropertyValueModel<Image>(JptJpaUiPlugin.getImage(JptUiIcons.JAR_FILE));
+ }
+
+ @Override
+ protected PropertyValueModel<String> buildTextModel() {
+ return new StaticPropertyValueModel<String>(((JarFile) model()).getResource().getName());
+ }
+
+ @Override
+ protected PropertyValueModel<String> buildDescriptionModel() {
+ JarFile jarFile = (JarFile) model();
+ return new StaticPropertyValueModel<String>(
+ jarFile.getResource().getName()
+ + " - " + jarFile.getResource().getParent().getFullPath().makeRelative().toString());
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jface/XmlMappingFileViewerFilter.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jface/XmlMappingFileViewerFilter.java
new file mode 100644
index 0000000000..b9f63a083e
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jface/XmlMappingFileViewerFilter.java
@@ -0,0 +1,78 @@
+/*******************************************************************************
+ * Copyright (c) 2009 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.ui.internal.jface;
+
+import org.eclipse.core.resources.IContainer;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerFilter;
+import org.eclipse.jpt.common.core.JptCommonCorePlugin;
+import org.eclipse.jpt.jpa.core.JpaFile;
+import org.eclipse.jpt.jpa.core.JpaProject;
+import org.eclipse.jpt.jpa.core.JptJpaCorePlugin;
+import org.eclipse.jpt.jpa.ui.JptJpaUiPlugin;
+
+/**
+ * This filter will deny showing any file that are not XML mapping files or folders
+ * that don't contain any XML mapping files in its sub-hierarchy. An XML mapping
+ * file is one that has a corresponding JpaFile in the project with a mapping file
+ * content type.
+ * @see JptJpaCorePlugin.MAPPING_FILE_CONTENT_TYPE
+ */
+public class XmlMappingFileViewerFilter
+ extends ViewerFilter {
+
+ private final JpaProject jpaProject;
+
+
+ public XmlMappingFileViewerFilter(JpaProject jpaProject) {
+ super();
+ this.jpaProject = jpaProject;
+ }
+
+
+ @Override
+ public boolean select(Viewer viewer, Object parentElement, Object element) {
+
+ if (element instanceof IFile) {
+ return isMappingFile((IFile) element);
+ }
+ else if (element instanceof IContainer) {
+ IContainer container = (IContainer) element;
+ IProject project = this.jpaProject.getProject();
+ if (JptCommonCorePlugin.getResourceLocator(project).acceptResourceLocation(project, container)) {
+ try {
+ for (IResource resource : container.members()) {
+ if (select(viewer, container, resource)) {
+ return true;
+ }
+ }
+ }
+ catch (CoreException ce) {
+ // fall through
+ JptJpaUiPlugin.log(ce);
+ }
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Determines whether the given file (an XML file) is a JPA mapping
+ * descriptor file.
+ */
+ private boolean isMappingFile(IFile file) {
+ JpaFile jpaFile = this.jpaProject.getJpaFile(file);
+ return jpaFile != null ? jpaFile.getContentType().isKindOf(JptJpaCorePlugin.MAPPING_FILE_CONTENT_TYPE): false;
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/Generic2_0JpaPlatformUiProvider.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/Generic2_0JpaPlatformUiProvider.java
new file mode 100644
index 0000000000..49c0736364
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/Generic2_0JpaPlatformUiProvider.java
@@ -0,0 +1,77 @@
+/*******************************************************************************
+ * Copyright (c) 2009 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.ui.internal.jpa2;
+
+import java.util.List;
+import org.eclipse.jpt.jpa.ui.JpaPlatformUiProvider;
+import org.eclipse.jpt.jpa.ui.ResourceUiDefinition;
+import org.eclipse.jpt.jpa.ui.details.JpaDetailsProvider;
+import org.eclipse.jpt.jpa.ui.internal.AbstractJpaPlatformUiProvider;
+import org.eclipse.jpt.jpa.ui.internal.details.java.JavaPersistentAttributeDetailsProvider;
+import org.eclipse.jpt.jpa.ui.internal.details.java.JavaPersistentTypeDetailsProvider;
+import org.eclipse.jpt.jpa.ui.internal.details.orm.EntityMappingsDetailsProvider;
+import org.eclipse.jpt.jpa.ui.internal.details.orm.OrmPersistentAttributeDetailsProvider;
+import org.eclipse.jpt.jpa.ui.internal.details.orm.OrmPersistentTypeDetailsProvider;
+import org.eclipse.jpt.jpa.ui.internal.details.orm.OrmXmlUiDefinition;
+import org.eclipse.jpt.jpa.ui.internal.jpa2.details.java.Generic2_0JavaResourceUiDefinition;
+import org.eclipse.jpt.jpa.ui.internal.jpa2.details.orm.EntityMappings2_0DetailsProvider;
+import org.eclipse.jpt.jpa.ui.internal.jpa2.details.orm.OrmXml2_0UiDefinition;
+import org.eclipse.jpt.jpa.ui.internal.jpa2.persistence.PersistenceXml2_0UiDefinition;
+import org.eclipse.jpt.jpa.ui.internal.persistence.details.PersistenceXmlUiDefinition;
+
+/**
+ * All the state in the JPA platform should be "static" (i.e. unchanging once
+ * it is initialized).
+ */
+public class Generic2_0JpaPlatformUiProvider extends AbstractJpaPlatformUiProvider
+{
+
+ // singleton
+ private static final JpaPlatformUiProvider INSTANCE = new Generic2_0JpaPlatformUiProvider();
+
+ /**
+ * Return the singleton.
+ */
+ public static JpaPlatformUiProvider instance() {
+ return INSTANCE;
+ }
+
+ /**
+ * Ensure single instance.
+ */
+ private Generic2_0JpaPlatformUiProvider() {
+ super();
+ }
+
+
+ // ********** details providers **********
+
+ @Override
+ protected void addDetailsProvidersTo(List<JpaDetailsProvider> providers) {
+ providers.add(JavaPersistentTypeDetailsProvider.instance());
+ providers.add(JavaPersistentAttributeDetailsProvider.instance());
+ providers.add(EntityMappingsDetailsProvider.instance());
+ providers.add(OrmPersistentTypeDetailsProvider.instance());
+ providers.add(OrmPersistentAttributeDetailsProvider.instance());
+ providers.add(EntityMappings2_0DetailsProvider.instance());
+ }
+
+
+ // ********** resource ui definitions **********
+
+ @Override
+ protected void addResourceUiDefinitionsTo(List<ResourceUiDefinition> definitions) {
+ definitions.add(Generic2_0JavaResourceUiDefinition.instance());
+ definitions.add(OrmXmlUiDefinition.instance());
+ definitions.add(OrmXml2_0UiDefinition.instance());
+ definitions.add(PersistenceXmlUiDefinition.instance());
+ definitions.add(PersistenceXml2_0UiDefinition.instance());
+ }
+} \ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/GenericOrmXml2_0UiFactory.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/GenericOrmXml2_0UiFactory.java
new file mode 100644
index 0000000000..91409a7de4
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/GenericOrmXml2_0UiFactory.java
@@ -0,0 +1,147 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2010 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.ui.internal.jpa2;
+
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.orm.OrmBasicMapping;
+import org.eclipse.jpt.jpa.core.context.orm.OrmEmbeddedIdMapping;
+import org.eclipse.jpt.jpa.core.context.orm.OrmEmbeddedMapping;
+import org.eclipse.jpt.jpa.core.context.orm.OrmEntity;
+import org.eclipse.jpt.jpa.core.context.orm.OrmIdMapping;
+import org.eclipse.jpt.jpa.core.context.orm.OrmManyToManyMapping;
+import org.eclipse.jpt.jpa.core.context.orm.OrmManyToOneMapping;
+import org.eclipse.jpt.jpa.core.context.orm.OrmOneToManyMapping;
+import org.eclipse.jpt.jpa.core.context.orm.OrmOneToOneMapping;
+import org.eclipse.jpt.jpa.core.context.orm.OrmTransientMapping;
+import org.eclipse.jpt.jpa.core.context.orm.OrmVersionMapping;
+import org.eclipse.jpt.jpa.core.jpa2.context.orm.OrmElementCollectionMapping2_0;
+import org.eclipse.jpt.jpa.ui.details.JpaComposite;
+import org.eclipse.jpt.jpa.ui.internal.details.TransientMappingComposite;
+import org.eclipse.jpt.jpa.ui.internal.details.orm.BaseOrmXmlUiFactory;
+import org.eclipse.jpt.jpa.ui.internal.jpa2.details.orm.OrmBasicMapping2_0Composite;
+import org.eclipse.jpt.jpa.ui.internal.jpa2.details.orm.OrmElementCollectionMapping2_0Composite;
+import org.eclipse.jpt.jpa.ui.internal.jpa2.details.orm.OrmEmbeddedIdMapping2_0Composite;
+import org.eclipse.jpt.jpa.ui.internal.jpa2.details.orm.OrmEmbeddedMapping2_0Composite;
+import org.eclipse.jpt.jpa.ui.internal.jpa2.details.orm.OrmEntity2_0Composite;
+import org.eclipse.jpt.jpa.ui.internal.jpa2.details.orm.OrmIdMapping2_0Composite;
+import org.eclipse.jpt.jpa.ui.internal.jpa2.details.orm.OrmManyToManyMapping2_0Composite;
+import org.eclipse.jpt.jpa.ui.internal.jpa2.details.orm.OrmManyToOneMapping2_0Composite;
+import org.eclipse.jpt.jpa.ui.internal.jpa2.details.orm.OrmOneToManyMapping2_0Composite;
+import org.eclipse.jpt.jpa.ui.internal.jpa2.details.orm.OrmOneToOneMapping2_0Composite;
+import org.eclipse.jpt.jpa.ui.internal.jpa2.details.orm.OrmVersionMapping2_0Composite;
+import org.eclipse.jpt.jpa.ui.jpa2.details.orm.OrmXmlUiFactory2_0;
+import org.eclipse.swt.widgets.Composite;
+
+public class GenericOrmXml2_0UiFactory
+ extends BaseOrmXmlUiFactory
+ implements OrmXmlUiFactory2_0
+{
+ // **************** orm type mapping composites ****************************
+
+ @Override
+ public JpaComposite createOrmEntityComposite(
+ PropertyValueModel<OrmEntity> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+ return new OrmEntity2_0Composite(subjectHolder, parent, widgetFactory);
+ }
+
+
+ // **************** orm attribute mapping composites ***********************
+
+ @Override
+ public JpaComposite createOrmIdMappingComposite(
+ PropertyValueModel<OrmIdMapping> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+ return new OrmIdMapping2_0Composite(subjectHolder, parent, widgetFactory);
+ }
+
+ @Override
+ public JpaComposite createOrmEmbeddedIdMappingComposite(
+ PropertyValueModel<OrmEmbeddedIdMapping> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+ return new OrmEmbeddedIdMapping2_0Composite(subjectHolder, parent, widgetFactory);
+ }
+
+ @Override
+ public JpaComposite createOrmBasicMappingComposite(
+ PropertyValueModel<OrmBasicMapping> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+ return new OrmBasicMapping2_0Composite(subjectHolder, parent, widgetFactory);
+ }
+
+ @Override
+ public JpaComposite createOrmVersionMappingComposite(
+ PropertyValueModel<OrmVersionMapping> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+ return new OrmVersionMapping2_0Composite(subjectHolder, parent, widgetFactory);
+ }
+
+ @Override
+ public JpaComposite createOrmManyToOneMappingComposite(
+ PropertyValueModel<OrmManyToOneMapping> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+ return new OrmManyToOneMapping2_0Composite(subjectHolder, parent, widgetFactory);
+ }
+
+ @Override
+ public JpaComposite createOrmOneToManyMappingComposite(
+ PropertyValueModel<OrmOneToManyMapping> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+ return new OrmOneToManyMapping2_0Composite(subjectHolder, parent, widgetFactory);
+ }
+
+ @Override
+ public JpaComposite createOrmOneToOneMappingComposite(
+ PropertyValueModel<OrmOneToOneMapping> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+ return new OrmOneToOneMapping2_0Composite(subjectHolder, parent, widgetFactory);
+ }
+
+ @Override
+ public JpaComposite createOrmManyToManyMappingComposite(
+ PropertyValueModel<OrmManyToManyMapping> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+ return new OrmManyToManyMapping2_0Composite(subjectHolder, parent, widgetFactory);
+ }
+
+ @Override
+ public JpaComposite createOrmEmbeddedMappingComposite(
+ PropertyValueModel<OrmEmbeddedMapping> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+ return new OrmEmbeddedMapping2_0Composite(subjectHolder, parent, widgetFactory);
+ }
+
+ @Override
+ public JpaComposite createOrmTransientMappingComposite(
+ PropertyValueModel<OrmTransientMapping> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+ return new TransientMappingComposite(subjectHolder, parent, widgetFactory);
+ }
+
+ public JpaComposite createOrmElementCollectionMapping2_0Composite(
+ PropertyValueModel<OrmElementCollectionMapping2_0> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+ return new OrmElementCollectionMapping2_0Composite(subjectHolder, parent, widgetFactory);
+ }
+
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/Jpa2_0ProjectFlagModel.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/Jpa2_0ProjectFlagModel.java
new file mode 100644
index 0000000000..182674ef75
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/Jpa2_0ProjectFlagModel.java
@@ -0,0 +1,31 @@
+/*******************************************************************************
+ * Copyright (c) 2010 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.ui.internal.jpa2;
+
+import org.eclipse.jpt.common.utility.internal.model.value.TransformationPropertyValueModel;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.JpaNode;
+import org.eclipse.jpt.jpa.core.JptJpaCorePlugin;
+
+/**
+ * Flag indicating whether the JPA project supports JPA 2.0.
+ */
+public class Jpa2_0ProjectFlagModel<T extends JpaNode>
+ extends TransformationPropertyValueModel<T, Boolean>
+{
+ public Jpa2_0ProjectFlagModel(PropertyValueModel<T> jpaProjectModel) {
+ super(jpaProjectModel);
+ }
+
+ @Override
+ protected Boolean transform_(T value) {
+ return Boolean.valueOf(JptJpaCorePlugin.nodeIsJpa2_0Compatible(value));
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/AbstractElementCollectionMapping2_0Composite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/AbstractElementCollectionMapping2_0Composite.java
new file mode 100644
index 0000000000..e1afecc33d
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/AbstractElementCollectionMapping2_0Composite.java
@@ -0,0 +1,378 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2010 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.ui.internal.jpa2.details;
+
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.ui.internal.util.ControlSwitcher;
+import org.eclipse.jpt.common.ui.internal.widgets.Pane;
+import org.eclipse.jpt.common.utility.internal.Transformer;
+import org.eclipse.jpt.common.utility.internal.model.value.PropertyAspectAdapter;
+import org.eclipse.jpt.common.utility.internal.model.value.SimplePropertyValueModel;
+import org.eclipse.jpt.common.utility.internal.model.value.TransformationPropertyValueModel;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.common.utility.model.value.WritablePropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.BasicMapping;
+import org.eclipse.jpt.jpa.core.context.Column;
+import org.eclipse.jpt.jpa.core.context.Converter;
+import org.eclipse.jpt.jpa.core.context.ConvertibleMapping;
+import org.eclipse.jpt.jpa.core.context.EnumeratedConverter;
+import org.eclipse.jpt.jpa.core.context.LobConverter;
+import org.eclipse.jpt.jpa.core.context.TemporalConverter;
+import org.eclipse.jpt.jpa.core.jpa2.context.CollectionTable2_0;
+import org.eclipse.jpt.jpa.core.jpa2.context.ElementCollectionMapping2_0;
+import org.eclipse.jpt.jpa.ui.details.JpaComposite;
+import org.eclipse.jpt.jpa.ui.internal.details.ColumnComposite;
+import org.eclipse.jpt.jpa.ui.internal.details.EnumTypeComposite;
+import org.eclipse.jpt.jpa.ui.internal.details.FetchTypeComposite;
+import org.eclipse.jpt.jpa.ui.internal.details.JptUiDetailsMessages;
+import org.eclipse.jpt.jpa.ui.internal.details.OptionalComposite;
+import org.eclipse.jpt.jpa.ui.internal.details.TemporalTypeComposite;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.ui.part.PageBook;
+
+/**
+ * Here the layout of this pane:
+ * <pre>
+ * -----------------------------------------------------------------------------
+ * | ------------------------------------------------------------------------- |
+ * | | | |
+ * | | ColumnComposite | |
+ * | | | |
+ * | ------------------------------------------------------------------------- |
+ * | ------------------------------------------------------------------------- |
+ * | | | |
+ * | | FetchTypeComposite | |
+ * | | | |
+ * | ------------------------------------------------------------------------- |
+ * | ------------------------------------------------------------------------- |
+ * | | | |
+ * | | TemporalTypeComposite | |
+ * | | | |
+ * | ------------------------------------------------------------------------- |
+ * | ------------------------------------------------------------------------- |
+ * | | | |
+ * | | EnumTypeComposite | |
+ * | | | |
+ * | ------------------------------------------------------------------------- |
+ * | ------------------------------------------------------------------------- |
+ * | | | |
+ * | | OptionalComposite | |
+ * | | | |
+ * | ------------------------------------------------------------------------- |
+ * | ------------------------------------------------------------------------- |
+ * | | | |
+ * | | LobComposite | |
+ * | | | |
+ * | ------------------------------------------------------------------------- |
+ * -----------------------------------------------------------------------------</pre>
+ *
+ * @see BasicMapping
+ * @see OrderColumnComposite
+ * @see EnumTypeComposite
+ * @see FetchTypeComposite
+ * @see LobComposite
+ * @see OptionalComposite
+ * @see TemporalTypeComposite
+ *
+ * @version 2.3
+ * @since 2.3
+ */
+public abstract class AbstractElementCollectionMapping2_0Composite<T extends ElementCollectionMapping2_0>
+ extends Pane<T>
+ implements JpaComposite
+{
+
+ private Composite basicValueComposite;
+
+ private Composite embeddableValueComposite;
+
+ /**
+ * Creates a new <code>BasicMappingComposite</code>.
+ *
+ * @param subjectHolder The holder of the subject <code>IBasicMapping</code>
+ * @param parent The parent container
+ * @param widgetFactory The factory used to create various common widgets
+ */
+ protected AbstractElementCollectionMapping2_0Composite(PropertyValueModel<? extends T> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+
+ super(subjectHolder, parent, widgetFactory);
+ }
+ @Override
+ protected void initializeLayout(Composite container) {
+ initializeElementCollectionCollapsibleSection(container);
+ initializeValueCollapsibleSection(container);
+ initializeKeyCollapsibleSection(container);
+ initializeOrderingCollapsibleSection(container);
+ }
+
+ protected void initializeElementCollectionCollapsibleSection(Composite container) {
+ container = addCollapsibleSection(
+ container,
+ JptUiDetailsMessages2_0.ElementCollectionSection_title,
+ new SimplePropertyValueModel<Boolean>(Boolean.TRUE)
+ );
+
+ this.initializeElementCollectionSection(container);
+ }
+
+ protected void initializeElementCollectionSection(Composite container) {
+ new TargetClassComposite(this, container);
+ new FetchTypeComposite(this, container);
+ new CollectionTable2_0Composite(this, buildCollectionTableHolder(), container);
+ }
+
+ protected void initializeOrderingCollapsibleSection(Composite container) {
+ new Ordering2_0Composite(this, container);
+ }
+
+ protected void initializeValueCollapsibleSection(Composite container) {
+ Composite valueSection = addCollapsibleSection(
+ container,
+ JptUiDetailsMessages2_0.AbstractElementCollectionMapping2_0_Composite_valueSectionTitle
+ );
+ initializeValueSection(valueSection);
+ }
+
+ protected void initializeKeyCollapsibleSection(Composite container) {
+
+ }
+
+ protected void initializeValueSection(Composite container) {
+ PageBook pageBook = new PageBook(container, SWT.NULL);
+ GridData gd = new GridData(GridData.FILL_HORIZONTAL);
+ gd.horizontalIndent = 5;
+ pageBook.setLayoutData(gd);
+
+ this.initializeBasicValueSection(pageBook);
+ this.initializeEmbeddableValueSection(pageBook);
+
+ installValueControlSwitcher(pageBook);
+ }
+
+ protected void initializeBasicValueSection(Composite container) {
+ this.basicValueComposite = addSubPane(container);
+
+ new ColumnComposite(this, buildValueColumnHolder(), this.basicValueComposite);
+
+ // type section
+ Composite converterSection = addCollapsibleSubSection(
+ this.basicValueComposite,
+ JptUiDetailsMessages.TypeSection_type,
+ new SimplePropertyValueModel<Boolean>(Boolean.FALSE)
+ );
+ ((GridLayout) converterSection.getLayout()).numColumns = 2;
+
+ // No converter
+ Button noConverterButton = addRadioButton(
+ converterSection,
+ JptUiDetailsMessages.TypeSection_default,
+ buildNoConverterHolder(),
+ null);
+ ((GridData) noConverterButton.getLayoutData()).horizontalSpan = 2;
+
+ // Lob
+ Button lobButton = addRadioButton(
+ converterSection,
+ JptUiDetailsMessages.TypeSection_lob,
+ buildLobConverterHolder(),
+ null);
+ ((GridData) lobButton.getLayoutData()).horizontalSpan = 2;
+
+
+ PropertyValueModel<Converter> converterHolder = buildConverterHolder();
+ // Temporal
+ addRadioButton(
+ converterSection,
+ JptUiDetailsMessages.TypeSection_temporal,
+ buildTemporalBooleanHolder(),
+ null);
+ registerSubPane(new TemporalTypeComposite(buildTemporalConverterHolder(converterHolder), converterSection, getWidgetFactory()));
+
+
+ // Enumerated
+ addRadioButton(
+ converterSection,
+ JptUiDetailsMessages.TypeSection_enumerated,
+ buildEnumeratedBooleanHolder(),
+ null);
+ registerSubPane(new EnumTypeComposite(buildEnumeratedConverterHolder(converterHolder), converterSection, getWidgetFactory()));
+ }
+
+ protected void initializeEmbeddableValueSection(Composite container) {
+ this.embeddableValueComposite = new ElementCollectionValueOverridesComposite(this, container).getControl();
+ }
+
+ private void installValueControlSwitcher(PageBook pageBook) {
+
+ new ControlSwitcher(
+ buildValueHolder(),
+ buildPaneTransformer(),
+ pageBook
+ );
+ }
+
+ protected PropertyValueModel<ElementCollectionMapping2_0.Type> buildValueHolder() {
+ return new PropertyAspectAdapter<T, ElementCollectionMapping2_0.Type>(
+ this.getSubjectHolder(), ElementCollectionMapping2_0.VALUE_TYPE_PROPERTY) {
+ @Override
+ protected ElementCollectionMapping2_0.Type buildValue_() {
+ return this.subject.getValueType();
+ }
+ };
+ }
+
+ private Transformer<ElementCollectionMapping2_0.Type, Control> buildPaneTransformer() {
+ return new Transformer<ElementCollectionMapping2_0.Type, Control>() {
+ public Control transform(ElementCollectionMapping2_0.Type type) {
+ return AbstractElementCollectionMapping2_0Composite.this.transformValueType(type);
+ }
+ };
+ }
+
+ /**
+ * Given the selected override, return the control that will be displayed
+ */
+ protected Control transformValueType(ElementCollectionMapping2_0.Type type) {
+ if (type == null) {
+ return null;
+ }
+ switch (type) {
+ case BASIC_TYPE :
+ return this.basicValueComposite;
+ case EMBEDDABLE_TYPE :
+ return this.embeddableValueComposite;
+ default :
+ return null;
+ }
+ }
+
+ protected PropertyValueModel<CollectionTable2_0> buildCollectionTableHolder() {
+ return new PropertyAspectAdapter<ElementCollectionMapping2_0, CollectionTable2_0>(getSubjectHolder()) {
+ @Override
+ protected CollectionTable2_0 buildValue_() {
+ return this.subject.getCollectionTable();
+ }
+ };
+ }
+
+ protected PropertyValueModel<Column> buildValueColumnHolder() {
+ return new PropertyAspectAdapter<ElementCollectionMapping2_0, Column>(getSubjectHolder()) {
+ @Override
+ protected Column buildValue_() {
+ return this.subject.getValueColumn();
+ }
+ };
+ }
+
+ private WritablePropertyValueModel<Boolean> buildNoConverterHolder() {
+ return new PropertyAspectAdapter<T, Boolean>(getSubjectHolder(), ConvertibleMapping.CONVERTER_PROPERTY) {
+ @Override
+ protected Boolean buildValue_() {
+ return Boolean.valueOf(this.subject.getConverter().getType() == null);
+ }
+
+ @Override
+ protected void setValue_(Boolean value) {
+ if (value.booleanValue()) {
+ this.subject.setConverter(null);
+ }
+ }
+ };
+ }
+
+ private WritablePropertyValueModel<Boolean> buildLobConverterHolder() {
+ return new PropertyAspectAdapter<T, Boolean>(getSubjectHolder(), ConvertibleMapping.CONVERTER_PROPERTY) {
+ @Override
+ protected Boolean buildValue_() {
+ Converter converter = this.subject.getConverter();
+ return Boolean.valueOf(converter.getType() == LobConverter.class);
+ }
+
+ @Override
+ protected void setValue_(Boolean value) {
+ if (value.booleanValue()) {
+ this.subject.setConverter(LobConverter.class);
+ }
+ }
+ };
+ }
+
+ private PropertyValueModel<Converter> buildConverterHolder() {
+ return new PropertyAspectAdapter<T, Converter>(getSubjectHolder(), ConvertibleMapping.CONVERTER_PROPERTY) {
+ @Override
+ protected Converter buildValue_() {
+ return this.subject.getConverter();
+ }
+ };
+ }
+
+ private PropertyValueModel<TemporalConverter> buildTemporalConverterHolder(PropertyValueModel<Converter> converterHolder) {
+ return new TransformationPropertyValueModel<Converter, TemporalConverter>(converterHolder) {
+ @Override
+ protected TemporalConverter transform_(Converter converter) {
+ return converter.getType() == TemporalConverter.class ? (TemporalConverter) converter : null;
+ }
+ };
+ }
+
+ private PropertyValueModel<EnumeratedConverter> buildEnumeratedConverterHolder(PropertyValueModel<Converter> converterHolder) {
+ return new TransformationPropertyValueModel<Converter, EnumeratedConverter>(converterHolder) {
+ @Override
+ protected EnumeratedConverter transform_(Converter converter) {
+ return converter.getType() == EnumeratedConverter.class ? (EnumeratedConverter) converter : null;
+ }
+ };
+ }
+
+ private WritablePropertyValueModel<Boolean> buildTemporalBooleanHolder() {
+ return new PropertyAspectAdapter<T, Boolean>(getSubjectHolder(), ConvertibleMapping.CONVERTER_PROPERTY) {
+ @Override
+ protected Boolean buildValue_() {
+ Converter converter = this.subject.getConverter();
+ return Boolean.valueOf(converter.getType() == TemporalConverter.class);
+ }
+
+ @Override
+ protected void setValue_(Boolean value) {
+ if (value.booleanValue()) {
+ this.subject.setConverter(TemporalConverter.class);
+ }
+ }
+ };
+ }
+
+ private WritablePropertyValueModel<Boolean> buildEnumeratedBooleanHolder() {
+ return new PropertyAspectAdapter<T, Boolean>(getSubjectHolder(), ConvertibleMapping.CONVERTER_PROPERTY) {
+ @Override
+ protected Boolean buildValue_() {
+ Converter converter = this.subject.getConverter();
+ return Boolean.valueOf(converter.getType() == EnumeratedConverter.class);
+ }
+
+ @Override
+ protected void setValue_(Boolean value) {
+ if (value.booleanValue()) {
+ this.subject.setConverter(EnumeratedConverter.class);
+ }
+ }
+ };
+ }
+ protected Composite addPane(Composite container, int groupBoxMargin) {
+ return addSubPane(container, 0, groupBoxMargin, 0, groupBoxMargin);
+ }
+
+} \ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/AbstractElementCollectionMapping2_0UiDefinition.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/AbstractElementCollectionMapping2_0UiDefinition.java
new file mode 100644
index 0000000000..d7f1921540
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/AbstractElementCollectionMapping2_0UiDefinition.java
@@ -0,0 +1,42 @@
+/*******************************************************************************
+ * Copyright (c) 2009 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.ui.internal.jpa2.details;
+
+import org.eclipse.jpt.jpa.core.jpa2.MappingKeys2_0;
+import org.eclipse.jpt.jpa.core.jpa2.context.ElementCollectionMapping2_0;
+import org.eclipse.jpt.jpa.ui.internal.JpaMappingImageHelper;
+import org.eclipse.jpt.jpa.ui.internal.details.AbstractMappingUiDefinition;
+import org.eclipse.swt.graphics.Image;
+
+public abstract class AbstractElementCollectionMapping2_0UiDefinition<M, T extends ElementCollectionMapping2_0>
+ extends AbstractMappingUiDefinition<M, T>
+{
+ protected AbstractElementCollectionMapping2_0UiDefinition() {
+ super();
+ }
+
+
+ public Image getImage() {
+ return JpaMappingImageHelper.imageForAttributeMapping(getKey());
+ }
+
+ public String getLabel() {
+ return JptUiDetailsMessages2_0.ElementCollectionMapping2_0_label;
+ }
+
+ public String getLinkLabel() {
+ return JptUiDetailsMessages2_0.ElementCollectionMapping2_0_linkLabel;
+ }
+
+ public String getKey() {
+ return MappingKeys2_0.ELEMENT_COLLECTION_ATTRIBUTE_MAPPING_KEY;
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/AbstractManyToOneMapping2_0Composite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/AbstractManyToOneMapping2_0Composite.java
new file mode 100644
index 0000000000..c20c27a8e6
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/AbstractManyToOneMapping2_0Composite.java
@@ -0,0 +1,57 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 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.ui.internal.jpa2.details;
+
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.utility.internal.model.value.PropertyAspectAdapter;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.ManyToOneMapping;
+import org.eclipse.jpt.jpa.core.jpa2.context.DerivedIdentity2_0;
+import org.eclipse.jpt.jpa.core.jpa2.context.ManyToOneMapping2_0;
+import org.eclipse.jpt.jpa.core.jpa2.context.ManyToOneRelationship2_0;
+import org.eclipse.jpt.jpa.ui.internal.details.AbstractManyToOneMappingComposite;
+import org.eclipse.swt.widgets.Composite;
+
+public abstract class AbstractManyToOneMapping2_0Composite<T extends ManyToOneMapping, R extends ManyToOneRelationship2_0>
+ extends AbstractManyToOneMappingComposite<T, R>
+{
+ protected AbstractManyToOneMapping2_0Composite(
+ PropertyValueModel<? extends T> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+
+ super(subjectHolder, parent, widgetFactory);
+ }
+
+ @Override
+ protected void initializeLayout(Composite container) {
+ initializeManyToOneCollapsibleSection(container);
+ initializeDerivedIdentityCollapsibleSection(container);
+ initializeJoiningStrategyCollapsibleSection(container);
+ }
+
+ protected void initializeDerivedIdentityCollapsibleSection(Composite container) {
+ new DerivedIdentity2_0Pane(this, buildDerivedIdentityHolder(), container);
+ }
+
+ @Override
+ protected void initializeJoiningStrategyCollapsibleSection(Composite container) {
+ new ManyToOneJoiningStrategy2_0Pane(this, buildJoiningHolder(), container);
+ }
+
+ protected PropertyValueModel<DerivedIdentity2_0> buildDerivedIdentityHolder() {
+ return new PropertyAspectAdapter<T, DerivedIdentity2_0>(getSubjectHolder()) {
+ @Override
+ protected DerivedIdentity2_0 buildValue_() {
+ return ((ManyToOneMapping2_0) this.subject).getDerivedIdentity();
+ }
+ };
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/AbstractOneToOneMapping2_0Composite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/AbstractOneToOneMapping2_0Composite.java
new file mode 100644
index 0000000000..3b158caadb
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/AbstractOneToOneMapping2_0Composite.java
@@ -0,0 +1,53 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 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.ui.internal.jpa2.details;
+
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.utility.internal.model.value.PropertyAspectAdapter;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.OneToOneMapping;
+import org.eclipse.jpt.jpa.core.jpa2.context.DerivedIdentity2_0;
+import org.eclipse.jpt.jpa.core.jpa2.context.OneToOneMapping2_0;
+import org.eclipse.jpt.jpa.core.jpa2.context.OneToOneRelationship2_0;
+import org.eclipse.jpt.jpa.ui.internal.details.AbstractOneToOneMappingComposite;
+import org.eclipse.swt.widgets.Composite;
+
+public abstract class AbstractOneToOneMapping2_0Composite<T extends OneToOneMapping, R extends OneToOneRelationship2_0>
+ extends AbstractOneToOneMappingComposite<T, R>
+{
+ protected AbstractOneToOneMapping2_0Composite(
+ PropertyValueModel<? extends T> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+
+ super(subjectHolder, parent, widgetFactory);
+ }
+
+ @Override
+ protected void initializeLayout(Composite container) {
+ initializeOneToOneCollapsibleSection(container);
+ initializeDerivedIdentityCollapsibleSection(container);
+ initializeJoiningStrategyCollapsibleSection(container);
+ }
+
+ protected void initializeDerivedIdentityCollapsibleSection(Composite container) {
+ new DerivedIdentity2_0Pane(this, buildDerivedIdentityHolder(), container);
+ }
+
+
+ protected PropertyValueModel<DerivedIdentity2_0> buildDerivedIdentityHolder() {
+ return new PropertyAspectAdapter<T, DerivedIdentity2_0>(getSubjectHolder()) {
+ @Override
+ protected DerivedIdentity2_0 buildValue_() {
+ return ((OneToOneMapping2_0) this.subject).getDerivedIdentity();
+ }
+ };
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/AssociationOverride2_0Composite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/AssociationOverride2_0Composite.java
new file mode 100644
index 0000000000..e21bd86741
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/AssociationOverride2_0Composite.java
@@ -0,0 +1,86 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 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.ui.internal.jpa2.details;
+
+import org.eclipse.jpt.common.ui.internal.widgets.Pane;
+import org.eclipse.jpt.common.utility.internal.model.value.TransformationPropertyValueModel;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.AssociationOverride;
+import org.eclipse.jpt.jpa.core.context.ReadOnlyAssociationOverride;
+import org.eclipse.jpt.jpa.core.context.ReadOnlyJoinTableRelationship;
+import org.eclipse.jpt.jpa.ui.internal.details.AssociationOverrideComposite;
+import org.eclipse.jpt.jpa.ui.internal.details.EntityOverridesComposite;
+import org.eclipse.jpt.jpa.ui.internal.details.JoinColumnsComposite;
+import org.eclipse.jpt.jpa.ui.internal.details.JoinTableJoiningStrategyPane;
+import org.eclipse.jpt.jpa.ui.internal.details.JptUiDetailsMessages;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * Here the layout of this pane:
+ * <pre>
+ * -----------------------------------------------------------------------------
+ * | |
+ * | JoinColumnJoiningStrategyPane |
+ * | JoinTableJoiningStrategyPane |
+ * | |
+ * -----------------------------------------------------------------------------</pre>
+ *
+ * @see AssociationOverride
+ * @see EntityOverridesComposite - The parent container
+ * @see JoinColumnsComposite
+ *
+ * @version 2.3
+ * @since 1.0
+ */
+public class AssociationOverride2_0Composite
+ extends AssociationOverrideComposite
+{
+ /**
+ * Creates a new <code>AssociationOverrideComposite</code>.
+ *
+ * @param subjectHolder The holder of the subject <code>AssociationOverride</code>
+ * @param parent The parent container
+ * @param widgetFactory The factory used to create various common widgets
+ */
+ public AssociationOverride2_0Composite(Pane<?> parentPane,
+ PropertyValueModel<? extends ReadOnlyAssociationOverride> subjectHolder,
+ Composite parent) {
+
+ super(parentPane, subjectHolder, parent);
+ }
+
+
+ @Override
+ protected void initializeLayout(Composite container) {
+ Composite composite = addTitledGroup(
+ container,
+ JptUiDetailsMessages.Joining_title);
+
+ addJoinColumnJoiningStrategyPane(composite);
+
+ addJoinTableJoiningStrategyPane(composite);
+
+ addSubPane(composite, 5);
+ }
+
+ protected void addJoinTableJoiningStrategyPane(Composite container) {
+ new JoinTableJoiningStrategyPane(this, buildRelationshipModel(), container);
+ }
+
+ private PropertyValueModel<ReadOnlyJoinTableRelationship> buildRelationshipModel() {
+ return new TransformationPropertyValueModel<ReadOnlyAssociationOverride, ReadOnlyJoinTableRelationship>(getSubjectHolder()) {
+ @Override
+ protected ReadOnlyJoinTableRelationship transform_(ReadOnlyAssociationOverride value) {
+ // all specified and virtual (mappings) overrides support join tables
+ return (ReadOnlyJoinTableRelationship) value.getRelationship();
+ }
+ };
+ }
+} \ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/Cacheable2_0Pane.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/Cacheable2_0Pane.java
new file mode 100644
index 0000000000..01abe5a0c1
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/Cacheable2_0Pane.java
@@ -0,0 +1,107 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2010 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.ui.internal.jpa2.details;
+
+import org.eclipse.jpt.common.ui.internal.JptCommonUiMessages;
+import org.eclipse.jpt.common.ui.internal.widgets.Pane;
+import org.eclipse.jpt.common.utility.internal.model.value.PropertyAspectAdapter;
+import org.eclipse.jpt.common.utility.internal.model.value.TransformationPropertyValueModel;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.common.utility.model.value.WritablePropertyValueModel;
+import org.eclipse.jpt.jpa.core.jpa2.context.Cacheable2_0;
+import org.eclipse.jpt.jpa.ui.internal.JpaHelpContextIds;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * Here the layout of this pane:
+ * <pre>
+ * -----------------------------------------------------------------------------
+ * | [X] Cacheable (true/false)
+ * -----------------------------------------------------------------------------</pre>
+ *
+ * @see Cacheable2_0
+ * @see JavaEntity2_0Composite - A container of this widget
+ * @see OrmEntity2_0Composite - A container of this widget
+ */
+public class Cacheable2_0Pane
+ extends Pane<Cacheable2_0>
+{
+ public Cacheable2_0Pane(
+ Pane<?> parentPane,
+ PropertyValueModel<? extends Cacheable2_0> subjectHolder,
+ Composite parent) {
+
+ super(parentPane, subjectHolder, parent);
+ }
+
+
+ @Override
+ protected void initializeLayout(Composite container) {
+ addTriStateCheckBoxWithDefault(
+ container,
+ JptUiDetailsMessages2_0.Entity_cacheableLabel,
+ buildCacheableBooleanHolder(),
+ buildCacheableStringHolder(),
+ JpaHelpContextIds.ENTITY_CACHEABLE
+ );
+ }
+
+
+ private WritablePropertyValueModel<Boolean> buildCacheableBooleanHolder() {
+ return new PropertyAspectAdapter<Cacheable2_0, Boolean>(
+ getSubjectHolder(),
+ Cacheable2_0.DEFAULT_CACHEABLE_PROPERTY,
+ Cacheable2_0.SPECIFIED_CACHEABLE_PROPERTY)
+ {
+ @Override
+ protected Boolean buildValue_() {
+ return this.subject.getSpecifiedCacheable();
+ }
+
+ @Override
+ protected void setValue_(Boolean value) {
+ this.subject.setSpecifiedCacheable(value);
+ }
+ };
+ }
+
+ private PropertyValueModel<String> buildCacheableStringHolder() {
+
+ return new TransformationPropertyValueModel<Boolean, String>(buildDefaultCacheableHolder()) {
+
+ @Override
+ protected String transform(Boolean value) {
+ if (value != null) {
+ String defaultStringValue = value.booleanValue() ? JptCommonUiMessages.Boolean_True : JptCommonUiMessages.Boolean_False;
+ return NLS.bind(JptUiDetailsMessages2_0.Entity_cacheableWithDefaultLabel, defaultStringValue);
+ }
+ return JptUiDetailsMessages2_0.Entity_cacheableLabel;
+ }
+ };
+ }
+
+ private PropertyValueModel<Boolean> buildDefaultCacheableHolder() {
+ return new PropertyAspectAdapter<Cacheable2_0, Boolean>(
+ getSubjectHolder(),
+ Cacheable2_0.SPECIFIED_CACHEABLE_PROPERTY,
+ Cacheable2_0.DEFAULT_CACHEABLE_PROPERTY)
+ {
+ @Override
+ protected Boolean buildValue_() {
+ if (this.subject.getSpecifiedCacheable() != null) {
+ return null;
+ }
+ return Boolean.valueOf(this.subject.isDefaultCacheable());
+ }
+ };
+ }
+
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/CascadePane2_0.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/CascadePane2_0.java
new file mode 100644
index 0000000000..b9990caac9
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/CascadePane2_0.java
@@ -0,0 +1,81 @@
+/*******************************************************************************
+ * Copyright (c) 2010 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.ui.internal.jpa2.details;
+
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.ui.internal.widgets.Pane;
+import org.eclipse.jpt.common.utility.internal.model.value.PropertyAspectAdapter;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.common.utility.model.value.WritablePropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.RelationshipMapping;
+import org.eclipse.jpt.jpa.core.jpa2.context.Cascade2_0;
+import org.eclipse.jpt.jpa.ui.internal.details.CascadeComposite;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Group;
+
+public class CascadePane2_0<T extends Cascade2_0>
+ extends CascadeComposite<T>
+{
+ public CascadePane2_0(
+ Pane<? extends RelationshipMapping> parentPane,
+ PropertyValueModel<T> subjectHolder,
+ Composite parent) {
+
+ super(parentPane, subjectHolder, parent);
+ }
+
+ public CascadePane2_0(
+ PropertyValueModel<T> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+
+ super(subjectHolder, parent, widgetFactory);
+ }
+
+
+ @Override
+ protected void initializeLayout(Composite container) {
+ // Cascade group
+ Group cascadeGroup = addCascadeGroup(container);
+
+ // Container of the check boxes
+ container = addSubPane(cascadeGroup, 6, 8, 0, 0, 0);
+
+ addAllCheckBox(container);
+ addPersistCheckBox(container);
+ addMergeCheckBox(container);
+ addRemoveCheckBox(container);
+ addRefreshCheckBox(container);
+ addDetachCheckBox(container);
+ }
+
+ protected void addDetachCheckBox(Composite container) {
+ addCheckBox(
+ container,
+ JptUiDetailsMessages2_0.CascadePane2_0_detach,
+ buildCascadeTypeDetachHolder(),
+ null);
+ }
+
+ protected WritablePropertyValueModel<Boolean> buildCascadeTypeDetachHolder() {
+ return new PropertyAspectAdapter<Cascade2_0, Boolean>(getSubjectHolder(), Cascade2_0.DETACH_PROPERTY) {
+ @Override
+ protected Boolean buildValue_() {
+ return subject.isDetach();
+ }
+
+ @Override
+ protected void setValue_(Boolean value) {
+ subject.setDetach(value);
+ }
+ };
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/CollectionTable2_0Composite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/CollectionTable2_0Composite.java
new file mode 100644
index 0000000000..c2b7dfb0c3
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/CollectionTable2_0Composite.java
@@ -0,0 +1,157 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2010 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.ui.internal.jpa2.details;
+
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.ui.internal.widgets.Pane;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.ReadOnlyReferenceTable;
+import org.eclipse.jpt.jpa.core.jpa2.context.CollectionTable2_0;
+import org.eclipse.jpt.jpa.ui.internal.JpaHelpContextIds;
+import org.eclipse.jpt.jpa.ui.internal.details.JoinColumnsComposite;
+import org.eclipse.jpt.jpa.ui.internal.details.ReferenceTableComposite;
+import org.eclipse.jpt.jpa.ui.internal.details.db.CatalogCombo;
+import org.eclipse.jpt.jpa.ui.internal.details.db.SchemaCombo;
+import org.eclipse.jpt.jpa.ui.internal.details.db.TableCombo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Group;
+
+/**
+ * The layout of this pane:
+ * <pre>
+ * -----------------------------------------------------------------------------
+ * | ------------------------------------------------------------ |
+ * | Name: | |v| |
+ * | ------------------------------------------------------------ |
+ * | ------------------------------------------------------------ |
+ * | Schema: | |v| |
+ * | ------------------------------------------------------------ |
+ * | ------------------------------------------------------------ |
+ * | Catalog: | |v| |
+ * | ------------------------------------------------------------ |
+ * | |
+ * | - Join Columns ---------------------------------------------------------- |
+ * | | | |
+ * | | x Override Default | |
+ * | | | |
+ * | | --------------------------------------------------------------------- | |
+ * | | | | | |
+ * | | | JoinColumnsComposite | | |
+ * | | | | | |
+ * | | --------------------------------------------------------------------- | |
+ * | ------------------------------------------------------------------------- |
+ * -----------------------------------------------------------------------------</pre>
+ *
+ * @see {@link CollectionTable2_0}
+ * @see {@link JoinColumnsComposite
+ *
+ * @version 3.0
+ * @since 3.0
+ */
+public class CollectionTable2_0Composite
+ extends ReferenceTableComposite<ReadOnlyReferenceTable>
+{
+ /**
+ * Creates a new <code>CollectionTable2_0Composite</code>.
+ *
+ * @param parentPane The parent container of this one
+ * @param subjectHolder The holder of this pane's subject
+ * @param parent The parent container
+ */
+ public CollectionTable2_0Composite(
+ Pane<?> parentPane,
+ PropertyValueModel<? extends ReadOnlyReferenceTable> subjectHolder,
+ Composite parent) {
+
+ super(parentPane, subjectHolder, parent);
+ }
+
+ /**
+ * Creates a new <code>CollectionTable2_0Composite</code>.
+ *
+ * @param subjectHolder The holder of the subject <code>CollectionTable2_0</code>
+ * @param parent The parent container
+ * @param widgetFactory The factory used to create various common widgets
+ */
+ public CollectionTable2_0Composite(PropertyValueModel<? extends CollectionTable2_0> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+
+ super(subjectHolder, parent, widgetFactory);
+ }
+
+ @Override
+ protected void initializeLayout(Composite container) {
+ // collection table group pane
+ container = addTitledGroup(
+ container,
+ JptUiDetailsMessages2_0.CollectionTable2_0Composite_title
+ );
+
+ int groupBoxMargin = getGroupBoxMargin();
+
+ // Name widgets
+ TableCombo<ReadOnlyReferenceTable> tableCombo = addTableCombo(container);
+ Composite tablePane = addPane(container, groupBoxMargin);
+ addLabeledComposite(
+ tablePane,
+ JptUiDetailsMessages2_0.CollectionTable2_0Composite_name,
+ tableCombo.getControl(),
+ JpaHelpContextIds.MAPPING_COLLECTION_TABLE_NAME
+ );
+
+ // schema widgets
+ SchemaCombo<ReadOnlyReferenceTable> schemaCombo = addSchemaCombo(container);
+
+ addLabeledComposite(
+ tablePane,
+ JptUiDetailsMessages2_0.CollectionTable2_0Composite_schema,
+ schemaCombo.getControl(),
+ JpaHelpContextIds.MAPPING_COLLECTION_TABLE_SCHEMA
+ );
+
+ // catalog widgets
+ CatalogCombo<ReadOnlyReferenceTable> catalogCombo = addCatalogCombo(container);
+
+ addLabeledComposite(
+ tablePane,
+ JptUiDetailsMessages2_0.CollectionTable2_0Composite_catalog,
+ catalogCombo.getControl(),
+ JpaHelpContextIds.MAPPING_COLLECTION_TABLE_CATALOG
+ );
+
+ // Join Columns group pane
+ Group joinColumnGroupPane = addTitledGroup(
+ container,
+ JptUiDetailsMessages2_0.CollectionTable2_0Composite_joinColumn
+ );
+
+ // Override Default Join Columns check box
+ this.overrideDefaultJoinColumnsCheckBox = addCheckBox(
+ addSubPane(joinColumnGroupPane, 8),
+ JptUiDetailsMessages2_0.CollectionTable2_0Composite_overrideDefaultJoinColumns,
+ buildOverrideDefaultJoinColumnHolder(),
+ null
+ );
+
+ this.joinColumnsComposite = new JoinColumnsComposite<ReadOnlyReferenceTable>(
+ this,
+ joinColumnGroupPane,
+ buildJoinColumnsEditor()
+ );
+
+ installJoinColumnsPaneEnabler(this.joinColumnsComposite);
+ }
+
+ @Override
+ protected boolean tableIsVirtual(ReadOnlyReferenceTable collectionTable) {
+ return collectionTable.getPersistentAttribute().isVirtual();
+ }
+} \ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/DerivedIdentity2_0Pane.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/DerivedIdentity2_0Pane.java
new file mode 100644
index 0000000000..071d0aef2c
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/DerivedIdentity2_0Pane.java
@@ -0,0 +1,200 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2010 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.ui.internal.jpa2.details;
+
+import java.util.Collection;
+import org.eclipse.jpt.common.ui.internal.widgets.ComboPane;
+import org.eclipse.jpt.common.ui.internal.widgets.Pane;
+import org.eclipse.jpt.common.utility.internal.iterables.EmptyIterable;
+import org.eclipse.jpt.common.utility.internal.model.value.PropertyAspectAdapter;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.common.utility.model.value.WritablePropertyValueModel;
+import org.eclipse.jpt.jpa.core.jpa2.context.DerivedIdentity2_0;
+import org.eclipse.jpt.jpa.core.jpa2.context.MapsIdDerivedIdentityStrategy2_0;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+
+public class DerivedIdentity2_0Pane
+ extends Pane<DerivedIdentity2_0>
+{
+ public DerivedIdentity2_0Pane(
+ Pane<?> parentPane,
+ PropertyValueModel<? extends DerivedIdentity2_0> subjectHolder,
+ Composite parent) {
+
+ super(parentPane, subjectHolder, parent);
+ }
+
+
+ @Override
+ protected void initializeLayout(Composite container) {
+ Composite composite = addCollapsibleSection(
+ container,
+ JptUiDetailsMessages2_0.DerivedIdentity_title);
+ ((GridLayout) composite.getLayout()).numColumns = 2;
+
+ addNullDerivedIdentityPane(composite);
+ addIdDerivedIdentityPane(composite);
+ addMapsIdDerivedIdentityPane(composite);
+ }
+
+ protected void addNullDerivedIdentityPane(Composite parent) {
+ Button button = addRadioButton(
+ parent,
+ JptUiDetailsMessages2_0.DerivedIdentity_nullDerivedIdentity,
+ buildUsesNullDerivedIdentityStrategyHolder(),
+ null);
+ ((GridData) button.getLayoutData()).horizontalSpan = 2;
+ }
+
+ protected WritablePropertyValueModel<Boolean> buildUsesNullDerivedIdentityStrategyHolder() {
+ return new PropertyAspectAdapter<DerivedIdentity2_0, Boolean>(
+ getSubjectHolder(), DerivedIdentity2_0.PREDOMINANT_DERIVED_IDENTITY_STRATEGY_PROPERTY) {
+
+ @Override
+ protected Boolean buildValue_() {
+ return this.subject.usesNullDerivedIdentityStrategy();
+ }
+
+ @Override
+ protected void setValue_(Boolean value) {
+ // radio button - should only have true values here
+ if (value) {
+ this.subject.setNullDerivedIdentityStrategy();
+ }
+ }
+ };
+ }
+
+ protected void addIdDerivedIdentityPane(Composite parent) {
+ Button button = addRadioButton(
+ parent,
+ JptUiDetailsMessages2_0.DerivedIdentity_idDerivedIdentity,
+ buildUsesIdDerivedIdentityStrategyHolder(),
+ null);
+ ((GridData) button.getLayoutData()).horizontalSpan = 2;
+ }
+
+ protected WritablePropertyValueModel<Boolean> buildUsesIdDerivedIdentityStrategyHolder() {
+ return new PropertyAspectAdapter<DerivedIdentity2_0, Boolean>(
+ getSubjectHolder(), DerivedIdentity2_0.PREDOMINANT_DERIVED_IDENTITY_STRATEGY_PROPERTY) {
+
+ @Override
+ protected Boolean buildValue_() {
+ return this.subject.usesIdDerivedIdentityStrategy();
+ }
+
+ @Override
+ protected void setValue_(Boolean value) {
+ // radio button - should only have true values here
+ if (value) {
+ this.subject.setIdDerivedIdentityStrategy();
+ }
+ }
+ };
+ }
+
+ protected void addMapsIdDerivedIdentityPane(Composite parent) {
+ WritablePropertyValueModel<Boolean> usesMapsIdModel = buildUsesMapsIdDerivedIdentityStrategyHolder();
+ addRadioButton(
+ parent,
+ JptUiDetailsMessages2_0.DerivedIdentity_mapsIdDerivedIdentity,
+ usesMapsIdModel,
+ null);
+
+ buildMapsIdValueComboPane(parent, usesMapsIdModel);
+ }
+
+ protected WritablePropertyValueModel<Boolean> buildUsesMapsIdDerivedIdentityStrategyHolder() {
+ return new PropertyAspectAdapter<DerivedIdentity2_0, Boolean>(
+ getSubjectHolder(), DerivedIdentity2_0.PREDOMINANT_DERIVED_IDENTITY_STRATEGY_PROPERTY) {
+
+ @Override
+ protected Boolean buildValue() {
+ return (this.subject == null) ? Boolean.FALSE : this.subject.usesMapsIdDerivedIdentityStrategy();
+ }
+
+ @Override
+ protected void setValue_(Boolean value) {
+ // radio button - should only have true values here
+ if (value) {
+ this.subject.setMapsIdDerivedIdentityStrategy();
+ }
+ }
+ };
+ }
+
+ protected ComboPane buildMapsIdValueComboPane(Composite parent, PropertyValueModel<Boolean> usesMapsIdModel) {
+ return new MapsIdValueComboPane(this, buildMapsIdStrategyHolder(), parent, usesMapsIdModel);
+ }
+
+ protected PropertyValueModel<MapsIdDerivedIdentityStrategy2_0> buildMapsIdStrategyHolder() {
+ return new PropertyAspectAdapter<DerivedIdentity2_0, MapsIdDerivedIdentityStrategy2_0>(getSubjectHolder()) {
+ @Override
+ protected MapsIdDerivedIdentityStrategy2_0 buildValue_() {
+ return this.subject.getMapsIdDerivedIdentityStrategy();
+ }
+ };
+ }
+
+
+ private class MapsIdValueComboPane
+ extends ComboPane<MapsIdDerivedIdentityStrategy2_0>
+ {
+ public MapsIdValueComboPane(
+ Pane<?> parentPane,
+ PropertyValueModel<? extends MapsIdDerivedIdentityStrategy2_0> subjectHolder,
+ Composite parent,
+ PropertyValueModel<Boolean> enabledModel) {
+
+ super(parentPane, subjectHolder, parent, enabledModel);
+ }
+
+
+ @Override
+ protected void addPropertyNames(Collection<String> propertyNames) {
+ super.addPropertyNames(propertyNames);
+ propertyNames.add(MapsIdDerivedIdentityStrategy2_0.DEFAULT_VALUE_PROPERTY);
+ propertyNames.add(MapsIdDerivedIdentityStrategy2_0.SPECIFIED_VALUE_PROPERTY);
+ }
+
+ @Override
+ protected String getValue() {
+ return (getSubject() == null) ? null : getSubject().getSpecifiedValue();
+ }
+
+ @Override
+ protected void setValue(String value) {
+ if (getSubject() != null) getSubject().setSpecifiedValue(value);
+ }
+
+ @Override
+ protected boolean usesDefaultValue() {
+ return (getSubject() == null) ? true : getSubject().usesDefaultValue();
+ }
+
+ @Override
+ protected String getDefaultValue() {
+ return (getSubject() == null) ? null : getSubject().getDefaultValue();
+ }
+
+ @Override
+ protected Iterable<String> getValues() {
+ return (getSubject() == null) ? EmptyIterable.<String>instance() : getSubject().getSortedValueChoices();
+ }
+
+ @Override
+ protected String buildNullDefaultValueEntry() {
+ return buildNonNullDefaultValueEntry(JptUiDetailsMessages2_0.DerivedIdentity_mapsIdUnspecifiedValue);
+ }
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/ElementCollectionMapping2_0Composite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/ElementCollectionMapping2_0Composite.java
new file mode 100644
index 0000000000..a6af316ea0
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/ElementCollectionMapping2_0Composite.java
@@ -0,0 +1,81 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2010 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.ui.internal.jpa2.details;
+
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.BasicMapping;
+import org.eclipse.jpt.jpa.core.jpa2.context.ElementCollectionMapping2_0;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * Here the layout of this pane:
+ * <pre>
+ * -----------------------------------------------------------------------------
+ * | ------------------------------------------------------------------------- |
+ * | | | |
+ * | | TargetClassComposite | |
+ * | | | |
+ * | ------------------------------------------------------------------------- |
+ * | ------------------------------------------------------------------------- |
+ * | | | |
+ * | | FetchTypeComposite | |
+ * | | | |
+ * | ------------------------------------------------------------------------- |
+ * | ------------------------------------------------------------------------- |
+ * | | | |
+ * | | CollectionTableComposite | |
+ * | | | |
+ * | ------------------------------------------------------------------------- |
+ * | ------------------------------------------------------------------------- |
+ * | | | |
+ * | | ColumnComposite | |
+ * | | | |
+ * | ------------------------------------------------------------------------- |
+ * | ------------------------------------------------------------------------- |
+ * | | | |
+ * | | OptionalComposite | |
+ * | | | |
+ * | ------------------------------------------------------------------------- |
+ * | ------------------------------------------------------------------------- |
+ * | | | |
+ * | | LobComposite | |
+ * | | | |
+ * | ------------------------------------------------------------------------- |
+ * -----------------------------------------------------------------------------</pre>
+ *
+ * @see BasicMapping
+ * @see OrderColumnComposite
+ * @see EnumTypeComposite
+ * @see FetchTypeComposite
+ * @see LobComposite
+ * @see OptionalComposite
+ * @see TemporalTypeComposite
+ *
+ * @version 2.3
+ * @since 2.3
+ */
+public class ElementCollectionMapping2_0Composite extends AbstractElementCollectionMapping2_0Composite<ElementCollectionMapping2_0>
+{
+ /**
+ * Creates a new <code>BasicMappingComposite</code>.
+ *
+ * @param subjectHolder The holder of the subject <code>IBasicMapping</code>
+ * @param parent The parent container
+ * @param widgetFactory The factory used to create various common widgets
+ */
+ public ElementCollectionMapping2_0Composite(PropertyValueModel<? extends ElementCollectionMapping2_0> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+
+ super(subjectHolder, parent, widgetFactory);
+ }
+
+} \ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/ElementCollectionValueOverridesComposite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/ElementCollectionValueOverridesComposite.java
new file mode 100644
index 0000000000..d956e31ec9
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/ElementCollectionValueOverridesComposite.java
@@ -0,0 +1,64 @@
+/*******************************************************************************
+ * Copyright (c) 2010 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.ui.internal.jpa2.details;
+
+import org.eclipse.jpt.common.ui.internal.widgets.Pane;
+import org.eclipse.jpt.common.utility.internal.model.value.PropertyAspectAdapter;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.AssociationOverrideContainer;
+import org.eclipse.jpt.jpa.core.context.AttributeOverrideContainer;
+import org.eclipse.jpt.jpa.core.context.ReadOnlyAssociationOverride;
+import org.eclipse.jpt.jpa.core.jpa2.context.ElementCollectionMapping2_0;
+import org.eclipse.jpt.jpa.ui.internal.details.AbstractOverridesComposite;
+import org.eclipse.jpt.jpa.ui.internal.details.AssociationOverrideComposite;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.ui.part.PageBook;
+
+public final class ElementCollectionValueOverridesComposite
+ extends AbstractOverridesComposite<ElementCollectionMapping2_0>
+{
+ public ElementCollectionValueOverridesComposite(
+ Pane<? extends ElementCollectionMapping2_0> parentPane,
+ Composite parent) {
+
+ super(parentPane, parent);
+ }
+
+
+ @Override
+ protected boolean supportsAssociationOverrides() {
+ return true;
+ }
+
+ @Override
+ protected Pane<ReadOnlyAssociationOverride> buildAssociationOverridePane(PageBook pageBook, PropertyValueModel<ReadOnlyAssociationOverride> associationOverrideHolder) {
+ return new AssociationOverrideComposite(this, associationOverrideHolder, pageBook);
+ }
+
+ @Override
+ protected PropertyValueModel<AttributeOverrideContainer> buildAttributeOverrideContainerHolder() {
+ return new PropertyAspectAdapter<ElementCollectionMapping2_0, AttributeOverrideContainer>(getSubjectHolder()) {
+ @Override
+ protected AttributeOverrideContainer buildValue_() {
+ return this.subject.getValueAttributeOverrideContainer();
+ }
+ };
+ }
+
+ @Override
+ protected PropertyValueModel<AssociationOverrideContainer> buildAssociationOverrideContainerHolder() {
+ return new PropertyAspectAdapter<ElementCollectionMapping2_0, AssociationOverrideContainer>(getSubjectHolder()) {
+ @Override
+ protected AssociationOverrideContainer buildValue_() {
+ return this.subject.getValueAssociationOverrideContainer();
+ }
+ };
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/EmbeddedIdMapping2_0Composite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/EmbeddedIdMapping2_0Composite.java
new file mode 100644
index 0000000000..9af3e40be9
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/EmbeddedIdMapping2_0Composite.java
@@ -0,0 +1,37 @@
+/*******************************************************************************
+ * Copyright (c) 2010 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.ui.internal.jpa2.details;
+
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.EmbeddedIdMapping;
+import org.eclipse.jpt.jpa.ui.internal.details.AbstractEmbeddedIdMappingComposite;
+import org.eclipse.jpt.jpa.ui.internal.details.EmbeddedMappingOverridesComposite;
+import org.eclipse.swt.widgets.Composite;
+
+public class EmbeddedIdMapping2_0Composite
+ extends AbstractEmbeddedIdMappingComposite<EmbeddedIdMapping>
+{
+ public EmbeddedIdMapping2_0Composite(
+ PropertyValueModel<? extends EmbeddedIdMapping> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+
+ super(subjectHolder, parent, widgetFactory);
+ }
+
+
+ @Override
+ protected void initializeEmbeddedIdSection(Composite container) {
+ new EmbeddedIdMapping2_0MappedByRelationshipPane(this, getSubjectHolder(), container);
+ new EmbeddedMappingOverridesComposite(this, container);
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/EmbeddedIdMapping2_0MappedByRelationshipPane.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/EmbeddedIdMapping2_0MappedByRelationshipPane.java
new file mode 100644
index 0000000000..1a1151e508
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/EmbeddedIdMapping2_0MappedByRelationshipPane.java
@@ -0,0 +1,70 @@
+/*******************************************************************************
+ * Copyright (c) 2010 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.ui.internal.jpa2.details;
+
+import org.eclipse.jpt.common.ui.internal.util.ControlSwitcher;
+import org.eclipse.jpt.common.ui.internal.widgets.Pane;
+import org.eclipse.jpt.common.utility.internal.Transformer;
+import org.eclipse.jpt.common.utility.internal.model.value.PropertyAspectAdapter;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.common.utility.model.value.WritablePropertyValueModel;
+import org.eclipse.jpt.jpa.core.jpa2.context.EmbeddedIdMapping2_0;
+import org.eclipse.jpt.jpa.core.jpa2.context.MappedByRelationshipMapping2_0;
+import org.eclipse.swt.SWT;
+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.ui.part.PageBook;
+
+public class EmbeddedIdMapping2_0MappedByRelationshipPane<T extends EmbeddedIdMapping2_0>
+ extends Pane<T>
+{
+ Label mappedByRelationshipLabel;
+
+ public EmbeddedIdMapping2_0MappedByRelationshipPane(
+ Pane<?> parentPane,
+ PropertyValueModel<T> subjectHolder,
+ Composite parent) {
+
+ super(parentPane, subjectHolder, parent);
+ }
+
+ @Override
+ protected void initializeLayout(Composite container) {
+ PageBook pageBook = new PageBook(container, SWT.NULL);
+ pageBook.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+ this.mappedByRelationshipLabel = addLabel(pageBook, JptUiDetailsMessages2_0.EmbeddedIdMapping2_0MappedByRelationshipPane_label);
+
+ new ControlSwitcher(buildIsMappedByRelationshipHolder(), buildPaneTransformer(), pageBook);
+ }
+
+ protected WritablePropertyValueModel<Boolean> buildIsMappedByRelationshipHolder() {
+ return new PropertyAspectAdapter<T, Boolean>(getSubjectHolder(), MappedByRelationshipMapping2_0.MAPPED_BY_RELATIONSHIP_PROPERTY) {
+ @Override
+ protected Boolean buildValue_() {
+ return Boolean.valueOf(this.subject.isMappedByRelationship());
+ }
+ };
+ }
+
+ private Transformer<Boolean, Control> buildPaneTransformer() {
+ return new Transformer<Boolean, Control>() {
+ public Control transform(Boolean converter) {
+ if (converter == null || converter == Boolean.FALSE) {
+ return null;
+ }
+ return EmbeddedIdMapping2_0MappedByRelationshipPane.this.mappedByRelationshipLabel;
+ }
+ };
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/EmbeddedMapping2_0OverridesComposite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/EmbeddedMapping2_0OverridesComposite.java
new file mode 100644
index 0000000000..7fa55fae3e
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/EmbeddedMapping2_0OverridesComposite.java
@@ -0,0 +1,64 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2010 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.ui.internal.jpa2.details;
+
+import org.eclipse.jpt.common.ui.internal.widgets.Pane;
+import org.eclipse.jpt.common.utility.internal.model.value.PropertyAspectAdapter;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.AssociationOverrideContainer;
+import org.eclipse.jpt.jpa.core.context.AttributeOverrideContainer;
+import org.eclipse.jpt.jpa.core.context.EmbeddedMapping;
+import org.eclipse.jpt.jpa.core.context.ReadOnlyAssociationOverride;
+import org.eclipse.jpt.jpa.core.jpa2.context.EmbeddedMapping2_0;
+import org.eclipse.jpt.jpa.ui.internal.details.AbstractEmbeddedMappingOverridesComposite;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.ui.part.PageBook;
+
+public class EmbeddedMapping2_0OverridesComposite
+ extends AbstractEmbeddedMappingOverridesComposite<EmbeddedMapping>
+{
+ public EmbeddedMapping2_0OverridesComposite(
+ Pane<? extends EmbeddedMapping> parentPane,
+ Composite parent) {
+
+ super(parentPane, parent);
+ }
+
+
+ @Override
+ protected boolean supportsAssociationOverrides() {
+ return true;
+ }
+
+ @Override
+ protected PropertyValueModel<AttributeOverrideContainer> buildAttributeOverrideContainerHolder() {
+ return new PropertyAspectAdapter<EmbeddedMapping, AttributeOverrideContainer>(getSubjectHolder()) {
+ @Override
+ protected AttributeOverrideContainer buildValue_() {
+ return this.subject.getAttributeOverrideContainer();
+ }
+ };
+ }
+
+ @Override
+ protected Pane<ReadOnlyAssociationOverride> buildAssociationOverridePane(PageBook pageBook, PropertyValueModel<ReadOnlyAssociationOverride> associationOverrideHolder) {
+ return new AssociationOverride2_0Composite(this, associationOverrideHolder, pageBook);
+ }
+
+ @Override
+ protected PropertyValueModel<AssociationOverrideContainer> buildAssociationOverrideContainerHolder() {
+ return new PropertyAspectAdapter<EmbeddedMapping, AssociationOverrideContainer>(getSubjectHolder()) {
+ @Override
+ protected AssociationOverrideContainer buildValue_() {
+ return ((EmbeddedMapping2_0) this.subject).getAssociationOverrideContainer();
+ }
+ };
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/Entity2_0OverridesComposite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/Entity2_0OverridesComposite.java
new file mode 100644
index 0000000000..b554a7dacf
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/Entity2_0OverridesComposite.java
@@ -0,0 +1,35 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2010 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.ui.internal.jpa2.details;
+
+import org.eclipse.jpt.common.ui.internal.widgets.Pane;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.Entity;
+import org.eclipse.jpt.jpa.core.context.ReadOnlyAssociationOverride;
+import org.eclipse.jpt.jpa.ui.internal.details.AbstractEntityOverridesComposite;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.ui.part.PageBook;
+
+public class Entity2_0OverridesComposite
+ extends AbstractEntityOverridesComposite
+{
+ public Entity2_0OverridesComposite(
+ Pane<? extends Entity> parentPane,
+ Composite parent) {
+
+ super(parentPane, parent);
+ }
+
+
+ @Override
+ protected Pane<ReadOnlyAssociationOverride> buildAssociationOverridePane(PageBook pageBook, PropertyValueModel<ReadOnlyAssociationOverride> associationOverrideHolder) {
+ return new AssociationOverride2_0Composite(this, associationOverrideHolder, pageBook);
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/Generation2_0Composite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/Generation2_0Composite.java
new file mode 100644
index 0000000000..94d06795ab
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/Generation2_0Composite.java
@@ -0,0 +1,42 @@
+/*******************************************************************************
+* Copyright (c) 2009 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.ui.internal.jpa2.details;
+
+import org.eclipse.jpt.common.ui.internal.widgets.Pane;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.GeneratorContainer;
+import org.eclipse.jpt.jpa.ui.internal.details.GenerationComposite;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * Generation2_0Composite
+ */
+public class Generation2_0Composite extends GenerationComposite
+{
+
+ public Generation2_0Composite(
+ Pane<?> parentPane,
+ PropertyValueModel<? extends GeneratorContainer> subjectHolder,
+ Composite parent) {
+
+ super(parentPane, subjectHolder, parent);
+ }
+
+ @Override
+ protected void addSequenceGeneratorComposite(Composite container, int topMargin, int leftMargin) {
+ new SequenceGenerator2_0Composite(
+ this,
+ this.buildSequenceGeneratorHolder(),
+ this.addSubPane(container, topMargin, leftMargin),
+ this.buildSequenceGeneratorBuilder()
+ );
+ }
+
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/IdMapping2_0MappedByRelationshipPane.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/IdMapping2_0MappedByRelationshipPane.java
new file mode 100644
index 0000000000..1381b5bbff
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/IdMapping2_0MappedByRelationshipPane.java
@@ -0,0 +1,72 @@
+/*******************************************************************************
+ * Copyright (c) 2010 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.ui.internal.jpa2.details;
+
+import org.eclipse.jpt.common.ui.internal.util.ControlSwitcher;
+import org.eclipse.jpt.common.ui.internal.widgets.Pane;
+import org.eclipse.jpt.common.utility.internal.Transformer;
+import org.eclipse.jpt.common.utility.internal.model.value.PropertyAspectAdapter;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.common.utility.model.value.WritablePropertyValueModel;
+import org.eclipse.jpt.jpa.core.jpa2.context.IdMapping2_0;
+import org.eclipse.jpt.jpa.core.jpa2.context.MappedByRelationshipMapping2_0;
+import org.eclipse.swt.SWT;
+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.ui.part.PageBook;
+
+
+public class IdMapping2_0MappedByRelationshipPane<T extends IdMapping2_0>
+ extends Pane<T>
+{
+
+ Label mappedByRelationshipLabel;
+
+ public IdMapping2_0MappedByRelationshipPane(
+ Pane<?> parentPane,
+ PropertyValueModel<T> subjectHolder,
+ Composite parent) {
+
+ super(parentPane, subjectHolder, parent);
+ }
+
+ @Override
+ protected void initializeLayout(Composite container) {
+ PageBook pageBook = new PageBook(container, SWT.NULL);
+ pageBook.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+ this.mappedByRelationshipLabel = addLabel(pageBook, JptUiDetailsMessages2_0.IdMapping2_0MappedByRelationshipPane_label);
+
+ new ControlSwitcher(buildIsMappedByRelationshipHolder(), buildPaneTransformer(), pageBook);
+ }
+
+ protected WritablePropertyValueModel<Boolean> buildIsMappedByRelationshipHolder() {
+ return new PropertyAspectAdapter<T, Boolean>(getSubjectHolder(), MappedByRelationshipMapping2_0.MAPPED_BY_RELATIONSHIP_PROPERTY) {
+ @Override
+ protected Boolean buildValue_() {
+ return Boolean.valueOf(this.subject.isMappedByRelationship());
+ }
+ };
+ }
+
+ private Transformer<Boolean, Control> buildPaneTransformer() {
+ return new Transformer<Boolean, Control>() {
+ public Control transform(Boolean converter) {
+ if (converter == null || converter == Boolean.FALSE) {
+ return null;
+ }
+ return IdMapping2_0MappedByRelationshipPane.this.mappedByRelationshipLabel;
+ }
+ };
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/IdMappingGeneration2_0Composite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/IdMappingGeneration2_0Composite.java
new file mode 100644
index 0000000000..c850727e35
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/IdMappingGeneration2_0Composite.java
@@ -0,0 +1,48 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2010 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.ui.internal.jpa2.details;
+
+import org.eclipse.jpt.common.ui.internal.widgets.Pane;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.IdMapping;
+import org.eclipse.jpt.jpa.core.context.SequenceGenerator;
+import org.eclipse.jpt.jpa.ui.internal.details.IdMappingGenerationComposite;
+import org.eclipse.jpt.jpa.ui.internal.details.SequenceGeneratorComposite;
+import org.eclipse.jpt.jpa.ui.internal.details.GeneratorComposite.GeneratorBuilder;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * IdMappingGeneration2_0Composite
+ */
+public class IdMappingGeneration2_0Composite extends IdMappingGenerationComposite
+{
+
+ public IdMappingGeneration2_0Composite(Pane<? extends IdMapping> parentPane, Composite parent) {
+ super(parentPane, parent);
+ }
+
+ @Override
+ protected SequenceGeneratorComposite buildSequenceGeneratorComposite(
+ Composite container,
+ PropertyValueModel<SequenceGenerator> sequenceGeneratorHolder,
+ GeneratorBuilder<SequenceGenerator> sequenceGeneratorBuilder,
+ int topMargin,
+ int leftMargin) {
+
+ return new SequenceGenerator2_0Composite(
+ this,
+ sequenceGeneratorHolder,
+ this.addSubPane(container, topMargin, leftMargin),
+ sequenceGeneratorBuilder
+ );
+ }
+
+
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/JptUiDetailsMessages2_0.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/JptUiDetailsMessages2_0.java
new file mode 100644
index 0000000000..02f251d197
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/JptUiDetailsMessages2_0.java
@@ -0,0 +1,78 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2010 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.ui.internal.jpa2.details;
+
+import org.eclipse.osgi.util.NLS;
+
+/**
+ * Localized messages used by Dali mapping panes.
+ *
+ * @version 2.3
+ * @since 2.3
+ */
+public class JptUiDetailsMessages2_0
+{
+ public static String CascadePane2_0_detach;
+
+ public static String CollectionTable2_0Composite_title;
+ public static String CollectionTable2_0Composite_joinColumn;
+ public static String CollectionTable2_0Composite_name;
+ public static String CollectionTable2_0Composite_schema;
+ public static String CollectionTable2_0Composite_catalog;
+ public static String CollectionTable2_0Composite_overrideDefaultJoinColumns;
+
+ public static String DerivedIdentity_title;
+ public static String DerivedIdentity_nullDerivedIdentity;
+ public static String DerivedIdentity_idDerivedIdentity;
+ public static String DerivedIdentity_mapsIdDerivedIdentity;
+ public static String DerivedIdentity_mapsIdUnspecifiedValue;
+
+ public static String ElementCollectionMapping2_0_label;
+ public static String ElementCollectionMapping2_0_linkLabel;
+
+ public static String ElementCollectionSection_title;
+ public static String AbstractElementCollectionMapping2_0_Composite_valueSectionTitle;
+
+ public static String Entity_cacheableLabel;
+ public static String Entity_cacheableWithDefaultLabel;
+
+ public static String EmbeddedIdMapping2_0MappedByRelationshipPane_label;
+
+ public static String IdMapping2_0MappedByRelationshipPane_label;
+
+ public static String OrderingComposite_orderColumn;
+
+ public static String OrphanRemoval2_0Composite_orphanRemovalLabel;
+ public static String OrphanRemoval2_0Composite_orphanRemovalLabelDefault;
+
+ public static String LockModeComposite_lockModeLabel;
+
+ public static String LockModeComposite_read;
+ public static String LockModeComposite_write;
+ public static String LockModeComposite_optimistic;
+ public static String LockModeComposite_optimistic_force_increment;
+ public static String LockModeComposite_pessimistic_read;
+ public static String LockModeComposite_pessimistic_write;
+ public static String LockModeComposite_pessimistic_force_increment;
+ public static String LockModeComposite_none;
+
+ public static String TargetClassComposite_label;
+
+ private static final String BUNDLE_NAME = "jpt_ui_details2_0"; //$NON-NLS-1$
+ private static final Class<?> BUNDLE_CLASS = JptUiDetailsMessages2_0.class;
+ static {
+ NLS.initializeMessages(BUNDLE_NAME, BUNDLE_CLASS);
+ }
+
+ private JptUiDetailsMessages2_0() {
+ throw new UnsupportedOperationException();
+ }
+
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/LockModeComposite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/LockModeComposite.java
new file mode 100644
index 0000000000..b47a08b720
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/LockModeComposite.java
@@ -0,0 +1,89 @@
+/*******************************************************************************
+* Copyright (c) 2009, 2010 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.ui.internal.jpa2.details;
+
+import java.util.Collection;
+
+import org.eclipse.jpt.common.ui.internal.widgets.EnumFormComboViewer;
+import org.eclipse.jpt.common.ui.internal.widgets.Pane;
+import org.eclipse.jpt.jpa.core.jpa2.context.LockModeType2_0;
+import org.eclipse.jpt.jpa.core.jpa2.context.NamedQuery2_0;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * LockModeComposite
+ */
+public class LockModeComposite extends Pane<NamedQuery2_0>
+{
+ /**
+ * Creates a new <code>LockModeComposite</code>.
+ *
+ * @param parentPane The parent container of this one
+ * @param parent The parent container
+ */
+ public LockModeComposite(Pane<? extends NamedQuery2_0> parentPane,
+ Composite parent) {
+
+ super(parentPane, parent);
+ }
+
+ @Override
+ protected void initializeLayout(Composite container) {
+
+ this.addLabeledComposite(
+ container,
+ JptUiDetailsMessages2_0.LockModeComposite_lockModeLabel,
+ this.addLockModeTypeCombo(container),
+ null // TODO
+ );
+ }
+
+ private EnumFormComboViewer<NamedQuery2_0, LockModeType2_0> addLockModeTypeCombo(Composite container) {
+
+ return new EnumFormComboViewer<NamedQuery2_0, LockModeType2_0>(this, container) {
+
+ @Override
+ protected void addPropertyNames(Collection<String> propertyNames) {
+ super.addPropertyNames(propertyNames);
+ propertyNames.add(NamedQuery2_0.DEFAULT_LOCK_MODE_PROPERTY);
+ propertyNames.add(NamedQuery2_0.SPECIFIED_LOCK_MODE_PROPERTY);
+ }
+
+ @Override
+ protected LockModeType2_0[] getChoices() {
+ return LockModeType2_0.values();
+ }
+
+ @Override
+ protected LockModeType2_0 getDefaultValue() {
+ return this.getSubject().getDefaultLockMode();
+ }
+
+ @Override
+ protected String displayString(LockModeType2_0 value) {
+ return this.buildDisplayString(
+ JptUiDetailsMessages2_0.class,
+ LockModeComposite.this,
+ value
+ );
+ }
+
+ @Override
+ protected LockModeType2_0 getValue() {
+ return this.getSubject().getSpecifiedLockMode();
+ }
+
+ @Override
+ protected void setValue(LockModeType2_0 value) {
+ this.getSubject().setSpecifiedLockMode(value);
+ }
+ };
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/ManyToOneJoiningStrategy2_0Pane.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/ManyToOneJoiningStrategy2_0Pane.java
new file mode 100644
index 0000000000..8e01f1ef5b
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/ManyToOneJoiningStrategy2_0Pane.java
@@ -0,0 +1,84 @@
+/*******************************************************************************
+ * Copyright (c) 2010, 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.ui.internal.jpa2.details;
+
+import org.eclipse.jpt.common.ui.internal.widgets.Pane;
+import org.eclipse.jpt.common.utility.internal.model.value.SimplePropertyValueModel;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.ManyToOneRelationship;
+import org.eclipse.jpt.jpa.core.jpa2.context.ManyToOneRelationship2_0;
+import org.eclipse.jpt.jpa.ui.internal.details.JoinColumnJoiningStrategyPane;
+import org.eclipse.jpt.jpa.ui.internal.details.JoinTableJoiningStrategyPane;
+import org.eclipse.jpt.jpa.ui.internal.details.JptUiDetailsMessages;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * Here is the layout of this pane:
+ * <pre>
+ * -----------------------------------------------------------------------------
+ * | - Joining Strategy ------------------------------------------------------ |
+ * | | | |
+ * | | o JoinColumnStrategyPane ____________________________________________ | |
+ * | | | | | |
+ * | | | | | |
+ * | | --------------------------------------------------------------------- | |
+ * | | o JoinTableJoiningStrategyPane_______________________________________ | |
+ * | | | | | |
+ * | | | | | |
+ * | | --------------------------------------------------------------------- | |
+ * | ------------------------------------------------------------------------- |
+ * -----------------------------------------------------------------------------</pre>
+ *
+ * @see {@link ManyToOneMapping}
+ * @see {@link ManyToOneRelationship}
+ * @see {@link OrmManyToOneMappingComposite}
+ * @see {@link JoinColumnStrategyPane}
+ *
+ * @version 2.3
+ * @since 2.1
+ */
+public class ManyToOneJoiningStrategy2_0Pane extends Pane<ManyToOneRelationship2_0>
+{
+ public ManyToOneJoiningStrategy2_0Pane(
+ Pane<?> parentPane,
+ PropertyValueModel<? extends ManyToOneRelationship2_0> subjectHolder,
+ Composite parent) {
+
+ super(parentPane, subjectHolder, parent);
+ }
+
+
+ @Override
+ protected void initializeLayout(Composite container) {
+ Composite composite = addCollapsibleSection(
+ container,
+ JptUiDetailsMessages.Joining_title,
+ new SimplePropertyValueModel<Boolean>(Boolean.TRUE));
+
+ addRadioButton(
+ composite,
+ JptUiDetailsMessages.Joining_joinColumnJoiningLabel,
+ JoinColumnJoiningStrategyPane.buildUsesJoinColumnJoiningStrategyHolder(getSubjectHolder()),
+ null);
+
+ JoinColumnJoiningStrategyPane.
+ buildJoinColumnJoiningStrategyPaneWithIncludeOverrideCheckBox(this, composite);
+
+ addRadioButton(
+ composite,
+ JptUiDetailsMessages.Joining_joinTableJoiningLabel,
+ JoinTableJoiningStrategyPane.buildUsesJoinTableJoiningStrategyHolder(getSubjectHolder()),
+ null);
+
+ new JoinTableJoiningStrategyPane(this, composite);
+
+ addSubPane(composite, 5);
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/NamedQueryProperty2_0Composite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/NamedQueryProperty2_0Composite.java
new file mode 100644
index 0000000000..037037b257
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/NamedQueryProperty2_0Composite.java
@@ -0,0 +1,67 @@
+/*******************************************************************************
+* Copyright (c) 2009 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.ui.internal.jpa2.details;
+
+import org.eclipse.jpt.common.ui.internal.widgets.Pane;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.jpa2.context.NamedQuery2_0;
+import org.eclipse.jpt.jpa.ui.internal.details.JptUiDetailsMessages;
+import org.eclipse.jpt.jpa.ui.internal.details.NamedQueryPropertyComposite;
+import org.eclipse.jpt.jpa.ui.internal.details.QueryHintsComposite;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * NamedQueryProperty2_0Composite
+ */
+public class NamedQueryProperty2_0Composite extends NamedQueryPropertyComposite<NamedQuery2_0>
+{
+ /**
+ * Creates a new <code>NamedQueryProperty2_0Composite</code>.
+ *
+ * @param parentPane The parent container of this one
+ * @param subjectHolder The holder of this pane's subject
+ * @param parent The parent container
+ */
+ public NamedQueryProperty2_0Composite(Pane<?> parentPane,
+ PropertyValueModel<NamedQuery2_0> subjectHolder,
+ Composite parent) {
+
+ super(parentPane, subjectHolder, parent);
+ }
+
+ @Override
+ protected void initializeLayout(Composite container) {
+
+ this.addLabeledText(
+ container,
+ JptUiDetailsMessages.NamedQueryComposite_nameTextLabel,
+ this.buildNameTextHolder());
+
+ // Query text area
+ this.addLabeledMultiLineText(
+ container,
+ JptUiDetailsMessages.NamedQueryPropertyComposite_query,
+ this.buildQueryHolder(),
+ 4,
+ null
+ );
+
+ new LockModeComposite(this, container);
+
+ // Query Hints pane
+ container = this.addTitledGroup(
+ this.addSubPane(container, 5),
+ JptUiDetailsMessages.NamedQueryPropertyComposite_queryHintsGroupBox
+ );
+
+ new QueryHintsComposite(this, container);
+ }
+
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/OneToManyJoiningStrategy2_0Pane.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/OneToManyJoiningStrategy2_0Pane.java
new file mode 100644
index 0000000000..6ce3c6ce17
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/OneToManyJoiningStrategy2_0Pane.java
@@ -0,0 +1,95 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 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.ui.internal.jpa2.details;
+
+import org.eclipse.jpt.common.ui.internal.widgets.Pane;
+import org.eclipse.jpt.common.utility.internal.model.value.SimplePropertyValueModel;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.OneToManyRelationship;
+import org.eclipse.jpt.jpa.core.jpa2.context.OneToManyRelationship2_0;
+import org.eclipse.jpt.jpa.ui.internal.details.JoinColumnJoiningStrategyPane;
+import org.eclipse.jpt.jpa.ui.internal.details.JoinTableJoiningStrategyPane;
+import org.eclipse.jpt.jpa.ui.internal.details.JptUiDetailsMessages;
+import org.eclipse.jpt.jpa.ui.internal.details.MappedByJoiningStrategyPane;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * Here is the layout of this pane:
+ * <pre>
+ * -----------------------------------------------------------------------------
+ * | - Joining Strategy ------------------------------------------------------ |
+ * | | | |
+ * | | o MappedByJoiningStrategyPane _______________________________________ | |
+ * | | | | | |
+ * | | | | | |
+ * | | --------------------------------------------------------------------- | |
+ * | | o JoinTableStrategyPane _____________________________________________ | |
+ * | | | | | |
+ * | | | | | |
+ * | | --------------------------------------------------------------------- | |
+ * | ------------------------------------------------------------------------- |
+ * -----------------------------------------------------------------------------</pre>
+ *
+ * @see {@link OneToManyMapping}
+ * @see {@link OneToManyRelationship}
+ * @see {@link OrmOneToManyMappingComposite}
+ * @see {@link MappedByStrategyPane}
+ * @see {@link JoinTableStrategyPane}
+ *
+ * @version 2.3
+ * @since 2.1
+ */
+public class OneToManyJoiningStrategy2_0Pane
+ extends Pane<OneToManyRelationship2_0>
+{
+ public OneToManyJoiningStrategy2_0Pane(
+ Pane<?> parentPane,
+ PropertyValueModel<? extends OneToManyRelationship2_0> subjectHolder,
+ Composite parent) {
+
+ super(parentPane, subjectHolder, parent);
+ }
+
+
+ @Override
+ protected void initializeLayout(Composite container) {
+ Composite composite = addCollapsibleSection(
+ container,
+ JptUiDetailsMessages.Joining_title,
+ new SimplePropertyValueModel<Boolean>(Boolean.TRUE));
+
+ addRadioButton(
+ composite,
+ JptUiDetailsMessages.Joining_mappedByLabel,
+ MappedByJoiningStrategyPane.buildUsesMappedByJoiningStrategyHolder(getSubjectHolder()),
+ null);
+
+ new MappedByJoiningStrategyPane(this, composite);
+
+ addRadioButton(
+ composite,
+ JptUiDetailsMessages.Joining_joinColumnJoiningLabel,
+ JoinColumnJoiningStrategyPane.buildUsesJoinColumnJoiningStrategyHolder(getSubjectHolder()),
+ null);
+
+ JoinColumnJoiningStrategyPane.
+ buildJoinColumnJoiningStrategyPaneWithIncludeOverrideCheckBox(this, composite);
+
+ addRadioButton(
+ composite,
+ JptUiDetailsMessages.Joining_joinTableJoiningLabel,
+ JoinTableJoiningStrategyPane.buildUsesJoinTableJoiningStrategyHolder(getSubjectHolder()),
+ null);
+
+ new JoinTableJoiningStrategyPane(this, composite);
+
+ addSubPane(composite, 5);
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/OneToOneJoiningStrategy2_0Pane.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/OneToOneJoiningStrategy2_0Pane.java
new file mode 100644
index 0000000000..79f70503af
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/OneToOneJoiningStrategy2_0Pane.java
@@ -0,0 +1,115 @@
+/*******************************************************************************
+ * Copyright (c) 2010, 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.ui.internal.jpa2.details;
+
+import org.eclipse.jpt.common.ui.internal.widgets.Pane;
+import org.eclipse.jpt.common.utility.internal.model.value.SimplePropertyValueModel;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.OneToOneMapping;
+import org.eclipse.jpt.jpa.core.context.OneToOneRelationship;
+import org.eclipse.jpt.jpa.core.jpa2.context.OneToOneRelationship2_0;
+import org.eclipse.jpt.jpa.ui.internal.details.JoinColumnJoiningStrategyPane;
+import org.eclipse.jpt.jpa.ui.internal.details.JoinTableJoiningStrategyPane;
+import org.eclipse.jpt.jpa.ui.internal.details.JptUiDetailsMessages;
+import org.eclipse.jpt.jpa.ui.internal.details.MappedByJoiningStrategyPane;
+import org.eclipse.jpt.jpa.ui.internal.details.OneToOneMappingComposite;
+import org.eclipse.jpt.jpa.ui.internal.details.PrimaryKeyJoinColumnJoiningStrategyPane;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * Here is the layout of this pane:
+ * <pre>
+ * -----------------------------------------------------------------------------
+ * | - Joining Strategy ------------------------------------------------------ |
+ * | | | |
+ * | | o MappedByJoiningStrategyPane _______________________________________ | |
+ * | | | | | |
+ * | | | | | |
+ * | | --------------------------------------------------------------------- | |
+ * | | o JoinColumnStrategyPane ____________________________________________ | |
+ * | | | | | |
+ * | | | | | |
+ * | | --------------------------------------------------------------------- | |
+ * | | o JoinTableJoiningStrategyPane_______________________________________ | |
+ * | | | | | |
+ * | | | | | |
+ * | | --------------------------------------------------------------------- | |
+ * | | o PrimaryKeyJoinColumnStrategyPane __________________________________ | |
+ * | | | | | |
+ * | | | | | |
+ * | | --------------------------------------------------------------------- | |
+ * | ------------------------------------------------------------------------- |
+ * -----------------------------------------------------------------------------</pre>
+ *
+ * @see {@link OneToOneMapping}
+ * @see {@link OneToOneRelationship}
+ * @see {@link OneToOneMappingComposite}
+ * @see {@link MappedByStrategyPane}
+ * @see {@link JoinColumnStrategyPane}
+ * @see {@link PrimaryKeyJoinColumnStrategyPane}
+ *
+ * @version 2.3
+ * @since 2.1
+ */
+public class OneToOneJoiningStrategy2_0Pane
+ extends Pane<OneToOneRelationship2_0>
+{
+ public OneToOneJoiningStrategy2_0Pane(
+ Pane<?> parentPane,
+ PropertyValueModel<? extends OneToOneRelationship2_0> subjectHolder,
+ Composite parent) {
+
+ super(parentPane, subjectHolder, parent);
+ }
+
+
+ @Override
+ protected void initializeLayout(Composite container) {
+ Composite composite = addCollapsibleSection(
+ container,
+ JptUiDetailsMessages.Joining_title,
+ new SimplePropertyValueModel<Boolean>(Boolean.TRUE));
+
+ addRadioButton(
+ composite,
+ JptUiDetailsMessages.Joining_mappedByLabel,
+ MappedByJoiningStrategyPane.buildUsesMappedByJoiningStrategyHolder(getSubjectHolder()),
+ null);
+
+ new MappedByJoiningStrategyPane(this, composite);
+
+ addRadioButton(
+ composite,
+ JptUiDetailsMessages.Joining_primaryKeyJoinColumnJoiningLabel,
+ PrimaryKeyJoinColumnJoiningStrategyPane.buildUsesPrimaryKeyJoinColumnJoiningStrategyHolder(getSubjectHolder()),
+ null);
+
+ new PrimaryKeyJoinColumnJoiningStrategyPane(this, composite);
+
+ addRadioButton(
+ composite,
+ JptUiDetailsMessages.Joining_joinColumnJoiningLabel,
+ JoinColumnJoiningStrategyPane.buildUsesJoinColumnJoiningStrategyHolder(getSubjectHolder()),
+ null);
+
+ JoinColumnJoiningStrategyPane.
+ buildJoinColumnJoiningStrategyPaneWithIncludeOverrideCheckBox(this, composite);
+
+ addRadioButton(
+ composite,
+ JptUiDetailsMessages.Joining_joinTableJoiningLabel,
+ JoinTableJoiningStrategyPane.buildUsesJoinTableJoiningStrategyHolder(getSubjectHolder()),
+ null);
+
+ new JoinTableJoiningStrategyPane(this, composite);
+
+ addSubPane(composite, 5);
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/OrderColumnComposite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/OrderColumnComposite.java
new file mode 100644
index 0000000000..f5601a87d1
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/OrderColumnComposite.java
@@ -0,0 +1,370 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2010 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.ui.internal.jpa2.details;
+
+import java.util.Collection;
+
+import org.eclipse.jpt.common.ui.internal.JptCommonUiMessages;
+import org.eclipse.jpt.common.ui.internal.widgets.Pane;
+import org.eclipse.jpt.common.utility.internal.model.value.PropertyAspectAdapter;
+import org.eclipse.jpt.common.utility.internal.model.value.SimplePropertyValueModel;
+import org.eclipse.jpt.common.utility.internal.model.value.TransformationPropertyValueModel;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.common.utility.model.value.WritablePropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.BaseColumn;
+import org.eclipse.jpt.jpa.core.context.NamedColumn;
+import org.eclipse.jpt.jpa.core.jpa2.context.OrderColumn2_0;
+import org.eclipse.jpt.jpa.db.Table;
+import org.eclipse.jpt.jpa.ui.internal.JpaHelpContextIds;
+import org.eclipse.jpt.jpa.ui.internal.details.JptUiDetailsMessages;
+import org.eclipse.jpt.jpa.ui.internal.details.db.ColumnCombo;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * Here the layout of this pane:
+ * <pre>
+ * -----------------------------------------------------------------------------
+ * | ------------------------------------------------------------------------- |
+ * | | | |
+ * | | ColumnCombo | |
+ * | | | |
+ * | ------------------------------------------------------------------------- |
+ * | |
+ * | > Details |
+ * | |
+ * | x Insertable |
+ * | |
+ * | x Updatable |
+ * | |
+ * | x Nullable |
+ * | |
+ * | ---------------------------------------------------- |
+ * | Column Definition: | I | |
+ * | ---------------------------------------------------- |
+ * -----------------------------------------------------------------------------</pre>
+ * *
+ * @version 3.0
+ * @since 3.0
+ */
+public class OrderColumnComposite extends Pane<OrderColumn2_0> {
+
+ /**
+ * Creates a new <code>ColumnComposite</code>.
+ *
+ * @param parentPane The parent container of this one
+ * @param subjectHolder The holder of the subject <code>IColumn</code>
+ * @param parent The parent container
+ */
+ public OrderColumnComposite(Pane<?> parentPane,
+ PropertyValueModel<? extends OrderColumn2_0> subjectHolder,
+ Composite parent) {
+
+ super(parentPane, subjectHolder, parent, false);
+ }
+
+ /**
+ * Creates a new <code>ColumnComposite</code>.
+ *
+ * @param parentPane The parent container of this one
+ * @param subjectHolder The holder of the subject <code>IColumn</code>
+ * @param parent The parent container
+ * @param automaticallyAlignWidgets <code>true</code> to make the widgets
+ * this pane aligned with the widgets of the given parent controller;
+ * <code>false</code> to not align them
+ */
+ public OrderColumnComposite(Pane<?> parentPane,
+ PropertyValueModel<? extends OrderColumn2_0> subjectHolder,
+ Composite parent,
+ boolean automaticallyAlignWidgets) {
+
+ super(parentPane, subjectHolder, parent, automaticallyAlignWidgets);
+ }
+
+ /**
+ * Creates a new <code>ColumnComposite</code>.
+ *
+ * @param parentPane The parent container of this one
+ * @param subjectHolder The holder of the subject <code>IColumn</code>
+ * @param parent The parent container
+ * @param automaticallyAlignWidgets <code>true</code> to make the widgets
+ * this pane aligned with the widgets of the given parent controller;
+ * <code>false</code> to not align them
+ */
+ public OrderColumnComposite(Pane<?> parentPane,
+ PropertyValueModel<? extends OrderColumn2_0> subjectHolder,
+ Composite parent,
+ boolean automaticallyAlignWidgets,
+ boolean parentManagePane) {
+
+ super(parentPane, subjectHolder, parent, automaticallyAlignWidgets, parentManagePane);
+ }
+
+ private ColumnCombo<OrderColumn2_0> addColumnCombo(Composite container) {
+
+ return new ColumnCombo<OrderColumn2_0>(this, container) {
+
+ @Override
+ protected void addPropertyNames(Collection<String> propertyNames) {
+ super.addPropertyNames(propertyNames);
+ propertyNames.add(NamedColumn.DEFAULT_NAME_PROPERTY);
+ propertyNames.add(NamedColumn.SPECIFIED_NAME_PROPERTY);
+ }
+
+ @Override
+ protected String getDefaultValue() {
+ return getSubject().getDefaultName();
+ }
+
+ @Override
+ protected void setValue(String value) {
+ getSubject().setSpecifiedName(value);
+ }
+
+ @Override
+ protected Table getDbTable_() {
+ return getSubject().getDbTable();
+ }
+
+ @Override
+ protected String getValue() {
+ return getSubject().getSpecifiedName();
+ }
+ @Override
+ public String toString() {
+ return "OrderColumnComposite.columnCombo"; //$NON-NLS-1$
+ }
+ };
+ }
+
+ private WritablePropertyValueModel<String> buildColumnDefinitionHolder() {
+ return new PropertyAspectAdapter<OrderColumn2_0, String>(getSubjectHolder(), NamedColumn.COLUMN_DEFINITION_PROPERTY) {
+ @Override
+ protected String buildValue_() {
+ return this.subject.getColumnDefinition();
+ }
+
+ @Override
+ protected void setValue_(String value) {
+ if (value.length() == 0) {
+ value = null;
+ }
+ this.subject.setColumnDefinition(value);
+ }
+ };
+ }
+
+ private WritablePropertyValueModel<Boolean> buildInsertableHolder() {
+ return new PropertyAspectAdapter<OrderColumn2_0, Boolean>(getSubjectHolder(), BaseColumn.SPECIFIED_INSERTABLE_PROPERTY) {
+ @Override
+ protected Boolean buildValue_() {
+ return this.subject.getSpecifiedInsertable();
+ }
+
+ @Override
+ protected void setValue_(Boolean value) {
+ this.subject.setSpecifiedInsertable(value);
+ }
+ };
+ }
+
+ private PropertyValueModel<String> buildInsertableStringHolder() {
+ return new TransformationPropertyValueModel<Boolean, String>(buildDefaultInsertableHolder()) {
+ @Override
+ protected String transform(Boolean value) {
+ if (value != null) {
+ String defaultStringValue = value.booleanValue() ? JptCommonUiMessages.Boolean_True : JptCommonUiMessages.Boolean_False;
+ return NLS.bind(JptUiDetailsMessages.ColumnComposite_insertableWithDefault, defaultStringValue);
+ }
+ return JptUiDetailsMessages.ColumnComposite_insertable;
+ }
+ };
+ }
+
+ private PropertyValueModel<Boolean> buildDefaultInsertableHolder() {
+ return new PropertyAspectAdapter<OrderColumn2_0, Boolean>(
+ getSubjectHolder(),
+ BaseColumn.SPECIFIED_INSERTABLE_PROPERTY,
+ BaseColumn.DEFAULT_INSERTABLE_PROPERTY)
+ {
+ @Override
+ protected Boolean buildValue_() {
+ if (this.subject.getSpecifiedInsertable() != null) {
+ return null;
+ }
+ return Boolean.valueOf(this.subject.isDefaultInsertable());
+ }
+ };
+ }
+
+ private WritablePropertyValueModel<Boolean> buildNullableHolder() {
+ return new PropertyAspectAdapter<OrderColumn2_0, Boolean>(
+ getSubjectHolder(),
+ BaseColumn.SPECIFIED_NULLABLE_PROPERTY)
+ {
+ @Override
+ protected Boolean buildValue_() {
+ return this.subject.getSpecifiedNullable();
+ }
+
+ @Override
+ protected void setValue_(Boolean value) {
+ this.subject.setSpecifiedNullable(value);
+ }
+ };
+ }
+
+ private PropertyValueModel<String> buildNullableStringHolder() {
+ return new TransformationPropertyValueModel<Boolean, String>(buildDefaultNullableHolder()) {
+ @Override
+ protected String transform(Boolean value) {
+ if (value != null) {
+ String defaultStringValue = value.booleanValue() ? JptCommonUiMessages.Boolean_True : JptCommonUiMessages.Boolean_False;
+ return NLS.bind(JptUiDetailsMessages.ColumnComposite_nullableWithDefault, defaultStringValue);
+ }
+ return JptUiDetailsMessages.ColumnComposite_nullable;
+ }
+ };
+ }
+
+ private PropertyValueModel<Boolean> buildDefaultNullableHolder() {
+ return new PropertyAspectAdapter<OrderColumn2_0, Boolean>(
+ getSubjectHolder(),
+ BaseColumn.SPECIFIED_NULLABLE_PROPERTY,
+ BaseColumn.DEFAULT_NULLABLE_PROPERTY)
+ {
+ @Override
+ protected Boolean buildValue_() {
+ if (this.subject.getSpecifiedNullable() != null) {
+ return null;
+ }
+ return Boolean.valueOf(this.subject.isDefaultNullable());
+ }
+ };
+ }
+
+
+ private WritablePropertyValueModel<Boolean> buildUpdatableHolder() {
+ return new PropertyAspectAdapter<OrderColumn2_0, Boolean>(
+ getSubjectHolder(),
+ BaseColumn.DEFAULT_UPDATABLE_PROPERTY,
+ BaseColumn.SPECIFIED_UPDATABLE_PROPERTY)
+ {
+ @Override
+ protected Boolean buildValue_() {
+ return this.subject.getSpecifiedUpdatable();
+ }
+
+ @Override
+ protected void setValue_(Boolean value) {
+ this.subject.setSpecifiedUpdatable(value);
+ }
+ };
+ }
+
+ private PropertyValueModel<String> buildUpdatableStringHolder() {
+
+ return new TransformationPropertyValueModel<Boolean, String>(buildDefaultUpdatableHolder()) {
+
+ @Override
+ protected String transform(Boolean value) {
+ if (value != null) {
+ String defaultStringValue = value.booleanValue() ? JptCommonUiMessages.Boolean_True : JptCommonUiMessages.Boolean_False;
+ return NLS.bind(JptUiDetailsMessages.ColumnComposite_updatableWithDefault, defaultStringValue);
+ }
+ return JptUiDetailsMessages.ColumnComposite_updatable;
+ }
+ };
+ }
+
+ private PropertyValueModel<Boolean> buildDefaultUpdatableHolder() {
+ return new PropertyAspectAdapter<OrderColumn2_0, Boolean>(
+ getSubjectHolder(),
+ BaseColumn.SPECIFIED_UPDATABLE_PROPERTY,
+ BaseColumn.DEFAULT_UPDATABLE_PROPERTY)
+ {
+ @Override
+ protected Boolean buildValue_() {
+ if (this.subject.getSpecifiedUpdatable() != null) {
+ return null;
+ }
+ return Boolean.valueOf(this.subject.isDefaultUpdatable());
+ }
+ };
+ }
+
+ @Override
+ protected void initializeLayout(Composite container) {
+ // Column widgets
+ addLabeledComposite(
+ container,
+ JptUiDetailsMessages.ColumnComposite_name,
+ addColumnCombo(container),
+ JpaHelpContextIds.MAPPING_ORDER_COLUMN_ORDERING_COLUMN
+ );
+
+ // Details sub-pane
+ container = addCollapsibleSubSection(
+ container,
+ JptUiDetailsMessages.ColumnComposite_details,
+ new SimplePropertyValueModel<Boolean>(Boolean.FALSE)
+ );
+
+ new DetailsComposite(this, getSubjectHolder(), addSubPane(container, 0, 16));
+ }
+
+ protected class DetailsComposite extends Pane<OrderColumn2_0> {
+
+ public DetailsComposite(Pane<?> parentPane,
+ PropertyValueModel<? extends OrderColumn2_0> subjectHolder,
+ Composite parent) {
+
+ super(parentPane, subjectHolder, parent, false);
+ }
+
+ @Override
+ protected void initializeLayout(Composite container) {
+
+ // Insertable tri-state check box
+ addTriStateCheckBoxWithDefault(
+ addSubPane(container, 4),
+ JptUiDetailsMessages.ColumnComposite_insertable,
+ buildInsertableHolder(),
+ buildInsertableStringHolder(),
+ JpaHelpContextIds.MAPPING_COLUMN_INSERTABLE
+ );
+
+ // Updatable tri-state check box
+ addTriStateCheckBoxWithDefault(
+ container,
+ JptUiDetailsMessages.ColumnComposite_updatable,
+ buildUpdatableHolder(),
+ buildUpdatableStringHolder(),
+ JpaHelpContextIds.MAPPING_COLUMN_UPDATABLE
+ );
+
+ // Nullable tri-state check box
+ addTriStateCheckBoxWithDefault(
+ container,
+ JptUiDetailsMessages.ColumnComposite_nullable,
+ buildNullableHolder(),
+ buildNullableStringHolder(),
+ JpaHelpContextIds.MAPPING_COLUMN_NULLABLE
+ );
+
+ // Column Definition widgets
+ addLabeledText(
+ container,
+ JptUiDetailsMessages.ColumnComposite_columnDefinition,
+ buildColumnDefinitionHolder()
+ );
+ }
+ }
+} \ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/Ordering2_0Composite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/Ordering2_0Composite.java
new file mode 100644
index 0000000000..4722746511
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/Ordering2_0Composite.java
@@ -0,0 +1,168 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2010 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.ui.internal.jpa2.details;
+
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.ui.internal.util.PaneEnabler;
+import org.eclipse.jpt.common.ui.internal.widgets.Pane;
+import org.eclipse.jpt.common.utility.internal.model.value.PropertyAspectAdapter;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.common.utility.model.value.WritablePropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.CollectionMapping;
+import org.eclipse.jpt.jpa.core.context.Orderable;
+import org.eclipse.jpt.jpa.core.jpa2.context.OrderColumn2_0;
+import org.eclipse.jpt.jpa.core.jpa2.context.Orderable2_0;
+import org.eclipse.jpt.jpa.ui.internal.JpaHelpContextIds;
+import org.eclipse.jpt.jpa.ui.internal.details.AbstractOrderingComposite;
+import org.eclipse.jpt.jpa.ui.internal.details.JptUiDetailsMessages;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * Here the layout of this pane:
+ * <pre>
+ * -----------------------------------------------------------------------------
+ * | - Ordering -------------------------------------------------------------- |
+ * | | | |
+ * | | o None | |
+ * | | | |
+ * | | o Primary Key | |
+ * | | | |
+ * | | o Custom | |
+ * | | ------------------------------------------------------------------- | |
+ * | | | I | | |
+ * | | ------------------------------------------------------------------- | |
+ * | ------------------------------------------------------------------------- |
+ * -----------------------------------------------------------------------------</pre>
+ *
+ * @see CollectionMapping
+ * @see OrmManyToManyMappingComposite - A container of this pane
+ * @see OrmOneToManyMappingComposite - A container of this pane
+ *
+ * @version 2.3
+ * @since 1.0
+ */
+public class Ordering2_0Composite extends AbstractOrderingComposite
+{
+ /**
+ * Creates a new <code>OrderingComposite</code>.
+ *
+ * @param parentPane The parent container of this one
+ * @param parent The parent container
+ */
+ public Ordering2_0Composite(Pane<? extends CollectionMapping> parentPane,
+ Composite parent) {
+
+ super(parentPane, parent);
+ }
+
+ /**
+ * Creates a new <code>OrderingComposite</code>.
+ *
+ * @param subjectHolder The holder of the subject <code>IMultiRelationshipMapping</code>
+ * @param parent The parent container
+ * @param widgetFactory The factory used to create various common widgets
+ */
+ public Ordering2_0Composite(PropertyValueModel<? extends CollectionMapping> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+
+ super(subjectHolder, parent, widgetFactory);
+ }
+
+ @Override
+ protected void initializeLayout(Composite container) {
+ PropertyValueModel<Orderable> orderableHolder = buildOrderableHolder();
+
+ container = addCollapsibleSection(
+ container,
+ JptUiDetailsMessages.OrderingComposite_orderingGroup
+ );
+
+ // No Ordering radio button
+ addRadioButton(
+ container,
+ JptUiDetailsMessages.OrderingComposite_none,
+ buildNoOrderingHolder(orderableHolder),
+ JpaHelpContextIds.MAPPING_ORDER_BY_NO_ORDERING
+ );
+
+ // Order by Primary Key radio button
+ addRadioButton(
+ container,
+ JptUiDetailsMessages.OrderingComposite_primaryKey,
+ buildPrimaryKeyOrderingHolder(orderableHolder),
+ JpaHelpContextIds.MAPPING_ORDER_BY_PRIMARY_KEY_ORDERING
+ );
+
+ // Custom Ordering radio button
+ addRadioButton(
+ container,
+ JptUiDetailsMessages.OrderingComposite_custom,
+ buildCustomOrderingHolder(orderableHolder),
+ JpaHelpContextIds.MAPPING_ORDER_BY_CUSTOM_ORDERING
+ );
+
+ // Custom Ordering text field
+ addText(
+ addSubPane(container, 0, 16),
+ buildSpecifiedOrderByHolder(orderableHolder),
+ JpaHelpContextIds.MAPPING_ORDER_BY,
+ buildCustomOrderingHolder(orderableHolder)
+ );
+
+
+ // Order Column Ordering radio button
+ addRadioButton(
+ container,
+ JptUiDetailsMessages2_0.OrderingComposite_orderColumn,
+ buildOrderColumnOrderingHolder(orderableHolder),
+ JpaHelpContextIds.MAPPING_ORDER_COLUMN_ORDERING
+ );
+
+ OrderColumnComposite orderColumnComposite = new OrderColumnComposite(
+ this,
+ buildOrderColumnHolder(orderableHolder),
+ addSubPane(container, 0, 16));
+
+ installOrderColumnCompositeEnabler(orderableHolder, orderColumnComposite);
+ }
+
+ protected void installOrderColumnCompositeEnabler(PropertyValueModel<Orderable> orderableHolder, OrderColumnComposite pane) {
+ new PaneEnabler(buildPaneEnablerHolder(orderableHolder), pane);
+ }
+
+ private PropertyValueModel<Boolean> buildPaneEnablerHolder(PropertyValueModel<Orderable> orderableHolder) {
+ return buildOrderColumnOrderingHolder(orderableHolder);
+ }
+
+
+ protected WritablePropertyValueModel<Boolean> buildOrderColumnOrderingHolder(PropertyValueModel<Orderable> orderableHolder) {
+ return new PropertyAspectAdapter<Orderable, Boolean>(orderableHolder, Orderable2_0.ORDER_COLUMN_ORDERING_PROPERTY) {
+ @Override
+ protected Boolean buildValue_() {
+ return Boolean.valueOf(((Orderable2_0) this.subject).isOrderColumnOrdering());
+ }
+
+ @Override
+ protected void setValue_(Boolean value) {
+ ((Orderable2_0) this.subject).setOrderColumnOrdering(value.booleanValue());
+ }
+ };
+ }
+
+ protected PropertyValueModel<OrderColumn2_0> buildOrderColumnHolder(PropertyValueModel<Orderable> orderableHolder) {
+ return new PropertyAspectAdapter<Orderable, OrderColumn2_0>(orderableHolder) {
+ @Override
+ protected OrderColumn2_0 buildValue_() {
+ return ((Orderable2_0) this.subject).getOrderColumn();
+ }
+ };
+ }
+} \ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/OrphanRemoval2_0Composite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/OrphanRemoval2_0Composite.java
new file mode 100644
index 0000000000..01845d77cd
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/OrphanRemoval2_0Composite.java
@@ -0,0 +1,111 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2010 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.ui.internal.jpa2.details;
+
+import org.eclipse.jpt.common.ui.internal.JptCommonUiMessages;
+import org.eclipse.jpt.common.ui.internal.widgets.Pane;
+import org.eclipse.jpt.common.utility.internal.model.value.PropertyAspectAdapter;
+import org.eclipse.jpt.common.utility.internal.model.value.TransformationPropertyValueModel;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.common.utility.model.value.WritablePropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.RelationshipMapping;
+import org.eclipse.jpt.jpa.core.jpa2.context.OrphanRemovable2_0;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * Here the layout of this pane:
+ * <pre>
+ * -----------------------------------------------------------------------------
+ * | ------------------------------------------------------------------------- |
+ * | | | |
+ * | | [X] Orphan removal (true/false) | |
+ * | | | |
+ * | ------------------------------------------------------------------------- |
+ * -----------------------------------------------------------------------------</pre>
+ *
+ * @see {@link OrphanRemovable2_0}
+ * @see {@link JavaOneToOneMapping2_0Composite} - A container of this widget
+ * @see {@link OrmOneToOneMapping2_0Composite} - A container of this widget
+ */
+public class OrphanRemoval2_0Composite extends Pane<OrphanRemovable2_0>
+{
+ /**
+ * Creates a new <code>OrphanRemoval2_0Composite</code>.
+ *
+ * @param parentPane The parent container of this one
+ * @param parent The parent container
+ */
+ public OrphanRemoval2_0Composite(
+ Pane<? extends RelationshipMapping> parentPane,
+ PropertyValueModel<? extends OrphanRemovable2_0> subjectHolder,
+ Composite parent) {
+ super(parentPane, subjectHolder, parent);
+ }
+
+ @Override
+ protected void initializeLayout(Composite container) {
+
+ this.addTriStateCheckBoxWithDefault(
+ container,
+ JptUiDetailsMessages2_0.OrphanRemoval2_0Composite_orphanRemovalLabel,
+ this.buildOrphanRemovalHolder(),
+ this.buildOrphanRemovalStringHolder(),
+ null // TODO
+ );
+ }
+ private WritablePropertyValueModel<Boolean> buildOrphanRemovalHolder() {
+ return new PropertyAspectAdapter<OrphanRemovable2_0, Boolean>(
+ this.getSubjectHolder(),
+ OrphanRemovable2_0.DEFAULT_ORPHAN_REMOVAL_PROPERTY,
+ OrphanRemovable2_0.SPECIFIED_ORPHAN_REMOVAL_PROPERTY) {
+ @Override
+ protected Boolean buildValue_() {
+ return this.subject.getSpecifiedOrphanRemoval();
+ }
+
+ @Override
+ protected void setValue_(Boolean value) {
+ this.subject.setSpecifiedOrphanRemoval(value);
+ }
+ };
+ }
+
+ private PropertyValueModel<String> buildOrphanRemovalStringHolder() {
+
+ return new TransformationPropertyValueModel<Boolean, String>(this.buildDefaultOrphanRemovalHolder()) {
+ @Override
+ protected String transform(Boolean value) {
+ if (value != null) {
+ String defaultStringValue = value.booleanValue() ? JptCommonUiMessages.Boolean_True : JptCommonUiMessages.Boolean_False;
+ return NLS.bind(JptUiDetailsMessages2_0.OrphanRemoval2_0Composite_orphanRemovalLabelDefault, defaultStringValue);
+ }
+ return JptUiDetailsMessages2_0.OrphanRemoval2_0Composite_orphanRemovalLabel;
+ }
+ };
+ }
+
+ private PropertyValueModel<Boolean> buildDefaultOrphanRemovalHolder() {
+ return new PropertyAspectAdapter<OrphanRemovable2_0, Boolean>(
+ this.getSubjectHolder(),
+ OrphanRemovable2_0.SPECIFIED_ORPHAN_REMOVAL_PROPERTY,
+ OrphanRemovable2_0.DEFAULT_ORPHAN_REMOVAL_PROPERTY)
+ {
+ @Override
+ protected Boolean buildValue_() {
+ if (this.subject.getSpecifiedOrphanRemoval() != null) {
+ return null;
+ }
+ return Boolean.valueOf(this.subject.isDefaultOrphanRemoval());
+ }
+ };
+ }
+
+} \ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/Queries2_0Composite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/Queries2_0Composite.java
new file mode 100644
index 0000000000..669669b674
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/Queries2_0Composite.java
@@ -0,0 +1,55 @@
+/*******************************************************************************
+* Copyright (c) 2009 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.ui.internal.jpa2.details;
+
+import org.eclipse.jpt.common.ui.internal.widgets.Pane;
+import org.eclipse.jpt.common.utility.internal.model.value.TransformationPropertyValueModel;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.NamedQuery;
+import org.eclipse.jpt.jpa.core.context.Query;
+import org.eclipse.jpt.jpa.core.context.QueryContainer;
+import org.eclipse.jpt.jpa.core.jpa2.context.NamedQuery2_0;
+import org.eclipse.jpt.jpa.ui.internal.details.NamedQueryPropertyComposite;
+import org.eclipse.jpt.jpa.ui.internal.details.QueriesComposite;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.ui.part.PageBook;
+
+/**
+ * Queries2_0Composite
+ */
+public class Queries2_0Composite
+ extends QueriesComposite
+{
+ public Queries2_0Composite(
+ Pane<?> parentPane,
+ PropertyValueModel<? extends QueryContainer> subjectHolder,
+ Composite parent) {
+
+ super(parentPane, subjectHolder, parent);
+ }
+
+
+ @Override
+ protected NamedQueryPropertyComposite<NamedQuery2_0> buildNamedQueryPropertyComposite(PageBook pageBook) {
+ return new NamedQueryProperty2_0Composite(
+ this,
+ this.buildNamedQuery2_0Holder(),
+ pageBook);
+ }
+
+ protected PropertyValueModel<NamedQuery2_0> buildNamedQuery2_0Holder() {
+ return new TransformationPropertyValueModel<Query, NamedQuery2_0>(this.getQueryHolder()) {
+ @Override
+ protected NamedQuery2_0 transform_(Query value) {
+ return (value instanceof NamedQuery) ? (NamedQuery2_0) value : null;
+ }
+ };
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/SequenceGenerator2_0Composite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/SequenceGenerator2_0Composite.java
new file mode 100644
index 0000000000..22a92db8fb
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/SequenceGenerator2_0Composite.java
@@ -0,0 +1,190 @@
+/*******************************************************************************
+* Copyright (c) 2009 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.ui.internal.jpa2.details;
+
+import java.util.Collection;
+
+import org.eclipse.jpt.common.ui.internal.widgets.Pane;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.JpaProject;
+import org.eclipse.jpt.jpa.core.context.SequenceGenerator;
+import org.eclipse.jpt.jpa.core.jpa2.context.SequenceGenerator2_0;
+import org.eclipse.jpt.jpa.db.SchemaContainer;
+import org.eclipse.jpt.jpa.ui.internal.JpaHelpContextIds;
+import org.eclipse.jpt.jpa.ui.internal.details.JptUiDetailsMessages;
+import org.eclipse.jpt.jpa.ui.internal.details.SequenceGeneratorComposite;
+import org.eclipse.jpt.jpa.ui.internal.details.db.CatalogCombo;
+import org.eclipse.jpt.jpa.ui.internal.details.db.SchemaCombo;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * JavaSequenceGenerator2_0Composite
+ */
+public class SequenceGenerator2_0Composite extends SequenceGeneratorComposite
+{
+
+ public SequenceGenerator2_0Composite(Pane<?> parentPane,
+ PropertyValueModel<SequenceGenerator> subjectHolder,
+ Composite parent,
+ GeneratorBuilder<SequenceGenerator> builder) {
+
+ super(parentPane, subjectHolder, parent, builder);
+ }
+
+ @Override
+ protected void initializeLayout(Composite container) {
+
+ // Name widgets
+ this.addLabeledText(
+ container,
+ JptUiDetailsMessages.SequenceGeneratorComposite_name,
+ this.buildGeneratorNameHolder(),
+ JpaHelpContextIds.MAPPING_SEQUENCE_GENERATOR_NAME
+ );
+
+ // Sequence Generator widgets
+ this.addLabeledComposite(
+ container,
+ JptUiDetailsMessages.SequenceGeneratorComposite_sequence,
+ this.buildSequenceNameCombo(container),
+ JpaHelpContextIds.MAPPING_SEQUENCE_GENERATOR_SEQUENCE
+ );
+
+ // Schema widgets
+ this.addLabeledComposite(
+ container,
+ JptUiDetailsMessages.SequenceGeneratorComposite_schema,
+ this.addSchemaCombo(container),
+ null // JpaHelpContextIds.MAPPING_SEQUENCE_GENERATOR_SCHEMA
+ );
+
+ // Catalog widgets
+ this.addLabeledComposite(
+ container,
+ JptUiDetailsMessages.SequenceGeneratorComposite_catalog,
+ this.addCatalogCombo(container),
+ null // JpaHelpContextIds.MAPPING_SEQUENCE_GENERATOR_CATALOG
+ );
+
+ this.addAllocationSizeCombo(container);
+ this.addInitialValueCombo(container);
+ }
+
+ private SchemaCombo<SequenceGenerator> addSchemaCombo(Composite container) {
+
+ return new SchemaCombo<SequenceGenerator>(this, getSubjectHolder(), container) {
+
+ @Override
+ protected void addPropertyNames(Collection<String> propertyNames) {
+ super.addPropertyNames(propertyNames);
+ propertyNames.add(SequenceGenerator2_0.DEFAULT_SCHEMA_PROPERTY);
+ propertyNames.add(SequenceGenerator2_0.SPECIFIED_SCHEMA_PROPERTY);
+ propertyNames.add(SequenceGenerator2_0.DEFAULT_CATALOG_PROPERTY);
+ propertyNames.add(SequenceGenerator2_0.SPECIFIED_CATALOG_PROPERTY);
+ }
+
+ @Override
+ protected void propertyChanged(String propertyName) {
+ if (propertyName == SequenceGenerator2_0.DEFAULT_CATALOG_PROPERTY
+ || propertyName == SequenceGenerator2_0.SPECIFIED_CATALOG_PROPERTY ) {
+ repopulateComboBox();
+ }
+ else {
+ super.propertyChanged(propertyName);
+ }
+ }
+
+ @Override
+ protected String getDefaultValue() {
+ return ((SequenceGenerator2_0) getSubject()).getDefaultSchema();
+ }
+
+ @Override
+ protected boolean nullSubjectIsAllowed() {
+ return true;
+ }
+
+ /**
+ * subject may be null, so delegate to the composite
+ */
+ @Override
+ protected JpaProject getJpaProject() {
+ return SequenceGenerator2_0Composite.this.getJpaProject();
+ }
+
+ @Override
+ protected void setValue(String value) {
+ ((SequenceGenerator2_0) SequenceGenerator2_0Composite.this.retrieveGenerator()).setSpecifiedSchema(value);
+ }
+
+ @Override
+ protected String getValue() {
+ return ((SequenceGenerator2_0) getSubject()).getSpecifiedSchema();
+ }
+
+ @Override
+ protected SchemaContainer getDbSchemaContainer() {
+ SequenceGenerator2_0 tg = (SequenceGenerator2_0) this.getSubject();
+ if (tg != null) {
+ return tg.getDbSchemaContainer();
+ }
+ return SequenceGenerator2_0Composite.this.getSubject().getContextDefaultDbSchemaContainer();
+ }
+
+ @Override
+ protected SchemaContainer getDbSchemaContainer_() {
+ // we overrode #getDbSchemaContainer() instead
+ throw new UnsupportedOperationException();
+ }
+ };
+ }
+
+ private CatalogCombo<SequenceGenerator> addCatalogCombo(Composite container) {
+
+ return new CatalogCombo<SequenceGenerator>(this, getSubjectHolder(), container) {
+
+ @Override
+ protected void addPropertyNames(Collection<String> propertyNames) {
+ super.addPropertyNames(propertyNames);
+ propertyNames.add(SequenceGenerator2_0.DEFAULT_CATALOG_PROPERTY);
+ propertyNames.add(SequenceGenerator2_0.SPECIFIED_CATALOG_PROPERTY);
+ }
+
+ @Override
+ protected String getDefaultValue() {
+ return ((SequenceGenerator2_0) getSubject()).getDefaultCatalog();
+ }
+
+ @Override
+ protected boolean nullSubjectIsAllowed() {
+ return true;
+ }
+
+ /**
+ * subject may be null, so delegate to the composite
+ */
+ @Override
+ protected JpaProject getJpaProject() {
+ return SequenceGenerator2_0Composite.this.getJpaProject();
+ }
+
+ @Override
+ protected void setValue(String value) {
+ ((SequenceGenerator2_0) SequenceGenerator2_0Composite.this.retrieveGenerator()).setSpecifiedCatalog(value);
+ }
+
+ @Override
+ protected String getValue() {
+ return ((SequenceGenerator2_0) getSubject()).getSpecifiedCatalog();
+ }
+ };
+ }
+
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/TargetClassComposite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/TargetClassComposite.java
new file mode 100644
index 0000000000..2f82995d38
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/TargetClassComposite.java
@@ -0,0 +1,130 @@
+/*******************************************************************************
+* Copyright (c) 2009, 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.ui.internal.jpa2.details;
+
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jpt.common.ui.internal.JptCommonUiMessages;
+import org.eclipse.jpt.common.ui.internal.widgets.ClassChooserComboPane;
+import org.eclipse.jpt.common.ui.internal.widgets.Pane;
+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.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.core.jpa2.context.ElementCollectionMapping2_0;
+import org.eclipse.jpt.jpa.ui.internal.JpaHelpContextIds;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * target entity hyperlink label, combo and browse button
+ */
+public class TargetClassComposite extends ClassChooserComboPane<ElementCollectionMapping2_0>
+{
+
+ /**
+ * Creates a new <code>TargetEntityComposite</code>.
+ *
+ * @param parentPane The parent container of this one
+ * @param parent The parent container
+ */
+ public TargetClassComposite(
+ Pane<? extends ElementCollectionMapping2_0> parentPane,
+ Composite parent) {
+
+ super(parentPane, parent);
+ }
+
+ @Override
+ protected String getClassName() {
+ return getSubject().getTargetClass();
+ }
+
+ @Override
+ protected void setClassName(String className) {
+ this.getSubject().setSpecifiedTargetClass(className);
+ }
+
+ @Override
+ protected char getEnclosingTypeSeparator() {
+ return getSubject().getTargetClassEnclosingTypeSeparator();
+ }
+
+ @Override
+ protected String getLabelText() {
+ return JptUiDetailsMessages2_0.TargetClassComposite_label;
+ }
+
+ @Override
+ protected String getHelpId() {
+ return JpaHelpContextIds.MAPPING_ELEMENT_COLLECTION_TARGET_CLASS;
+ }
+
+ @Override
+ protected IJavaProject getJavaProject() {
+ return getSubject().getJpaProject().getJavaProject();
+ }
+
+ @Override
+ protected WritablePropertyValueModel<String> buildTextHolder() {
+ return new PropertyAspectAdapter<ElementCollectionMapping2_0, String>(this.getSubjectHolder(), ElementCollectionMapping2_0.SPECIFIED_TARGET_CLASS_PROPERTY) {
+ @Override
+ protected String buildValue_() {
+
+ String name = this.subject.getSpecifiedTargetClass();
+ if (name == null) {
+ name = TargetClassComposite.this.getDefaultValue(this.subject);
+ }
+ return name;
+ }
+
+ @Override
+ protected void setValue_(String value) {
+
+ if (getDefaultValue(this.subject).equals(value)) {
+ value = null;
+ }
+ this.subject.setSpecifiedTargetClass(value);
+ }
+ };
+ }
+
+ @Override
+ protected ListValueModel<String> buildClassListHolder() {
+ return this.buildDefaultProfilerListHolder();
+ }
+
+ private ListValueModel<String> buildDefaultProfilerListHolder() {
+ return new PropertyListValueModelAdapter<String>(
+ this.buildDefaultProfilerHolder()
+ );
+ }
+
+ private PropertyValueModel<String> buildDefaultProfilerHolder() {
+ return new PropertyAspectAdapter<ElementCollectionMapping2_0, String>(this.getSubjectHolder(), ElementCollectionMapping2_0.DEFAULT_TARGET_CLASS_PROPERTY) {
+ @Override
+ protected String buildValue_() {
+ return TargetClassComposite.this.getDefaultValue(this.subject);
+ }
+ };
+ }
+
+ private String getDefaultValue(ElementCollectionMapping2_0 subject) {
+ String defaultValue = subject.getDefaultTargetClass();
+
+ if (defaultValue != null) {
+ return NLS.bind(
+ JptCommonUiMessages.DefaultWithOneParam,
+ defaultValue
+ );
+ }
+ return JptCommonUiMessages.DefaultEmpty;
+ }
+} \ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/java/Generic2_0JavaResourceUiDefinition.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/java/Generic2_0JavaResourceUiDefinition.java
new file mode 100644
index 0000000000..f4964985db
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/java/Generic2_0JavaResourceUiDefinition.java
@@ -0,0 +1,91 @@
+/*******************************************************************************
+ * Copyright (c) 2009 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.ui.internal.jpa2.details.java;
+
+import java.util.List;
+import org.eclipse.jpt.jpa.core.context.AttributeMapping;
+import org.eclipse.jpt.jpa.core.context.TypeMapping;
+import org.eclipse.jpt.jpa.ui.ResourceUiDefinition;
+import org.eclipse.jpt.jpa.ui.details.java.DefaultJavaAttributeMappingUiDefinition;
+import org.eclipse.jpt.jpa.ui.details.java.JavaAttributeMappingUiDefinition;
+import org.eclipse.jpt.jpa.ui.details.java.JavaTypeMappingUiDefinition;
+import org.eclipse.jpt.jpa.ui.details.java.JavaUiFactory;
+import org.eclipse.jpt.jpa.ui.internal.details.java.AbstractJavaResourceUiDefinition;
+import org.eclipse.jpt.jpa.ui.internal.details.java.DefaultBasicMappingUiDefinition;
+import org.eclipse.jpt.jpa.ui.internal.details.java.DefaultEmbeddedMappingUiDefinition;
+import org.eclipse.jpt.jpa.ui.internal.details.java.JavaBasicMappingUiDefinition;
+import org.eclipse.jpt.jpa.ui.internal.details.java.JavaEmbeddableUiDefinition;
+import org.eclipse.jpt.jpa.ui.internal.details.java.JavaEmbeddedIdMappingUDefinition;
+import org.eclipse.jpt.jpa.ui.internal.details.java.JavaEmbeddedMappingUiDefinition;
+import org.eclipse.jpt.jpa.ui.internal.details.java.JavaEntityUiDefinition;
+import org.eclipse.jpt.jpa.ui.internal.details.java.JavaIdMappingUiDefinition;
+import org.eclipse.jpt.jpa.ui.internal.details.java.JavaManyToManyMappingUiDefinition;
+import org.eclipse.jpt.jpa.ui.internal.details.java.JavaManyToOneMappingUiDefinition;
+import org.eclipse.jpt.jpa.ui.internal.details.java.JavaMappedSuperclassUiDefinition;
+import org.eclipse.jpt.jpa.ui.internal.details.java.JavaOneToManyMappingUiDefinition;
+import org.eclipse.jpt.jpa.ui.internal.details.java.JavaOneToOneMappingUiDefinition;
+import org.eclipse.jpt.jpa.ui.internal.details.java.JavaTransientMappingUiDefinition;
+import org.eclipse.jpt.jpa.ui.internal.details.java.JavaVersionMappingUiDefinition;
+import org.eclipse.jpt.jpa.ui.internal.details.java.NullJavaAttributeMappingUiDefinition;
+
+public class Generic2_0JavaResourceUiDefinition extends AbstractJavaResourceUiDefinition
+{
+ // singleton
+ private static final ResourceUiDefinition INSTANCE = new Generic2_0JavaResourceUiDefinition();
+
+ /**
+ * Return the singleton.
+ */
+ public static ResourceUiDefinition instance() {
+ return INSTANCE;
+ }
+
+
+ /**
+ * zero-argument constructor
+ */
+ protected Generic2_0JavaResourceUiDefinition() {
+ super();
+ }
+
+ @Override
+ protected JavaUiFactory buildJavaUiFactory() {
+ return new Generic2_0JavaUiFactory();
+ }
+
+ @Override
+ protected void addSpecifiedAttributeMappingUiDefinitionsTo(List<JavaAttributeMappingUiDefinition<? extends AttributeMapping>> definitions) {
+ definitions.add(JavaElementCollectionMapping2_0UiDefinition.instance());
+ definitions.add(JavaIdMappingUiDefinition.instance());
+ definitions.add(JavaEmbeddedIdMappingUDefinition.instance());
+ definitions.add(JavaBasicMappingUiDefinition.instance());
+ definitions.add(JavaVersionMappingUiDefinition.instance());
+ definitions.add(JavaManyToOneMappingUiDefinition.instance());
+ definitions.add(JavaOneToManyMappingUiDefinition.instance());
+ definitions.add(JavaOneToOneMappingUiDefinition.instance());
+ definitions.add(JavaManyToManyMappingUiDefinition.instance());
+ definitions.add(JavaEmbeddedMappingUiDefinition.instance());
+ definitions.add(JavaTransientMappingUiDefinition.instance());
+ }
+
+ @Override
+ protected void addDefaultAttributeMappingUiDefinitionsTo(List<DefaultJavaAttributeMappingUiDefinition<?>> definitions) {
+ definitions.add(DefaultBasicMappingUiDefinition.instance());
+ definitions.add(DefaultEmbeddedMappingUiDefinition.instance());
+ definitions.add(NullJavaAttributeMappingUiDefinition.instance());
+ }
+
+ @Override
+ protected void addSpecifiedTypeMappingUiDefinitionsTo(List<JavaTypeMappingUiDefinition<? extends TypeMapping>> definitions) {
+ definitions.add(JavaEntityUiDefinition.instance());
+ definitions.add(JavaMappedSuperclassUiDefinition.instance());
+ definitions.add(JavaEmbeddableUiDefinition.instance());
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/java/Generic2_0JavaUiFactory.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/java/Generic2_0JavaUiFactory.java
new file mode 100644
index 0000000000..451c37f8e2
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/java/Generic2_0JavaUiFactory.java
@@ -0,0 +1,134 @@
+/*******************************************************************************
+ * Copyright (c) 2009 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.ui.internal.jpa2.details.java;
+
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.java.JavaEmbeddable;
+import org.eclipse.jpt.jpa.core.context.java.JavaEmbeddedIdMapping;
+import org.eclipse.jpt.jpa.core.context.java.JavaEmbeddedMapping;
+import org.eclipse.jpt.jpa.core.context.java.JavaEntity;
+import org.eclipse.jpt.jpa.core.context.java.JavaIdMapping;
+import org.eclipse.jpt.jpa.core.context.java.JavaManyToManyMapping;
+import org.eclipse.jpt.jpa.core.context.java.JavaManyToOneMapping;
+import org.eclipse.jpt.jpa.core.context.java.JavaMappedSuperclass;
+import org.eclipse.jpt.jpa.core.context.java.JavaOneToManyMapping;
+import org.eclipse.jpt.jpa.core.context.java.JavaOneToOneMapping;
+import org.eclipse.jpt.jpa.core.jpa2.context.java.JavaElementCollectionMapping2_0;
+import org.eclipse.jpt.jpa.ui.details.JpaComposite;
+import org.eclipse.jpt.jpa.ui.internal.details.java.BaseJavaUiFactory;
+import org.eclipse.jpt.jpa.ui.internal.jpa2.details.ElementCollectionMapping2_0Composite;
+import org.eclipse.jpt.jpa.ui.internal.jpa2.details.EmbeddedIdMapping2_0Composite;
+import org.eclipse.jpt.jpa.ui.internal.persistence.details.GenericPersistenceXmlUiFactory;
+import org.eclipse.jpt.jpa.ui.jpa2.details.java.JavaUiFactory2_0;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * The default implementation of the UI factory required to show the information
+ * related to a JPA mapping (type or attribute).
+ *
+ * @see GenericPersistenceXmlUiFactory
+ *
+ * @version 1.0
+ * @since 1.0
+ */
+public class Generic2_0JavaUiFactory
+ extends BaseJavaUiFactory
+ implements JavaUiFactory2_0
+{
+ // **************** java type mapping composites ***************************
+
+ @Override
+ public JpaComposite createJavaMappedSuperclassComposite(
+ PropertyValueModel<JavaMappedSuperclass> subjectHolder,
+ Composite parent, WidgetFactory widgetFactory) {
+ return new JavaMappedSuperclass2_0Composite(subjectHolder, parent, widgetFactory);
+ }
+
+ @Override
+ public JpaComposite createJavaEntityComposite(
+ PropertyValueModel<JavaEntity> subjectHolder,
+ Composite parent, WidgetFactory widgetFactory) {
+ return new JavaEntity2_0Composite(subjectHolder, parent, widgetFactory);
+ }
+
+ @Override
+ public JpaComposite createJavaEmbeddableComposite(
+ PropertyValueModel<JavaEmbeddable> subjectHolder,
+ Composite parent, WidgetFactory widgetFactory) {
+ return new JavaEmbeddable2_0Composite(subjectHolder, parent, widgetFactory);
+ }
+
+
+ // **************** java attribute mapping composites **********************
+
+ @Override
+ public JpaComposite createJavaIdMappingComposite(
+ PropertyValueModel<JavaIdMapping> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+ return new JavaIdMapping2_0Composite(subjectHolder, parent, widgetFactory);
+ }
+
+ @Override
+ public JpaComposite createJavaEmbeddedIdMappingComposite(
+ PropertyValueModel<JavaEmbeddedIdMapping> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+ return new EmbeddedIdMapping2_0Composite(subjectHolder, parent, widgetFactory);
+ }
+
+ @Override
+ public JpaComposite createJavaEmbeddedMappingComposite(
+ PropertyValueModel<JavaEmbeddedMapping> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+ return new JavaEmbeddedMapping2_0Composite(subjectHolder, parent, widgetFactory);
+ }
+
+ @Override
+ public JpaComposite createJavaManyToManyMappingComposite(
+ PropertyValueModel<JavaManyToManyMapping> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+ return new JavaManyToManyMapping2_0Composite(subjectHolder, parent, widgetFactory);
+ }
+
+ @Override
+ public JpaComposite createJavaManyToOneMappingComposite(
+ PropertyValueModel<JavaManyToOneMapping> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+ return new JavaManyToOneMapping2_0Composite(subjectHolder, parent, widgetFactory);
+ }
+
+ @Override
+ public JpaComposite createJavaOneToManyMappingComposite(
+ PropertyValueModel<JavaOneToManyMapping> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+ return new JavaOneToManyMapping2_0Composite(subjectHolder, parent, widgetFactory);
+ }
+
+ @Override
+ public JpaComposite createJavaOneToOneMappingComposite(
+ PropertyValueModel<JavaOneToOneMapping> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+ return new JavaOneToOneMapping2_0Composite(subjectHolder, parent, widgetFactory);
+ }
+
+ public JpaComposite createJavaElementCollectionMapping2_0Composite(
+ PropertyValueModel<JavaElementCollectionMapping2_0> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+ return new ElementCollectionMapping2_0Composite(subjectHolder, parent, widgetFactory);
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/java/JavaElementCollectionMapping2_0UiDefinition.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/java/JavaElementCollectionMapping2_0UiDefinition.java
new file mode 100644
index 0000000000..42f5a7e56a
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/java/JavaElementCollectionMapping2_0UiDefinition.java
@@ -0,0 +1,56 @@
+/*******************************************************************************
+ * Copyright (c) 2009 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.ui.internal.jpa2.details.java;
+
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.ReadOnlyPersistentAttribute;
+import org.eclipse.jpt.jpa.core.jpa2.context.java.JavaElementCollectionMapping2_0;
+import org.eclipse.jpt.jpa.ui.details.JpaComposite;
+import org.eclipse.jpt.jpa.ui.details.java.JavaAttributeMappingUiDefinition;
+import org.eclipse.jpt.jpa.ui.details.java.JavaUiFactory;
+import org.eclipse.jpt.jpa.ui.internal.jpa2.details.AbstractElementCollectionMapping2_0UiDefinition;
+import org.eclipse.jpt.jpa.ui.jpa2.details.java.JavaUiFactory2_0;
+import org.eclipse.swt.widgets.Composite;
+
+public class JavaElementCollectionMapping2_0UiDefinition
+ extends AbstractElementCollectionMapping2_0UiDefinition<ReadOnlyPersistentAttribute, JavaElementCollectionMapping2_0>
+ implements JavaAttributeMappingUiDefinition<JavaElementCollectionMapping2_0>
+{
+ // singleton
+ private static final JavaElementCollectionMapping2_0UiDefinition INSTANCE =
+ new JavaElementCollectionMapping2_0UiDefinition();
+
+
+ /**
+ * Return the singleton.
+ */
+ public static JavaAttributeMappingUiDefinition<JavaElementCollectionMapping2_0> instance() {
+ return INSTANCE;
+ }
+
+
+ /**
+ * Ensure single instance.
+ */
+ private JavaElementCollectionMapping2_0UiDefinition() {
+ super();
+ }
+
+
+ public JpaComposite buildAttributeMappingComposite(
+ JavaUiFactory factory,
+ PropertyValueModel<JavaElementCollectionMapping2_0> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+
+ return ((JavaUiFactory2_0) factory).createJavaElementCollectionMapping2_0Composite(subjectHolder, parent, widgetFactory);
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/java/JavaEmbeddable2_0Composite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/java/JavaEmbeddable2_0Composite.java
new file mode 100644
index 0000000000..a1fae294dd
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/java/JavaEmbeddable2_0Composite.java
@@ -0,0 +1,69 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2010 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.ui.internal.jpa2.details.java;
+
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.utility.internal.model.value.PropertyAspectAdapter;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.AccessHolder;
+import org.eclipse.jpt.jpa.core.context.java.JavaEmbeddable;
+import org.eclipse.jpt.jpa.ui.details.JpaComposite;
+import org.eclipse.jpt.jpa.ui.internal.details.AbstractEmbeddableComposite;
+import org.eclipse.jpt.jpa.ui.internal.details.AccessTypeComposite;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * This pane does not have any widgets.
+ *
+ * @see Embeddable
+ * @see EmbeddableUiProvider
+ *
+ * @version 2.3
+ * @since 2.0
+ */
+public class JavaEmbeddable2_0Composite extends AbstractEmbeddableComposite<JavaEmbeddable>
+ implements JpaComposite
+{
+ /**
+ * Creates a new <code>EmbeddableComposite</code>.
+ *
+ * @param subjectHolder The holder of this pane's subject
+ * @param parent The parent container
+ * @param widgetFactory The factory used to create various common widgets
+ */
+ public JavaEmbeddable2_0Composite(PropertyValueModel<? extends JavaEmbeddable> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+
+ super(subjectHolder, parent, widgetFactory);
+ }
+
+ @Override
+ protected void initializeLayout(Composite container) {
+ this.initializeEmbeddableCollapsibleSection(container);
+ }
+
+ @Override
+ protected void initializeEmbeddableSection(Composite container) {
+ new AccessTypeComposite(this, buildAccessHolder(), container);
+ }
+
+ protected PropertyValueModel<AccessHolder> buildAccessHolder() {
+ return new PropertyAspectAdapter<JavaEmbeddable, AccessHolder>(
+ getSubjectHolder())
+ {
+ @Override
+ protected AccessHolder buildValue_() {
+ return this.subject.getPersistentType();
+ }
+ };
+ }
+
+} \ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/java/JavaEmbeddedMapping2_0Composite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/java/JavaEmbeddedMapping2_0Composite.java
new file mode 100644
index 0000000000..8713cc0415
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/java/JavaEmbeddedMapping2_0Composite.java
@@ -0,0 +1,60 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2010 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.ui.internal.jpa2.details.java;
+
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.java.JavaEmbeddedMapping;
+import org.eclipse.jpt.jpa.ui.details.JpaComposite;
+import org.eclipse.jpt.jpa.ui.internal.details.AbstractEmbeddedMappingComposite;
+import org.eclipse.jpt.jpa.ui.internal.jpa2.details.EmbeddedMapping2_0OverridesComposite;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * Here the layout of this pane:
+ * <pre>
+ * -----------------------------------------------------------------------------
+ * | ------------------------------------------------------------------------- |
+ * | | | |
+ * | | EmbeddedAttributeOverridesComposite | |
+ * | | | |
+ * | ------------------------------------------------------------------------- |
+ * -----------------------------------------------------------------------------</pre>
+ *
+ * @see EmbeddedMapping
+ *
+ * @version 2.3
+ * @since 1.0
+ */
+public class JavaEmbeddedMapping2_0Composite extends AbstractEmbeddedMappingComposite<JavaEmbeddedMapping>
+ implements JpaComposite
+{
+ /**
+ * Creates a new <code>EmbeddedMappingComposite</code>.
+ *
+ * @param subjectHolder The holder of the subject <code>EmbeddedMapping</code>
+ * @param parent The parent container
+ * @param widgetFactory The factory used to create various common widgets
+ */
+ public JavaEmbeddedMapping2_0Composite(PropertyValueModel<? extends JavaEmbeddedMapping> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+
+ super(subjectHolder, parent, widgetFactory);
+ }
+
+ @Override
+ protected void initializeEmbeddedSection(Composite container) {
+ new EmbeddedMapping2_0OverridesComposite(
+ this,
+ container
+ );
+ }
+} \ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/java/JavaEntity2_0Composite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/java/JavaEntity2_0Composite.java
new file mode 100644
index 0000000000..cc12ebd7f1
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/java/JavaEntity2_0Composite.java
@@ -0,0 +1,105 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2010 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.ui.internal.jpa2.details.java;
+
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.utility.internal.model.value.PropertyAspectAdapter;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.AccessHolder;
+import org.eclipse.jpt.jpa.core.context.QueryContainer;
+import org.eclipse.jpt.jpa.core.context.java.JavaEntity;
+import org.eclipse.jpt.jpa.core.jpa2.context.Cacheable2_0;
+import org.eclipse.jpt.jpa.core.jpa2.context.CacheableHolder2_0;
+import org.eclipse.jpt.jpa.ui.internal.details.AbstractEntityComposite;
+import org.eclipse.jpt.jpa.ui.internal.details.AccessTypeComposite;
+import org.eclipse.jpt.jpa.ui.internal.details.EntityNameComposite;
+import org.eclipse.jpt.jpa.ui.internal.details.IdClassComposite;
+import org.eclipse.jpt.jpa.ui.internal.details.TableComposite;
+import org.eclipse.jpt.jpa.ui.internal.details.java.JavaInheritanceComposite;
+import org.eclipse.jpt.jpa.ui.internal.details.java.JavaSecondaryTablesComposite;
+import org.eclipse.jpt.jpa.ui.internal.jpa2.details.Cacheable2_0Pane;
+import org.eclipse.jpt.jpa.ui.internal.jpa2.details.Entity2_0OverridesComposite;
+import org.eclipse.jpt.jpa.ui.internal.jpa2.details.Queries2_0Composite;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * The pane used for a Java entity.
+ *
+ * @see JavaEntity
+ * @see JavaSecondaryTablesComposite
+ *
+ * @version 2.3
+ * @since 1.0
+ */
+public class JavaEntity2_0Composite
+ extends AbstractEntityComposite<JavaEntity>
+{
+ /**
+ * Creates a new <code>JavaEntityComposite</code>.
+ *
+ * @param subjectHolder The holder of the subject <code>JavaEntity</code>
+ * @param parent The parent container
+ * @param widgetFactory The factory used to create various common widgets
+ */
+ public JavaEntity2_0Composite(
+ PropertyValueModel<? extends JavaEntity> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+
+ super(subjectHolder, parent, widgetFactory);
+ }
+
+ @Override
+ protected void initializeEntitySection(Composite container) {
+ new TableComposite(this, container);
+ new EntityNameComposite(this, container);
+ new AccessTypeComposite(this, buildAccessHolder(), container);
+ new IdClassComposite(this, buildIdClassReferenceHolder(), container);
+ new Cacheable2_0Pane(this, buildCacheableHolder(), container);
+ }
+
+ protected PropertyValueModel<AccessHolder> buildAccessHolder() {
+ return new PropertyAspectAdapter<JavaEntity, AccessHolder>(getSubjectHolder()) {
+ @Override
+ protected AccessHolder buildValue_() {
+ return this.subject.getPersistentType();
+ }
+ };
+ }
+
+ protected PropertyValueModel<Cacheable2_0> buildCacheableHolder() {
+ return new PropertyAspectAdapter<JavaEntity, Cacheable2_0>(getSubjectHolder()) {
+ @Override
+ protected Cacheable2_0 buildValue_() {
+ return ((CacheableHolder2_0) this.subject).getCacheable();
+ }
+ };
+ }
+
+ @Override
+ protected void initializeSecondaryTablesSection(Composite container) {
+ new JavaSecondaryTablesComposite(this, container);
+ }
+
+ @Override
+ protected void initializeInheritanceSection(Composite container) {
+ new JavaInheritanceComposite(this, container);
+ }
+
+ @Override
+ protected void initializeAttributeOverridesSection(Composite container) {
+ new Entity2_0OverridesComposite(this, container);
+ }
+
+ @Override
+ protected void initializeQueriesSection(Composite container, PropertyValueModel<QueryContainer> queryContainerHolder) {
+ new Queries2_0Composite(this, queryContainerHolder, container);
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/java/JavaIdMapping2_0Composite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/java/JavaIdMapping2_0Composite.java
new file mode 100644
index 0000000000..6ab367fabe
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/java/JavaIdMapping2_0Composite.java
@@ -0,0 +1,43 @@
+/*******************************************************************************
+* Copyright (c) 2009, 2010 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.ui.internal.jpa2.details.java;
+
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.IdMapping;
+import org.eclipse.jpt.jpa.ui.internal.details.AbstractIdMappingComposite;
+import org.eclipse.jpt.jpa.ui.internal.details.ColumnComposite;
+import org.eclipse.jpt.jpa.ui.internal.jpa2.details.IdMapping2_0MappedByRelationshipPane;
+import org.eclipse.jpt.jpa.ui.internal.jpa2.details.IdMappingGeneration2_0Composite;
+import org.eclipse.swt.widgets.Composite;
+
+public class JavaIdMapping2_0Composite
+ extends AbstractIdMappingComposite<IdMapping>
+{
+ public JavaIdMapping2_0Composite(
+ PropertyValueModel<? extends IdMapping> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+
+ super(subjectHolder, parent, widgetFactory);
+ }
+
+
+ @Override
+ protected void initializeIdSection(Composite container) {
+ new IdMapping2_0MappedByRelationshipPane(this, getSubjectHolder(), container);
+ new ColumnComposite(this, buildColumnHolder(), container);
+ }
+
+ @Override
+ protected void initializeGenerationCollapsibleSection(Composite container) {
+ new IdMappingGeneration2_0Composite(this, container);
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/java/JavaManyToManyMapping2_0Composite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/java/JavaManyToManyMapping2_0Composite.java
new file mode 100644
index 0000000000..55822090d6
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/java/JavaManyToManyMapping2_0Composite.java
@@ -0,0 +1,46 @@
+/*******************************************************************************
+ * 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.ui.internal.jpa2.details.java;
+
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.java.JavaManyToManyMapping;
+import org.eclipse.jpt.jpa.core.context.java.JavaManyToManyRelationship;
+import org.eclipse.jpt.jpa.ui.internal.details.AbstractManyToManyMappingComposite;
+import org.eclipse.jpt.jpa.ui.internal.details.FetchTypeComposite;
+import org.eclipse.jpt.jpa.ui.internal.details.TargetEntityComposite;
+import org.eclipse.jpt.jpa.ui.internal.jpa2.details.CascadePane2_0;
+import org.eclipse.jpt.jpa.ui.internal.jpa2.details.Ordering2_0Composite;
+import org.eclipse.swt.widgets.Composite;
+
+public class JavaManyToManyMapping2_0Composite
+ extends AbstractManyToManyMappingComposite<JavaManyToManyMapping, JavaManyToManyRelationship>
+{
+ public JavaManyToManyMapping2_0Composite(
+ PropertyValueModel<? extends JavaManyToManyMapping> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+
+ super(subjectHolder, parent, widgetFactory);
+ }
+
+
+ @Override
+ protected void initializeManyToManySection(Composite container) {
+ new TargetEntityComposite(this, container);
+ new FetchTypeComposite(this, container);
+ new CascadePane2_0(this, buildCascadeHolder(), addSubPane(container, 5));
+ }
+
+ @Override
+ protected void initializeOrderingCollapsibleSection(Composite container) {
+ new Ordering2_0Composite(this, container);
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/java/JavaManyToOneMapping2_0Composite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/java/JavaManyToOneMapping2_0Composite.java
new file mode 100644
index 0000000000..dba1e697f4
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/java/JavaManyToOneMapping2_0Composite.java
@@ -0,0 +1,42 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 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.ui.internal.jpa2.details.java;
+
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.java.JavaManyToOneMapping;
+import org.eclipse.jpt.jpa.core.jpa2.context.java.JavaManyToOneRelationship2_0;
+import org.eclipse.jpt.jpa.ui.internal.details.FetchTypeComposite;
+import org.eclipse.jpt.jpa.ui.internal.details.OptionalComposite;
+import org.eclipse.jpt.jpa.ui.internal.details.TargetEntityComposite;
+import org.eclipse.jpt.jpa.ui.internal.jpa2.details.AbstractManyToOneMapping2_0Composite;
+import org.eclipse.jpt.jpa.ui.internal.jpa2.details.CascadePane2_0;
+import org.eclipse.swt.widgets.Composite;
+
+public class JavaManyToOneMapping2_0Composite
+ extends AbstractManyToOneMapping2_0Composite<JavaManyToOneMapping, JavaManyToOneRelationship2_0>
+{
+ public JavaManyToOneMapping2_0Composite(
+ PropertyValueModel<? extends JavaManyToOneMapping> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+
+ super(subjectHolder, parent, widgetFactory);
+ }
+
+
+ @Override
+ protected void initializeManyToOneSection(Composite container) {
+ new TargetEntityComposite(this, container);
+ new FetchTypeComposite(this, container);
+ new OptionalComposite(this, container);
+ new CascadePane2_0(this, buildCascadeHolder(), addSubPane(container, 5));
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/java/JavaManyToOneMapping2_0Pane.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/java/JavaManyToOneMapping2_0Pane.java
new file mode 100644
index 0000000000..6ac5eb9eee
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/java/JavaManyToOneMapping2_0Pane.java
@@ -0,0 +1,14 @@
+/*******************************************************************************
+ * Copyright (c) 2010 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.ui.internal.jpa2.details.java;
+
+public class JavaManyToOneMapping2_0Pane
+{}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/java/JavaMappedSuperclass2_0Composite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/java/JavaMappedSuperclass2_0Composite.java
new file mode 100644
index 0000000000..0467f48b14
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/java/JavaMappedSuperclass2_0Composite.java
@@ -0,0 +1,74 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2010 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.ui.internal.jpa2.details.java;
+
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.utility.internal.model.value.PropertyAspectAdapter;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.AccessHolder;
+import org.eclipse.jpt.jpa.core.context.MappedSuperclass;
+import org.eclipse.jpt.jpa.core.context.java.JavaMappedSuperclass;
+import org.eclipse.jpt.jpa.ui.details.JpaComposite;
+import org.eclipse.jpt.jpa.ui.internal.details.AbstractMappedSuperclassComposite;
+import org.eclipse.jpt.jpa.ui.internal.details.AccessTypeComposite;
+import org.eclipse.jpt.jpa.ui.internal.details.IdClassComposite;
+import org.eclipse.jpt.jpa.ui.internal.details.java.BaseJavaUiFactory;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * Here the layout of this pane:
+ * <pre>
+ * -----------------------------------------------------------------------------
+ * | |
+ * | IdClassComposite |
+ * | |
+ * -----------------------------------------------------------------------------</pre>
+ *
+ * @see MappedSuperclass
+ * @see BaseJavaUiFactory - The factory creating this pane
+ * @see IdClassComposite
+ *
+ * @version 2.3
+ * @since 2.0
+ */
+public class JavaMappedSuperclass2_0Composite
+ extends AbstractMappedSuperclassComposite<JavaMappedSuperclass>
+ implements JpaComposite
+{
+ /**
+ * Creates a new <code>MappedSuperclassComposite</code>.
+ *
+ * @param subjectHolder The holder of this pane's subject
+ * @param parent The parent container
+ * @param widgetFactory The factory used to create various common widgets
+ */
+ public JavaMappedSuperclass2_0Composite(
+ PropertyValueModel<? extends JavaMappedSuperclass> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+
+ super(subjectHolder, parent, widgetFactory);
+ }
+
+ @Override
+ protected void initializeMappedSuperclassSection(Composite container) {
+ new AccessTypeComposite(this, buildAccessHolder(), container);
+ new IdClassComposite(this, buildIdClassReferenceHolder(), container);
+ }
+
+ protected PropertyValueModel<AccessHolder> buildAccessHolder() {
+ return new PropertyAspectAdapter<JavaMappedSuperclass, AccessHolder>(getSubjectHolder()) {
+ @Override
+ protected AccessHolder buildValue_() {
+ return this.subject.getPersistentType();
+ }
+ };
+ }
+} \ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/java/JavaOneToManyMapping2_0Composite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/java/JavaOneToManyMapping2_0Composite.java
new file mode 100644
index 0000000000..1c946851a7
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/java/JavaOneToManyMapping2_0Composite.java
@@ -0,0 +1,66 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 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.ui.internal.jpa2.details.java;
+
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.utility.internal.model.value.PropertyAspectAdapter;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.java.JavaOneToManyMapping;
+import org.eclipse.jpt.jpa.core.jpa2.context.OrphanRemovable2_0;
+import org.eclipse.jpt.jpa.core.jpa2.context.OrphanRemovalHolder2_0;
+import org.eclipse.jpt.jpa.core.jpa2.context.java.JavaOneToManyRelationship2_0;
+import org.eclipse.jpt.jpa.ui.internal.details.AbstractOneToManyMappingComposite;
+import org.eclipse.jpt.jpa.ui.internal.details.FetchTypeComposite;
+import org.eclipse.jpt.jpa.ui.internal.details.TargetEntityComposite;
+import org.eclipse.jpt.jpa.ui.internal.jpa2.details.CascadePane2_0;
+import org.eclipse.jpt.jpa.ui.internal.jpa2.details.OneToManyJoiningStrategy2_0Pane;
+import org.eclipse.jpt.jpa.ui.internal.jpa2.details.Ordering2_0Composite;
+import org.eclipse.jpt.jpa.ui.internal.jpa2.details.OrphanRemoval2_0Composite;
+import org.eclipse.swt.widgets.Composite;
+
+public class JavaOneToManyMapping2_0Composite
+ extends AbstractOneToManyMappingComposite<JavaOneToManyMapping, JavaOneToManyRelationship2_0>
+{
+ public JavaOneToManyMapping2_0Composite(
+ PropertyValueModel<? extends JavaOneToManyMapping> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+
+ super(subjectHolder, parent, widgetFactory);
+ }
+
+
+ @Override
+ protected void initializeOneToManySection(Composite container) {
+ new TargetEntityComposite(this, container);
+ new FetchTypeComposite(this, container);
+ new OrphanRemoval2_0Composite(this, this.buildOrphanRemovableHolder(), container);
+ new CascadePane2_0(this, this.buildCascadeHolder(), this.addSubPane(container, 5));
+ }
+
+ @Override
+ protected void initializeJoiningStrategyCollapsibleSection(Composite container) {
+ new OneToManyJoiningStrategy2_0Pane(this, this.buildJoiningHolder(), container);
+ }
+
+ @Override
+ protected void initializeOrderingCollapsibleSection(Composite container) {
+ new Ordering2_0Composite(this, container);
+ }
+
+ protected PropertyValueModel<OrphanRemovable2_0> buildOrphanRemovableHolder() {
+ return new PropertyAspectAdapter<JavaOneToManyMapping, OrphanRemovable2_0>(this.getSubjectHolder()) {
+ @Override
+ protected OrphanRemovable2_0 buildValue_() {
+ return ((OrphanRemovalHolder2_0) this.subject).getOrphanRemoval();
+ }
+ };
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/java/JavaOneToOneMapping2_0Composite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/java/JavaOneToOneMapping2_0Composite.java
new file mode 100644
index 0000000000..9cc8974a57
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/java/JavaOneToOneMapping2_0Composite.java
@@ -0,0 +1,62 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 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.ui.internal.jpa2.details.java;
+
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.utility.internal.model.value.PropertyAspectAdapter;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.java.JavaOneToOneMapping;
+import org.eclipse.jpt.jpa.core.jpa2.context.OrphanRemovable2_0;
+import org.eclipse.jpt.jpa.core.jpa2.context.OrphanRemovalHolder2_0;
+import org.eclipse.jpt.jpa.core.jpa2.context.java.JavaOneToOneRelationship2_0;
+import org.eclipse.jpt.jpa.ui.internal.details.FetchTypeComposite;
+import org.eclipse.jpt.jpa.ui.internal.details.OptionalComposite;
+import org.eclipse.jpt.jpa.ui.internal.details.TargetEntityComposite;
+import org.eclipse.jpt.jpa.ui.internal.jpa2.details.AbstractOneToOneMapping2_0Composite;
+import org.eclipse.jpt.jpa.ui.internal.jpa2.details.CascadePane2_0;
+import org.eclipse.jpt.jpa.ui.internal.jpa2.details.OneToOneJoiningStrategy2_0Pane;
+import org.eclipse.jpt.jpa.ui.internal.jpa2.details.OrphanRemoval2_0Composite;
+import org.eclipse.swt.widgets.Composite;
+
+public class JavaOneToOneMapping2_0Composite
+ extends AbstractOneToOneMapping2_0Composite<JavaOneToOneMapping, JavaOneToOneRelationship2_0>
+{
+ public JavaOneToOneMapping2_0Composite(
+ PropertyValueModel<? extends JavaOneToOneMapping> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+
+ super(subjectHolder, parent, widgetFactory);
+ }
+
+
+ @Override
+ protected void initializeOneToOneSection(Composite container) {
+ new TargetEntityComposite(this, container);
+ new FetchTypeComposite(this, container);
+ new OptionalComposite(this, container);
+ new OrphanRemoval2_0Composite(this, buildOrphanRemovableHolder(), container);
+ new CascadePane2_0(this, buildCascadeHolder(), addSubPane(container, 5));
+ }
+
+ @Override
+ protected void initializeJoiningStrategyCollapsibleSection(Composite container) {
+ new OneToOneJoiningStrategy2_0Pane(this, buildJoiningHolder(), container);
+ }
+
+ protected PropertyValueModel<OrphanRemovable2_0> buildOrphanRemovableHolder() {
+ return new PropertyAspectAdapter<JavaOneToOneMapping, OrphanRemovable2_0>(getSubjectHolder()) {
+ @Override
+ protected OrphanRemovable2_0 buildValue_() {
+ return ((OrphanRemovalHolder2_0) this.subject).getOrphanRemoval();
+ }
+ };
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/orm/EntityMappings2_0DetailsPage.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/orm/EntityMappings2_0DetailsPage.java
new file mode 100644
index 0000000000..57bec22097
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/orm/EntityMappings2_0DetailsPage.java
@@ -0,0 +1,43 @@
+/*******************************************************************************
+* Copyright (c) 2009, 2010 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.ui.internal.jpa2.details.orm;
+
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.jpa.ui.internal.details.orm.AbstractEntityMappingsDetailsPage;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * EntityMappings2_0DetailsPage
+ */
+public class EntityMappings2_0DetailsPage extends AbstractEntityMappingsDetailsPage
+{
+ /**
+ * Creates a new <code>EntityMappings2_0DetailsPage</code>.
+ *
+ * @param parent The parent container
+ * @param widgetFactory The factory used to create various common widgets
+ */
+ public EntityMappings2_0DetailsPage(Composite parent,
+ WidgetFactory widgetFactory) {
+
+ super(parent, widgetFactory);
+ }
+
+ @Override
+ protected void initializeGeneratorsCollapsibleSection(Composite container) {
+ new EntityMappingsGenerators2_0Composite(this, container);
+ }
+
+ @Override
+ protected void initializeQueriesCollapsibleSection(Composite container) {
+ new OrmQueries2_0Composite(this, container);
+ }
+
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/orm/EntityMappings2_0DetailsProvider.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/orm/EntityMappings2_0DetailsProvider.java
new file mode 100644
index 0000000000..128a9e6b54
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/orm/EntityMappings2_0DetailsProvider.java
@@ -0,0 +1,58 @@
+/*******************************************************************************
+* Copyright (c) 2009 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.ui.internal.jpa2.details.orm;
+
+import org.eclipse.jpt.common.core.JptResourceType;
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.jpa.core.JptJpaCorePlugin;
+import org.eclipse.jpt.jpa.core.context.orm.EntityMappings;
+import org.eclipse.jpt.jpa.ui.details.JpaDetailsPage;
+import org.eclipse.jpt.jpa.ui.details.JpaDetailsProvider;
+import org.eclipse.jpt.jpa.ui.internal.details.AbstractEntityMappingsDetailsProvider;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * EntityMappings2_0DetailsProvider
+ */
+public class EntityMappings2_0DetailsProvider
+ extends AbstractEntityMappingsDetailsProvider
+{
+ // singleton
+ private static final JpaDetailsProvider INSTANCE = new EntityMappings2_0DetailsProvider();
+
+
+ /**
+ * Return the singleton
+ */
+ public static JpaDetailsProvider instance() {
+ return INSTANCE;
+ }
+
+
+ /**
+ * Enforce singleton usage
+ */
+ private EntityMappings2_0DetailsProvider() {
+ super();
+ }
+
+
+ @Override
+ protected boolean providesDetails(JptResourceType resourceType) {
+ return resourceType.equals(JptJpaCorePlugin.ORM_XML_2_0_RESOURCE_TYPE);
+ }
+
+ public JpaDetailsPage<EntityMappings> buildDetailsPage(
+ Composite parent,
+ WidgetFactory widgetFactory) {
+
+ return new EntityMappings2_0DetailsPage(parent, widgetFactory);
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/orm/EntityMappingsGenerators2_0Composite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/orm/EntityMappingsGenerators2_0Composite.java
new file mode 100644
index 0000000000..293019a85d
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/orm/EntityMappingsGenerators2_0Composite.java
@@ -0,0 +1,53 @@
+/*******************************************************************************
+* Copyright (c) 2009 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.ui.internal.jpa2.details.orm;
+
+import org.eclipse.jpt.common.ui.internal.widgets.Pane;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.SequenceGenerator;
+import org.eclipse.jpt.jpa.core.context.orm.EntityMappings;
+import org.eclipse.jpt.jpa.ui.internal.details.GeneratorComposite;
+import org.eclipse.jpt.jpa.ui.internal.details.GeneratorComposite.GeneratorBuilder;
+import org.eclipse.jpt.jpa.ui.internal.details.orm.EntityMappingsGeneratorsComposite;
+import org.eclipse.jpt.jpa.ui.internal.jpa2.details.SequenceGenerator2_0Composite;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * EntityMappingsGenerators2_0Composite
+ */
+public class EntityMappingsGenerators2_0Composite extends EntityMappingsGeneratorsComposite
+{
+ /**
+ * Creates a new <code>EntityMappingsGenerators2_0Composite</code>.
+ *
+ * @param parentPane The parent container of this one
+ * @param parent The parent container
+ */
+ public EntityMappingsGenerators2_0Composite(
+ Pane<? extends EntityMappings> parentPane,
+ Composite parent) {
+
+ super(parentPane, parent);
+ }
+
+ @Override
+ protected GeneratorComposite<SequenceGenerator> buildSequenceGeneratorComposite(
+ Composite parent,
+ PropertyValueModel<SequenceGenerator> sequenceGeneratorHolder,
+ GeneratorBuilder<SequenceGenerator> generatorBuilder) {
+
+ return new SequenceGenerator2_0Composite(
+ this,
+ sequenceGeneratorHolder,
+ parent,
+ generatorBuilder
+ );
+ }
+} \ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/orm/OrmBasicMapping2_0Composite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/orm/OrmBasicMapping2_0Composite.java
new file mode 100644
index 0000000000..46a70b9cdc
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/orm/OrmBasicMapping2_0Composite.java
@@ -0,0 +1,58 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2010 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.ui.internal.jpa2.details.orm;
+
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.utility.internal.model.value.PropertyAspectAdapter;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.AccessHolder;
+import org.eclipse.jpt.jpa.core.context.BasicMapping;
+import org.eclipse.jpt.jpa.ui.internal.details.AbstractBasicMappingComposite;
+import org.eclipse.jpt.jpa.ui.internal.details.AccessTypeComposite;
+import org.eclipse.jpt.jpa.ui.internal.details.ColumnComposite;
+import org.eclipse.jpt.jpa.ui.internal.details.FetchTypeComposite;
+import org.eclipse.jpt.jpa.ui.internal.details.OptionalComposite;
+import org.eclipse.jpt.jpa.ui.internal.details.orm.OrmMappingNameChooser;
+import org.eclipse.swt.widgets.Composite;
+
+public class OrmBasicMapping2_0Composite extends AbstractBasicMappingComposite<BasicMapping>
+{
+ /**
+ * Creates a new <code>EclipseLink1_1OrmBasicMappingComposite</code>.
+ *
+ * @param subjectHolder The holder of the subject <code>BasicMapping</code>
+ * @param parent The parent container
+ * @param widgetFactory The factory used to create various common widgets
+ */
+ public OrmBasicMapping2_0Composite(PropertyValueModel<? extends BasicMapping> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+
+ super(subjectHolder, parent, widgetFactory);
+ }
+
+ @Override
+ protected void initializeBasicSection(Composite container) {
+ new ColumnComposite(this, buildColumnHolder(), container);
+ new OrmMappingNameChooser(this, getSubjectHolder(), container);
+ new AccessTypeComposite(this, buildAccessHolderHolder(), container);
+ new FetchTypeComposite(this, container);
+ new OptionalComposite(this, addSubPane(container, 4));
+ }
+
+ protected PropertyValueModel<AccessHolder> buildAccessHolderHolder() {
+ return new PropertyAspectAdapter<BasicMapping, AccessHolder>(getSubjectHolder()) {
+ @Override
+ protected AccessHolder buildValue_() {
+ return this.subject.getPersistentAttribute();
+ }
+ };
+ }
+} \ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/orm/OrmElementCollectionMapping2_0Composite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/orm/OrmElementCollectionMapping2_0Composite.java
new file mode 100644
index 0000000000..fcba7bd016
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/orm/OrmElementCollectionMapping2_0Composite.java
@@ -0,0 +1,59 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2010 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.ui.internal.jpa2.details.orm;
+
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.utility.internal.model.value.PropertyAspectAdapter;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.AccessHolder;
+import org.eclipse.jpt.jpa.core.jpa2.context.ElementCollectionMapping2_0;
+import org.eclipse.jpt.jpa.ui.internal.details.AccessTypeComposite;
+import org.eclipse.jpt.jpa.ui.internal.details.FetchTypeComposite;
+import org.eclipse.jpt.jpa.ui.internal.details.orm.OrmMappingNameChooser;
+import org.eclipse.jpt.jpa.ui.internal.jpa2.details.AbstractElementCollectionMapping2_0Composite;
+import org.eclipse.jpt.jpa.ui.internal.jpa2.details.CollectionTable2_0Composite;
+import org.eclipse.jpt.jpa.ui.internal.jpa2.details.TargetClassComposite;
+import org.eclipse.swt.widgets.Composite;
+
+public class OrmElementCollectionMapping2_0Composite
+ extends AbstractElementCollectionMapping2_0Composite<ElementCollectionMapping2_0>
+{
+ /**
+ * Creates a new <code>EclipseLink1_1OrmBasicMappingComposite</code>.
+ *
+ * @param subjectHolder The holder of the subject <code>BasicMapping</code>
+ * @param parent The parent container
+ * @param widgetFactory The factory used to create various common widgets
+ */
+ public OrmElementCollectionMapping2_0Composite(PropertyValueModel<? extends ElementCollectionMapping2_0> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+
+ super(subjectHolder, parent, widgetFactory);
+ }
+
+ @Override
+ protected void initializeElementCollectionSection(Composite container) {
+ new TargetClassComposite(this, container);
+ new OrmMappingNameChooser(this, getSubjectHolder(), container);
+ new AccessTypeComposite(this, buildAccessHolderHolder(), container);
+ new FetchTypeComposite(this, container);
+ new CollectionTable2_0Composite(this, buildCollectionTableHolder(), container);
+ }
+
+ protected PropertyValueModel<AccessHolder> buildAccessHolderHolder() {
+ return new PropertyAspectAdapter<ElementCollectionMapping2_0, AccessHolder>(getSubjectHolder()) {
+ @Override
+ protected AccessHolder buildValue_() {
+ return this.subject.getPersistentAttribute();
+ }
+ };
+ }
+} \ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/orm/OrmElementCollectionMapping2_0UiDefinition.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/orm/OrmElementCollectionMapping2_0UiDefinition.java
new file mode 100644
index 0000000000..7f7722056e
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/orm/OrmElementCollectionMapping2_0UiDefinition.java
@@ -0,0 +1,56 @@
+/*******************************************************************************
+ * Copyright (c) 2009 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.ui.internal.jpa2.details.orm;
+
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.ReadOnlyPersistentAttribute;
+import org.eclipse.jpt.jpa.core.jpa2.context.orm.OrmElementCollectionMapping2_0;
+import org.eclipse.jpt.jpa.ui.details.JpaComposite;
+import org.eclipse.jpt.jpa.ui.details.orm.OrmAttributeMappingUiDefinition;
+import org.eclipse.jpt.jpa.ui.details.orm.OrmXmlUiFactory;
+import org.eclipse.jpt.jpa.ui.internal.jpa2.details.AbstractElementCollectionMapping2_0UiDefinition;
+import org.eclipse.jpt.jpa.ui.jpa2.details.orm.OrmXmlUiFactory2_0;
+import org.eclipse.swt.widgets.Composite;
+
+public class OrmElementCollectionMapping2_0UiDefinition
+ extends AbstractElementCollectionMapping2_0UiDefinition<ReadOnlyPersistentAttribute, OrmElementCollectionMapping2_0>
+ implements OrmAttributeMappingUiDefinition<OrmElementCollectionMapping2_0>
+{
+ // singleton
+ private static final OrmElementCollectionMapping2_0UiDefinition INSTANCE =
+ new OrmElementCollectionMapping2_0UiDefinition();
+
+
+ /**
+ * Return the singleton.
+ */
+ public static OrmAttributeMappingUiDefinition<OrmElementCollectionMapping2_0> instance() {
+ return INSTANCE;
+ }
+
+
+ /**
+ * Ensure single instance.
+ */
+ private OrmElementCollectionMapping2_0UiDefinition() {
+ super();
+ }
+
+ public JpaComposite buildAttributeMappingComposite(
+ OrmXmlUiFactory factory,
+ PropertyValueModel<OrmElementCollectionMapping2_0> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+
+ return ((OrmXmlUiFactory2_0) factory).createOrmElementCollectionMapping2_0Composite(subjectHolder, parent, widgetFactory);
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/orm/OrmEmbeddedIdMapping2_0Composite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/orm/OrmEmbeddedIdMapping2_0Composite.java
new file mode 100644
index 0000000000..d1ae124f01
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/orm/OrmEmbeddedIdMapping2_0Composite.java
@@ -0,0 +1,53 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2010 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.ui.internal.jpa2.details.orm;
+
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.utility.internal.model.value.PropertyAspectAdapter;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.AccessHolder;
+import org.eclipse.jpt.jpa.core.context.EmbeddedIdMapping;
+import org.eclipse.jpt.jpa.ui.internal.details.AbstractEmbeddedIdMappingComposite;
+import org.eclipse.jpt.jpa.ui.internal.details.AccessTypeComposite;
+import org.eclipse.jpt.jpa.ui.internal.details.EmbeddedMappingOverridesComposite;
+import org.eclipse.jpt.jpa.ui.internal.details.orm.OrmMappingNameChooser;
+import org.eclipse.jpt.jpa.ui.internal.jpa2.details.EmbeddedIdMapping2_0MappedByRelationshipPane;
+import org.eclipse.swt.widgets.Composite;
+
+public class OrmEmbeddedIdMapping2_0Composite
+ extends AbstractEmbeddedIdMappingComposite<EmbeddedIdMapping>
+{
+ public OrmEmbeddedIdMapping2_0Composite(
+ PropertyValueModel<? extends EmbeddedIdMapping> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+
+ super(subjectHolder, parent, widgetFactory);
+ }
+
+
+ @Override
+ protected void initializeEmbeddedIdSection(Composite container) {
+ new OrmMappingNameChooser(this, getSubjectHolder(), container);
+ new AccessTypeComposite(this, buildAccessHolderHolder(), container);
+
+ new EmbeddedIdMapping2_0MappedByRelationshipPane(this, getSubjectHolder(), container);
+ new EmbeddedMappingOverridesComposite(this, container);
+ }
+
+ protected PropertyValueModel<AccessHolder> buildAccessHolderHolder() {
+ return new PropertyAspectAdapter<EmbeddedIdMapping, AccessHolder>(getSubjectHolder()) {
+ @Override
+ protected AccessHolder buildValue_() {
+ return this.subject.getPersistentAttribute();
+ }
+ };
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/orm/OrmEmbeddedMapping2_0Composite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/orm/OrmEmbeddedMapping2_0Composite.java
new file mode 100644
index 0000000000..0913d9ec2b
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/orm/OrmEmbeddedMapping2_0Composite.java
@@ -0,0 +1,77 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2010 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.ui.internal.jpa2.details.orm;
+
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.utility.internal.model.value.PropertyAspectAdapter;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.AccessHolder;
+import org.eclipse.jpt.jpa.core.context.EmbeddedMapping;
+import org.eclipse.jpt.jpa.ui.internal.details.AbstractEmbeddedMappingComposite;
+import org.eclipse.jpt.jpa.ui.internal.details.AccessTypeComposite;
+import org.eclipse.jpt.jpa.ui.internal.details.java.BaseJavaUiFactory;
+import org.eclipse.jpt.jpa.ui.internal.details.orm.OrmMappingNameChooser;
+import org.eclipse.jpt.jpa.ui.internal.jpa2.details.EmbeddedMapping2_0OverridesComposite;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * Here the layout of this pane:
+ * <pre>
+ * -----------------------------------------------------------------------------
+ * | ------------------------------------------------------------------------- |
+ * | | | |
+ * | | EmbeddedAttributeOverridesComposite | |
+ * | | | |
+ * | ------------------------------------------------------------------------- |
+ * -----------------------------------------------------------------------------</pre>
+ *
+ * @see EmbeddedMapping
+ * @see BaseJavaUiFactory - The factory creating this pane
+ *
+ * @version 2.3
+ * @since 2.2
+ */
+public class OrmEmbeddedMapping2_0Composite
+ extends AbstractEmbeddedMappingComposite<EmbeddedMapping>
+{
+ /**
+ * Creates a new <code>EmbeddedMappingComposite</code>.
+ *
+ * @param subjectHolder The holder of the subject <code>EmbeddedMapping</code>
+ * @param parent The parent container
+ * @param widgetFactory The factory used to create various common widgets
+ */
+ public OrmEmbeddedMapping2_0Composite(PropertyValueModel<? extends EmbeddedMapping> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+
+ super(subjectHolder, parent, widgetFactory);
+ }
+
+ @Override
+ protected void initializeEmbeddedSection(Composite container) {
+ new OrmMappingNameChooser(this, getSubjectHolder(), container);
+ new AccessTypeComposite(this, buildAccessHolderHolder(), container);
+
+ new EmbeddedMapping2_0OverridesComposite(
+ this,
+ container
+ );
+ }
+
+ protected PropertyValueModel<AccessHolder> buildAccessHolderHolder() {
+ return new PropertyAspectAdapter<EmbeddedMapping, AccessHolder>(getSubjectHolder()) {
+ @Override
+ protected AccessHolder buildValue_() {
+ return this.subject.getPersistentAttribute();
+ }
+ };
+ }
+} \ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/orm/OrmEntity2_0Composite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/orm/OrmEntity2_0Composite.java
new file mode 100644
index 0000000000..a018170014
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/orm/OrmEntity2_0Composite.java
@@ -0,0 +1,91 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2010 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.ui.internal.jpa2.details.orm;
+
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.utility.internal.model.value.PropertyAspectAdapter;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.GeneratorContainer;
+import org.eclipse.jpt.jpa.core.context.QueryContainer;
+import org.eclipse.jpt.jpa.core.context.orm.OrmEntity;
+import org.eclipse.jpt.jpa.core.jpa2.context.Cacheable2_0;
+import org.eclipse.jpt.jpa.core.jpa2.context.CacheableHolder2_0;
+import org.eclipse.jpt.jpa.ui.internal.details.AccessTypeComposite;
+import org.eclipse.jpt.jpa.ui.internal.details.EntityNameComposite;
+import org.eclipse.jpt.jpa.ui.internal.details.IdClassComposite;
+import org.eclipse.jpt.jpa.ui.internal.details.TableComposite;
+import org.eclipse.jpt.jpa.ui.internal.details.orm.AbstractOrmEntityComposite;
+import org.eclipse.jpt.jpa.ui.internal.details.orm.MetadataCompleteComposite;
+import org.eclipse.jpt.jpa.ui.internal.details.orm.OrmJavaClassChooser;
+import org.eclipse.jpt.jpa.ui.internal.jpa2.details.Cacheable2_0Pane;
+import org.eclipse.jpt.jpa.ui.internal.jpa2.details.Entity2_0OverridesComposite;
+import org.eclipse.jpt.jpa.ui.internal.jpa2.details.Generation2_0Composite;
+import org.eclipse.jpt.jpa.ui.internal.jpa2.details.Queries2_0Composite;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * The pane used for an ORM entity 2.0.
+ *
+ * @see OrmEntity
+ * @see Entity2_0OverridesComposite
+ */
+public class OrmEntity2_0Composite
+ extends AbstractOrmEntityComposite
+{
+ /**
+ * Creates a new <code>OrmEntityComposite</code>.
+ *
+ * @param subjectHolder The holder of the subject <code>OrmEntity</code>
+ * @param parent The parent container
+ * @param widgetFactory The factory used to create various common widgets
+ */
+ public OrmEntity2_0Composite(
+ PropertyValueModel<? extends OrmEntity> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+
+ super(subjectHolder, parent, widgetFactory);
+ }
+
+ @Override
+ protected void initializeEntitySection(Composite container) {
+ new OrmJavaClassChooser(this, getSubjectHolder(), container, false);
+ new TableComposite(this, container);
+ new EntityNameComposite(this, container);
+ new AccessTypeComposite(this, buildAccessHolder(), container);
+ new IdClassComposite(this, buildIdClassReferenceHolder(), container);
+ new Cacheable2_0Pane(this, buildCacheableHolder(), container);
+ new MetadataCompleteComposite(this, getSubjectHolder(), container);
+ }
+
+ protected PropertyValueModel<Cacheable2_0> buildCacheableHolder() {
+ return new PropertyAspectAdapter<OrmEntity, Cacheable2_0>(getSubjectHolder()) {
+ @Override
+ protected Cacheable2_0 buildValue_() {
+ return ((CacheableHolder2_0) this.subject).getCacheable();
+ }
+ };
+ }
+
+ @Override
+ protected void initializeAttributeOverridesSection(Composite container) {
+ new Entity2_0OverridesComposite(this, container);
+ }
+
+ @Override
+ protected void initializeGeneratorsSection(Composite container, PropertyValueModel<GeneratorContainer> generatorContainerHolder) {
+ new Generation2_0Composite(this, generatorContainerHolder, container);
+ }
+
+ @Override
+ protected void initializeQueriesSection(Composite container, PropertyValueModel<QueryContainer> queryContainerHolder) {
+ new Queries2_0Composite(this, queryContainerHolder, container);
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/orm/OrmIdMapping2_0Composite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/orm/OrmIdMapping2_0Composite.java
new file mode 100644
index 0000000000..3717d093e0
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/orm/OrmIdMapping2_0Composite.java
@@ -0,0 +1,58 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2010 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.ui.internal.jpa2.details.orm;
+
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.utility.internal.model.value.PropertyAspectAdapter;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.AccessHolder;
+import org.eclipse.jpt.jpa.core.context.IdMapping;
+import org.eclipse.jpt.jpa.ui.internal.details.AbstractIdMappingComposite;
+import org.eclipse.jpt.jpa.ui.internal.details.AccessTypeComposite;
+import org.eclipse.jpt.jpa.ui.internal.details.ColumnComposite;
+import org.eclipse.jpt.jpa.ui.internal.details.orm.OrmMappingNameChooser;
+import org.eclipse.jpt.jpa.ui.internal.jpa2.details.IdMapping2_0MappedByRelationshipPane;
+import org.eclipse.jpt.jpa.ui.internal.jpa2.details.IdMappingGeneration2_0Composite;
+import org.eclipse.swt.widgets.Composite;
+
+public class OrmIdMapping2_0Composite
+ extends AbstractIdMappingComposite<IdMapping>
+{
+ public OrmIdMapping2_0Composite(
+ PropertyValueModel<? extends IdMapping> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+
+ super(subjectHolder, parent, widgetFactory);
+ }
+
+
+ @Override
+ protected void initializeIdSection(Composite container) {
+ new IdMapping2_0MappedByRelationshipPane(this, getSubjectHolder(), container);
+ new ColumnComposite(this, buildColumnHolder(), container);
+ new OrmMappingNameChooser(this, getSubjectHolder(), container);
+ new AccessTypeComposite(this, buildAccessHolderHolder(), container);
+ }
+
+ @Override
+ protected void initializeGenerationCollapsibleSection(Composite container) {
+ new IdMappingGeneration2_0Composite(this, container);
+ }
+
+ protected PropertyValueModel<AccessHolder> buildAccessHolderHolder() {
+ return new PropertyAspectAdapter<IdMapping, AccessHolder>(getSubjectHolder()) {
+ @Override
+ protected AccessHolder buildValue_() {
+ return this.subject.getPersistentAttribute();
+ }
+ };
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/orm/OrmManyToManyMapping2_0Composite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/orm/OrmManyToManyMapping2_0Composite.java
new file mode 100644
index 0000000000..136fbb7fd4
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/orm/OrmManyToManyMapping2_0Composite.java
@@ -0,0 +1,57 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 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.ui.internal.jpa2.details.orm;
+
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.ManyToManyMapping;
+import org.eclipse.jpt.jpa.core.context.ManyToManyRelationship;
+import org.eclipse.jpt.jpa.ui.internal.details.AbstractManyToManyMappingComposite;
+import org.eclipse.jpt.jpa.ui.internal.details.AccessTypeComposite;
+import org.eclipse.jpt.jpa.ui.internal.details.FetchTypeComposite;
+import org.eclipse.jpt.jpa.ui.internal.details.TargetEntityComposite;
+import org.eclipse.jpt.jpa.ui.internal.details.orm.OrmMappingNameChooser;
+import org.eclipse.jpt.jpa.ui.internal.jpa2.details.CascadePane2_0;
+import org.eclipse.jpt.jpa.ui.internal.jpa2.details.Ordering2_0Composite;
+import org.eclipse.swt.widgets.Composite;
+
+public class OrmManyToManyMapping2_0Composite
+ extends AbstractManyToManyMappingComposite<ManyToManyMapping, ManyToManyRelationship>
+{
+ /**
+ * Creates a new <code>ManyToManyMappingComposite</code>.
+ *
+ * @param subjectHolder The holder of the subject <code>IManyToManyMapping</code>
+ * @param parent The parent container
+ * @param widgetFactory The factory used to create various common widgets
+ */
+ public OrmManyToManyMapping2_0Composite(
+ PropertyValueModel<? extends ManyToManyMapping> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+
+ super(subjectHolder, parent, widgetFactory);
+ }
+
+
+ @Override
+ protected void initializeManyToManySection(Composite container) {
+ new TargetEntityComposite(this, container);
+ new OrmMappingNameChooser(this, getSubjectHolder(), container);
+ new AccessTypeComposite(this, buildAccessHolderHolder(), container);
+ new FetchTypeComposite(this, container);
+ new CascadePane2_0(this, buildCascadeHolder(), addSubPane(container, 5));
+ }
+
+ @Override
+ protected void initializeOrderingCollapsibleSection(Composite container) {
+ new Ordering2_0Composite(this, container);
+ }
+} \ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/orm/OrmManyToOneMapping2_0Composite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/orm/OrmManyToOneMapping2_0Composite.java
new file mode 100644
index 0000000000..15ca95d75c
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/orm/OrmManyToOneMapping2_0Composite.java
@@ -0,0 +1,57 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 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.ui.internal.jpa2.details.orm;
+
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.utility.internal.model.value.PropertyAspectAdapter;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.AccessHolder;
+import org.eclipse.jpt.jpa.core.context.ManyToOneMapping;
+import org.eclipse.jpt.jpa.core.jpa2.context.ManyToOneRelationship2_0;
+import org.eclipse.jpt.jpa.ui.internal.details.AccessTypeComposite;
+import org.eclipse.jpt.jpa.ui.internal.details.FetchTypeComposite;
+import org.eclipse.jpt.jpa.ui.internal.details.OptionalComposite;
+import org.eclipse.jpt.jpa.ui.internal.details.TargetEntityComposite;
+import org.eclipse.jpt.jpa.ui.internal.details.orm.OrmMappingNameChooser;
+import org.eclipse.jpt.jpa.ui.internal.jpa2.details.AbstractManyToOneMapping2_0Composite;
+import org.eclipse.jpt.jpa.ui.internal.jpa2.details.CascadePane2_0;
+import org.eclipse.swt.widgets.Composite;
+
+public class OrmManyToOneMapping2_0Composite
+ extends AbstractManyToOneMapping2_0Composite<ManyToOneMapping, ManyToOneRelationship2_0>
+{
+ public OrmManyToOneMapping2_0Composite(
+ PropertyValueModel<? extends ManyToOneMapping> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+
+ super(subjectHolder, parent, widgetFactory);
+ }
+
+
+ @Override
+ protected void initializeManyToOneSection(Composite container) {
+ new TargetEntityComposite(this, container);
+ new OrmMappingNameChooser(this, getSubjectHolder(), container);
+ new AccessTypeComposite(this, buildAccessHolderHolder(), container);
+ new FetchTypeComposite(this, container);
+ new OptionalComposite(this, container);
+ new CascadePane2_0(this, buildCascadeHolder(), addSubPane(container, 5));
+ }
+
+ protected PropertyValueModel<AccessHolder> buildAccessHolderHolder() {
+ return new PropertyAspectAdapter<ManyToOneMapping, AccessHolder>(getSubjectHolder()) {
+ @Override
+ protected AccessHolder buildValue_() {
+ return this.subject.getPersistentAttribute();
+ }
+ };
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/orm/OrmOneToManyMapping2_0Composite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/orm/OrmOneToManyMapping2_0Composite.java
new file mode 100644
index 0000000000..352f358926
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/orm/OrmOneToManyMapping2_0Composite.java
@@ -0,0 +1,80 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 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.ui.internal.jpa2.details.orm;
+
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.utility.internal.model.value.PropertyAspectAdapter;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.AccessHolder;
+import org.eclipse.jpt.jpa.core.context.OneToManyMapping;
+import org.eclipse.jpt.jpa.core.jpa2.context.OneToManyRelationship2_0;
+import org.eclipse.jpt.jpa.core.jpa2.context.OrphanRemovable2_0;
+import org.eclipse.jpt.jpa.core.jpa2.context.OrphanRemovalHolder2_0;
+import org.eclipse.jpt.jpa.ui.internal.details.AbstractOneToManyMappingComposite;
+import org.eclipse.jpt.jpa.ui.internal.details.AccessTypeComposite;
+import org.eclipse.jpt.jpa.ui.internal.details.FetchTypeComposite;
+import org.eclipse.jpt.jpa.ui.internal.details.TargetEntityComposite;
+import org.eclipse.jpt.jpa.ui.internal.details.orm.OrmMappingNameChooser;
+import org.eclipse.jpt.jpa.ui.internal.jpa2.details.CascadePane2_0;
+import org.eclipse.jpt.jpa.ui.internal.jpa2.details.OneToManyJoiningStrategy2_0Pane;
+import org.eclipse.jpt.jpa.ui.internal.jpa2.details.Ordering2_0Composite;
+import org.eclipse.jpt.jpa.ui.internal.jpa2.details.OrphanRemoval2_0Composite;
+import org.eclipse.swt.widgets.Composite;
+
+public class OrmOneToManyMapping2_0Composite
+ extends AbstractOneToManyMappingComposite<OneToManyMapping, OneToManyRelationship2_0>
+{
+ public OrmOneToManyMapping2_0Composite(
+ PropertyValueModel<? extends OneToManyMapping> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+
+ super(subjectHolder, parent, widgetFactory);
+ }
+
+
+ @Override
+ protected void initializeOneToManySection(Composite container) {
+ new TargetEntityComposite(this, container);
+ new OrmMappingNameChooser(this, getSubjectHolder(), container);
+ new AccessTypeComposite(this, this.buildAccessHolderHolder(), container);
+ new FetchTypeComposite(this, container);
+ new OrphanRemoval2_0Composite(this, this.buildOrphanRemovableHolder(), container);
+ new CascadePane2_0(this, this.buildCascadeHolder(), this.addSubPane(container, 5));
+ }
+
+ @Override
+ protected void initializeJoiningStrategyCollapsibleSection(Composite container) {
+ new OneToManyJoiningStrategy2_0Pane(this, this.buildJoiningHolder(), container);
+ }
+
+ @Override
+ protected void initializeOrderingCollapsibleSection(Composite container) {
+ new Ordering2_0Composite(this, container);
+ }
+
+ protected PropertyValueModel<AccessHolder> buildAccessHolderHolder() {
+ return new PropertyAspectAdapter<OneToManyMapping, AccessHolder>(this.getSubjectHolder()) {
+ @Override
+ protected AccessHolder buildValue_() {
+ return this.subject.getPersistentAttribute();
+ }
+ };
+ }
+
+ protected PropertyValueModel<OrphanRemovable2_0> buildOrphanRemovableHolder() {
+ return new PropertyAspectAdapter<OneToManyMapping, OrphanRemovable2_0>(this.getSubjectHolder()) {
+ @Override
+ protected OrphanRemovable2_0 buildValue_() {
+ return ((OrphanRemovalHolder2_0) this.subject).getOrphanRemoval();
+ }
+ };
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/orm/OrmOneToOneMapping2_0Composite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/orm/OrmOneToOneMapping2_0Composite.java
new file mode 100644
index 0000000000..a9cd556c85
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/orm/OrmOneToOneMapping2_0Composite.java
@@ -0,0 +1,76 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 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.ui.internal.jpa2.details.orm;
+
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.utility.internal.model.value.PropertyAspectAdapter;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.AccessHolder;
+import org.eclipse.jpt.jpa.core.context.OneToOneMapping;
+import org.eclipse.jpt.jpa.core.jpa2.context.OneToOneRelationship2_0;
+import org.eclipse.jpt.jpa.core.jpa2.context.OrphanRemovable2_0;
+import org.eclipse.jpt.jpa.core.jpa2.context.OrphanRemovalHolder2_0;
+import org.eclipse.jpt.jpa.ui.internal.details.AccessTypeComposite;
+import org.eclipse.jpt.jpa.ui.internal.details.FetchTypeComposite;
+import org.eclipse.jpt.jpa.ui.internal.details.OptionalComposite;
+import org.eclipse.jpt.jpa.ui.internal.details.TargetEntityComposite;
+import org.eclipse.jpt.jpa.ui.internal.details.orm.OrmMappingNameChooser;
+import org.eclipse.jpt.jpa.ui.internal.jpa2.details.AbstractOneToOneMapping2_0Composite;
+import org.eclipse.jpt.jpa.ui.internal.jpa2.details.CascadePane2_0;
+import org.eclipse.jpt.jpa.ui.internal.jpa2.details.OneToOneJoiningStrategy2_0Pane;
+import org.eclipse.jpt.jpa.ui.internal.jpa2.details.OrphanRemoval2_0Composite;
+import org.eclipse.swt.widgets.Composite;
+
+public class OrmOneToOneMapping2_0Composite
+ extends AbstractOneToOneMapping2_0Composite<OneToOneMapping, OneToOneRelationship2_0>
+{
+ public OrmOneToOneMapping2_0Composite(
+ PropertyValueModel<? extends OneToOneMapping> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+
+ super(subjectHolder, parent, widgetFactory);
+ }
+
+
+ @Override
+ protected void initializeOneToOneSection(Composite container) {
+ new TargetEntityComposite(this, container);
+ new OrmMappingNameChooser(this, getSubjectHolder(), container);
+ new AccessTypeComposite(this, buildAccessHolderHolder(), container);
+ new FetchTypeComposite(this, container);
+ new OptionalComposite(this, container);
+ new OrphanRemoval2_0Composite(this, buildOrphanRemovableHolder(), container);
+ new CascadePane2_0(this, buildCascadeHolder(), addSubPane(container, 5));
+ }
+
+ @Override
+ protected void initializeJoiningStrategyCollapsibleSection(Composite container) {
+ new OneToOneJoiningStrategy2_0Pane(this, buildJoiningHolder(), container);
+ }
+
+ protected PropertyValueModel<AccessHolder> buildAccessHolderHolder() {
+ return new PropertyAspectAdapter<OneToOneMapping, AccessHolder>(getSubjectHolder()) {
+ @Override
+ protected AccessHolder buildValue_() {
+ return this.subject.getPersistentAttribute();
+ }
+ };
+ }
+
+ protected PropertyValueModel<OrphanRemovable2_0> buildOrphanRemovableHolder() {
+ return new PropertyAspectAdapter<OneToOneMapping, OrphanRemovable2_0>(getSubjectHolder()) {
+ @Override
+ protected OrphanRemovable2_0 buildValue_() {
+ return ((OrphanRemovalHolder2_0) this.subject).getOrphanRemoval();
+ }
+ };
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/orm/OrmQueries2_0Composite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/orm/OrmQueries2_0Composite.java
new file mode 100644
index 0000000000..e60271eb8d
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/orm/OrmQueries2_0Composite.java
@@ -0,0 +1,43 @@
+/*******************************************************************************
+* Copyright (c) 2009 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.ui.internal.jpa2.details.orm;
+
+import org.eclipse.jpt.common.ui.internal.widgets.Pane;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.QueryContainer;
+import org.eclipse.jpt.jpa.core.context.orm.EntityMappings;
+import org.eclipse.jpt.jpa.ui.internal.details.QueriesComposite;
+import org.eclipse.jpt.jpa.ui.internal.details.orm.OrmQueriesComposite;
+import org.eclipse.jpt.jpa.ui.internal.jpa2.details.Queries2_0Composite;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * OrmQueries2_0Composite
+ */
+public class OrmQueries2_0Composite extends OrmQueriesComposite {
+
+ /**
+ * Creates a new <code>OrmQueries2_0Composite</code>.
+ *
+ * @param parentPane The parent container of this one
+ * @param parent The parent container
+ */
+ public OrmQueries2_0Composite(Pane<? extends EntityMappings> parentPane,
+ Composite parent) {
+
+ super(parentPane, parent);
+ }
+
+ @Override
+ protected QueriesComposite buildQueriesComposite(Composite container, PropertyValueModel<QueryContainer> queryContainerHolder) {
+ return new Queries2_0Composite(this, queryContainerHolder, container);
+ }
+
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/orm/OrmVersionMapping2_0Composite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/orm/OrmVersionMapping2_0Composite.java
new file mode 100644
index 0000000000..416aadd306
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/orm/OrmVersionMapping2_0Composite.java
@@ -0,0 +1,55 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2010 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.ui.internal.jpa2.details.orm;
+
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.utility.internal.model.value.PropertyAspectAdapter;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.AccessHolder;
+import org.eclipse.jpt.jpa.core.context.VersionMapping;
+import org.eclipse.jpt.jpa.ui.internal.details.AbstractVersionMappingComposite;
+import org.eclipse.jpt.jpa.ui.internal.details.AccessTypeComposite;
+import org.eclipse.jpt.jpa.ui.internal.details.ColumnComposite;
+import org.eclipse.jpt.jpa.ui.internal.details.orm.OrmMappingNameChooser;
+import org.eclipse.swt.widgets.Composite;
+
+public class OrmVersionMapping2_0Composite
+ extends AbstractVersionMappingComposite<VersionMapping>
+{
+ /**
+ * Creates a new <code>EclipseLinkOrmVersionMappingComposite</code>.
+ *
+ * @param subjectHolder The holder of the subject <code>VersionMapping</code>
+ * @param parent The parent container
+ * @param widgetFactory The factory used to create various common widgets
+ */
+ public OrmVersionMapping2_0Composite(PropertyValueModel<? extends VersionMapping> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+
+ super(subjectHolder, parent, widgetFactory);
+ }
+
+ @Override
+ protected void initializeVersionSection(Composite container) {
+ new ColumnComposite(this, buildColumnHolder(), container);
+ new OrmMappingNameChooser(this, getSubjectHolder(), container);
+ new AccessTypeComposite(this, buildAccessHolderHolder(), container);
+ }
+
+ protected PropertyValueModel<AccessHolder> buildAccessHolderHolder() {
+ return new PropertyAspectAdapter<VersionMapping, AccessHolder>(getSubjectHolder()) {
+ @Override
+ protected AccessHolder buildValue_() {
+ return this.subject.getPersistentAttribute();
+ }
+ };
+ }
+} \ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/orm/OrmXml2_0UiDefinition.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/orm/OrmXml2_0UiDefinition.java
new file mode 100644
index 0000000000..c9bd67284d
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/orm/OrmXml2_0UiDefinition.java
@@ -0,0 +1,96 @@
+/*******************************************************************************
+ * Copyright (c) 2009 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.ui.internal.jpa2.details.orm;
+
+import java.util.List;
+import org.eclipse.jpt.common.core.JptResourceType;
+import org.eclipse.jpt.jpa.core.JptJpaCorePlugin;
+import org.eclipse.jpt.jpa.core.context.AttributeMapping;
+import org.eclipse.jpt.jpa.core.context.TypeMapping;
+import org.eclipse.jpt.jpa.ui.ResourceUiDefinition;
+import org.eclipse.jpt.jpa.ui.details.orm.OrmAttributeMappingUiDefinition;
+import org.eclipse.jpt.jpa.ui.details.orm.OrmTypeMappingUiDefinition;
+import org.eclipse.jpt.jpa.ui.details.orm.OrmXmlUiFactory;
+import org.eclipse.jpt.jpa.ui.internal.details.orm.AbstractOrmXmlResourceUiDefinition;
+import org.eclipse.jpt.jpa.ui.internal.details.orm.OrmBasicMappingUiDefinition;
+import org.eclipse.jpt.jpa.ui.internal.details.orm.OrmEmbeddableUiDefinition;
+import org.eclipse.jpt.jpa.ui.internal.details.orm.OrmEmbeddedIdMappingUiDefinition;
+import org.eclipse.jpt.jpa.ui.internal.details.orm.OrmEmbeddedMappingUiDefinition;
+import org.eclipse.jpt.jpa.ui.internal.details.orm.OrmEntityUiDefinition;
+import org.eclipse.jpt.jpa.ui.internal.details.orm.OrmIdMappingUiDefinition;
+import org.eclipse.jpt.jpa.ui.internal.details.orm.OrmManyToManyMappingUiDefinition;
+import org.eclipse.jpt.jpa.ui.internal.details.orm.OrmManyToOneMappingUiDefinition;
+import org.eclipse.jpt.jpa.ui.internal.details.orm.OrmMappedSuperclassUiDefinition;
+import org.eclipse.jpt.jpa.ui.internal.details.orm.OrmOneToManyMappingUiDefinition;
+import org.eclipse.jpt.jpa.ui.internal.details.orm.OrmOneToOneMappingUiDefinition;
+import org.eclipse.jpt.jpa.ui.internal.details.orm.OrmTransientMappingUiDefinition;
+import org.eclipse.jpt.jpa.ui.internal.details.orm.OrmVersionMappingUiDefinition;
+import org.eclipse.jpt.jpa.ui.internal.jpa2.GenericOrmXml2_0UiFactory;
+import org.eclipse.jpt.jpa.ui.internal.structure.OrmResourceModelStructureProvider;
+import org.eclipse.jpt.jpa.ui.structure.JpaStructureProvider;
+
+public class OrmXml2_0UiDefinition extends AbstractOrmXmlResourceUiDefinition
+{
+ // singleton
+ private static final ResourceUiDefinition INSTANCE = new OrmXml2_0UiDefinition();
+
+
+ /**
+ * Return the singleton
+ */
+ public static ResourceUiDefinition instance() {
+ return INSTANCE;
+ }
+
+
+ /**
+ * Enforce singleton usage
+ */
+ private OrmXml2_0UiDefinition() {
+ super();
+ }
+
+
+ @Override
+ protected OrmXmlUiFactory buildOrmXmlUiFactory() {
+ return new GenericOrmXml2_0UiFactory();
+ }
+
+ public boolean providesUi(JptResourceType resourceType) {
+ return resourceType.equals(JptJpaCorePlugin.ORM_XML_2_0_RESOURCE_TYPE);
+ }
+
+ public JpaStructureProvider getStructureProvider() {
+ return OrmResourceModelStructureProvider.instance();
+ }
+
+ @Override
+ protected void addOrmAttributeMappingUiDefinitionsTo(List<OrmAttributeMappingUiDefinition<? extends AttributeMapping>> definitions) {
+ definitions.add(OrmIdMappingUiDefinition.instance());
+ definitions.add(OrmEmbeddedIdMappingUiDefinition.instance());
+ definitions.add(OrmBasicMappingUiDefinition.instance());
+ definitions.add(OrmVersionMappingUiDefinition.instance());
+ definitions.add(OrmManyToOneMappingUiDefinition.instance());
+ definitions.add(OrmOneToManyMappingUiDefinition.instance());
+ definitions.add(OrmOneToOneMappingUiDefinition.instance());
+ definitions.add(OrmManyToManyMappingUiDefinition.instance());
+ definitions.add(OrmEmbeddedMappingUiDefinition.instance());
+ definitions.add(OrmTransientMappingUiDefinition.instance());
+
+ definitions.add(OrmElementCollectionMapping2_0UiDefinition.instance());
+ }
+
+ @Override
+ protected void addOrmTypeMappingUiDefinitionsTo(List<OrmTypeMappingUiDefinition<? extends TypeMapping>> definitions) {
+ definitions.add(OrmEntityUiDefinition.instance());
+ definitions.add(OrmMappedSuperclassUiDefinition.instance());
+ definitions.add(OrmEmbeddableUiDefinition.instance());
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/persistence/Generic2_0PersistenceXmlUiFactory.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/persistence/Generic2_0PersistenceXmlUiFactory.java
new file mode 100644
index 0000000000..a25815dedb
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/persistence/Generic2_0PersistenceXmlUiFactory.java
@@ -0,0 +1,83 @@
+/*******************************************************************************
+ * Copyright (c) 2009 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.ui.internal.jpa2.persistence;
+
+import java.util.ArrayList;
+import java.util.ListIterator;
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.utility.internal.model.value.TransformationPropertyValueModel;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.persistence.PersistenceUnit;
+import org.eclipse.jpt.jpa.core.jpa2.context.persistence.PersistenceUnit2_0;
+import org.eclipse.jpt.jpa.core.jpa2.context.persistence.connection.JpaConnection2_0;
+import org.eclipse.jpt.jpa.core.jpa2.context.persistence.options.JpaOptions2_0;
+import org.eclipse.jpt.jpa.ui.details.JpaPageComposite;
+import org.eclipse.jpt.jpa.ui.internal.jpa2.persistence.connection.GenericPersistenceUnit2_0ConnectionTab;
+import org.eclipse.jpt.jpa.ui.internal.jpa2.persistence.options.GenericPersistenceUnit2_0OptionsTab;
+import org.eclipse.jpt.jpa.ui.internal.persistence.details.GenericPersistenceUnitGeneralComposite;
+import org.eclipse.jpt.jpa.ui.internal.persistence.details.PersistenceUnitPropertiesComposite;
+import org.eclipse.jpt.jpa.ui.internal.persistence.details.PersistenceXmlUiFactory;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * The default implementation of the UI factory required to show the information
+ * related to a JPA mapping (type or attribute).
+ *
+ * @see GenericPersistenceXmlUiFactory
+ *
+ * @version 1.0
+ * @since 1.0
+ */
+public class Generic2_0PersistenceXmlUiFactory implements PersistenceXmlUiFactory
+{
+
+ // **************** persistence unit composites ****************************
+ public ListIterator<JpaPageComposite> createPersistenceUnitComposites(
+ PropertyValueModel<PersistenceUnit> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+
+ ArrayList<JpaPageComposite> pages = new ArrayList<JpaPageComposite>(4);
+
+ PropertyValueModel<JpaConnection2_0> connection2_0Holder =
+ this.buildJpaConnection2_0Holder(subjectHolder);
+ PropertyValueModel<JpaOptions2_0> options2_0Holder =
+ this.buildJpaOptions2_0Holder(subjectHolder);
+
+ pages.add(new GenericPersistenceUnitGeneralComposite(subjectHolder, parent, widgetFactory));
+ pages.add(new GenericPersistenceUnit2_0ConnectionTab(connection2_0Holder, parent, widgetFactory));
+ pages.add(new GenericPersistenceUnit2_0OptionsTab(options2_0Holder, parent, widgetFactory));
+ pages.add(new PersistenceUnitPropertiesComposite(subjectHolder, parent, widgetFactory));
+
+ return pages.listIterator();
+ }
+
+ // ********** private methods **********
+
+ private PropertyValueModel<JpaConnection2_0> buildJpaConnection2_0Holder(
+ PropertyValueModel<PersistenceUnit> subjectHolder) {
+ return new TransformationPropertyValueModel<PersistenceUnit, JpaConnection2_0>(subjectHolder) {
+ @Override
+ protected JpaConnection2_0 transform_(PersistenceUnit value) {
+ return (JpaConnection2_0) ((PersistenceUnit2_0) value).getConnection();
+ }
+ };
+ }
+
+ private PropertyValueModel<JpaOptions2_0> buildJpaOptions2_0Holder(
+ PropertyValueModel<PersistenceUnit> subjectHolder) {
+ return new TransformationPropertyValueModel<PersistenceUnit, JpaOptions2_0>(subjectHolder) {
+ @Override
+ protected JpaOptions2_0 transform_(PersistenceUnit value) {
+ return (JpaOptions2_0) ((PersistenceUnit2_0) value).getOptions();
+ }
+ };
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/persistence/JptUiPersistence2_0Messages.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/persistence/JptUiPersistence2_0Messages.java
new file mode 100644
index 0000000000..634139d2bf
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/persistence/JptUiPersistence2_0Messages.java
@@ -0,0 +1,82 @@
+/*******************************************************************************
+* Copyright (c) 2009, 2010 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.ui.internal.jpa2.persistence;
+
+import org.eclipse.osgi.util.NLS;
+
+/**
+ * JptUiPersistence2_0Messages
+ */
+public class JptUiPersistence2_0Messages
+{
+ // Connection
+ public static String ConnectionPropertiesComposite_Database_GroupBox;
+
+ public static String DataSourcePropertiesComposite_jtaDataSourceLabel;
+ public static String DataSourcePropertiesComposite_nonJtaDataSourceLabel;
+
+ public static String GenericPersistenceUnit2_0ConnectionComposite_sectionTitle;
+ public static String GenericPersistenceUnit2_0ConnectionComposite_sectionDescription;
+ public static String GenericPersistenceUnit2_0ConnectionTab_title;
+
+ public static String GenericPersistenceUnit2_0OptionsComposite_miscellaneousSectionTitle;
+ public static String GenericPersistenceUnit2_0OptionsComposite_miscellaneousSectionDescription;
+ public static String GenericPersistenceUnit2_0OptionsTab_title;
+ public static String GenericPersistenceUnit2_0OptionsTab_noName;
+
+ public static String JdbcConnectionPropertiesComposite_ConnectionDialog_Message;
+ public static String JdbcConnectionPropertiesComposite_ConnectionDialog_Title;
+
+ public static String JdbcConnectionPropertiesComposite_populateFromConnectionHyperLink;
+ public static String JdbcConnectionPropertiesComposite_driverLabel;
+ public static String JdbcConnectionPropertiesComposite_urlLabel;
+ public static String JdbcConnectionPropertiesComposite_userLabel;
+ public static String JdbcConnectionPropertiesComposite_passwordLabel;
+
+ public static String JdbcPropertiesComposite_JdbcConnectionProperties_GroupBox;
+
+ public static String LockingConfigurationComposite_lockTimeoutLabel;
+ public static String QueryConfigurationComposite_queryTimeoutLabel;
+
+ public static String TransactionTypeComposite_transactionTypeLabel;
+
+ public static String TransactionTypeComposite_jta;
+ public static String TransactionTypeComposite_resource_local;
+
+ public static String SharedCacheModeComposite_sharedCacheModeLabel;
+
+ public static String SharedCacheModeComposite_all;
+ public static String SharedCacheModeComposite_none;
+ public static String SharedCacheModeComposite_enable_selective;
+ public static String SharedCacheModeComposite_disable_selective;
+ public static String SharedCacheModeComposite_unspecified;
+
+ public static String ValidationModeComposite_validationModeLabel;
+
+ public static String ValidationModeComposite_auto;
+ public static String ValidationModeComposite_callback;
+ public static String ValidationModeComposite_none;
+
+ public static String ValidationConfigurationComposite_groupPrePersistLabel;
+ public static String ValidationConfigurationComposite_groupPreUpdateLabel;
+ public static String ValidationConfigurationComposite_groupPreRemoveLabel;
+
+
+ private static final String BUNDLE_NAME = "jpt_ui_persistence2_0"; //$NON-NLS-1$
+ private static final Class<?> BUNDLE_CLASS = JptUiPersistence2_0Messages.class;
+ static {
+ NLS.initializeMessages(BUNDLE_NAME, BUNDLE_CLASS);
+ }
+
+ private JptUiPersistence2_0Messages() {
+ throw new UnsupportedOperationException();
+ }
+
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/persistence/PersistenceXml2_0UiDefinition.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/persistence/PersistenceXml2_0UiDefinition.java
new file mode 100644
index 0000000000..c57412685f
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/persistence/PersistenceXml2_0UiDefinition.java
@@ -0,0 +1,55 @@
+/*******************************************************************************
+ * Copyright (c) 2009 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.ui.internal.jpa2.persistence;
+
+import org.eclipse.jpt.common.core.JptResourceType;
+import org.eclipse.jpt.jpa.core.JptJpaCorePlugin;
+import org.eclipse.jpt.jpa.ui.ResourceUiDefinition;
+import org.eclipse.jpt.jpa.ui.internal.persistence.details.AbstractPersistenceXmlResourceUiDefinition;
+import org.eclipse.jpt.jpa.ui.internal.persistence.details.PersistenceXmlUiFactory;
+import org.eclipse.jpt.jpa.ui.internal.structure.PersistenceResourceModelStructureProvider;
+import org.eclipse.jpt.jpa.ui.structure.JpaStructureProvider;
+
+public class PersistenceXml2_0UiDefinition extends AbstractPersistenceXmlResourceUiDefinition
+{
+ // singleton
+ private static final ResourceUiDefinition INSTANCE = new PersistenceXml2_0UiDefinition();
+
+
+ /**
+ * Return the singleton
+ */
+ public static ResourceUiDefinition instance() {
+ return INSTANCE;
+ }
+
+
+ /**
+ * Enforce singleton usage
+ */
+ private PersistenceXml2_0UiDefinition() {
+ super();
+ }
+
+
+ @Override
+ protected PersistenceXmlUiFactory buildPersistenceXmlUiFactory() {
+ return new Generic2_0PersistenceXmlUiFactory();
+ }
+
+ public boolean providesUi(JptResourceType resourceType) {
+ return resourceType.equals(JptJpaCorePlugin.PERSISTENCE_XML_2_0_RESOURCE_TYPE);
+ }
+
+ public JpaStructureProvider getStructureProvider() {
+ return PersistenceResourceModelStructureProvider.instance();
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/persistence/connection/ConnectionPropertiesComposite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/persistence/connection/ConnectionPropertiesComposite.java
new file mode 100644
index 0000000000..4e37630532
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/persistence/connection/ConnectionPropertiesComposite.java
@@ -0,0 +1,38 @@
+/*******************************************************************************
+* Copyright (c) 2009, 2010 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.ui.internal.jpa2.persistence.connection;
+
+import org.eclipse.jpt.common.ui.internal.widgets.Pane;
+import org.eclipse.jpt.jpa.core.jpa2.context.persistence.connection.JpaConnection2_0;
+import org.eclipse.jpt.jpa.ui.internal.jpa2.persistence.JptUiPersistence2_0Messages;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * ConnectionPropertiesComposite
+ */
+public class ConnectionPropertiesComposite extends Pane<JpaConnection2_0>
+{
+ public ConnectionPropertiesComposite(Pane<JpaConnection2_0> parentComposite, Composite parent) {
+
+ super(parentComposite, parent);
+ }
+
+ @Override
+ protected void initializeLayout(Composite container) {
+
+ container = addTitledGroup(
+ container,
+ JptUiPersistence2_0Messages.ConnectionPropertiesComposite_Database_GroupBox
+ );
+
+ new DataSourcePropertiesComposite(this, container);
+ new JdbcPropertiesComposite(this, container);
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/persistence/connection/DataSourcePropertiesComposite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/persistence/connection/DataSourcePropertiesComposite.java
new file mode 100644
index 0000000000..f35c3df2dc
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/persistence/connection/DataSourcePropertiesComposite.java
@@ -0,0 +1,142 @@
+/*******************************************************************************
+* Copyright (c) 2009, 2010 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.ui.internal.jpa2.persistence.connection;
+
+import org.eclipse.jpt.common.ui.internal.widgets.Pane;
+import org.eclipse.jpt.common.utility.internal.model.value.PropertyAspectAdapter;
+import org.eclipse.jpt.common.utility.internal.model.value.TransformationPropertyValueModel;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.common.utility.model.value.WritablePropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.persistence.PersistenceUnit;
+import org.eclipse.jpt.jpa.core.context.persistence.PersistenceUnitTransactionType;
+import org.eclipse.jpt.jpa.core.jpa2.context.persistence.connection.JpaConnection2_0;
+import org.eclipse.jpt.jpa.ui.internal.JpaHelpContextIds;
+import org.eclipse.jpt.jpa.ui.internal.jpa2.persistence.JptUiPersistence2_0Messages;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+
+/**
+ * DataSourcePropertiesComposite
+ */
+public class DataSourcePropertiesComposite extends Pane<JpaConnection2_0>
+{
+ /**
+ * Creates a new <code>DataSourcePropertiesComposite</code>.
+ *
+ * @param parentPane The parent container of this one
+ * @param parent The parent container
+ */
+ public DataSourcePropertiesComposite(Pane<JpaConnection2_0> parentComposite,
+ Composite parent) {
+
+ super(parentComposite, parent);
+ }
+
+ private WritablePropertyValueModel<String> buildJtaDataSourceHolder() {
+ return new PropertyAspectAdapter<PersistenceUnit, String>(this.buildPersistenceUnitHolder(), PersistenceUnit.JTA_DATA_SOURCE_PROPERTY) {
+ @Override
+ protected String buildValue_() {
+ return this.subject.getJtaDataSource();
+ }
+
+ @Override
+ protected void setValue_(String value) {
+ if (value.length() == 0) {
+ value = null;
+ }
+ this.subject.setJtaDataSource(value);
+ }
+ };
+ }
+
+ private PropertyValueModel<Boolean> buildJTADataSourceHolder() {
+ return new TransformationPropertyValueModel<PersistenceUnitTransactionType, Boolean>(buildTransactionTypeHolder()) {
+ @Override
+ protected Boolean transform(PersistenceUnitTransactionType value) {
+ return Boolean.valueOf(this.transform2(value));
+ }
+ private boolean transform2(PersistenceUnitTransactionType value) {
+ return value == null || value == PersistenceUnitTransactionType.JTA;
+ }
+ };
+ }
+
+ private WritablePropertyValueModel<String> buildNonJtaDataSourceHolder() {
+ return new PropertyAspectAdapter<PersistenceUnit, String>(buildPersistenceUnitHolder(), PersistenceUnit.NON_JTA_DATA_SOURCE_PROPERTY) {
+ @Override
+ protected String buildValue_() {
+ return this.subject.getNonJtaDataSource();
+ }
+
+ @Override
+ protected void setValue_(String value) {
+ if (value.length() == 0) {
+ value = null;
+ }
+ this.subject.setNonJtaDataSource(value);
+ }
+ };
+ }
+
+ private PropertyValueModel<Boolean> buildNonJTADataSourceHolder() {
+ return new TransformationPropertyValueModel<PersistenceUnitTransactionType, Boolean>(buildTransactionTypeHolder()) {
+ @Override
+ protected Boolean transform(PersistenceUnitTransactionType value) {
+ return Boolean.valueOf(value == PersistenceUnitTransactionType.RESOURCE_LOCAL);
+ }
+ };
+ }
+
+ private PropertyValueModel<PersistenceUnitTransactionType> buildTransactionTypeHolder() {
+ return new PropertyAspectAdapter<PersistenceUnit, PersistenceUnitTransactionType>(
+ buildPersistenceUnitHolder(),
+ PersistenceUnit.SPECIFIED_TRANSACTION_TYPE_PROPERTY,
+ PersistenceUnit.DEFAULT_TRANSACTION_TYPE_PROPERTY) {
+ @Override
+ protected PersistenceUnitTransactionType buildValue_() {
+ return this.subject.getTransactionType();
+ }
+ };
+ }
+
+ private PropertyValueModel<PersistenceUnit> buildPersistenceUnitHolder() {
+ return new PropertyAspectAdapter<JpaConnection2_0, PersistenceUnit>(getSubjectHolder()) {
+ @Override
+ protected PersistenceUnit buildValue_() {
+ return this.subject.getPersistenceUnit();
+ }
+ };
+ }
+
+ @Override
+ protected void initializeLayout(Composite container) {
+
+ int groupBoxMargin = this.getGroupBoxMargin();
+
+ container = this.addSubPane(container, 0, groupBoxMargin, 0, groupBoxMargin);
+
+ // JTA Data Source
+ PropertyValueModel<Boolean> jtaEnabled = this.buildJTADataSourceHolder();
+ Label jtaLabel = this.addLabel(container, JptUiPersistence2_0Messages.DataSourcePropertiesComposite_jtaDataSourceLabel, jtaEnabled);
+ Text jtaText = this.addText(container, this.buildJtaDataSourceHolder(), this.getHelpID(), jtaEnabled);
+ this.addLabeledComposite(container, jtaLabel, jtaText, this.getHelpID());
+
+ // Non-JTA Data Source
+ PropertyValueModel<Boolean> nonJTAEnabled = this.buildNonJTADataSourceHolder();
+ Label nonJtaLabel = this.addLabel(container, JptUiPersistence2_0Messages.DataSourcePropertiesComposite_nonJtaDataSourceLabel, nonJTAEnabled);
+ Text nonJtaText = this.addText(container, this.buildNonJtaDataSourceHolder(), this.getHelpID(), nonJTAEnabled);
+ this.addLabeledComposite(container, nonJtaLabel, nonJtaText, this.getHelpID());
+ }
+
+ public String getHelpID() {
+ return JpaHelpContextIds.PERSISTENCE_XML_CONNECTION; // TODO - Review for JPA 2.0
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/persistence/connection/GenericPersistenceUnit2_0ConnectionComposite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/persistence/connection/GenericPersistenceUnit2_0ConnectionComposite.java
new file mode 100644
index 0000000000..52ee14de9d
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/persistence/connection/GenericPersistenceUnit2_0ConnectionComposite.java
@@ -0,0 +1,49 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2010 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.ui.internal.jpa2.persistence.connection;
+
+import org.eclipse.jpt.common.ui.internal.widgets.Pane;
+import org.eclipse.jpt.jpa.core.jpa2.context.persistence.connection.JpaConnection2_0;
+import org.eclipse.jpt.jpa.ui.internal.jpa2.persistence.JptUiPersistence2_0Messages;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * GenericPersistenceUnit2_0ConnectionComposite
+ */
+public class GenericPersistenceUnit2_0ConnectionComposite extends Pane<JpaConnection2_0>
+{
+ public GenericPersistenceUnit2_0ConnectionComposite(
+ Pane<JpaConnection2_0> subjectHolder,
+ Composite container) {
+ super(subjectHolder, container, false);
+ }
+
+ @Override
+ protected void initializeLayout(Composite container) {
+
+ int groupBoxMargin = this.getGroupBoxMargin() * 2;
+
+ container = this.addSection(
+ container,
+ JptUiPersistence2_0Messages.GenericPersistenceUnit2_0ConnectionComposite_sectionTitle,
+ JptUiPersistence2_0Messages.GenericPersistenceUnit2_0ConnectionComposite_sectionDescription
+ );
+
+ Composite subPane = this.addSubPane(
+ container,
+ 0, groupBoxMargin, 10, groupBoxMargin
+ );
+
+ new TransactionTypeComposite(this, subPane);
+
+ new ConnectionPropertiesComposite(this, container);
+ }
+
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/persistence/connection/GenericPersistenceUnit2_0ConnectionTab.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/persistence/connection/GenericPersistenceUnit2_0ConnectionTab.java
new file mode 100644
index 0000000000..a90d91c496
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/persistence/connection/GenericPersistenceUnit2_0ConnectionTab.java
@@ -0,0 +1,90 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2010 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.ui.internal.jpa2.persistence.connection;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.ui.internal.widgets.Pane;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.jpa2.context.persistence.connection.JpaConnection2_0;
+import org.eclipse.jpt.jpa.ui.details.JpaPageComposite;
+import org.eclipse.jpt.jpa.ui.internal.JpaHelpContextIds;
+import org.eclipse.jpt.jpa.ui.internal.jpa2.persistence.JptUiPersistence2_0Messages;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * GenericPersistenceUnit2_0ConnectionTab
+ */
+public class GenericPersistenceUnit2_0ConnectionTab extends Pane<JpaConnection2_0>
+ implements JpaPageComposite
+{
+ // ********** constructors/initialization **********
+ /**
+ * Creates a new <code>GenericPersistenceUnit2_0ConnectionTab</code>.
+ *
+ * @param subjectHolder The holder of this pane's subject
+ * @param parent The parent container
+ * @param widgetFactory The factory used to create various common widgets
+ */
+ public GenericPersistenceUnit2_0ConnectionTab(
+ PropertyValueModel<JpaConnection2_0> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+
+ super(subjectHolder, parent, widgetFactory);
+ }
+
+ @Override
+ protected void initializeLayout(Composite container) {
+ new GenericPersistenceUnit2_0ConnectionComposite(this, container);
+ }
+
+ // ********** Layout **********
+ @Override
+ protected Composite addContainer(Composite parent) {
+ GridLayout layout = new GridLayout(1, true);
+ layout.marginHeight = 0;
+ layout.marginWidth = 0;
+ layout.marginTop = 0;
+ layout.marginLeft = 0;
+ layout.marginBottom = 0;
+ layout.marginRight = 0;
+ layout.verticalSpacing = 15;
+ Composite container = this.addPane(parent, layout);
+ updateGridData(container);
+ return container;
+ }
+
+ private void updateGridData(Composite container) {
+ GridData gridData = new GridData();
+ gridData.grabExcessHorizontalSpace = true;
+ gridData.grabExcessVerticalSpace = true;
+ gridData.horizontalAlignment = SWT.FILL;
+ gridData.verticalAlignment = SWT.FILL;
+ container.setLayoutData(gridData);
+ }
+
+ // ********** JpaPageComposite implementation **********
+
+ public String getHelpID() {
+ return JpaHelpContextIds.PERSISTENCE_XML_CONNECTION; // TODO - Review for JPA 2.0
+ }
+
+ public ImageDescriptor getPageImageDescriptor() {
+ return null;
+ }
+
+ public String getPageText() {
+ return JptUiPersistence2_0Messages.GenericPersistenceUnit2_0ConnectionTab_title;
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/persistence/connection/JdbcConnectionPropertiesComposite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/persistence/connection/JdbcConnectionPropertiesComposite.java
new file mode 100644
index 0000000000..3b59a85a61
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/persistence/connection/JdbcConnectionPropertiesComposite.java
@@ -0,0 +1,314 @@
+/*******************************************************************************
+* Copyright (c) 2009, 2010 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.ui.internal.jpa2.persistence.connection;
+
+import java.util.Comparator;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.jface.dialogs.IDialogSettings;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jpt.common.ui.internal.widgets.Pane;
+import org.eclipse.jpt.common.utility.internal.StringTools;
+import org.eclipse.jpt.common.utility.internal.model.value.PropertyAspectAdapter;
+import org.eclipse.jpt.common.utility.model.value.WritablePropertyValueModel;
+import org.eclipse.jpt.jpa.core.jpa2.context.persistence.connection.JpaConnection2_0;
+import org.eclipse.jpt.jpa.db.ConnectionProfile;
+import org.eclipse.jpt.jpa.db.ConnectionProfileFactory;
+import org.eclipse.jpt.jpa.db.JptJpaDbPlugin;
+import org.eclipse.jpt.jpa.ui.JptJpaUiPlugin;
+import org.eclipse.jpt.jpa.ui.internal.jpa2.persistence.JptUiPersistence2_0Messages;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.dialogs.FilteredItemsSelectionDialog;
+
+/**
+ * JdbcConnectionPropertiesComposite
+ */
+@SuppressWarnings("nls")
+public class JdbcConnectionPropertiesComposite extends Pane<JpaConnection2_0>
+{
+ /**
+ * The constant ID used to retrieve the dialog settings.
+ */
+ private static final String DIALOG_SETTINGS = "org.eclipse.jpt.jpa.ui.internal.jpa2.dialogs.ConnectionDialog";
+
+ public JdbcConnectionPropertiesComposite(Pane<JpaConnection2_0> parentComposite, Composite parent) {
+
+ super(parentComposite, parent);
+ }
+
+ private WritablePropertyValueModel<String> buildPasswordHolder() {
+ return new PropertyAspectAdapter<JpaConnection2_0, String>(this.getSubjectHolder(), JpaConnection2_0.PASSWORD_PROPERTY) {
+ @Override
+ protected String buildValue_() {
+ return this.subject.getPassword();
+ }
+
+ @Override
+ protected void setValue_(String value) {
+ if (value.length() == 0) {
+ value = null;
+ }
+ this.subject.setPassword(value);
+ }
+ };
+ }
+
+ private Runnable buildPopulateFromConnectionAction() {
+ return new Runnable() {
+ public void run() {
+ promptConnection();
+ }
+ };
+ }
+
+ private WritablePropertyValueModel<String> buildUrlHolder() {
+ return new PropertyAspectAdapter<JpaConnection2_0, String>(this.getSubjectHolder(), JpaConnection2_0.URL_PROPERTY) {
+ @Override
+ protected String buildValue_() {
+ return this.subject.getUrl();
+ }
+
+ @Override
+ protected void setValue_(String value) {
+ if (value.length() == 0) {
+ value = null;
+ }
+ this.subject.setUrl(value);
+ }
+ };
+ }
+
+ private WritablePropertyValueModel<String> buildUserHolder() {
+ return new PropertyAspectAdapter<JpaConnection2_0, String>(this.getSubjectHolder(), JpaConnection2_0.USER_PROPERTY) {
+ @Override
+ protected String buildValue_() {
+ return this.subject.getUser();
+ }
+
+ @Override
+ protected void setValue_(String value) {
+ if (value.length() == 0) {
+ value = null;
+ }
+ this.subject.setUser(value);
+ }
+ };
+ }
+
+ @Override
+ protected void initializeLayout(Composite container) {
+
+ // Populate from Connection hyperlink
+ this.addHyperlink(
+ container,
+ JptUiPersistence2_0Messages.JdbcConnectionPropertiesComposite_populateFromConnectionHyperLink,
+ this.buildPopulateFromConnectionAction()
+ );
+
+ // Driver
+ new JdbcDriverComposite(this, container);
+
+ // Url
+ this.addLabeledText(
+ container,
+ JptUiPersistence2_0Messages.JdbcConnectionPropertiesComposite_urlLabel,
+ this.buildUrlHolder()
+ );
+
+ // User
+ this.addLabeledText(
+ container,
+ JptUiPersistence2_0Messages.JdbcConnectionPropertiesComposite_userLabel,
+ this.buildUserHolder()
+ );
+
+ // Password
+ this.addLabeledPasswordText(
+ container,
+ JptUiPersistence2_0Messages.JdbcConnectionPropertiesComposite_passwordLabel,
+ this.buildPasswordHolder()
+ );
+ }
+
+ void promptConnection() {
+
+ ConnectionSelectionDialog dialog = new ConnectionSelectionDialog();
+
+ if (dialog.open() != IDialogConstants.OK_ID) {
+ return;
+ }
+
+ String name = (String) dialog.getResult()[0];
+ ConnectionProfile cp = this.getConnectionProfileFactory().buildConnectionProfile(name);
+
+ JpaConnection2_0 connection = getSubject();
+ connection.setUrl((cp == null) ? "" : cp.getURL());
+ connection.setUser((cp == null) ? "" : cp.getUserName());
+ connection.setPassword((cp == null) ? "" : cp.getUserPassword());
+ connection.setDriver((cp == null) ? "" : cp.getDriverClassName());
+ }
+
+ ConnectionProfileFactory getConnectionProfileFactory() {
+ // we allow the user to select any connection profile and simply
+ // take the settings from it (user, password, etc.) and give them
+ // to the persistence connection, so we go
+ // to the db plug-in directly to get the factory
+ return JptJpaDbPlugin.getConnectionProfileFactory();
+ }
+
+ // broaden access a bit
+ Shell getShell_() {
+ return this.getShell();
+ }
+
+ /**
+ * This dialog shows the list of possible connection names and lets the user
+ * the option to filter them using a search field.
+ */
+ protected class ConnectionSelectionDialog extends FilteredItemsSelectionDialog {
+
+ /**
+ * Creates a new <code>MappingSelectionDialog</code>.
+ */
+ protected ConnectionSelectionDialog() {
+ super(JdbcConnectionPropertiesComposite.this.getShell_(), false);
+ this.setMessage(JptUiPersistence2_0Messages.JdbcConnectionPropertiesComposite_ConnectionDialog_Message);
+ this.setTitle(JptUiPersistence2_0Messages.JdbcConnectionPropertiesComposite_ConnectionDialog_Title);
+ this.setListLabelProvider(this.buildLabelProvider());
+ this.setDetailsLabelProvider(this.buildLabelProvider());
+ }
+
+ protected ILabelProvider buildLabelProvider() {
+ return new LabelProvider() {
+ @Override
+ public Image getImage(Object element) {
+ return null;
+ }
+
+ @Override
+ public String getText(Object element) {
+ return (element == null) ? "" : element.toString();
+ }
+ };
+ }
+
+ @Override
+ protected Control createExtendedContentArea(Composite parent) {
+ return null;
+ }
+
+ @Override
+ protected ItemsFilter createFilter() {
+ return new ConnectionItemsFilter();
+ }
+
+ @Override
+ protected void fillContentProvider(AbstractContentProvider provider,
+ ItemsFilter itemsFilter,
+ IProgressMonitor monitor) throws CoreException {
+
+ monitor.beginTask(null, -1);
+
+ try {
+ // Add the connection names to the dialog
+ for (String name : this.getConnectionProfileNames()) {
+ provider.add(name, itemsFilter);
+ }
+ }
+ finally {
+ monitor.done();
+ }
+ }
+
+ private Iterable<String> getConnectionProfileNames() {
+ return JdbcConnectionPropertiesComposite.this.getConnectionProfileFactory().getConnectionProfileNames();
+ }
+
+ @Override
+ protected IDialogSettings getDialogSettings() {
+
+ IDialogSettings dialogSettings = JptJpaUiPlugin.instance().getDialogSettings();
+ IDialogSettings settings = dialogSettings.getSection(DIALOG_SETTINGS);
+
+ if (settings == null) {
+ settings = dialogSettings.addNewSection(DIALOG_SETTINGS);
+ }
+ return settings;
+ }
+
+ @Override
+ public String getElementName(Object object) {
+ return object.toString();
+ }
+
+ @Override
+ protected Comparator<String> getItemsComparator() {
+ return new Comparator<String>() {
+ public int compare(String item1, String item2) {
+ return item1.compareTo(item2);
+ }
+ };
+ }
+
+ @Override
+ protected IStatus validateItem(Object item) {
+
+ if (item == null) {
+ return new Status(IStatus.ERROR, JptJpaUiPlugin.PLUGIN_ID, IStatus.ERROR, "", null);
+ }
+ return Status.OK_STATUS;
+ }
+
+ /**
+ * Create the filter responsible to remove any connection name based on
+ * the pattern entered in the text field.
+ */
+ private class ConnectionItemsFilter extends ItemsFilter {
+
+ /**
+ * Creates a new <code>ConnectionItemsFilter</code>.
+ */
+ ConnectionItemsFilter() {
+
+ super();
+
+ // Make sure that if the pattern is empty, we specify * in order
+ // to show all the mapping types
+ if (StringTools.stringIsEmpty(getPattern())) {
+ patternMatcher.setPattern("*");
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ */
+ @Override
+ public boolean isConsistentItem(Object item) {
+ return true;
+ }
+
+ /*
+ * (non-Javadoc)
+ */
+ @Override
+ public boolean matchItem(Object item) {
+ return matches(item.toString());
+ }
+ }
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/persistence/connection/JdbcDriverComposite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/persistence/connection/JdbcDriverComposite.java
new file mode 100644
index 0000000000..cd1471328f
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/persistence/connection/JdbcDriverComposite.java
@@ -0,0 +1,94 @@
+/*******************************************************************************
+* Copyright (c) 2009, 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.ui.internal.jpa2.persistence.connection;
+
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jpt.common.ui.internal.widgets.ClassChooserPane;
+import org.eclipse.jpt.common.ui.internal.widgets.Pane;
+import org.eclipse.jpt.common.utility.internal.model.value.PropertyAspectAdapter;
+import org.eclipse.jpt.common.utility.model.value.WritablePropertyValueModel;
+import org.eclipse.jpt.jpa.core.jpa2.context.persistence.connection.JpaConnection2_0;
+import org.eclipse.jpt.jpa.ui.internal.jpa2.persistence.JptUiPersistence2_0Messages;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * JdbcDriverComposite
+ */
+public class JdbcDriverComposite extends Pane<JpaConnection2_0>
+{
+ /**
+ * Creates a new <code>JdbcDriverComposite</code>.
+ *
+ * @param parentPane The parent pane of this one
+ * @param parent The parent container
+ */
+ public JdbcDriverComposite(Pane<? extends JpaConnection2_0> parentPane,
+ Composite parent) {
+
+ super(parentPane, parent);
+ }
+
+ private ClassChooserPane<JpaConnection2_0> initializeClassChooser(Composite container) {
+
+ return new ClassChooserPane<JpaConnection2_0>(this, container) {
+
+ @Override
+ protected WritablePropertyValueModel<String> buildTextHolder() {
+ return new PropertyAspectAdapter<JpaConnection2_0, String>(
+ this.getSubjectHolder(), JpaConnection2_0.DRIVER_PROPERTY) {
+ @Override
+ protected String buildValue_() {
+ return this.subject.getDriver();
+ }
+
+ @Override
+ protected void setValue_(String value) {
+
+ if (value.length() == 0) {
+ value = null;
+ }
+ this.subject.setDriver(value);
+ }
+ };
+ }
+
+ @Override
+ protected String getClassName() {
+ return this.getSubject().getDriver();
+ }
+
+ @Override
+ protected String getLabelText() {
+ return JptUiPersistence2_0Messages.JdbcConnectionPropertiesComposite_driverLabel;
+ }
+
+ @Override
+ protected IJavaProject getJavaProject() {
+ return getSubject().getJpaProject().getJavaProject();
+ }
+
+ @Override
+ protected void setClassName(String className) {
+ this.getSubject().setDriver(className);
+ }
+
+ @Override
+ protected boolean allowTypeCreation() {
+ //Does not make sense to allow the user to create a new Driver class
+ return false;
+ }
+ };
+ }
+
+ @Override
+ protected void initializeLayout(Composite container) {
+ this.initializeClassChooser(container);
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/persistence/connection/JdbcPropertiesComposite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/persistence/connection/JdbcPropertiesComposite.java
new file mode 100644
index 0000000000..2ab54d50b5
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/persistence/connection/JdbcPropertiesComposite.java
@@ -0,0 +1,79 @@
+/*******************************************************************************
+* Copyright (c) 2009, 2010 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.ui.internal.jpa2.persistence.connection;
+
+import org.eclipse.jpt.common.ui.internal.util.PaneEnabler;
+import org.eclipse.jpt.common.ui.internal.widgets.Pane;
+import org.eclipse.jpt.common.utility.internal.model.value.PropertyAspectAdapter;
+import org.eclipse.jpt.common.utility.internal.model.value.TransformationPropertyValueModel;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.persistence.PersistenceUnit;
+import org.eclipse.jpt.jpa.core.context.persistence.PersistenceUnitTransactionType;
+import org.eclipse.jpt.jpa.core.jpa2.context.persistence.connection.JpaConnection2_0;
+import org.eclipse.jpt.jpa.ui.internal.jpa2.persistence.JptUiPersistence2_0Messages;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * JdbcPropertiesComposite
+ */
+public class JdbcPropertiesComposite extends Pane<JpaConnection2_0>
+{
+ public JdbcPropertiesComposite(Pane<JpaConnection2_0> parentComposite, Composite parent) {
+
+ super(parentComposite, parent);
+ }
+
+ private PropertyValueModel<Boolean> buildPaneEnablerHolder() {
+ return new TransformationPropertyValueModel<PersistenceUnitTransactionType, Boolean>(buildTransactionTypeHolder()) {
+ @Override
+ protected Boolean transform(PersistenceUnitTransactionType value) {
+ return value == PersistenceUnitTransactionType.RESOURCE_LOCAL;
+ }
+ };
+ }
+
+ private PropertyValueModel<PersistenceUnitTransactionType> buildTransactionTypeHolder() {
+ return new PropertyAspectAdapter<PersistenceUnit, PersistenceUnitTransactionType>(
+ buildPersistenceUnitHolder(),
+ PersistenceUnit.SPECIFIED_TRANSACTION_TYPE_PROPERTY,
+ PersistenceUnit.DEFAULT_TRANSACTION_TYPE_PROPERTY) {
+ @Override
+ protected PersistenceUnitTransactionType buildValue_() {
+ return this.subject.getTransactionType();
+ }
+ };
+ }
+
+ private PropertyValueModel<PersistenceUnit> buildPersistenceUnitHolder() {
+ return new PropertyAspectAdapter<JpaConnection2_0, PersistenceUnit>(getSubjectHolder()) {
+ @Override
+ protected PersistenceUnit buildValue_() {
+ return this.subject.getPersistenceUnit();
+ }
+ };
+ }
+
+ @Override
+ protected void initializeLayout(Composite container) {
+
+ container = addTitledGroup(
+ addSubPane(container, 10),
+ JptUiPersistence2_0Messages.JdbcPropertiesComposite_JdbcConnectionProperties_GroupBox
+ );
+
+ new JdbcConnectionPropertiesComposite(this, container);
+
+ this.installPaneEnabler();
+ }
+
+ private void installPaneEnabler() {
+ new PaneEnabler(buildPaneEnablerHolder(), this);
+ }
+} \ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/persistence/connection/TransactionTypeComposite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/persistence/connection/TransactionTypeComposite.java
new file mode 100644
index 0000000000..179a6e5d2d
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/persistence/connection/TransactionTypeComposite.java
@@ -0,0 +1,123 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2010 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.ui.internal.jpa2.persistence.connection;
+
+import java.util.Collection;
+
+import org.eclipse.jpt.common.ui.internal.widgets.EnumFormComboViewer;
+import org.eclipse.jpt.common.ui.internal.widgets.Pane;
+import org.eclipse.jpt.common.utility.internal.model.value.PropertyAspectAdapter;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.persistence.PersistenceUnit;
+import org.eclipse.jpt.jpa.core.context.persistence.PersistenceUnitTransactionType;
+import org.eclipse.jpt.jpa.core.jpa2.context.persistence.connection.JpaConnection2_0;
+import org.eclipse.jpt.jpa.ui.internal.JpaHelpContextIds;
+import org.eclipse.jpt.jpa.ui.internal.jpa2.persistence.JptUiPersistence2_0Messages;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * TransactionTypeComposite
+ */
+public class TransactionTypeComposite extends Pane<JpaConnection2_0>
+{
+ /**
+ * Creates a new <code>TransactionTypeComposite</code>.
+ *
+ * @param parentController
+ * The parent container of this one
+ * @param parent
+ * The parent container
+ */
+ public TransactionTypeComposite(
+ Pane<? extends JpaConnection2_0> parentComposite,
+ Composite parent) {
+
+ super( parentComposite, parent);
+ }
+
+ private EnumFormComboViewer<PersistenceUnit, PersistenceUnitTransactionType> buildTransactionTypeCombo(Composite container) {
+
+ return new EnumFormComboViewer<PersistenceUnit, PersistenceUnitTransactionType>(this,
+ this.buildPersistenceUnitHolder(),
+ container) {
+ @Override
+ protected void addPropertyNames(Collection<String> propertyNames) {
+ super.addPropertyNames(propertyNames);
+ propertyNames.add(PersistenceUnit.SPECIFIED_TRANSACTION_TYPE_PROPERTY);
+ propertyNames.add(PersistenceUnit.DEFAULT_TRANSACTION_TYPE_PROPERTY);
+ }
+
+ @Override
+ protected PersistenceUnitTransactionType[] getChoices() {
+ return PersistenceUnitTransactionType.values();
+ }
+
+ @Override
+ protected PersistenceUnitTransactionType getDefaultValue() {
+ return this.getSubject().getDefaultTransactionType();
+ }
+
+ @Override
+ protected String displayString(PersistenceUnitTransactionType value) {
+ return this.buildDisplayString(JptUiPersistence2_0Messages.class, TransactionTypeComposite.this, value);
+ }
+
+ @Override
+ protected PersistenceUnitTransactionType getValue() {
+ return this.getSubject().getSpecifiedTransactionType();
+ }
+
+ @Override
+ protected void setValue(PersistenceUnitTransactionType value) {
+ this.getSubject().setSpecifiedTransactionType(value);
+
+ if (value == PersistenceUnitTransactionType.RESOURCE_LOCAL) {
+ clearJTAProperties();
+ }
+ else {
+ clearResourceLocalProperties();
+ }
+ }
+ };
+ }
+
+ private PropertyValueModel<PersistenceUnit> buildPersistenceUnitHolder() {
+ return new PropertyAspectAdapter<JpaConnection2_0, PersistenceUnit>(this.getSubjectHolder()) {
+ @Override
+ protected PersistenceUnit buildValue_() {
+ return this.subject.getPersistenceUnit();
+ }
+ };
+ }
+
+ private void clearJTAProperties() {
+ this.getSubject().getPersistenceUnit().setJtaDataSource(null);
+ }
+
+ private void clearResourceLocalProperties() {
+ JpaConnection2_0 connection = this.getSubject();
+ connection.getPersistenceUnit().setNonJtaDataSource(null);
+ connection.setDriver(null);
+ connection.setUrl(null);
+ connection.setUser(null);
+ connection.setPassword(null);
+ }
+
+ @Override
+ protected void initializeLayout( Composite container) {
+
+ this.addLabeledComposite(
+ container,
+ JptUiPersistence2_0Messages.TransactionTypeComposite_transactionTypeLabel,
+ this.buildTransactionTypeCombo( container),
+ JpaHelpContextIds.PERSISTENCE_XML_CONNECTION // TODO - Review for JPA 2.0
+ );
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/persistence/options/GenericPersistenceUnit2_0OptionsComposite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/persistence/options/GenericPersistenceUnit2_0OptionsComposite.java
new file mode 100644
index 0000000000..dc2b64a91d
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/persistence/options/GenericPersistenceUnit2_0OptionsComposite.java
@@ -0,0 +1,63 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2010 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.ui.internal.jpa2.persistence.options;
+
+import org.eclipse.jpt.common.ui.internal.widgets.Pane;
+import org.eclipse.jpt.jpa.core.jpa2.context.persistence.options.JpaOptions2_0;
+import org.eclipse.jpt.jpa.ui.internal.jpa2.persistence.JptUiPersistence2_0Messages;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * GenericPersistenceUnit2_0OptionsComposite
+ */
+public class GenericPersistenceUnit2_0OptionsComposite extends Pane<JpaOptions2_0>
+{
+ public GenericPersistenceUnit2_0OptionsComposite(
+ Pane<JpaOptions2_0> subjectHolder,
+ Composite parent) {
+
+ super(subjectHolder, parent, false);
+ }
+
+ @Override
+ protected void initializeLayout(Composite parent) {
+ this.initializeMiscellaneousPane(parent);
+ }
+
+ private void initializeMiscellaneousPane(Composite container) {
+
+ this.updateGridData(container);
+ this.updateGridData(container.getParent());
+
+ Composite composite = this.addSection(container,
+ JptUiPersistence2_0Messages.GenericPersistenceUnit2_0OptionsComposite_miscellaneousSectionTitle,
+ JptUiPersistence2_0Messages.GenericPersistenceUnit2_0OptionsComposite_miscellaneousSectionDescription);
+
+ this.updateGridData(composite);
+ this.updateGridData(composite.getParent());
+
+ new LockingConfigurationComposite(this, composite);
+ new QueryConfigurationComposite(this, composite);
+ new ValidationConfigurationComposite(this, composite);
+
+ }
+
+ private void updateGridData(Composite container) {
+ GridData gridData = new GridData();
+ gridData.grabExcessHorizontalSpace = true;
+ gridData.grabExcessVerticalSpace = true;
+ gridData.horizontalAlignment = SWT.FILL;
+ gridData.verticalAlignment = SWT.FILL;
+ container.setLayoutData(gridData);
+ }
+
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/persistence/options/GenericPersistenceUnit2_0OptionsTab.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/persistence/options/GenericPersistenceUnit2_0OptionsTab.java
new file mode 100644
index 0000000000..955837017c
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/persistence/options/GenericPersistenceUnit2_0OptionsTab.java
@@ -0,0 +1,90 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2010 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.ui.internal.jpa2.persistence.options;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.ui.internal.widgets.Pane;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.jpa2.context.persistence.options.JpaOptions2_0;
+import org.eclipse.jpt.jpa.ui.details.JpaPageComposite;
+import org.eclipse.jpt.jpa.ui.internal.jpa2.persistence.JptUiPersistence2_0Messages;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * GenericPersistenceUnit2_0OptionsTab
+ */
+public class GenericPersistenceUnit2_0OptionsTab extends Pane<JpaOptions2_0>
+ implements JpaPageComposite
+{
+ // ********** constructors/initialization **********
+ /**
+ * Creates a new <code>GenericPersistenceUnit2_0OptionsTab</code>.
+ *
+ * @param subjectHolder The holder of this pane's subject
+ * @param parent The parent container
+ * @param widgetFactory The factory used to create various common widgets
+ */
+ public GenericPersistenceUnit2_0OptionsTab(
+ PropertyValueModel<JpaOptions2_0> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+
+ super(subjectHolder, parent, widgetFactory);
+ }
+
+ @Override
+ protected void initializeLayout(Composite parent) {
+ new GenericPersistenceUnit2_0OptionsComposite(this, parent);
+
+ }
+
+ // ********** Layout **********
+ @Override
+ protected Composite addContainer(Composite parent) {
+ GridLayout layout = new GridLayout(1, true);
+ layout.marginHeight = 0;
+ layout.marginWidth = 0;
+ layout.marginTop = 0;
+ layout.marginLeft = 0;
+ layout.marginBottom = 0;
+ layout.marginRight = 0;
+ layout.verticalSpacing = 15;
+ Composite container = this.addPane(parent, layout);
+ updateGridData(container);
+ return container;
+ }
+
+ private void updateGridData(Composite container) {
+ GridData gridData = new GridData();
+ gridData.grabExcessHorizontalSpace = true;
+ gridData.grabExcessVerticalSpace = true;
+ gridData.horizontalAlignment = SWT.FILL;
+ gridData.verticalAlignment = SWT.FILL;
+ container.setLayoutData(gridData);
+ }
+
+ // ********** JpaPageComposite implementation **********
+
+ public String getHelpID() {
+ return null; // TODO - Review for JPA 2.0
+ }
+
+ public ImageDescriptor getPageImageDescriptor() {
+ return null;
+ }
+
+ public String getPageText() {
+ return JptUiPersistence2_0Messages.GenericPersistenceUnit2_0OptionsTab_title;
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/persistence/options/LockingConfigurationComposite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/persistence/options/LockingConfigurationComposite.java
new file mode 100644
index 0000000000..afc52a4de8
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/persistence/options/LockingConfigurationComposite.java
@@ -0,0 +1,85 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2010 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.ui.internal.jpa2.persistence.options;
+
+import org.eclipse.jpt.common.ui.internal.widgets.IntegerCombo;
+import org.eclipse.jpt.common.ui.internal.widgets.Pane;
+import org.eclipse.jpt.common.utility.internal.model.value.PropertyAspectAdapter;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.common.utility.model.value.WritablePropertyValueModel;
+import org.eclipse.jpt.jpa.core.jpa2.context.persistence.options.JpaOptions2_0;
+import org.eclipse.jpt.jpa.ui.internal.jpa2.persistence.JptUiPersistence2_0Messages;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * LockingConfigurationComposite
+ */
+public class LockingConfigurationComposite extends Pane<JpaOptions2_0>
+{
+ /**
+ * Creates a new <code>LockingConfigurationComposite</code>.
+ *
+ * @param parentController
+ * The parent container of this one
+ * @param parent
+ * The parent container
+ */
+ public LockingConfigurationComposite(
+ Pane<? extends JpaOptions2_0> parentComposite,
+ Composite parent) {
+
+ super(parentComposite, parent);
+ }
+
+ @Override
+ protected void initializeLayout(Composite parent) {
+ this.addLockTimeoutCombo(parent);
+ }
+
+ private void addLockTimeoutCombo(Composite parent) {
+ new IntegerCombo<JpaOptions2_0>(this, parent) {
+
+ @Override
+ protected String getLabelText() {
+ return JptUiPersistence2_0Messages.LockingConfigurationComposite_lockTimeoutLabel;
+ }
+
+ @Override
+ protected String getHelpId() {
+ return null; // TODO
+ }
+
+ @Override
+ protected PropertyValueModel<Integer> buildDefaultHolder() {
+ return new PropertyAspectAdapter<JpaOptions2_0, Integer>(this.getSubjectHolder()) {
+ @Override
+ protected Integer buildValue_() {
+ return this.subject.getDefaultLockTimeout();
+ }
+ };
+ }
+
+ @Override
+ protected WritablePropertyValueModel<Integer> buildSelectedItemHolder() {
+ return new PropertyAspectAdapter<JpaOptions2_0, Integer>(this.getSubjectHolder(), JpaOptions2_0.LOCK_TIMEOUT_PROPERTY) {
+ @Override
+ protected Integer buildValue_() {
+ return this.subject.getLockTimeout();
+ }
+
+ @Override
+ protected void setValue_(Integer value) {
+ this.subject.setLockTimeout(value);
+ }
+ };
+ }
+ };
+ }
+} \ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/persistence/options/QueryConfigurationComposite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/persistence/options/QueryConfigurationComposite.java
new file mode 100644
index 0000000000..2707d978ed
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/persistence/options/QueryConfigurationComposite.java
@@ -0,0 +1,85 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2010 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.ui.internal.jpa2.persistence.options;
+
+import org.eclipse.jpt.common.ui.internal.widgets.IntegerCombo;
+import org.eclipse.jpt.common.ui.internal.widgets.Pane;
+import org.eclipse.jpt.common.utility.internal.model.value.PropertyAspectAdapter;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.common.utility.model.value.WritablePropertyValueModel;
+import org.eclipse.jpt.jpa.core.jpa2.context.persistence.options.JpaOptions2_0;
+import org.eclipse.jpt.jpa.ui.internal.jpa2.persistence.JptUiPersistence2_0Messages;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * QueryConfigurationComposite
+ */
+public class QueryConfigurationComposite extends Pane<JpaOptions2_0>
+{
+ /**
+ * Creates a new <code>QueryConfigurationComposite</code>.
+ *
+ * @param parentController
+ * The parent container of this one
+ * @param parent
+ * The parent container
+ */
+ public QueryConfigurationComposite(
+ Pane<? extends JpaOptions2_0> parentComposite,
+ Composite parent) {
+
+ super(parentComposite, parent);
+ }
+
+ @Override
+ protected void initializeLayout(Composite parent) {
+ this.addQueryTimeoutCombo(parent);
+ }
+
+ private void addQueryTimeoutCombo(Composite parent) {
+ new IntegerCombo<JpaOptions2_0>(this, parent) {
+
+ @Override
+ protected String getLabelText() {
+ return JptUiPersistence2_0Messages.QueryConfigurationComposite_queryTimeoutLabel;
+ }
+
+ @Override
+ protected String getHelpId() {
+ return null; // TODO
+ }
+
+ @Override
+ protected PropertyValueModel<Integer> buildDefaultHolder() {
+ return new PropertyAspectAdapter<JpaOptions2_0, Integer>(this.getSubjectHolder()) {
+ @Override
+ protected Integer buildValue_() {
+ return this.subject.getDefaultQueryTimeout();
+ }
+ };
+ }
+
+ @Override
+ protected WritablePropertyValueModel<Integer> buildSelectedItemHolder() {
+ return new PropertyAspectAdapter<JpaOptions2_0, Integer>(this.getSubjectHolder(), JpaOptions2_0.QUERY_TIMEOUT_PROPERTY) {
+ @Override
+ protected Integer buildValue_() {
+ return this.subject.getQueryTimeout();
+ }
+
+ @Override
+ protected void setValue_(Integer value) {
+ this.subject.setQueryTimeout(value);
+ }
+ };
+ }
+ };
+ }
+} \ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/persistence/options/SharedCacheModeComposite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/persistence/options/SharedCacheModeComposite.java
new file mode 100644
index 0000000000..575b731e44
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/persistence/options/SharedCacheModeComposite.java
@@ -0,0 +1,94 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2010 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.ui.internal.jpa2.persistence.options;
+
+import java.util.Collection;
+
+import org.eclipse.jpt.common.ui.internal.widgets.EnumFormComboViewer;
+import org.eclipse.jpt.common.ui.internal.widgets.Pane;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.jpa2.context.persistence.PersistenceUnit2_0;
+import org.eclipse.jpt.jpa.core.jpa2.context.persistence.options.SharedCacheMode;
+import org.eclipse.jpt.jpa.ui.internal.jpa2.persistence.JptUiPersistence2_0Messages;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * SharedCacheModeComposite
+ */
+public class SharedCacheModeComposite extends Pane<PersistenceUnit2_0>
+{
+ /**
+ * Creates a new <code>SharedCacheModeComposite</code>.
+ *
+ * @param parentController
+ * The parent container of this one
+ * @param parent
+ * The parent container
+ */
+ public SharedCacheModeComposite(
+ Pane<?> parentPane,
+ PropertyValueModel<? extends PersistenceUnit2_0> subjectHolder,
+ Composite parent) {
+
+ super(parentPane, subjectHolder, parent);
+ }
+
+ @Override
+ protected void initializeLayout(Composite parent) {
+
+ this.addLabeledComposite(
+ parent,
+ JptUiPersistence2_0Messages.SharedCacheModeComposite_sharedCacheModeLabel,
+ this.addSharedCacheModeCombo(parent),
+ null // TODO
+ );
+ }
+
+ private EnumFormComboViewer<PersistenceUnit2_0, SharedCacheMode> addSharedCacheModeCombo(Composite parent) {
+
+ return new EnumFormComboViewer<PersistenceUnit2_0, SharedCacheMode>(this, this.getSubjectHolder(), parent) {
+ @Override
+ protected void addPropertyNames(Collection<String> propertyNames) {
+ super.addPropertyNames(propertyNames);
+ propertyNames.add(PersistenceUnit2_0.SPECIFIED_SHARED_CACHE_MODE_PROPERTY);
+ }
+
+ @Override
+ protected SharedCacheMode[] getChoices() {
+ return SharedCacheMode.values();
+ }
+
+ @Override
+ protected boolean sortChoices() {
+ return false;
+ }
+
+ @Override
+ protected SharedCacheMode getDefaultValue() {
+ return this.getSubject().getDefaultSharedCacheMode();
+ }
+
+ @Override
+ protected String displayString(SharedCacheMode value) {
+ return this.buildDisplayString(JptUiPersistence2_0Messages.class, SharedCacheModeComposite.this, value);
+ }
+
+ @Override
+ protected SharedCacheMode getValue() {
+ return this.getSubject().getSpecifiedSharedCacheMode();
+ }
+
+ @Override
+ protected void setValue(SharedCacheMode value) {
+ this.getSubject().setSpecifiedSharedCacheMode(value);
+ }
+ };
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/persistence/options/ValidationConfigurationComposite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/persistence/options/ValidationConfigurationComposite.java
new file mode 100644
index 0000000000..f6f6fce40f
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/persistence/options/ValidationConfigurationComposite.java
@@ -0,0 +1,385 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2010 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.ui.internal.jpa2.persistence.options;
+
+import java.util.ListIterator;
+
+import org.eclipse.jdt.core.IJavaElement;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.jdt.core.search.IJavaSearchScope;
+import org.eclipse.jdt.core.search.SearchEngine;
+import org.eclipse.jdt.ui.IJavaElementSearchConstants;
+import org.eclipse.jdt.ui.JavaUI;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.window.Window;
+import org.eclipse.jpt.common.ui.internal.JptCommonUiMessages;
+import org.eclipse.jpt.common.ui.internal.widgets.AddRemoveListPane;
+import org.eclipse.jpt.common.ui.internal.widgets.Pane;
+import org.eclipse.jpt.common.ui.internal.widgets.AddRemovePane.Adapter;
+import org.eclipse.jpt.common.utility.internal.model.value.ListAspectAdapter;
+import org.eclipse.jpt.common.utility.internal.model.value.PropertyAspectAdapter;
+import org.eclipse.jpt.common.utility.internal.model.value.SimplePropertyValueModel;
+import org.eclipse.jpt.common.utility.internal.model.value.swing.ObjectListSelectionModel;
+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.core.jpa2.context.persistence.PersistenceUnit2_0;
+import org.eclipse.jpt.jpa.core.jpa2.context.persistence.options.JpaOptions2_0;
+import org.eclipse.jpt.jpa.ui.JptJpaUiPlugin;
+import org.eclipse.jpt.jpa.ui.internal.jpa2.persistence.JptUiPersistence2_0Messages;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.dialogs.SelectionDialog;
+import org.eclipse.ui.progress.IProgressService;
+
+/**
+ * ValidationConfigurationComposite
+ */
+public class ValidationConfigurationComposite extends Pane<JpaOptions2_0>
+{
+ /**
+ * Creates a new <code>ValidationGroupComposite</code>.
+ *
+ * @param parentController
+ * The parent container of this one
+ * @param parent
+ * The parent container
+ */
+ public ValidationConfigurationComposite(
+ Pane<? extends JpaOptions2_0> parentComposite,
+ Composite parent) {
+
+ super(parentComposite, parent);
+ }
+
+ @Override
+ protected void initializeLayout(Composite parent) {
+
+ // SharedCacheMode
+ new SharedCacheModeComposite(this, this.buildPersistenceUnit2_0Holder(), parent);
+
+ // ValidationMode
+ new ValidationModeComposite(this, this.buildPersistenceUnit2_0Holder(), parent);
+
+ // ValidationGroupPrePersist
+ this.addGroupPrePersistListPane(parent);
+
+ // ValidationGroupPreUpdate
+ this.addGroupPreUpdateListPane(parent);
+
+ // ValidationGroupPreRemove
+ this.addGroupPreRemoveListPane(parent);
+ }
+
+ // ********** ValidationGroupPrePersists **********
+
+ private void addGroupPrePersistListPane(Composite parent) {
+
+ this.addLabeledComposite(parent,
+ JptUiPersistence2_0Messages.ValidationConfigurationComposite_groupPrePersistLabel,
+ this.addPrePersistListPane(parent),
+ null // TODO Help
+ );
+ }
+
+ private AddRemoveListPane<JpaOptions2_0> addPrePersistListPane(Composite parent) {
+
+ // List pane
+ AddRemoveListPane<JpaOptions2_0> listPane = new AddRemoveListPane<JpaOptions2_0>(
+ this,
+ parent,
+ this.buildPrePersistAdapter(),
+ this.buildPrePersistListHolder(),
+ this.buildSelectedItemHolder(),
+ this.buildLabelProvider()
+ )
+ {
+ @Override
+ protected void initializeTable(Table table) {
+ super.initializeTable(table);
+
+ Composite container = table.getParent();
+ GridData gridData = (GridData) container.getLayoutData();
+ gridData.heightHint = 75;
+ }
+ };
+ return listPane;
+ }
+
+ private Adapter buildPrePersistAdapter() {
+ return new AddRemoveListPane.AbstractAdapter() {
+ public void addNewItem(ObjectListSelectionModel listSelectionModel) {
+ addPrePersistClass(listSelectionModel);
+ }
+
+ public void removeSelectedItems(ObjectListSelectionModel listSelectionModel) {
+ for (Object item : listSelectionModel.selectedValues()) {
+ getSubject().removeValidationGroupPrePersist((String) item);
+ }
+ }
+ };
+ }
+
+ private ListValueModel<String> buildPrePersistListHolder() {
+ return new ListAspectAdapter<JpaOptions2_0, String>(getSubjectHolder(), JpaOptions2_0.VALIDATION_GROUP_PRE_PERSIST_LIST) {
+ @Override
+ protected ListIterator<String> listIterator_() {
+ return subject.validationGroupPrePersists();
+ }
+
+ @Override
+ protected int size_() {
+ return subject.validationGroupPrePersistsSize();
+ }
+ };
+ }
+
+ private void addPrePersistClass(ObjectListSelectionModel listSelectionModel) {
+
+ IType type = this.chooseType();
+
+ if (type != null) {
+ String className = type.getFullyQualifiedName('$');
+ if( ! this.getSubject().validationGroupPrePersistExists(className)) {
+
+ String classRef = this.getSubject().addValidationGroupPrePersist(className);
+ listSelectionModel.setSelectedValue(classRef);
+ }
+ }
+ }
+
+ // ********** ValidationGroupPreUpdates **********
+
+ private void addGroupPreUpdateListPane(Composite parent) {
+
+ this.addLabeledComposite(parent,
+ JptUiPersistence2_0Messages.ValidationConfigurationComposite_groupPreUpdateLabel,
+ this.addPreUpdateListPane(parent),
+ null // TODO Help
+ );
+ }
+
+ private AddRemoveListPane<JpaOptions2_0> addPreUpdateListPane(Composite parent) {
+
+ // List pane
+ AddRemoveListPane<JpaOptions2_0> listPane = new AddRemoveListPane<JpaOptions2_0>(
+ this,
+ parent,
+ this.buildPreUpdateAdapter(),
+ this.buildPreUpdateListHolder(),
+ this.buildSelectedItemHolder(),
+ this.buildLabelProvider()
+ )
+ {
+ @Override
+ protected void initializeTable(Table table) {
+ super.initializeTable(table);
+
+ Composite container = table.getParent();
+ GridData gridData = (GridData) container.getLayoutData();
+ gridData.heightHint = 75;
+ }
+ };
+ return listPane;
+ }
+
+ private Adapter buildPreUpdateAdapter() {
+ return new AddRemoveListPane.AbstractAdapter() {
+ public void addNewItem(ObjectListSelectionModel listSelectionModel) {
+ addPreUpdateClass(listSelectionModel);
+ }
+
+ public void removeSelectedItems(ObjectListSelectionModel listSelectionModel) {
+ for (Object item : listSelectionModel.selectedValues()) {
+ getSubject().removeValidationGroupPreUpdate((String) item);
+ }
+ }
+ };
+ }
+
+ private ListValueModel<String> buildPreUpdateListHolder() {
+ return new ListAspectAdapter<JpaOptions2_0, String>(getSubjectHolder(), JpaOptions2_0.VALIDATION_GROUP_PRE_UPDATE_LIST) {
+ @Override
+ protected ListIterator<String> listIterator_() {
+ return subject.validationGroupPreUpdates();
+ }
+
+ @Override
+ protected int size_() {
+ return subject.validationGroupPreUpdatesSize();
+ }
+ };
+ }
+
+ private void addPreUpdateClass(ObjectListSelectionModel listSelectionModel) {
+
+ IType type = this.chooseType();
+
+ if (type != null) {
+ String className = type.getFullyQualifiedName('$');
+ if( ! this.getSubject().validationGroupPreUpdateExists(className)) {
+
+ String classRef = this.getSubject().addValidationGroupPreUpdate(className);
+ listSelectionModel.setSelectedValue(classRef);
+ }
+ }
+ }
+
+ // ********** ValidationGroupPreRemoves **********
+
+ private void addGroupPreRemoveListPane(Composite parent) {
+
+ this.addLabeledComposite(parent,
+ JptUiPersistence2_0Messages.ValidationConfigurationComposite_groupPreRemoveLabel,
+ this.addPreRemoveListPane(parent),
+ null // TODO Help
+ );
+ }
+
+ private AddRemoveListPane<JpaOptions2_0> addPreRemoveListPane(Composite parent) {
+
+ // List pane
+ AddRemoveListPane<JpaOptions2_0> listPane = new AddRemoveListPane<JpaOptions2_0>(
+ this,
+ parent,
+ this.buildPreRemoveAdapter(),
+ this.buildPreRemoveListHolder(),
+ this.buildSelectedItemHolder(),
+ this.buildLabelProvider()
+ )
+ {
+ @Override
+ protected void initializeTable(Table table) {
+ super.initializeTable(table);
+
+ Composite container = table.getParent();
+ GridData gridData = (GridData) container.getLayoutData();
+ gridData.heightHint = 75;
+ }
+ };
+ return listPane;
+ }
+
+ private Adapter buildPreRemoveAdapter() {
+ return new AddRemoveListPane.AbstractAdapter() {
+ public void addNewItem(ObjectListSelectionModel listSelectionModel) {
+ addPreRemoveClass(listSelectionModel);
+ }
+
+ public void removeSelectedItems(ObjectListSelectionModel listSelectionModel) {
+ for (Object item : listSelectionModel.selectedValues()) {
+ getSubject().removeValidationGroupPreRemove((String) item);
+ }
+ }
+ };
+ }
+
+ private ListValueModel<String> buildPreRemoveListHolder() {
+ return new ListAspectAdapter<JpaOptions2_0, String>(getSubjectHolder(), JpaOptions2_0.VALIDATION_GROUP_PRE_REMOVE_LIST) {
+ @Override
+ protected ListIterator<String> listIterator_() {
+ return subject.validationGroupPreRemoves();
+ }
+
+ @Override
+ protected int size_() {
+ return subject.validationGroupPreRemovesSize();
+ }
+ };
+ }
+
+ private void addPreRemoveClass(ObjectListSelectionModel listSelectionModel) {
+
+ IType type = this.chooseType();
+
+ if (type != null) {
+ String className = type.getFullyQualifiedName('$');
+ if( ! this.getSubject().validationGroupPreRemoveExists(className)) {
+
+ String classRef = this.getSubject().addValidationGroupPreRemove(className);
+ listSelectionModel.setSelectedValue(classRef);
+ }
+ }
+ }
+
+
+ // ********** Private methods **********
+
+ private PropertyValueModel<PersistenceUnit2_0> buildPersistenceUnit2_0Holder() {
+ return new PropertyAspectAdapter<JpaOptions2_0, PersistenceUnit2_0>(this.getSubjectHolder()) {
+ @Override
+ protected PersistenceUnit2_0 buildValue_() {
+ return (PersistenceUnit2_0) this.subject.getPersistenceUnit();
+ }
+ };
+ }
+
+ private ILabelProvider buildLabelProvider() {
+ return new LabelProvider() {
+
+ @Override
+ public String getText(Object element) {
+ String name = (String) element;
+
+ if (name == null) {
+ name = JptUiPersistence2_0Messages.GenericPersistenceUnit2_0OptionsTab_noName;
+ }
+ return name;
+ }
+ };
+ }
+
+ /**
+ * Prompts the user the Open Type dialog.
+ *
+ * @return Either the selected type or <code>null</code> if the user
+ * canceled the dialog
+ */
+ private IType chooseType() {
+ IJavaProject javaProject = this.getSubject().getJpaProject().getJavaProject();
+ IJavaElement[] elements = new IJavaElement[] { javaProject };
+ IJavaSearchScope scope = SearchEngine.createJavaSearchScope(elements);
+ IProgressService service = PlatformUI.getWorkbench().getProgressService();
+ SelectionDialog typeSelectionDialog;
+
+ try {
+ typeSelectionDialog = JavaUI.createTypeDialog(
+ getShell(),
+ service,
+ scope,
+ IJavaElementSearchConstants.CONSIDER_CLASSES,
+ false,
+ ""
+ );
+ }
+ catch (JavaModelException e) {
+ JptJpaUiPlugin.log(e);
+ return null;
+ }
+
+ typeSelectionDialog.setTitle(JptCommonUiMessages.ClassChooserPane_dialogTitle);
+ typeSelectionDialog.setMessage(JptCommonUiMessages.ClassChooserPane_dialogMessage);
+
+ if (typeSelectionDialog.open() == Window.OK) {
+ return (IType) typeSelectionDialog.getResult()[0];
+ }
+
+ return null;
+ }
+
+ private WritablePropertyValueModel<String> buildSelectedItemHolder() {
+ return new SimplePropertyValueModel<String>();
+ }
+} \ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/persistence/options/ValidationModeComposite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/persistence/options/ValidationModeComposite.java
new file mode 100644
index 0000000000..c7df80240c
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/persistence/options/ValidationModeComposite.java
@@ -0,0 +1,94 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2010 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.ui.internal.jpa2.persistence.options;
+
+import java.util.Collection;
+
+import org.eclipse.jpt.common.ui.internal.widgets.EnumFormComboViewer;
+import org.eclipse.jpt.common.ui.internal.widgets.Pane;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.jpa2.context.persistence.PersistenceUnit2_0;
+import org.eclipse.jpt.jpa.core.jpa2.context.persistence.options.ValidationMode;
+import org.eclipse.jpt.jpa.ui.internal.jpa2.persistence.JptUiPersistence2_0Messages;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * ValidationModeComposite
+ */
+public class ValidationModeComposite extends Pane<PersistenceUnit2_0>
+{
+ /**
+ * Creates a new <code>ValidationModeComposite</code>.
+ *
+ * @param parentController
+ * The parent container of this one
+ * @param parent
+ * The parent container
+ */
+ public ValidationModeComposite(
+ Pane<?> parentPane,
+ PropertyValueModel<? extends PersistenceUnit2_0> subjectHolder,
+ Composite parent) {
+
+ super(parentPane, subjectHolder, parent);
+ }
+
+ @Override
+ protected void initializeLayout(Composite parent) {
+
+ this.addLabeledComposite(
+ parent,
+ JptUiPersistence2_0Messages.ValidationModeComposite_validationModeLabel,
+ this.addValidationModeCombo(parent),
+ null // TODO
+ );
+ }
+
+ private EnumFormComboViewer<PersistenceUnit2_0, ValidationMode> addValidationModeCombo(Composite parent) {
+
+ return new EnumFormComboViewer<PersistenceUnit2_0, ValidationMode>(this, this.getSubjectHolder(), parent) {
+ @Override
+ protected void addPropertyNames(Collection<String> propertyNames) {
+ super.addPropertyNames(propertyNames);
+ propertyNames.add(PersistenceUnit2_0.SPECIFIED_VALIDATION_MODE_PROPERTY);
+ }
+
+ @Override
+ protected ValidationMode[] getChoices() {
+ return ValidationMode.values();
+ }
+
+ @Override
+ protected boolean sortChoices() {
+ return false;
+ }
+
+ @Override
+ protected ValidationMode getDefaultValue() {
+ return this.getSubject().getDefaultValidationMode();
+ }
+
+ @Override
+ protected String displayString(ValidationMode value) {
+ return this.buildDisplayString(JptUiPersistence2_0Messages.class, ValidationModeComposite.this, value);
+ }
+
+ @Override
+ protected ValidationMode getValue() {
+ return this.getSubject().getSpecifiedValidationMode();
+ }
+
+ @Override
+ protected void setValue(ValidationMode value) {
+ this.getSubject().setSpecifiedValidationMode(value);
+ }
+ };
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/platform/generic/Generic2_0JpaPlatformUiFactory.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/platform/generic/Generic2_0JpaPlatformUiFactory.java
new file mode 100644
index 0000000000..c18b25f18c
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/platform/generic/Generic2_0JpaPlatformUiFactory.java
@@ -0,0 +1,34 @@
+/*******************************************************************************
+ * Copyright (c) 2009 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.ui.internal.jpa2.platform.generic;
+
+import org.eclipse.jpt.jpa.ui.JpaPlatformUi;
+import org.eclipse.jpt.jpa.ui.JpaPlatformUiFactory;
+import org.eclipse.jpt.jpa.ui.internal.jpa2.Generic2_0JpaPlatformUiProvider;
+import org.eclipse.jpt.jpa.ui.internal.platform.generic.GenericJpaPlatformUi;
+import org.eclipse.jpt.jpa.ui.internal.platform.generic.GenericNavigatorProvider;
+
+public class Generic2_0JpaPlatformUiFactory implements JpaPlatformUiFactory
+{
+
+ /**
+ * Zero arg constructor for extension point
+ */
+ public Generic2_0JpaPlatformUiFactory() {
+ super();
+ }
+
+ public JpaPlatformUi buildJpaPlatformUi() {
+ return new GenericJpaPlatformUi(
+ new GenericNavigatorProvider(),
+ Generic2_0JpaPlatformUiProvider.instance()
+ );
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/listeners/SWTConnectionListenerWrapper.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/listeners/SWTConnectionListenerWrapper.java
new file mode 100644
index 0000000000..9368bf286f
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/listeners/SWTConnectionListenerWrapper.java
@@ -0,0 +1,348 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 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.ui.internal.listeners;
+
+import org.eclipse.jpt.jpa.db.Catalog;
+import org.eclipse.jpt.jpa.db.Column;
+import org.eclipse.jpt.jpa.db.ConnectionListener;
+import org.eclipse.jpt.jpa.db.ConnectionProfile;
+import org.eclipse.jpt.jpa.db.Database;
+import org.eclipse.jpt.jpa.db.ForeignKey;
+import org.eclipse.jpt.jpa.db.Schema;
+import org.eclipse.jpt.jpa.db.Sequence;
+import org.eclipse.jpt.jpa.db.Table;
+import org.eclipse.swt.widgets.Display;
+
+/**
+ * Wrap another connection listener and forward events to it on the SWT
+ * UI thread, asynchronously if necessary.
+ */
+public class SWTConnectionListenerWrapper
+ implements ConnectionListener
+{
+
+ private final ConnectionListener listener;
+
+ public SWTConnectionListenerWrapper(ConnectionListener listener) {
+ super();
+ if (listener == null) {
+ throw new NullPointerException();
+ }
+ this.listener = listener;
+ }
+
+ public void opened(ConnectionProfile profile) {
+ if (this.isExecutingOnUIThread()) {
+ this.opened_(profile);
+ } else {
+ this.executeOnUIThread(this.buildOpenedRunnable(profile));
+ }
+ }
+
+ public void modified(ConnectionProfile profile) {
+ if (this.isExecutingOnUIThread()) {
+ this.modified_(profile);
+ } else {
+ this.executeOnUIThread(this.buildModifiedRunnable(profile));
+ }
+ }
+
+ public boolean okToClose(ConnectionProfile profile) {
+ if (this.isExecutingOnUIThread()) {
+ return this.okToClose_(profile);
+ }
+ this.executeOnUIThread(this.buildOkToCloseRunnable(profile));
+ return true;
+ }
+
+ public void aboutToClose(ConnectionProfile profile) {
+ if (this.isExecutingOnUIThread()) {
+ this.aboutToClose_(profile);
+ } else {
+ this.executeOnUIThread(this.buildAboutToCloseRunnable(profile));
+ }
+ }
+
+ public void closed(ConnectionProfile profile) {
+ if (this.isExecutingOnUIThread()) {
+ this.closed_(profile);
+ } else {
+ this.executeOnUIThread(this.buildClosedRunnable(profile));
+ }
+ }
+
+ public void databaseChanged(ConnectionProfile profile, Database database) {
+ if (this.isExecutingOnUIThread()) {
+ this.databaseChanged_(profile, database);
+ } else {
+ this.executeOnUIThread(this.buildDatabaseChangedRunnable(profile, database));
+ }
+ }
+
+ public void catalogChanged(ConnectionProfile profile, Catalog catalog) {
+ if (this.isExecutingOnUIThread()) {
+ this.catalogChanged_(profile, catalog);
+ } else {
+ this.executeOnUIThread(this.buildCatalogChangedRunnable(profile, catalog));
+ }
+ }
+
+ public void schemaChanged(ConnectionProfile profile, Schema schema) {
+ if (this.isExecutingOnUIThread()) {
+ this.schemaChanged_(profile, schema);
+ } else {
+ this.executeOnUIThread(this.buildSchemaChangedRunnable(profile, schema));
+ }
+ }
+
+ public void sequenceChanged(ConnectionProfile profile, Sequence sequence) {
+ if (this.isExecutingOnUIThread()) {
+ this.sequenceChanged_(profile, sequence);
+ } else {
+ this.executeOnUIThread(this.buildSequenceChangedRunnable(profile, sequence));
+ }
+ }
+
+ public void tableChanged(ConnectionProfile profile, Table table) {
+ if (this.isExecutingOnUIThread()) {
+ this.tableChanged_(profile, table);
+ } else {
+ this.executeOnUIThread(this.buildTableChangedRunnable(profile, table));
+ }
+ }
+
+ public void columnChanged(ConnectionProfile profile, Column column) {
+ if (this.isExecutingOnUIThread()) {
+ this.columnChanged_(profile, column);
+ } else {
+ this.executeOnUIThread(this.buildColumnChangedRunnable(profile, column));
+ }
+ }
+
+ public void foreignKeyChanged(ConnectionProfile profile, ForeignKey foreignKey) {
+ if (this.isExecutingOnUIThread()) {
+ this.foreignKeyChanged_(profile, foreignKey);
+ } else {
+ this.executeOnUIThread(this.buildForeignKeyChangedRunnable(profile, foreignKey));
+ }
+ }
+
+ private Runnable buildOpenedRunnable(final ConnectionProfile profile) {
+ return new Runnable() {
+ public void run() {
+ SWTConnectionListenerWrapper.this.opened_(profile);
+ }
+ @Override
+ public String toString() {
+ return "opened runnable"; //$NON-NLS-1$
+ }
+ };
+ }
+
+ private Runnable buildModifiedRunnable(final ConnectionProfile profile) {
+ return new Runnable() {
+ public void run() {
+ SWTConnectionListenerWrapper.this.modified_(profile);
+ }
+ @Override
+ public String toString() {
+ return "modified runnable"; //$NON-NLS-1$
+ }
+ };
+ }
+
+ private Runnable buildOkToCloseRunnable(final ConnectionProfile profile) {
+ return new Runnable() {
+ public void run() {
+ SWTConnectionListenerWrapper.this.okToClose_(profile);
+ }
+ @Override
+ public String toString() {
+ return "OK to close runnable"; //$NON-NLS-1$
+ }
+ };
+ }
+
+ private Runnable buildAboutToCloseRunnable(final ConnectionProfile profile) {
+ return new Runnable() {
+ public void run() {
+ SWTConnectionListenerWrapper.this.aboutToClose_(profile);
+ }
+ @Override
+ public String toString() {
+ return "about to close runnable"; //$NON-NLS-1$
+ }
+ };
+ }
+
+ private Runnable buildClosedRunnable(final ConnectionProfile profile) {
+ return new Runnable() {
+ public void run() {
+ SWTConnectionListenerWrapper.this.closed_(profile);
+ }
+ @Override
+ public String toString() {
+ return "closed runnable"; //$NON-NLS-1$
+ }
+ };
+ }
+
+ private Runnable buildDatabaseChangedRunnable(final ConnectionProfile profile, final Database database) {
+ return new Runnable() {
+ public void run() {
+ SWTConnectionListenerWrapper.this.databaseChanged_(profile, database);
+ }
+ @Override
+ public String toString() {
+ return "database changed runnable"; //$NON-NLS-1$
+ }
+ };
+ }
+
+ private Runnable buildCatalogChangedRunnable(final ConnectionProfile profile, final Catalog catalog) {
+ return new Runnable() {
+ public void run() {
+ SWTConnectionListenerWrapper.this.catalogChanged_(profile, catalog);
+ }
+ @Override
+ public String toString() {
+ return "catalog changed runnable"; //$NON-NLS-1$
+ }
+ };
+ }
+
+ private Runnable buildSchemaChangedRunnable(final ConnectionProfile profile, final Schema schema) {
+ return new Runnable() {
+ public void run() {
+ SWTConnectionListenerWrapper.this.schemaChanged_(profile, schema);
+ }
+ @Override
+ public String toString() {
+ return "schema changed runnable"; //$NON-NLS-1$
+ }
+ };
+ }
+
+ private Runnable buildSequenceChangedRunnable(final ConnectionProfile profile, final Sequence sequence) {
+ return new Runnable() {
+ public void run() {
+ SWTConnectionListenerWrapper.this.sequenceChanged_(profile, sequence);
+ }
+ @Override
+ public String toString() {
+ return "sequence changed runnable"; //$NON-NLS-1$
+ }
+ };
+ }
+
+ private Runnable buildTableChangedRunnable(final ConnectionProfile profile, final Table table) {
+ return new Runnable() {
+ public void run() {
+ SWTConnectionListenerWrapper.this.tableChanged_(profile, table);
+ }
+ @Override
+ public String toString() {
+ return "table changed runnable"; //$NON-NLS-1$
+ }
+ };
+ }
+
+ private Runnable buildColumnChangedRunnable(final ConnectionProfile profile, final Column column) {
+ return new Runnable() {
+ public void run() {
+ SWTConnectionListenerWrapper.this.columnChanged_(profile, column);
+ }
+ @Override
+ public String toString() {
+ return "column changed runnable"; //$NON-NLS-1$
+ }
+ };
+ }
+
+ private Runnable buildForeignKeyChangedRunnable(final ConnectionProfile profile, final ForeignKey foreignKey) {
+ return new Runnable() {
+ public void run() {
+ SWTConnectionListenerWrapper.this.foreignKeyChanged_(profile, foreignKey);
+ }
+ @Override
+ public String toString() {
+ return "foreign key changed runnable"; //$NON-NLS-1$
+ }
+ };
+ }
+
+ private boolean isExecutingOnUIThread() {
+ return Display.getCurrent() != null;
+ }
+
+ /**
+ * {@link Display#asyncExec(Runnable)} seems to work OK;
+ * but using {@link Display#syncExec(Runnable)} can somtimes make things
+ * more predictable when debugging, at the risk of deadlocks.
+ */
+ private void executeOnUIThread(Runnable r) {
+ Display.getDefault().asyncExec(r);
+// Display.getDefault().syncExec(r);
+ }
+
+ void opened_(ConnectionProfile profile) {
+ this.listener.opened(profile);
+ }
+
+ void modified_(ConnectionProfile profile) {
+ this.listener.modified(profile);
+ }
+
+ boolean okToClose_(ConnectionProfile profile) {
+ return this.listener.okToClose(profile);
+ }
+
+ void aboutToClose_(ConnectionProfile profile) {
+ this.listener.aboutToClose(profile);
+ }
+
+ void closed_(ConnectionProfile profile) {
+ this.listener.closed(profile);
+ }
+
+ void databaseChanged_(ConnectionProfile profile, Database database) {
+ this.listener.databaseChanged(profile, database);
+ }
+
+ void catalogChanged_(ConnectionProfile profile, Catalog catalog) {
+ this.listener.catalogChanged(profile, catalog);
+ }
+
+ void schemaChanged_(ConnectionProfile profile, Schema schema) {
+ this.listener.schemaChanged(profile, schema);
+ }
+
+ void sequenceChanged_(ConnectionProfile profile, Sequence sequence) {
+ this.listener.sequenceChanged(profile, sequence);
+ }
+
+ void tableChanged_(ConnectionProfile profile, Table table) {
+ this.listener.tableChanged(profile, table);
+ }
+
+ void columnChanged_(ConnectionProfile profile, Column column) {
+ this.listener.columnChanged(profile, column);
+ }
+
+ void foreignKeyChanged_(ConnectionProfile profile, ForeignKey foreignKey) {
+ this.listener.foreignKeyChanged(profile, foreignKey);
+ }
+
+ @Override
+ public String toString() {
+ return "SWT(" + this.listener.toString() + ')'; //$NON-NLS-1$
+ }
+
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/menus/MapAsContribution.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/menus/MapAsContribution.java
new file mode 100644
index 0000000000..054e7ab34b
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/menus/MapAsContribution.java
@@ -0,0 +1,204 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2009 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.ui.internal.menus;
+
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import org.eclipse.jface.action.IContributionItem;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jpt.common.core.JptResourceType;
+import org.eclipse.jpt.common.ui.internal.jface.ImageImageDescriptor;
+import org.eclipse.jpt.common.utility.internal.ArrayTools;
+import org.eclipse.jpt.common.utility.internal.CollectionTools;
+import org.eclipse.jpt.common.utility.internal.iterators.CompositeIterator;
+import org.eclipse.jpt.common.utility.internal.iterators.FilteringIterator;
+import org.eclipse.jpt.common.utility.internal.iterators.TransformationIterator;
+import org.eclipse.jpt.jpa.core.JpaPlatform;
+import org.eclipse.jpt.jpa.core.JpaStructureNode;
+import org.eclipse.jpt.jpa.ui.JpaPlatformUi;
+import org.eclipse.jpt.jpa.ui.JptJpaUiPlugin;
+import org.eclipse.jpt.jpa.ui.details.DefaultMappingUiDefinition;
+import org.eclipse.jpt.jpa.ui.details.MappingUiDefinition;
+import org.eclipse.ui.ISources;
+import org.eclipse.ui.actions.CompoundContributionItem;
+import org.eclipse.ui.handlers.IHandlerService;
+import org.eclipse.ui.menus.CommandContributionItem;
+import org.eclipse.ui.menus.CommandContributionItemParameter;
+import org.eclipse.ui.menus.IWorkbenchContribution;
+import org.eclipse.ui.services.IServiceLocator;
+import com.ibm.icu.text.Collator;
+
+/**
+ * This menu contribution is responsible to populate the Map As menu with the
+ * registered mapping types defined in the <code>JptPlatformUi</code>.
+ *
+ * @see JpaPlatform
+ * @see JpaPlatformUi
+ *
+ * @version 2.0
+ * @since 2.0
+ */
+@SuppressWarnings("nls")
+public abstract class MapAsContribution<T extends JpaStructureNode>
+ extends CompoundContributionItem
+ implements IWorkbenchContribution
+{
+ /**
+ * Keeps track of the <code>IServiceLocator</code> which is used to retrieve
+ * various services required for invoking the <code>PersistentAttributeMapAsHandler</code>.
+ */
+ private IServiceLocator serviceLocator;
+
+
+ /**
+ * Creates a new <code>PersistentAttributeMapAsContribution</code>.
+ */
+ public MapAsContribution() {
+ super();
+ }
+
+
+ public void initialize(IServiceLocator serviceLocator) {
+ this.serviceLocator = serviceLocator;
+ }
+
+ @Override
+ protected IContributionItem[] getContributionItems() {
+ // Retrieve the selection from the handler service
+ // which should be an IStructuredSelection of JpaStructureNodes
+ IHandlerService handlerService =
+ (IHandlerService) this.serviceLocator.getService(IHandlerService.class);
+ IStructuredSelection currentSelection =
+ (IStructuredSelection) handlerService.getCurrentState().getVariable(ISources.ACTIVE_CURRENT_SELECTION_NAME);
+
+ // Assume that all nodes are in the same project (which is very safe)
+ // and retrieve the mapping UI providers just from the first item
+ T node = (T) currentSelection.getFirstElement();
+
+ return
+ ArrayTools.array(
+ new TransformationIterator<MappingUiDefinition<T, ?>, IContributionItem>(mappingUiDefinitions(node)) {
+ @Override
+ protected IContributionItem transform(MappingUiDefinition<T, ?> next) {
+ return createContributionItem(next);
+ }
+ },
+ new IContributionItem[0]);
+ }
+
+
+ protected Comparator<MappingUiDefinition<T, ?>> getDefinitionsComparator() {
+ return new Comparator<MappingUiDefinition<T, ?>>() {
+ public int compare(MappingUiDefinition<T, ?> item1, MappingUiDefinition<T, ?> item2) {
+ String displayString1 = item1.getLabel();
+ String displayString2 = item2.getLabel();
+ return Collator.getInstance().compare(displayString1, displayString2);
+ }
+ };
+ }
+
+ /**
+ * Retrieves the registered {@link MappingUiDefinition}s from the given node,
+ * using its {@link JpaPlatformUi}.
+ *
+ * @param node A test node to determine the {@link JpaPlatformUi} and type
+ * of providers to return
+ * @return The list of registered {@link MappingUiDefinition}s
+ */
+ protected <U extends T> Iterator<? extends MappingUiDefinition<T, ?>> mappingUiDefinitions(final T node) {
+ JpaPlatform jpaPlatform = node.getJpaProject().getJpaPlatform();
+ JpaPlatformUi jpaPlatformUi = JptJpaUiPlugin.instance().getJpaPlatformUi(jpaPlatform);
+
+ Iterator<? extends MappingUiDefinition<T, ?>> sortedMappingUiDefinitions =
+ CollectionTools.sort(
+ new FilteringIterator<MappingUiDefinition<T, ?>>(
+ mappingUiDefinitions(jpaPlatformUi, node.getResourceType())) {
+ @Override
+ protected boolean accept(MappingUiDefinition<T, ?> o) {
+ return o.isEnabledFor(node);
+ }
+ },
+ getDefinitionsComparator());
+
+ DefaultMappingUiDefinition<T, ?> defaultDefinition = getDefaultMappingUiDefinition(jpaPlatformUi, node);
+ if (defaultDefinition != null) {
+ return new CompositeIterator<MappingUiDefinition<T, ?>>(defaultDefinition, sortedMappingUiDefinitions);
+ }
+ return sortedMappingUiDefinitions;
+ }
+
+ /**
+ * Retrieves the registered {@link MappingUiDefinition}s from the given
+ * {@link JpaPlatformUi} and {@link JpaStructureNode} (to determine type of
+ * mapping providers to retrieve).
+ *
+ * @param jpaPlatformUi The active {@link JpaPlatformUi} from where the
+ * provider can be retrieved
+ * @param node A test node to determine type of providers to return
+ * @return The list of registered {@link MappingUiDefinition}s
+ */
+ protected abstract Iterator<? extends MappingUiDefinition<T, ?>>
+ mappingUiDefinitions(JpaPlatformUi platformUi, JptResourceType resourceType);
+
+ /**
+ * Creates the default provider responsible for clearing the mapping type.
+ * If not default provider, then return null
+ *
+ * @return A provider that acts as a default mapping provider
+ */
+ protected abstract DefaultMappingUiDefinition<T, ?> getDefaultMappingUiDefinition(JpaPlatformUi platformUi, T node);
+
+ protected IContributionItem createContributionItem(MappingUiDefinition<T, ?> mappingUiProvider) {
+ return new CommandContributionItem(createParameter(mappingUiProvider));
+ }
+
+ protected CommandContributionItemParameter createParameter(MappingUiDefinition<T, ?> mappingUiDefinition) {
+ CommandContributionItemParameter parameter =
+ new CommandContributionItemParameter(
+ this.serviceLocator,
+ createCommandContributionItemId(mappingUiDefinition),
+ getCommandId(),
+ CommandContributionItem.STYLE_CHECK);
+ parameter.label = mappingUiDefinition.getLabel();
+ Map<String, String> parameters = new HashMap<String, String>();
+ parameters.put(getCommandParameterId(), mappingUiDefinition.getKey());
+ parameter.parameters = parameters;
+ parameter.icon = new ImageImageDescriptor(mappingUiDefinition.getImage());
+ parameter.visibleEnabled = true;
+ return parameter;
+ }
+
+ /**
+ * Retrieves the unique identifier of the command that will be invoked for
+ * changing the mapping type of the selected nodes.
+ *
+ * @return The unique identifier of the "map as" command
+ */
+ protected abstract String getCommandId();
+
+ /**
+ * Retrieves the unique identifier of the mapping key command parameter that
+ * will be used for the new mapping type of the selected nodes.
+ *
+ * @return The unique identifier of the "map as" command parameter
+ */
+ protected abstract String getCommandParameterId();
+
+ /**
+ * Returns an id for a {@link CommandContributionItem} in the form of
+ * "<commandId>.<mappingKey>"
+ * (for example "org.eclipse.jpt.jpa.core.ui.persistentTypeMapAs.entity")
+ */
+ protected String createCommandContributionItemId(MappingUiDefinition<T, ?> mappingUiDefinition) {
+ return getCommandId() + "." + mappingUiDefinition.getKey();
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/menus/PersistentAttributeMapAsContribution.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/menus/PersistentAttributeMapAsContribution.java
new file mode 100644
index 0000000000..45e1c6393b
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/menus/PersistentAttributeMapAsContribution.java
@@ -0,0 +1,86 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2009 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.ui.internal.menus;
+
+import java.util.Iterator;
+import org.eclipse.jpt.common.core.JptResourceType;
+import org.eclipse.jpt.jpa.core.context.PersistentAttribute;
+import org.eclipse.jpt.jpa.core.context.ReadOnlyPersistentAttribute;
+import org.eclipse.jpt.jpa.ui.JpaPlatformUi;
+import org.eclipse.jpt.jpa.ui.details.DefaultMappingUiDefinition;
+import org.eclipse.jpt.jpa.ui.details.MappingUiDefinition;
+import org.eclipse.jpt.jpa.ui.internal.commands.PersistentAttributeMapAsHandler;
+import org.eclipse.ui.menus.CommandContributionItemParameter;
+
+/**
+ * This menu contribution is responsible to populate the Map As menu with the
+ * registered attribute mapping types defined in the <code>JptPlatformUi</code>
+ * for <code>PersistentAttribute</code> objects.
+ *
+ * @see PersistentAttributeMapAsHandler
+ * @see PersistentAttribute
+ *
+ * @version 2.2
+ * @since 2.0
+ */
+public class PersistentAttributeMapAsContribution
+ extends MapAsContribution<ReadOnlyPersistentAttribute>
+{
+ /**
+ * Creates a new <code>PersistentAttributeMapAsContribution</code>.
+ */
+ public PersistentAttributeMapAsContribution() {
+ super();
+ }
+
+ @Override
+ protected String getCommandId() {
+ return PersistentAttributeMapAsHandler.COMMAND_ID;
+ }
+
+ @Override
+ protected String getCommandParameterId() {
+ return PersistentAttributeMapAsHandler.SPECIFIED_MAPPING_COMMAND_PARAMETER_ID;
+ }
+
+ @Override
+ protected CommandContributionItemParameter createParameter(MappingUiDefinition<ReadOnlyPersistentAttribute, ?> mappingUiProvider) {
+ CommandContributionItemParameter parameter = super.createParameter(mappingUiProvider);
+ String defaultKey = null;
+ if (mappingUiProvider instanceof DefaultMappingUiDefinition<?, ?>) {
+ defaultKey = ((DefaultMappingUiDefinition<? extends PersistentAttribute, ?>) mappingUiProvider).getDefaultKey();
+ }
+ parameter.parameters.put(PersistentAttributeMapAsHandler.DEFAULT_MAPPING_COMMAND_PARAMETER_ID, defaultKey);
+ return parameter;
+ }
+
+ @Override
+ protected Iterator<? extends MappingUiDefinition<ReadOnlyPersistentAttribute, ?>> mappingUiDefinitions(
+ JpaPlatformUi jpaPlatformUi, JptResourceType resourceType) {
+
+ return jpaPlatformUi.attributeMappingUiDefinitions(resourceType);
+ }
+
+ @Override
+ protected DefaultMappingUiDefinition<ReadOnlyPersistentAttribute, ?> getDefaultMappingUiDefinition(
+ JpaPlatformUi jpaPlatformUi, ReadOnlyPersistentAttribute node) {
+
+ return getDefaultMappingUiDefinition(
+ jpaPlatformUi,
+ ((PersistentAttribute) node).getDefaultMappingKey(),
+ node.getResourceType());
+ }
+
+ protected DefaultMappingUiDefinition<ReadOnlyPersistentAttribute, ?> getDefaultMappingUiDefinition(
+ JpaPlatformUi jpaPlatformUi, String defaultMappingKey, JptResourceType resourceType) {
+
+ return jpaPlatformUi.getDefaultAttributeMappingUiDefinition(resourceType, defaultMappingKey);
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/menus/PersistentTypeMapAsContribution.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/menus/PersistentTypeMapAsContribution.java
new file mode 100644
index 0000000000..ac878eb934
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/menus/PersistentTypeMapAsContribution.java
@@ -0,0 +1,64 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2009 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.ui.internal.menus;
+
+import java.util.Iterator;
+import org.eclipse.jpt.common.core.JptResourceType;
+import org.eclipse.jpt.jpa.core.JpaPlatform;
+import org.eclipse.jpt.jpa.core.context.PersistentType;
+import org.eclipse.jpt.jpa.ui.JpaPlatformUi;
+import org.eclipse.jpt.jpa.ui.details.DefaultMappingUiDefinition;
+import org.eclipse.jpt.jpa.ui.details.MappingUiDefinition;
+import org.eclipse.jpt.jpa.ui.internal.commands.PersistentTypeMapAsHandler;
+
+/**
+ * This menu contribution is responsible to populate the Map As menu with the
+ * registered mapping types defined in the <code>JptPlatformUi</code> for
+ * <code>PersistentType</code> objects.
+ *
+ * @see JpaPlatform
+ * @see JpaPlatformUi
+ * @see PersistentType
+ */
+public class PersistentTypeMapAsContribution
+ extends MapAsContribution<PersistentType>
+{
+ /**
+ * Creates a new <code>PersistentTypeMapAsContribution</code>.
+ */
+ public PersistentTypeMapAsContribution() {
+ super();
+ }
+
+
+ @Override
+ protected String getCommandId() {
+ return PersistentTypeMapAsHandler.COMMAND_ID;
+ }
+
+ @Override
+ protected String getCommandParameterId() {
+ return PersistentTypeMapAsHandler.COMMAND_PARAMETER_ID;
+ }
+
+ @Override
+ protected Iterator<? extends MappingUiDefinition<PersistentType, ?>> mappingUiDefinitions(
+ JpaPlatformUi jpaPlatformUi, JptResourceType resourceType) {
+
+ return jpaPlatformUi.typeMappingUiDefinitions(resourceType);
+ }
+
+ @Override
+ protected DefaultMappingUiDefinition<PersistentType, ?> getDefaultMappingUiDefinition(
+ JpaPlatformUi jpaPlatformUi, PersistentType node) {
+
+ return jpaPlatformUi.getDefaultTypeMappingUiDefinition(node.getResourceType());
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/navigator/JpaNavigatorActionProvider.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/navigator/JpaNavigatorActionProvider.java
new file mode 100644
index 0000000000..17f73794a1
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/navigator/JpaNavigatorActionProvider.java
@@ -0,0 +1,59 @@
+/*******************************************************************************
+ * Copyright (c) 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.jpa.ui.internal.navigator;
+
+import org.eclipse.jface.action.IMenuManager;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jpt.jpa.ui.internal.actions.OpenJpaResourceAction;
+import org.eclipse.ui.IActionBars;
+import org.eclipse.ui.actions.ActionContext;
+import org.eclipse.ui.navigator.CommonActionProvider;
+import org.eclipse.ui.navigator.ICommonActionConstants;
+import org.eclipse.ui.navigator.ICommonActionExtensionSite;
+import org.eclipse.ui.navigator.ICommonMenuConstants;
+
+public class JpaNavigatorActionProvider extends CommonActionProvider
+{
+ private OpenJpaResourceAction openAction;
+
+ public JpaNavigatorActionProvider() {
+ super();
+ }
+
+ public void init(ICommonActionExtensionSite aConfig) {
+ openAction = new OpenJpaResourceAction();
+ }
+
+ public void setContext(ActionContext aContext) {
+ if (aContext != null && aContext.getSelection() instanceof IStructuredSelection) {
+ IStructuredSelection selection = (IStructuredSelection) aContext.getSelection();
+ openAction.selectionChanged(selection);
+ }
+
+ super.setContext(aContext);
+ }
+
+ public void fillActionBars(IActionBars theActionBars) {
+ if (openAction.isEnabled()) {
+ theActionBars.setGlobalActionHandler(ICommonActionConstants.OPEN, openAction);
+ }
+ }
+
+ public void fillContextMenu(IMenuManager aMenu) {
+ if (getContext() == null || getContext().getSelection().isEmpty()) {
+ return;
+ }
+
+ if (openAction.isEnabled()) {
+ aMenu.insertAfter(ICommonMenuConstants.GROUP_OPEN, openAction);
+ }
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/navigator/JpaNavigatorContentAndLabelProvider.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/navigator/JpaNavigatorContentAndLabelProvider.java
new file mode 100644
index 0000000000..9075967581
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/navigator/JpaNavigatorContentAndLabelProvider.java
@@ -0,0 +1,20 @@
+/*******************************************************************************
+ * Copyright (c) 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.jpa.ui.internal.navigator;
+
+import org.eclipse.jpt.common.ui.internal.jface.DelegatingTreeContentAndLabelProvider;
+
+public class JpaNavigatorContentAndLabelProvider extends DelegatingTreeContentAndLabelProvider
+{
+ public JpaNavigatorContentAndLabelProvider() {
+ super(new JpaNavigatorTreeItemContentProviderFactory(), new JpaNavigatorItemLabelProviderFactory());
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/navigator/JpaNavigatorContentProvider.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/navigator/JpaNavigatorContentProvider.java
new file mode 100644
index 0000000000..12e0ae7fc6
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/navigator/JpaNavigatorContentProvider.java
@@ -0,0 +1,216 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2010 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.ui.internal.navigator;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.jface.viewers.StructuredViewer;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jpt.jpa.core.JpaFacet;
+import org.eclipse.jpt.jpa.core.JpaProject;
+import org.eclipse.jpt.jpa.core.JptJpaCorePlugin;
+import org.eclipse.jpt.jpa.ui.JpaPlatformUi;
+import org.eclipse.jpt.jpa.ui.JptJpaUiPlugin;
+import org.eclipse.ui.IMemento;
+import org.eclipse.ui.navigator.ICommonContentExtensionSite;
+import org.eclipse.ui.navigator.ICommonContentProvider;
+import org.eclipse.wst.common.project.facet.core.FacetedProjectFramework;
+import org.eclipse.wst.common.project.facet.core.events.IFacetedProjectEvent;
+import org.eclipse.wst.common.project.facet.core.events.IFacetedProjectListener;
+import org.eclipse.wst.common.project.facet.core.events.IProjectFacetActionEvent;
+
+/**
+ * This extension of navigator content provider delegates to the platform UI
+ * (see the org.eclipse.jpt.jpa.ui.jpaPlatform extension point) for navigator content.
+ *
+ * If there is a platform UI for the given project, this content provider will
+ * provide a root "JPA Content" node (child of the project), otherwise there
+ * will be no content. For children of the "JPA Content" node (or for any other
+ * sub-node), this provider will delegate to the content provider returned by the
+ * platform UI implementation.
+ */
+public class JpaNavigatorContentProvider
+ implements ICommonContentProvider {
+
+ private JpaNavigatorContentAndLabelProvider delegate;
+
+ private IFacetedProjectListener facetListener;
+
+ private StructuredViewer viewer;
+
+
+ public JpaNavigatorContentProvider() {
+ super();
+ facetListener = new FacetListener();
+ FacetedProjectFramework.addListener(
+ facetListener,
+ IFacetedProjectEvent.Type.POST_INSTALL,
+ IFacetedProjectEvent.Type.POST_UNINSTALL,
+ IFacetedProjectEvent.Type.PROJECT_MODIFIED);
+ }
+
+
+ public JpaNavigatorContentAndLabelProvider delegate() {
+ return delegate;
+ }
+
+
+ // **************** IContentProvider implementation ************************
+
+ public void dispose() {
+ FacetedProjectFramework.removeListener(facetListener);
+ if (delegate != null) {
+ delegate.dispose();
+ }
+ }
+
+ public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+ if (delegate != null) {
+ delegate.inputChanged(viewer, oldInput, newInput);
+ }
+ this.viewer = (StructuredViewer) viewer;
+ }
+
+
+ // **************** IStructuredContentProvider implementation **************
+
+ public Object[] getElements(Object inputElement) {
+ return getChildren(inputElement);
+ }
+
+
+ // **************** ITreeContentProvider implementation ********************
+
+ public Object getParent(Object element) {
+ if (delegate != null) {
+ return delegate.getParent(element);
+ }
+
+ return null;
+ }
+
+ public boolean hasChildren(Object element) {
+ if (element instanceof IAdaptable) {
+ IProject project = (IProject) ((IAdaptable) element).getAdapter(IProject.class);
+
+ if (project != null) {
+ JpaProject jpaProject = JptJpaCorePlugin.getJpaProject(project);
+ if (jpaProject != null) {
+ JpaPlatformUi platformUi = JptJpaUiPlugin.instance().getJpaPlatformUi(jpaProject.getJpaPlatform());
+
+ return platformUi != null;
+ }
+ }
+ }
+
+ if (delegate != null) {
+ return delegate.hasChildren(element);
+ }
+
+ return false;
+ }
+
+ public Object[] getChildren(Object parentElement) {
+ if (parentElement instanceof IAdaptable) {
+ IProject project = (IProject) ((IAdaptable) parentElement).getAdapter(IProject.class);
+
+ if (project != null) {
+ JpaProject jpaProject = JptJpaCorePlugin.getJpaProject(project);
+ if (jpaProject != null) {
+ JpaPlatformUi platformUi = JptJpaUiPlugin.instance().getJpaPlatformUi(jpaProject.getJpaPlatform());
+
+ if (platformUi != null) {
+ return new Object[] {jpaProject.getRootContextNode()};
+ }
+ }
+ }
+ }
+
+ if (delegate != null) {
+ return delegate.getChildren(parentElement);
+ }
+
+ return new Object[0];
+ }
+
+
+ // **************** IMementoAware implementation ***************************
+
+ public void saveState(IMemento memento) {
+ // no op
+ }
+
+ public void restoreState(IMemento memento) {
+ // no op
+ }
+
+
+ // **************** ICommonContentProvider implementation ******************
+
+ public void init(ICommonContentExtensionSite config) {
+ if (delegate == null) {
+ JpaNavigatorLabelProvider labelProvider = (JpaNavigatorLabelProvider) config.getExtension().getLabelProvider();
+ if (labelProvider != null && labelProvider.delegate() != null) {
+ delegate = labelProvider.delegate();
+ }
+ else {
+ delegate = new JpaNavigatorContentAndLabelProvider();
+ }
+ }
+ }
+
+
+ // **************** member classes *****************************************
+
+ private class FacetListener
+ implements IFacetedProjectListener
+ {
+ public void handleEvent(IFacetedProjectEvent event) {
+ if (event.getType() == IFacetedProjectEvent.Type.PROJECT_MODIFIED) {
+ refreshViewer(event.getProject().getProject());
+ }
+ else if (event.getType() == IFacetedProjectEvent.Type.POST_INSTALL
+ || event.getType() == IFacetedProjectEvent.Type.POST_UNINSTALL) {
+ IProjectFacetActionEvent ipaEvent = (IProjectFacetActionEvent) event;
+ if (ipaEvent.getProjectFacet().equals(JpaFacet.FACET)) {
+ refreshViewer(ipaEvent.getProject().getProject());
+ }
+ }
+ }
+
+ private void refreshViewer(final IProject project) {
+ if (viewer != null
+ && viewer.getControl() != null
+ && !viewer.getControl().isDisposed()) {
+ // Using job here so that project model update (which also uses
+ // a job) will complete first
+ Job refreshJob = new Job("Refresh viewer") {
+ @Override
+ protected IStatus run(IProgressMonitor monitor) {
+ // Using runnable here so that refresh will go on correct thread
+ viewer.getControl().getDisplay().asyncExec(new Runnable() {
+ public void run() {
+ viewer.refresh(project);
+ }
+ });
+ return Status.OK_STATUS;
+ }
+ };
+ refreshJob.setRule(project);
+ refreshJob.schedule();
+ }
+ }
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/navigator/JpaNavigatorItemLabelProviderFactory.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/navigator/JpaNavigatorItemLabelProviderFactory.java
new file mode 100644
index 0000000000..77a06d342f
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/navigator/JpaNavigatorItemLabelProviderFactory.java
@@ -0,0 +1,75 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2009 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.ui.internal.navigator;
+
+import java.util.HashMap;
+import java.util.Map;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.jpt.common.ui.jface.DelegatingContentAndLabelProvider;
+import org.eclipse.jpt.common.ui.jface.ItemLabelProvider;
+import org.eclipse.jpt.common.ui.jface.ItemLabelProviderFactory;
+import org.eclipse.jpt.jpa.core.JpaPlatform;
+import org.eclipse.jpt.jpa.core.context.JpaContextNode;
+import org.eclipse.jpt.jpa.ui.JptJpaUiPlugin;
+import org.eclipse.jpt.jpa.ui.navigator.JpaNavigatorProvider;
+
+public class JpaNavigatorItemLabelProviderFactory
+ implements ItemLabelProviderFactory
+{
+ /**
+ * Exactly *one* of these factories is created for each view that utilizes it.
+ * Therefore, as we delegate to the platform UI for each project, we should
+ * maintain the same multiplicity. That is, if there is a delegate for each
+ * platform UI, we should maintain *one* delegate for each view.
+ *
+ * Key: platform id, Value: delegate content provider factory
+ */
+ private final Map<String, ItemLabelProviderFactory> delegates;
+
+
+ public JpaNavigatorItemLabelProviderFactory() {
+ super();
+ this.delegates = new HashMap<String, ItemLabelProviderFactory>();
+ }
+
+ public ItemLabelProvider buildItemLabelProvider(Object item, DelegatingContentAndLabelProvider contentAndLabelProvider) {
+ ItemLabelProviderFactory delegate = getDelegate(item);
+ if (delegate != null) {
+ return delegate.buildItemLabelProvider(item, contentAndLabelProvider);
+ }
+ return null;
+ }
+
+
+ private ItemLabelProviderFactory getDelegate(Object element) {
+ if (! (element instanceof IAdaptable)) {
+ return null;
+ }
+
+ JpaContextNode contextNode = (JpaContextNode) ((IAdaptable) element).getAdapter(JpaContextNode.class);
+
+ if (contextNode == null) {
+ return null;
+ }
+
+ JpaPlatform platform = contextNode.getJpaProject().getJpaPlatform();
+ String platformId = platform.getId();
+ if (delegates.containsKey(platformId)) {
+ return delegates.get(platformId);
+ }
+ JpaNavigatorProvider navigatorProvider = JptJpaUiPlugin.instance().getJpaNavigatorProvider(platform);
+ ItemLabelProviderFactory delegate = null;
+ if (navigatorProvider != null) {
+ delegate = navigatorProvider.getItemLabelProviderFactory();
+ }
+ delegates.put(platformId, delegate);
+ return delegate;
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/navigator/JpaNavigatorLabelProvider.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/navigator/JpaNavigatorLabelProvider.java
new file mode 100644
index 0000000000..8066e9ff12
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/navigator/JpaNavigatorLabelProvider.java
@@ -0,0 +1,138 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2010 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.ui.internal.navigator;
+
+import org.eclipse.jface.viewers.ILabelProviderListener;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.ui.IMemento;
+import org.eclipse.ui.navigator.ICommonContentExtensionSite;
+import org.eclipse.ui.navigator.ICommonLabelProvider;
+
+/**
+ * This extension of navigator label provider delegates to the platform UI
+ * (see the org.eclipse.jpt.jpa.ui.jpaPlatform extension point) for navigator labels.
+ *
+ * This label provider provides a label for the root "JPA Content" node provided
+ * by the content provider (see {@link JpaNavigatorContentProvider}) and delegates
+ * to the label provider returned by the platform UI implementation for labels
+ * for children of the "JPA Content" node (or for any other sub-node).
+ */
+public class JpaNavigatorLabelProvider
+ extends LabelProvider
+ implements ICommonLabelProvider {
+
+ private JpaNavigatorContentAndLabelProvider delegate;
+
+
+ public JpaNavigatorLabelProvider() {
+ super();
+ }
+
+
+ public JpaNavigatorContentAndLabelProvider delegate() {
+ return delegate;
+ }
+
+
+ // **************** IBaseLabelProvider implementation **********************
+
+ @Override
+ public void addListener(ILabelProviderListener listener) {
+ if (delegate != null) {
+ delegate.addListener(listener);
+ }
+ super.addListener(listener);
+ }
+
+ @Override
+ public void removeListener(ILabelProviderListener listener) {
+ super.removeListener(listener);
+ if (delegate != null) {
+ delegate.removeListener(listener);
+ }
+ }
+
+ @Override
+ public boolean isLabelProperty(Object element, String property) {
+ if (delegate != null) {
+ return delegate.isLabelProperty(element, property);
+ }
+
+ return super.isLabelProperty(element, property);
+ }
+
+ @Override
+ public void dispose() {
+ if (delegate != null) {
+ delegate.dispose();
+ }
+ super.dispose();
+ }
+
+
+ // **************** ILabelProvider implementation **************************
+
+ @Override
+ public Image getImage(Object element) {
+ if (delegate != null) {
+ return delegate.getImage(element);
+ }
+
+ return super.getImage(element);
+ }
+
+ @Override
+ public String getText(Object element) {
+ if (delegate != null) {
+ return delegate.getText(element);
+ }
+
+ return super.getText(element);
+ }
+
+
+ // **************** IDescriptionProvider implementation ********************
+
+ public String getDescription(Object element) {
+ if (delegate != null) {
+ return delegate.getDescription(element);
+ }
+
+ return super.getText(element);
+ }
+
+
+ // **************** IMementoAware implementation ***************************
+
+ public void saveState(IMemento memento) {
+ // no op
+ }
+
+ public void restoreState(IMemento memento) {
+ // no op
+ }
+
+
+ // **************** ICommonLabelProvider implementation ********************
+
+ public void init(ICommonContentExtensionSite config) {
+ if (delegate == null) {
+ JpaNavigatorContentProvider contentProvider = (JpaNavigatorContentProvider) config.getExtension().getContentProvider();
+ if (contentProvider != null && contentProvider.delegate() != null) {
+ delegate = contentProvider.delegate();
+ }
+ else {
+ delegate = new JpaNavigatorContentAndLabelProvider();
+ }
+ }
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/navigator/JpaNavigatorTreeItemContentProviderFactory.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/navigator/JpaNavigatorTreeItemContentProviderFactory.java
new file mode 100644
index 0000000000..604f912622
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/navigator/JpaNavigatorTreeItemContentProviderFactory.java
@@ -0,0 +1,75 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2009 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.ui.internal.navigator;
+
+import java.util.HashMap;
+import java.util.Map;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.jpt.common.ui.jface.DelegatingContentAndLabelProvider;
+import org.eclipse.jpt.common.ui.jface.TreeItemContentProvider;
+import org.eclipse.jpt.common.ui.jface.TreeItemContentProviderFactory;
+import org.eclipse.jpt.jpa.core.JpaPlatform;
+import org.eclipse.jpt.jpa.core.context.JpaContextNode;
+import org.eclipse.jpt.jpa.ui.JptJpaUiPlugin;
+import org.eclipse.jpt.jpa.ui.navigator.JpaNavigatorProvider;
+
+public class JpaNavigatorTreeItemContentProviderFactory
+ implements TreeItemContentProviderFactory
+{
+ /**
+ * Exactly *one* of these factories is created for each view that utilizes it.
+ * Therefore, as we delegate to the platform UI for each project, we should
+ * maintain the same multiplicity. That is, if there is a delegate for each
+ * platform UI, we should maintain *one* delegate for each view.
+ *
+ * Key: platform id, Value: delegate content provider factory
+ */
+ private Map<String, TreeItemContentProviderFactory> delegates;
+
+
+ public JpaNavigatorTreeItemContentProviderFactory() {
+ super();
+ this.delegates = new HashMap<String, TreeItemContentProviderFactory>();
+ }
+
+ public TreeItemContentProvider buildItemContentProvider(Object item, DelegatingContentAndLabelProvider contentAndLabelProvider) {
+ TreeItemContentProviderFactory delegate = getDelegate(item);
+ if (delegate != null) {
+ return delegate.buildItemContentProvider(item, contentAndLabelProvider);
+ }
+ return null;
+ }
+
+
+ private TreeItemContentProviderFactory getDelegate(Object element) {
+ if (! (element instanceof IAdaptable)) {
+ return null;
+ }
+
+ JpaContextNode contextNode = (JpaContextNode) ((IAdaptable) element).getAdapter(JpaContextNode.class);
+
+ if (contextNode == null) {
+ return null;
+ }
+
+ JpaPlatform platform = contextNode.getJpaProject().getJpaPlatform();
+ String platformId = platform.getId();
+ if (delegates.containsKey(platformId)) {
+ return delegates.get(platformId);
+ }
+ JpaNavigatorProvider navigatorProvider = JptJpaUiPlugin.instance().getJpaNavigatorProvider(platform);
+ TreeItemContentProviderFactory delegate = null;
+ if (navigatorProvider != null) {
+ delegate = navigatorProvider.getTreeItemContentProviderFactory();
+ }
+ delegates.put(platformId, delegate);
+ return delegate;
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/persistence/JptUiPersistenceMessages.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/persistence/JptUiPersistenceMessages.java
new file mode 100644
index 0000000000..fa852649bc
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/persistence/JptUiPersistenceMessages.java
@@ -0,0 +1,78 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2009 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.ui.internal.persistence;
+
+import org.eclipse.osgi.util.NLS;
+
+/**
+ * Localized messages used by Dali persistence editor.
+ *
+ * @version 2.0
+ * @since 2.0
+ */
+public class JptUiPersistenceMessages {
+
+ public static String ArchiveFileSelectionDialog_jarPathHelpLabel;
+ public static String ArchiveFileSelectionDialog_jarPathLabel;
+
+ public static String PersistenceEditor_page_help;
+ public static String PersistenceEditor_sourceTab;
+
+ public static String PersistenceUnitClassesComposite_description;
+ public static String PersistenceUnitClassesComposite_excludeUnlistedMappedClasses;
+ public static String PersistenceUnitClassesComposite_excludeUnlistedMappedClassesWithDefault;
+ public static String PersistenceUnitClassesComposite_mappedClassesNoName;
+ public static String PersistenceUnitClassesComposite_open;
+
+ public static String PersistenceUnitConnectionComposite_connection;
+ public static String PersistenceUnitConnectionComposite_database;
+ public static String PersistenceUnitConnectionComposite_general;
+
+ public static String PersistenceUnitConnectionDatabaseComposite_jtaDatasourceName;
+ public static String PersistenceUnitConnectionDatabaseComposite_nonJtaDatasourceName;
+
+ public static String PersistenceUnitConnectionGeneralComposite_default;
+ public static String PersistenceUnitConnectionGeneralComposite_jta;
+ public static String PersistenceUnitConnectionGeneralComposite_resource_local;
+ public static String PersistenceUnitConnectionGeneralComposite_transactionType;
+
+ public static String PersistenceUnitGeneralComposite_general;
+ public static String PersistenceUnitGeneralComposite_jarFiles;
+ public static String PersistenceUnitGeneralComposite_jpaMappingDescriptors;
+ public static String PersistenceUnitGeneralComposite_jpaMappingDescriptors_description;
+ public static String PersistenceUnitGeneralComposite_mappedClasses;
+ public static String PersistenceUnitGeneralComposite_name;
+ public static String PersistenceUnitGeneralComposite_persistenceProvider;
+ public static String PersistenceUnitGeneralComposite_description;
+
+ public static String PersistenceUnitJarFilesComposite_noFileName;
+ public static String PersistenceUnitMappingFilesComposite_jarFileDialog_title;
+ public static String PersistenceUnitMappingFilesComposite_jarFileDialog_message;
+
+ public static String PersistenceUnitMappingFilesComposite_mappingFileDialog_message;
+ public static String PersistenceUnitMappingFilesComposite_mappingFileDialog_title;
+ public static String PersistenceUnitMappingFilesComposite_ormNoName;
+
+ public static String PersistenceUnitPropertiesComposite_nameColumn;
+ public static String PersistenceUnitPropertiesComposite_properties;
+ public static String PersistenceUnitPropertiesComposite_properties_description;
+ public static String PersistenceUnitPropertiesComposite_valueColumn;
+
+ private static final String BUNDLE_NAME = "jpt_ui_persistence"; //$NON-NLS-1$
+ private static final Class<?> BUNDLE_CLASS = JptUiPersistenceMessages.class;
+ static {
+ NLS.initializeMessages(BUNDLE_NAME, BUNDLE_CLASS);
+ }
+
+ private JptUiPersistenceMessages() {
+ throw new UnsupportedOperationException();
+ }
+
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/persistence/details/AbstractPersistenceXmlResourceUiDefinition.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/persistence/details/AbstractPersistenceXmlResourceUiDefinition.java
new file mode 100644
index 0000000000..19ff3fffbc
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/persistence/details/AbstractPersistenceXmlResourceUiDefinition.java
@@ -0,0 +1,50 @@
+/*******************************************************************************
+ * Copyright (c) 2009 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.ui.internal.persistence.details;
+
+import java.util.ListIterator;
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.persistence.PersistenceUnit;
+import org.eclipse.jpt.jpa.ui.PersistenceXmlResourceUiDefinition;
+import org.eclipse.jpt.jpa.ui.ResourceUiDefinition;
+import org.eclipse.jpt.jpa.ui.details.JpaPageComposite;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * All the state in the definition should be "static" (i.e. unchanging once it is initialized).
+ */
+public abstract class AbstractPersistenceXmlResourceUiDefinition
+ implements ResourceUiDefinition, PersistenceXmlResourceUiDefinition
+{
+
+
+ private final PersistenceXmlUiFactory factory;
+
+
+ /**
+ * zero-argument constructor
+ */
+ protected AbstractPersistenceXmlResourceUiDefinition() {
+ super();
+ this.factory = buildPersistenceXmlUiFactory();
+ }
+
+
+ protected abstract PersistenceXmlUiFactory buildPersistenceXmlUiFactory();
+
+ public PersistenceXmlUiFactory getFactory() {
+ return this.factory;
+ }
+
+ public ListIterator<JpaPageComposite> buildPersistenceUnitComposites(PropertyValueModel<PersistenceUnit> subjectHolder, Composite parent, WidgetFactory widgetFactory) {
+ return this.factory.createPersistenceUnitComposites(subjectHolder, parent, widgetFactory);
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/persistence/details/ArchiveFileSelectionDialog.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/persistence/details/ArchiveFileSelectionDialog.java
new file mode 100644
index 0000000000..8a2717420a
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/persistence/details/ArchiveFileSelectionDialog.java
@@ -0,0 +1,225 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2010 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.ui.internal.persistence.details;
+
+import java.util.Collections;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.jpt.common.ui.internal.jface.ArchiveFileViewerFilter;
+import org.eclipse.jpt.common.ui.internal.utility.swt.SWTTools;
+import org.eclipse.jpt.common.utility.internal.model.value.SimplePropertyValueModel;
+import org.eclipse.jpt.common.utility.model.value.WritablePropertyValueModel;
+import org.eclipse.jpt.jpa.core.JptJpaCorePlugin;
+import org.eclipse.jpt.jpa.ui.JptJpaUiPlugin;
+import org.eclipse.jpt.jpa.ui.internal.persistence.JptUiPersistenceMessages;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.dialogs.ElementTreeSelectionDialog;
+import org.eclipse.ui.dialogs.ISelectionStatusValidator;
+import org.eclipse.ui.model.WorkbenchContentProvider;
+import org.eclipse.ui.model.WorkbenchLabelProvider;
+import org.eclipse.ui.views.navigator.ResourceComparator;
+import org.eclipse.wst.common.componentcore.ComponentCore;
+import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
+import org.eclipse.wst.common.componentcore.resources.IVirtualContainer;
+import org.eclipse.wst.common.componentcore.resources.IVirtualFile;
+import org.eclipse.wst.common.componentcore.resources.IVirtualFolder;
+import org.eclipse.wst.common.componentcore.resources.IVirtualResource;
+
+public class ArchiveFileSelectionDialog
+ extends ElementTreeSelectionDialog
+{
+ private final WritablePropertyValueModel<String> jarPathModel;
+
+ private DeploymentPathCalculator pathCalculator;
+
+
+ public ArchiveFileSelectionDialog(Shell parent) {
+ this(parent, new SimpleDeploymentPathCalculator());
+ }
+
+ public ArchiveFileSelectionDialog(Shell parent, DeploymentPathCalculator pathCalculator) {
+ super(parent, new WorkbenchLabelProvider(), new WorkbenchContentProvider());
+ this.pathCalculator = pathCalculator;
+ setComparator(new ResourceComparator(ResourceComparator.NAME));
+ addFilter(new ArchiveFileViewerFilter());
+ setValidator(new ArchiveFileSelectionValidator());
+ this.jarPathModel = new SimplePropertyValueModel<String>();
+ }
+
+
+ @Override
+ protected Control createDialogArea(Composite parent) {
+ Composite composite = (Composite) super.createDialogArea(parent);
+
+ Label helpLabel = new Label(composite, SWT.WRAP);
+ helpLabel.setText(JptUiPersistenceMessages.ArchiveFileSelectionDialog_jarPathHelpLabel);
+ GridData gd = new GridData(GridData.FILL_HORIZONTAL);
+ gd.widthHint = 400;
+ helpLabel.setLayoutData(gd);
+
+ Composite subComposite = new Composite(composite, SWT.NONE);
+ subComposite.setLayout(new GridLayout(2, false));
+ subComposite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+ Label jarPathLabel = new Label(subComposite, SWT.NONE);
+ jarPathLabel.setFont(composite.getFont());
+ jarPathLabel.setText(JptUiPersistenceMessages.ArchiveFileSelectionDialog_jarPathLabel);
+
+ Text jarPathText = new Text(subComposite, SWT.BORDER);
+ jarPathText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+ SWTTools.bind(jarPathModel, jarPathText);
+
+ return composite;
+ }
+
+ @Override
+ protected TreeViewer doCreateTreeViewer(Composite parent, int style) {
+ TreeViewer treeViewer = super.doCreateTreeViewer(parent, style);
+
+ treeViewer.addSelectionChangedListener(
+ new ISelectionChangedListener() {
+ public void selectionChanged(SelectionChangedEvent event) {
+ updateJarPathModel(event.getSelection());
+ }
+ });
+
+ return treeViewer;
+ }
+
+ protected void updateJarPathModel(ISelection selection) {
+ Object selectedObj = ((IStructuredSelection) selection).getFirstElement();
+ if (selectedObj instanceof IFile) {
+ this.jarPathModel.setValue(calculateDeployPath((IFile) selectedObj));
+ }
+ else {
+ this.jarPathModel.setValue("");
+ }
+ }
+
+ protected String calculateDeployPath(IFile archiveFile) {
+ return this.pathCalculator.calculateDeploymentPath(archiveFile);
+ }
+
+ @Override
+ protected void computeResult() {
+ setResult(Collections.singletonList(this.jarPathModel.getValue()));
+ }
+
+
+ private static class ArchiveFileSelectionValidator
+ implements ISelectionStatusValidator
+ {
+ public ArchiveFileSelectionValidator() {
+ super();
+ }
+
+
+ public IStatus validate(Object[] selection) {
+ int nSelected= selection.length;
+ if (nSelected == 0 || (nSelected > 1)) {
+ return new Status(IStatus.ERROR, JptJpaUiPlugin.PLUGIN_ID, ""); //$NON-NLS-1$
+ }
+ for (int i= 0; i < selection.length; i++) {
+ Object curr= selection[i];
+ if (curr instanceof IFile) {
+ return new Status(IStatus.OK, JptJpaUiPlugin.PLUGIN_ID, ""); //$NON-NLS-1$
+ }
+ }
+ return new Status(IStatus.ERROR, JptJpaUiPlugin.PLUGIN_ID, ""); //$NON-NLS-1$
+ }
+ }
+
+
+ public static interface DeploymentPathCalculator
+ {
+ String calculateDeploymentPath(IFile file);
+ }
+
+
+ public static class SimpleDeploymentPathCalculator
+ implements DeploymentPathCalculator
+ {
+ public String calculateDeploymentPath(IFile file) {
+ return file.getName();
+ }
+ }
+
+
+ public static class ModuleDeploymentPathCalculator
+ extends SimpleDeploymentPathCalculator
+ {
+ @Override
+ public String calculateDeploymentPath(IFile file) {
+ // first look for virtual component that matches this file, returning
+ // the path to that virtual component
+ IVirtualComponent vComponent = ComponentCore.createComponent(file.getProject());
+ if (vComponent != null) {
+ IVirtualFolder vFolder = vComponent.getRootFolder();
+ IVirtualFile vFile = findVirtualFile(vFolder, file);
+ if (vFile != null) {
+ return calculatePersistenceRootRelativePath(vFile);
+ }
+ }
+
+ // then default to simple behavior
+ return super.calculateDeploymentPath(file);
+ }
+
+ protected IVirtualFile findVirtualFile(IVirtualContainer vContainer, IFile realFile) {
+ try {
+ for (IVirtualResource vResource : vContainer.members()) {
+ if (vResource.getType() == IVirtualResource.FILE) {
+ IVirtualFile vFile = (IVirtualFile) vResource;
+ if (realFile.equals(vFile.getUnderlyingFile())) {
+ return vFile;
+ }
+ }
+ else {
+ IVirtualFile vFile = findVirtualFile((IVirtualContainer) vResource, realFile);
+ if (vFile != null) {
+ return vFile;
+ }
+ }
+ }
+ }
+ catch (CoreException ce) {
+ JptJpaUiPlugin.log(ce);
+ }
+
+ return null;
+ }
+
+ protected String calculatePersistenceRootRelativePath(IVirtualFile vFile) {
+ IProject project = vFile.getProject();
+ IPath puRootPath = JptJpaCorePlugin.getJarRuntimeRootPath(project);
+
+ IPath path = vFile.getRuntimePath().makeRelativeTo(puRootPath);
+
+ return path.toString();
+ }
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/persistence/details/GenericPersistenceUnitGeneralComposite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/persistence/details/GenericPersistenceUnitGeneralComposite.java
new file mode 100644
index 0000000000..5c25dab4de
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/persistence/details/GenericPersistenceUnitGeneralComposite.java
@@ -0,0 +1,116 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2009 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.ui.internal.persistence.details;
+
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.persistence.PersistenceUnit;
+import org.eclipse.jpt.jpa.ui.details.JpaPageComposite;
+import org.eclipse.jpt.jpa.ui.internal.persistence.JptUiPersistenceMessages;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * Here the layout of this pane:
+ * <pre>
+ * -----------------------------------------------------------------------------
+ * | |
+ * | - General --------------------------------------------------------------- |
+ * | ------------------------------------------------- |
+ * | Name: | I | |
+ * | ------------------------------------------------- |
+ * | ------------------------------------------------- |
+ * | Persistence Provider: | |v| |
+ * | ------------------------------------------------- |
+ * | |
+ * | |
+ * | - Mapped Classes -------------------------------------------------------- |
+ * | |
+ * | Description |
+ * | |
+ * | ----------------------------------------------------------------------- |
+ * | | | |
+ * | | PersistenceUnitMappedClassesComposite | |
+ * | | | |
+ * | ----------------------------------------------------------------------- |
+ * | |
+ * | |
+ * | - XML Mapping Files ----------------------------------------------------- |
+ * | |
+ * | Description |
+ * | |
+ * | ----------------------------------------------------------------------- |
+ * | | | |
+ * | | PersistenceUnitMappingFilesComposite | |
+ * | | | |
+ * | ----------------------------------------------------------------------- |
+ * -----------------------------------------------------------------------------</pre>
+ *
+ * @see PersistenceUnit
+ * @see PersistenceUnitJarFilesComposite
+ * @see PersistenceUnitMappedClassesComposite
+ * @see PersistenceUnitMappingFilesComposite
+ *
+ * @version 2.0
+ * @since 2.0
+ */
+public class GenericPersistenceUnitGeneralComposite extends PersistenceUnitGeneralComposite
+ implements JpaPageComposite
+{
+ /**
+ * Creates a new <code>PersistenceUnitGeneralComposite</code>.
+ *
+ * @param subjectHolder The holder of this pane's subject
+ * @param parent The parent container
+ * @param widgetFactory The factory used to create various common widgets
+ */
+ public GenericPersistenceUnitGeneralComposite(PropertyValueModel<PersistenceUnit> subjectHolder,
+ Composite container,
+ WidgetFactory widgetFactory) {
+
+ super(subjectHolder, container, widgetFactory);
+ }
+
+ @Override
+ protected void initializeLayout(Composite container) {
+
+ initializeGeneralPane(container);
+ initializeMappedClassesPane(container);
+ initializeJPAMappingDescriptorsPane(container);
+ initializeJarFilesPane(container);
+ }
+
+
+ protected void initializeJPAMappingDescriptorsPane(Composite container) {
+
+ container = addCollapsibleSection(
+ container,
+ JptUiPersistenceMessages.PersistenceUnitGeneralComposite_jpaMappingDescriptors,
+ JptUiPersistenceMessages.PersistenceUnitGeneralComposite_jpaMappingDescriptors_description
+ );
+
+ updateGridData(container);
+ updateGridData(container.getParent());
+
+ new GenericPersistenceUnitMappingFilesComposite(this, container);
+ }
+
+ protected void initializeJarFilesPane(Composite container) {
+
+ container = addCollapsibleSection(
+ container,
+ JptUiPersistenceMessages.PersistenceUnitGeneralComposite_jarFiles
+ );
+
+ updateGridData(container);
+ updateGridData(container.getParent());
+
+ new GenericPersistenceUnitJarFilesComposite(this, container);
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/persistence/details/GenericPersistenceUnitJarFilesComposite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/persistence/details/GenericPersistenceUnitJarFilesComposite.java
new file mode 100644
index 0000000000..7fde0e2c0f
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/persistence/details/GenericPersistenceUnitJarFilesComposite.java
@@ -0,0 +1,26 @@
+/*******************************************************************************
+ * Copyright (c) 2009 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.ui.internal.persistence.details;
+
+import org.eclipse.jpt.common.ui.internal.widgets.Pane;
+import org.eclipse.jpt.jpa.core.context.persistence.PersistenceUnit;
+import org.eclipse.swt.widgets.Composite;
+
+public class GenericPersistenceUnitJarFilesComposite
+ extends PersistenceUnitJarFilesComposite
+{
+ public GenericPersistenceUnitJarFilesComposite(
+ Pane<? extends PersistenceUnit> parentPane,
+ Composite parent) {
+
+ super(parentPane, parent);
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/persistence/details/GenericPersistenceUnitMappingFilesComposite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/persistence/details/GenericPersistenceUnitMappingFilesComposite.java
new file mode 100644
index 0000000000..c99cbb4d4b
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/persistence/details/GenericPersistenceUnitMappingFilesComposite.java
@@ -0,0 +1,52 @@
+/*******************************************************************************
+ * Copyright (c) 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.jpa.ui.internal.persistence.details;
+
+import org.eclipse.jpt.common.ui.internal.widgets.Pane;
+import org.eclipse.jpt.jpa.core.context.persistence.PersistenceUnit;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * Here the layout of this pane:
+ * <pre>
+ * -----------------------------------------------------------------------------
+ * | ------------------------------------------------------------------------- |
+ * | | | |
+ * | | AddRemoveListPane | |
+ * | | | |
+ * | ------------------------------------------------------------------------- |
+ * -----------------------------------------------------------------------------</pre>
+ *
+ * @see PersistenceUnit
+ * @see PersistenceUnitGeneralComposite - The parent container
+ * @see AddRemoveListPane
+ *
+ * @version 2.0
+ * @since 2.0
+ */
+public class GenericPersistenceUnitMappingFilesComposite extends PersistenceUnitMappingFilesComposite
+{
+ /**
+ * Creates a new <code>PersistenceUnitMappingFilesComposite</code>.
+ *
+ * @param parentPane The parent pane of this one
+ * @param parent The parent container
+ */
+ public GenericPersistenceUnitMappingFilesComposite(Pane<? extends PersistenceUnit> parentPane,
+ Composite parent) {
+
+ super(parentPane, parent);
+ }
+
+ @Override
+ protected void initializeLayout(Composite container) {
+ addMappingFilesList(container);
+ }
+} \ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/persistence/details/GenericPersistenceXmlUiFactory.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/persistence/details/GenericPersistenceXmlUiFactory.java
new file mode 100644
index 0000000000..5a98afe62e
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/persistence/details/GenericPersistenceXmlUiFactory.java
@@ -0,0 +1,38 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 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.ui.internal.persistence.details;
+
+import java.util.ArrayList;
+import java.util.ListIterator;
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.persistence.PersistenceUnit;
+import org.eclipse.jpt.jpa.ui.details.JpaPageComposite;
+import org.eclipse.swt.widgets.Composite;
+
+public class GenericPersistenceXmlUiFactory implements PersistenceXmlUiFactory
+{
+ // **************** persistence unit composites ****************************
+
+ public ListIterator<JpaPageComposite> createPersistenceUnitComposites(
+ PropertyValueModel<PersistenceUnit> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory) {
+
+ ArrayList<JpaPageComposite> pages = new ArrayList<JpaPageComposite>(3);
+
+ pages.add(new GenericPersistenceUnitGeneralComposite(subjectHolder, parent, widgetFactory));
+ pages.add(new PersistenceUnitConnectionComposite(subjectHolder, parent, widgetFactory));
+ pages.add(new PersistenceUnitPropertiesComposite(subjectHolder, parent, widgetFactory));
+
+ return pages.listIterator();
+ }
+
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/persistence/details/PersistenceUnitClassesComposite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/persistence/details/PersistenceUnitClassesComposite.java
new file mode 100644
index 0000000000..fe474335d2
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/persistence/details/PersistenceUnitClassesComposite.java
@@ -0,0 +1,376 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 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.ui.internal.persistence.details;
+
+import java.util.ListIterator;
+import org.eclipse.jdt.core.IJavaElement;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.jdt.core.search.IJavaSearchScope;
+import org.eclipse.jdt.core.search.SearchEngine;
+import org.eclipse.jdt.ui.IJavaElementSearchConstants;
+import org.eclipse.jdt.ui.JavaUI;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.window.Window;
+import org.eclipse.jpt.common.ui.internal.JptCommonUiMessages;
+import org.eclipse.jpt.common.ui.internal.widgets.AddRemoveListPane;
+import org.eclipse.jpt.common.ui.internal.widgets.Pane;
+import org.eclipse.jpt.common.ui.internal.widgets.AddRemovePane.Adapter;
+import org.eclipse.jpt.common.utility.internal.model.value.ItemPropertyListValueModelAdapter;
+import org.eclipse.jpt.common.utility.internal.model.value.ListAspectAdapter;
+import org.eclipse.jpt.common.utility.internal.model.value.PropertyAspectAdapter;
+import org.eclipse.jpt.common.utility.internal.model.value.SimplePropertyValueModel;
+import org.eclipse.jpt.common.utility.internal.model.value.TransformationPropertyValueModel;
+import org.eclipse.jpt.common.utility.internal.model.value.swing.ObjectListSelectionModel;
+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.core.context.java.JavaPersistentType;
+import org.eclipse.jpt.jpa.core.context.persistence.ClassRef;
+import org.eclipse.jpt.jpa.core.context.persistence.PersistenceUnit;
+import org.eclipse.jpt.jpa.ui.JptJpaUiPlugin;
+import org.eclipse.jpt.jpa.ui.internal.JpaHelpContextIds;
+import org.eclipse.jpt.jpa.ui.internal.JpaMappingImageHelper;
+import org.eclipse.jpt.jpa.ui.internal.JptUiIcons;
+import org.eclipse.jpt.jpa.ui.internal.persistence.JptUiPersistenceMessages;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.dialogs.SelectionDialog;
+import org.eclipse.ui.progress.IProgressService;
+
+/**
+ * Here the layout of this pane:
+ * <pre>
+ * -----------------------------------------------------------------------------
+ * | |
+ * | Description |
+ * | |
+ * | ------------------------------------------------------------------------- |
+ * | | | |
+ * | | AddRemoveListPane | |
+ * | | | |
+ * | ------------------------------------------------------------------------- |
+ * | |
+ * | x Exclude Unlisted Mapped Classes |
+ * | |
+ * -----------------------------------------------------------------------------</pre>
+ *
+ * @see PersistenceUnit
+ * @see PersistenceUnitGeneralComposite - The parent container
+ * @see AddRemoveListPane
+ *
+ * @version 2.3
+ * @since 2.0
+ */
+@SuppressWarnings("nls")
+public class PersistenceUnitClassesComposite extends Pane<PersistenceUnit>
+{
+ /**
+ * Creates a new <code>PersistenceUnitMappedClassesComposite</code>.
+ *
+ * @param parentPane The parent pane of this one
+ * @param parent The parent container
+ */
+ public PersistenceUnitClassesComposite(Pane<? extends PersistenceUnit> parentPane,
+ Composite parent) {
+
+ super(parentPane, parent);
+ }
+
+ private void addMappedClass(ObjectListSelectionModel listSelectionModel) {
+
+ IType type = chooseType();
+
+ if (type != null) {
+ String className = type.getFullyQualifiedName('$');
+ if(classRefExists(className)) {
+ return;
+ }
+ ClassRef classRef = getSubject().addSpecifiedClassRef(className);
+ listSelectionModel.setSelectedValue(classRef);
+ }
+ }
+
+ private boolean classRefExists(String className) {
+ for ( ListIterator<ClassRef> i = getSubject().specifiedClassRefs(); i.hasNext(); ) {
+ ClassRef classRef = i.next();
+ if( classRef.getClassName().equals(className)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ private Adapter buildAdapter() {
+ return new AddRemoveListPane.AbstractAdapter() {
+ public void addNewItem(ObjectListSelectionModel listSelectionModel) {
+ addMappedClass(listSelectionModel);
+ }
+
+ @Override
+ public boolean enableOptionOnSelectionChange(ObjectListSelectionModel listSelectionModel) {
+ if (!super.enableOptionOnSelectionChange(listSelectionModel)) {
+ return false;
+ }
+
+ return findType((ClassRef) listSelectionModel.selectedValue()) != null;
+ }
+
+ @Override
+ public boolean hasOptionalButton() {
+ return true;
+ }
+
+ @Override
+ public String optionalButtonText() {
+ return JptUiPersistenceMessages.PersistenceUnitClassesComposite_open;
+ }
+
+ @Override
+ public void optionOnSelection(ObjectListSelectionModel listSelectionModel) {
+ openMappedClass((ClassRef) listSelectionModel.selectedValue());
+ }
+
+ public void removeSelectedItems(ObjectListSelectionModel listSelectionModel) {
+ for (Object item : listSelectionModel.selectedValues()) {
+ getSubject().removeSpecifiedClassRef((ClassRef) item);
+ }
+ }
+ };
+ }
+
+ private WritablePropertyValueModel<Boolean> buildExcludeUnlistedMappedClassesHolder() {
+ return new PropertyAspectAdapter<PersistenceUnit, Boolean>(
+ getSubjectHolder(),
+ PersistenceUnit.SPECIFIED_EXCLUDE_UNLISTED_CLASSES_PROPERTY)
+ {
+ @Override
+ protected Boolean buildValue_() {
+ return this.subject.getSpecifiedExcludeUnlistedClasses();
+ }
+
+ @Override
+ protected void setValue_(Boolean value) {
+ this.subject.setSpecifiedExcludeUnlistedClasses(value);
+ }
+ };
+ }
+
+ private PropertyValueModel<String> buildExcludeUnlistedMappedClassesStringHolder() {
+ return new TransformationPropertyValueModel<Boolean, String>(buildDefaultExcludeUnlistedMappedClassesHolder()) {
+ @Override
+ protected String transform(Boolean value) {
+ if (value != null) {
+ String defaultStringValue = value.booleanValue() ? JptCommonUiMessages.Boolean_True : JptCommonUiMessages.Boolean_False;
+ return NLS.bind(JptUiPersistenceMessages.PersistenceUnitClassesComposite_excludeUnlistedMappedClassesWithDefault, defaultStringValue);
+ }
+ return JptUiPersistenceMessages.PersistenceUnitClassesComposite_excludeUnlistedMappedClasses;
+ }
+ };
+ }
+
+ private PropertyValueModel<Boolean> buildDefaultExcludeUnlistedMappedClassesHolder() {
+ return new PropertyAspectAdapter<PersistenceUnit, Boolean>(
+ getSubjectHolder(),
+ PersistenceUnit.SPECIFIED_EXCLUDE_UNLISTED_CLASSES_PROPERTY,
+ PersistenceUnit.DEFAULT_EXCLUDE_UNLISTED_CLASSES_PROPERTY)
+ {
+ @Override
+ protected Boolean buildValue_() {
+ if (this.subject.getSpecifiedExcludeUnlistedClasses() != null) {
+ return null;
+ }
+ return Boolean.valueOf(this.subject.getDefaultExcludeUnlistedClasses());
+ }
+ };
+ }
+ private ILabelProvider buildLabelProvider() {
+ return new LabelProvider() {
+ @Override
+ public Image getImage(Object element) {
+ ClassRef classRef = (ClassRef) element;
+ JavaPersistentType persistentType = classRef.getJavaPersistentType();
+ Image image = null;
+
+ if (persistentType != null) {
+ image = JpaMappingImageHelper.imageForTypeMapping(persistentType.getMappingKey());
+ }
+
+ if (image != null) {
+ return image;
+ }
+
+ return JptJpaUiPlugin.getImage(JptUiIcons.WARNING);
+ }
+
+ @Override
+ public String getText(Object element) {
+ ClassRef classRef = (ClassRef) element;
+ String name = classRef.getClassName();
+
+ if (name == null) {
+ name = JptUiPersistenceMessages.PersistenceUnitClassesComposite_mappedClassesNoName;
+ }
+
+ return name;
+ }
+ };
+ }
+
+ private ListValueModel<ClassRef> buildItemListHolder() {
+ return new ItemPropertyListValueModelAdapter<ClassRef>(
+ buildListHolder(),
+ ClassRef.JAVA_PERSISTENT_TYPE_PROPERTY,
+ ClassRef.CLASS_NAME_PROPERTY
+ );
+ }
+
+ private ListValueModel<ClassRef> buildListHolder() {
+ return new ListAspectAdapter<PersistenceUnit, ClassRef>(getSubjectHolder(), PersistenceUnit.SPECIFIED_CLASS_REFS_LIST) {
+ @Override
+ protected ListIterator<ClassRef> listIterator_() {
+ return subject.specifiedClassRefs();
+ }
+
+ @Override
+ protected int size_() {
+ return subject.specifiedClassRefsSize();
+ }
+ };
+ }
+
+ private WritablePropertyValueModel<ClassRef> buildSelectedItemHolder() {
+ return new SimplePropertyValueModel<ClassRef>();
+ }
+
+ /**
+ * Prompts the user the Open Type dialog.
+ *
+ * @return Either the selected type or <code>null</code> if the user
+ * canceled the dialog
+ */
+ private IType chooseType() {
+ IJavaProject javaProject = getJavaProject();
+ IJavaElement[] elements = new IJavaElement[] { javaProject };
+ IJavaSearchScope scope = SearchEngine.createJavaSearchScope(elements);
+ IProgressService service = PlatformUI.getWorkbench().getProgressService();
+ SelectionDialog typeSelectionDialog;
+
+ try {
+ typeSelectionDialog = JavaUI.createTypeDialog(
+ getShell(),
+ service,
+ scope,
+ IJavaElementSearchConstants.CONSIDER_CLASSES,
+ false,
+ ""
+ );
+ }
+ catch (JavaModelException e) {
+ JptJpaUiPlugin.log(e);
+ return null;
+ }
+
+ typeSelectionDialog.setTitle(JptCommonUiMessages.ClassChooserPane_dialogTitle);
+ typeSelectionDialog.setMessage(JptCommonUiMessages.ClassChooserPane_dialogMessage);
+
+ if (typeSelectionDialog.open() == Window.OK) {
+ return (IType) typeSelectionDialog.getResult()[0];
+ }
+
+ return null;
+ }
+
+ private IType findType(ClassRef classRef) {
+ String className = classRef.getClassName();
+
+ if (className != null) {
+ try {
+ return getSubject().getJpaProject().getJavaProject().findType(className.replace('$', '.'));
+ }
+ catch (JavaModelException e) {
+ JptJpaUiPlugin.log(e);
+ }
+ }
+
+ return null;
+ }
+
+ /*
+ * (non-Javadoc)
+ */
+ @Override
+ protected void initializeLayout(Composite container) {
+
+ // Description
+ addMultiLineLabel(
+ container,
+ JptUiPersistenceMessages.PersistenceUnitClassesComposite_description
+ );
+
+ // List pane
+ new AddRemoveListPane<PersistenceUnit>(
+ this,
+ container,
+ this.buildAdapter(),
+ this.buildItemListHolder(),
+ this.buildSelectedItemHolder(),
+ this.buildLabelProvider(),
+ JpaHelpContextIds.PERSISTENCE_XML_GENERAL
+ )
+ {
+ @Override
+ protected void initializeTable(Table table) {
+ super.initializeTable(table);
+
+ Composite container = table.getParent();
+ GridData gridData = (GridData) container.getLayoutData();
+ gridData.heightHint = 75;
+ }
+ };
+
+ this.addTriStateCheckBoxWithDefault(
+ container,
+ JptUiPersistenceMessages.PersistenceUnitClassesComposite_excludeUnlistedMappedClasses,
+ buildExcludeUnlistedMappedClassesHolder(),
+ buildExcludeUnlistedMappedClassesStringHolder(),
+ JpaHelpContextIds.PERSISTENCE_XML_GENERAL
+ );
+ }
+
+ private void openMappedClass(ClassRef classRef) {
+
+ IType type = findType(classRef);
+
+ if (type != null) {
+ try {
+ IJavaElement javaElement = type.getParent();
+ JavaUI.openInEditor(javaElement, true, true);
+ }
+ catch (PartInitException e) {
+ JptJpaUiPlugin.log(e);
+ }
+ catch (JavaModelException e) {
+ JptJpaUiPlugin.log(e);
+ }
+ }
+ }
+
+ private IJavaProject getJavaProject() {
+ return getSubject().getJpaProject().getJavaProject();
+ }
+} \ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/persistence/details/PersistenceUnitConnectionComposite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/persistence/details/PersistenceUnitConnectionComposite.java
new file mode 100644
index 0000000000..6214cb00ed
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/persistence/details/PersistenceUnitConnectionComposite.java
@@ -0,0 +1,144 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 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.ui.internal.persistence.details;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.ui.internal.widgets.Pane;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.persistence.PersistenceUnit;
+import org.eclipse.jpt.jpa.ui.details.JpaPageComposite;
+import org.eclipse.jpt.jpa.ui.internal.JpaHelpContextIds;
+import org.eclipse.jpt.jpa.ui.internal.persistence.JptUiPersistenceMessages;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * Here the layout of this pane:
+ * <pre>
+ * -----------------------------------------------------------------------------
+ * | |
+ * | - General --------------------------------------------------------------- |
+ * | ------------------------------------------------------------------------- |
+ * | | | |
+ * | | PersistenceUnitConnectionGeneralComposite | |
+ * | | | |
+ * | ------------------------------------------------------------------------- |
+ * | |
+ * | - Database -------------------------------------------------------------- |
+ * | ------------------------------------------------------------------------- |
+ * | | | |
+ * | | PersistenceUnitConnectionDatabaseComposite | |
+ * | | | |
+ * | ------------------------------------------------------------------------- |
+ * -----------------------------------------------------------------------------</pre>
+ *
+ * @see PersistenceUnit
+ * @see PersistenceUnitConnectionGeneralComposite
+ * @see PersistenceUnitConnectionDatabaseComposite
+ *
+ * @version 2.0
+ * @since 2.0
+ */
+public class PersistenceUnitConnectionComposite extends Pane<PersistenceUnit>
+ implements JpaPageComposite
+{
+ /**
+ * Creates a new <code>PersistenceUnitConnectionComposite</code>.
+ *
+ * @param subjectHolder The holder of this pane's subject
+ * @param parent The parent container
+ * @param widgetFactory The factory used to create various common widgets
+ */
+ public PersistenceUnitConnectionComposite(PropertyValueModel<PersistenceUnit> subjectHolder,
+ Composite container,
+ WidgetFactory widgetFactory) {
+
+ super(subjectHolder, container, widgetFactory);
+ }
+
+ /*
+ * (non-Javadoc)
+ */
+ @Override
+ protected Composite addContainer(Composite parent) {
+
+ GridLayout layout = new GridLayout(1, true);
+ layout.marginHeight = 0;
+ layout.marginWidth = 0;
+ layout.marginTop = 0;
+ layout.marginLeft = 0;
+ layout.marginBottom = 0;
+ layout.marginRight = 0;
+ layout.verticalSpacing = 15;
+
+ Composite container = addPane(parent, layout);
+ updateGridData(container);
+
+ return container;
+ }
+
+ /*
+ * (non-Javadoc)
+ */
+ public String getHelpID() {
+ return JpaHelpContextIds.PERSISTENCE_XML_CONNECTION;
+ }
+
+ private void initializeDatabasePane(Composite container) {
+
+ container = addSection(
+ container,
+ JptUiPersistenceMessages.PersistenceUnitConnectionComposite_database
+ );
+
+ new PersistenceUnitConnectionDatabaseComposite(this, container);
+ }
+
+ private void initializeGeneralPane(Composite container) {
+
+ container = addSection(
+ container,
+ JptUiPersistenceMessages.PersistenceUnitConnectionComposite_general
+ );
+
+ new PersistenceUnitConnectionGeneralComposite(this, container);
+ }
+
+ /*
+ * (non-Javadoc)
+ */
+ @Override
+ protected void initializeLayout(Composite container) {
+
+ initializeGeneralPane(container);
+ initializeDatabasePane(container);
+ }
+
+ public ImageDescriptor getPageImageDescriptor() {
+ return null;
+ }
+
+ public String getPageText() {
+ return JptUiPersistenceMessages.PersistenceUnitConnectionComposite_connection;
+ }
+
+ private void updateGridData(Composite container) {
+
+ GridData gridData = new GridData();
+ gridData.grabExcessHorizontalSpace = true;
+ gridData.grabExcessVerticalSpace = true;
+ gridData.horizontalAlignment = SWT.FILL;
+ gridData.verticalAlignment = SWT.FILL;
+ container.setLayoutData(gridData);
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/persistence/details/PersistenceUnitConnectionDatabaseComposite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/persistence/details/PersistenceUnitConnectionDatabaseComposite.java
new file mode 100644
index 0000000000..a4f72a4b0d
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/persistence/details/PersistenceUnitConnectionDatabaseComposite.java
@@ -0,0 +1,159 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 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.ui.internal.persistence.details;
+
+import org.eclipse.jpt.common.ui.internal.widgets.Pane;
+import org.eclipse.jpt.common.utility.internal.model.value.PropertyAspectAdapter;
+import org.eclipse.jpt.common.utility.internal.model.value.TransformationPropertyValueModel;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.common.utility.model.value.WritablePropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.persistence.PersistenceUnit;
+import org.eclipse.jpt.jpa.core.context.persistence.PersistenceUnitTransactionType;
+import org.eclipse.jpt.jpa.ui.internal.JpaHelpContextIds;
+import org.eclipse.jpt.jpa.ui.internal.persistence.JptUiPersistenceMessages;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+
+/**
+ * Here the layout of this pane:
+ * <pre>
+ * -----------------------------------------------------------------------------
+ * | ------------------------------------------------ |
+ * | JTA Datasource Name: | I | |
+ * | ------------------------------------------------ |
+ * | ------------------------------------------------ |
+ * | Non-JTA Datasource Name: | I | |
+ * | ------------------------------------------------ |
+ * -----------------------------------------------------------------------------</pre>
+ *
+ * @see PersistenceUnit
+ * @see PersistenceUnitConnectionComposite - The parent container
+ *
+ * @version 2.0
+ * @since 2.0
+ */
+public class PersistenceUnitConnectionDatabaseComposite extends Pane<PersistenceUnit>
+{
+ /**
+ * Creates a new <code>PersistenceUnitConnectionDatabaseComposite</code>.
+ *
+ * @param parentPane The parent pane of this one
+ * @param parent The parent container
+ */
+ public PersistenceUnitConnectionDatabaseComposite(Pane<PersistenceUnit> subjectHolder,
+ Composite container) {
+
+ super(subjectHolder, container);
+ }
+
+ private PropertyValueModel<Boolean> buildJTADatasourceNameBooleanHolder() {
+ return new TransformationPropertyValueModel<PersistenceUnitTransactionType, Boolean>(buildTransactionTypeHolder()) {
+ @Override
+ protected Boolean transform_(PersistenceUnitTransactionType value) {
+ return Boolean.valueOf(value == PersistenceUnitTransactionType.JTA);
+ }
+ };
+ }
+
+ private WritablePropertyValueModel<String> buildJTADatasourceNameHolder() {
+ return new PropertyAspectAdapter<PersistenceUnit, String>(getSubjectHolder(), PersistenceUnit.JTA_DATA_SOURCE_PROPERTY) {
+ @Override
+ protected String buildValue_() {
+ return subject.getJtaDataSource();
+ }
+
+ @Override
+ protected void setValue_(String value) {
+ if (value.length() == 0) {
+ value = null;
+ }
+ subject.setJtaDataSource(value);
+ }
+ };
+ }
+
+ private PropertyValueModel<Boolean> buildNonJTADatasourceNameBooleanHolder() {
+ return new TransformationPropertyValueModel<PersistenceUnitTransactionType, Boolean>(buildTransactionTypeHolder()) {
+ @Override
+ protected Boolean transform_(PersistenceUnitTransactionType value) {
+ return Boolean.valueOf(value == PersistenceUnitTransactionType.RESOURCE_LOCAL);
+ }
+ };
+ }
+
+ private WritablePropertyValueModel<String> buildNonJTADatasourceNameHolder() {
+ return new PropertyAspectAdapter<PersistenceUnit, String>(getSubjectHolder(), PersistenceUnit.NON_JTA_DATA_SOURCE_PROPERTY) {
+ @Override
+ protected String buildValue_() {
+ return subject.getNonJtaDataSource();
+ }
+
+ @Override
+ protected void setValue_(String value) {
+ if (value.length() == 0) {
+ value = null;
+ }
+ subject.setNonJtaDataSource(value);
+ }
+ };
+ }
+
+ private PropertyValueModel<PersistenceUnitTransactionType> buildTransactionTypeHolder() {
+ return new PropertyAspectAdapter<PersistenceUnit, PersistenceUnitTransactionType>(
+ getSubjectHolder(),
+ PersistenceUnit.DEFAULT_TRANSACTION_TYPE_PROPERTY,
+ PersistenceUnit.SPECIFIED_TRANSACTION_TYPE_PROPERTY)
+ {
+ @Override
+ protected PersistenceUnitTransactionType buildValue_() {
+ return subject.getTransactionType();
+ }
+ };
+ }
+
+ /*
+ * (non-Javadoc)
+ */
+ @Override
+ protected void initializeLayout(Composite container) {
+
+ // JTA Datasource Name widgets
+ PropertyValueModel<Boolean> enabled = this.buildJTADatasourceNameBooleanHolder();
+ Label label = addLabel(
+ container,
+ JptUiPersistenceMessages.PersistenceUnitConnectionDatabaseComposite_jtaDatasourceName,
+ enabled
+ );
+ Text text = addText(
+ container,
+ buildJTADatasourceNameHolder(),
+ JpaHelpContextIds.PERSISTENCE_XML_CONNECTION,
+ enabled
+ );
+ addLabeledComposite(container, label, text, JpaHelpContextIds.PERSISTENCE_XML_CONNECTION);
+
+
+ // Non-JTA Datasource Name widgets
+ enabled = this.buildNonJTADatasourceNameBooleanHolder();
+ label = addLabel(
+ container,
+ JptUiPersistenceMessages.PersistenceUnitConnectionDatabaseComposite_nonJtaDatasourceName,
+ enabled
+ );
+ text = addText(
+ container,
+ buildNonJTADatasourceNameHolder(),
+ JpaHelpContextIds.PERSISTENCE_XML_CONNECTION,
+ enabled
+ );
+ addLabeledComposite(container, label, text, JpaHelpContextIds.PERSISTENCE_XML_CONNECTION);
+ }
+} \ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/persistence/details/PersistenceUnitConnectionGeneralComposite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/persistence/details/PersistenceUnitConnectionGeneralComposite.java
new file mode 100644
index 0000000000..be160c8996
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/persistence/details/PersistenceUnitConnectionGeneralComposite.java
@@ -0,0 +1,106 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2009 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.ui.internal.persistence.details;
+
+import java.util.Collection;
+import org.eclipse.jpt.common.ui.internal.widgets.EnumFormComboViewer;
+import org.eclipse.jpt.common.ui.internal.widgets.Pane;
+import org.eclipse.jpt.jpa.core.context.persistence.PersistenceUnit;
+import org.eclipse.jpt.jpa.core.context.persistence.PersistenceUnitTransactionType;
+import org.eclipse.jpt.jpa.ui.internal.JpaHelpContextIds;
+import org.eclipse.jpt.jpa.ui.internal.persistence.JptUiPersistenceMessages;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * Here the layout of this pane:
+ * <pre>
+ * -----------------------------------------------------------------------------
+ * | ------------------------------------------------------ |
+ * | Transaction Type: | |v| |
+ * | ------------------------------------------------------ |
+ * -----------------------------------------------------------------------------</pre>
+ *
+ * @see PersistenceUnit
+ * @see PersistenceUnitConnectionComposite - The parent container
+ *
+ * @version 2.0
+ * @since 2.0
+ */
+public class PersistenceUnitConnectionGeneralComposite extends Pane<PersistenceUnit>
+{
+ /**
+ * Creates a new <code>PersistenceUnitConnectionGeneralComposite</code>.
+ *
+ * @param parentPane The parent pane of this one
+ * @param parent The parent container
+ */
+ public PersistenceUnitConnectionGeneralComposite(Pane<PersistenceUnit> subjectHolder,
+ Composite container) {
+
+ super(subjectHolder, container);
+ }
+
+ private EnumFormComboViewer<PersistenceUnit, PersistenceUnitTransactionType> buildTransactionTypeCombo(Composite container) {
+
+ return new EnumFormComboViewer<PersistenceUnit, PersistenceUnitTransactionType>(this, container) {
+
+ @Override
+ protected void addPropertyNames(Collection<String> propertyNames) {
+ super.addPropertyNames(propertyNames);
+ propertyNames.add(PersistenceUnit.SPECIFIED_TRANSACTION_TYPE_PROPERTY);
+ propertyNames.add(PersistenceUnit.DEFAULT_TRANSACTION_TYPE_PROPERTY);
+ }
+
+ @Override
+ protected PersistenceUnitTransactionType[] getChoices() {
+ return PersistenceUnitTransactionType.values();
+ }
+
+ @Override
+ protected PersistenceUnitTransactionType getDefaultValue() {
+ return getSubject().getDefaultTransactionType();
+ }
+
+ @Override
+ protected String displayString(PersistenceUnitTransactionType value) {
+ return buildDisplayString(
+ JptUiPersistenceMessages.class,
+ PersistenceUnitConnectionGeneralComposite.this,
+ value
+ );
+ }
+
+ @Override
+ protected PersistenceUnitTransactionType getValue() {
+ return getSubject().getSpecifiedTransactionType();
+ }
+
+ @Override
+ protected void setValue(PersistenceUnitTransactionType value) {
+ getSubject().setSpecifiedTransactionType(value);
+ }
+ };
+ }
+
+ /*
+ * (non-Javadoc)
+ */
+ @Override
+ protected void initializeLayout(Composite container) {
+
+ // Transaction Type widgets
+ addLabeledComposite(
+ container,
+ JptUiPersistenceMessages.PersistenceUnitConnectionGeneralComposite_transactionType,
+ buildTransactionTypeCombo(container).getControl(),
+ JpaHelpContextIds.PERSISTENCE_XML_CONNECTION
+ );
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/persistence/details/PersistenceUnitGeneralComposite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/persistence/details/PersistenceUnitGeneralComposite.java
new file mode 100644
index 0000000000..00d02e800c
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/persistence/details/PersistenceUnitGeneralComposite.java
@@ -0,0 +1,230 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 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.ui.internal.persistence.details;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.ui.internal.widgets.Pane;
+import org.eclipse.jpt.common.utility.internal.model.value.PropertyAspectAdapter;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.common.utility.model.value.WritablePropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.persistence.PersistenceUnit;
+import org.eclipse.jpt.jpa.ui.details.JpaPageComposite;
+import org.eclipse.jpt.jpa.ui.internal.JpaHelpContextIds;
+import org.eclipse.jpt.jpa.ui.internal.persistence.JptUiPersistenceMessages;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * Here the layout of this pane:
+ * <pre>
+ * -----------------------------------------------------------------------------
+ * | |
+ * | - General --------------------------------------------------------------- |
+ * | ------------------------------------------------- |
+ * | Name: | I | |
+ * | ------------------------------------------------- |
+ * | ------------------------------------------------- |
+ * | Persistence Provider: | |v| |
+ * | ------------------------------------------------- |
+ * | |
+ * | |
+ * | - Mapped Classes -------------------------------------------------------- |
+ * | |
+ * | Description |
+ * | |
+ * | ----------------------------------------------------------------------- |
+ * | | | |
+ * | | PersistenceUnitMappedClassesComposite | |
+ * | | | |
+ * | ----------------------------------------------------------------------- |
+ * | |
+ * | |
+ * | - XML Mapping Files ----------------------------------------------------- |
+ * | |
+ * | Description |
+ * | |
+ * | ----------------------------------------------------------------------- |
+ * | | | |
+ * | | PersistenceUnitMappingFilesComposite | |
+ * | | | |
+ * | ----------------------------------------------------------------------- |
+ * | |
+ * | |
+ * | - JAR Files ------------------------------------------------------------- |
+ * | |
+ * | Description |
+ * | |
+ * | ----------------------------------------------------------------------- |
+ * | | | |
+ * | | PersistenceUnitJarFilesComposite | |
+ * | | | |
+ * | ----------------------------------------------------------------------- |
+ * -----------------------------------------------------------------------------</pre>
+ *
+ * @see PersistenceUnit
+ * @see PersistenceUnitMappedClassesComposite
+ * @see PersistenceUnitMappingFilesComposite
+ * @see PersistenceUnitJarFilesComposite
+ *
+ * @version 2.0
+ * @since 2.0
+ */
+public abstract class PersistenceUnitGeneralComposite extends Pane<PersistenceUnit>
+ implements JpaPageComposite
+{
+ /**
+ * Creates a new <code>PersistenceUnitGeneralComposite</code>.
+ *
+ * @param subjectHolder The holder of this pane's subject
+ * @param parent The parent container
+ * @param widgetFactory The factory used to create various common widgets
+ */
+ public PersistenceUnitGeneralComposite(PropertyValueModel<? extends PersistenceUnit> subjectHolder,
+ Composite container,
+ WidgetFactory widgetFactory) {
+
+ super(subjectHolder, container, widgetFactory);
+ }
+
+
+ /*
+ * (non-Javadoc)
+ */
+ @Override
+ protected Composite addContainer(Composite parent) {
+ Composite container = addSubPane(parent);
+ updateGridData(container);
+
+ return container;
+ }
+
+ private WritablePropertyValueModel<String> buildPersistenceProviderHolder() {
+ return new PropertyAspectAdapter<PersistenceUnit, String>(getSubjectHolder(), PersistenceUnit.PROVIDER_PROPERTY) {
+ @Override
+ protected String buildValue_() {
+ return subject.getProvider();
+ }
+
+ @Override
+ protected void setValue_(String value) {
+ if (value.length() == 0) {
+ value = null;
+ }
+ subject.setProvider(value);
+ }
+ };
+ }
+
+ private WritablePropertyValueModel<String> buildPersistenceUnitNameHolder() {
+ return new PropertyAspectAdapter<PersistenceUnit, String>(getSubjectHolder(), PersistenceUnit.NAME_PROPERTY) {
+ @Override
+ protected String buildValue_() {
+ return subject.getName();
+ }
+
+ @Override
+ protected void setValue_(String value) {
+ subject.setName(value);
+ }
+ };
+ }
+
+ private WritablePropertyValueModel<String> buildPersistenceUnitDescriptionHolder() {
+ return new PropertyAspectAdapter<PersistenceUnit, String>(getSubjectHolder(), PersistenceUnit.DESCRIPTION_PROPERTY) {
+ @Override
+ protected String buildValue_() {
+ return subject.getDescription();
+ }
+
+ @Override
+ protected void setValue_(String value) {
+ if (value.length() == 0) {
+ value = null;
+ }
+ subject.setDescription(value);
+ }
+ };
+ }
+
+ /*
+ * (non-Javadoc)
+ */
+ public String getHelpID() {
+ return JpaHelpContextIds.PERSISTENCE_XML_GENERAL;
+ }
+
+ public ImageDescriptor getPageImageDescriptor() {
+ return null;
+ }
+
+ /*
+ * (non-Javadoc)
+ */
+ public String getPageText() {
+ return JptUiPersistenceMessages.PersistenceUnitGeneralComposite_general;
+ }
+
+ protected void initializeGeneralPane(Composite container) {
+
+ container = this.addSection(
+ container,
+ JptUiPersistenceMessages.PersistenceUnitGeneralComposite_general
+ );
+
+ // Name widgets
+ this.addLabeledText(
+ container,
+ JptUiPersistenceMessages.PersistenceUnitGeneralComposite_name,
+ this.buildPersistenceUnitNameHolder(),
+ this.getHelpID()
+ );
+
+ // Persistence Provider widgets
+ this.addLabeledText(
+ container,
+ JptUiPersistenceMessages.PersistenceUnitGeneralComposite_persistenceProvider,
+ this.buildPersistenceProviderHolder(),
+ this.getHelpID()
+ );
+
+ // Description widgets
+ this.addLabeledText(
+ container,
+ JptUiPersistenceMessages.PersistenceUnitGeneralComposite_description,
+ this.buildPersistenceUnitDescriptionHolder(),
+ this.getHelpID()
+ );
+ }
+
+ protected void initializeMappedClassesPane(Composite container) {
+
+ container = addCollapsibleSection(
+ container,
+ JptUiPersistenceMessages.PersistenceUnitGeneralComposite_mappedClasses
+ );
+
+ updateGridData(container);
+ updateGridData(container.getParent());
+
+ new PersistenceUnitClassesComposite(this, container);
+ }
+
+ protected void updateGridData(Composite container) {
+
+ GridData gridData = new GridData();
+ gridData.grabExcessHorizontalSpace = true;
+ gridData.grabExcessVerticalSpace = true;
+ gridData.horizontalAlignment = SWT.FILL;
+ gridData.verticalAlignment = SWT.FILL;
+ container.setLayoutData(gridData);
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/persistence/details/PersistenceUnitJarFilesComposite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/persistence/details/PersistenceUnitJarFilesComposite.java
new file mode 100644
index 0000000000..8a2fc7cd7b
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/persistence/details/PersistenceUnitJarFilesComposite.java
@@ -0,0 +1,230 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 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.ui.internal.persistence.details;
+
+import java.util.ListIterator;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jpt.common.ui.internal.util.SWTUtil;
+import org.eclipse.jpt.common.ui.internal.widgets.AddRemoveListPane;
+import org.eclipse.jpt.common.ui.internal.widgets.Pane;
+import org.eclipse.jpt.common.ui.internal.widgets.PostExecution;
+import org.eclipse.jpt.common.ui.internal.widgets.AddRemovePane.Adapter;
+import org.eclipse.jpt.common.utility.internal.CollectionTools;
+import org.eclipse.jpt.common.utility.internal.model.value.ItemPropertyListValueModelAdapter;
+import org.eclipse.jpt.common.utility.internal.model.value.ListAspectAdapter;
+import org.eclipse.jpt.common.utility.internal.model.value.SimplePropertyValueModel;
+import org.eclipse.jpt.common.utility.internal.model.value.swing.ObjectListSelectionModel;
+import org.eclipse.jpt.common.utility.model.value.ListValueModel;
+import org.eclipse.jpt.common.utility.model.value.WritablePropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.persistence.JarFileRef;
+import org.eclipse.jpt.jpa.core.context.persistence.PersistenceUnit;
+import org.eclipse.jpt.jpa.ui.JptJpaUiPlugin;
+import org.eclipse.jpt.jpa.ui.internal.JpaHelpContextIds;
+import org.eclipse.jpt.jpa.ui.internal.JptUiIcons;
+import org.eclipse.jpt.jpa.ui.internal.persistence.JptUiPersistenceMessages;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.ui.dialogs.ElementTreeSelectionDialog;
+
+/**
+ * Here the layout of this pane:
+ * <pre>
+ * -----------------------------------------------------------------------------
+ * | |
+ * | Description |
+ * | |
+ * | ------------------------------------------------------------------------- |
+ * | | | |
+ * | | AddRemoveListPane | |
+ * | | | |
+ * | ------------------------------------------------------------------------- |
+ * -----------------------------------------------------------------------------</pre>
+ *
+ * @see PersistenceUnit
+ * @see PersistenceUnitGeneralComposite - The parent container
+ * @see AddRemoveListPane
+ *
+ * @version 2.0
+ * @since 2.0
+ */
+public abstract class PersistenceUnitJarFilesComposite
+ extends Pane<PersistenceUnit>
+{
+ /**
+ * Creates a new <code>PersistenceUnitJPAMappingDescriptorsComposite</code>.
+ *
+ * @param parentPane The parent pane of this one
+ * @param parent The parent container
+ */
+ public PersistenceUnitJarFilesComposite(
+ Pane<? extends PersistenceUnit> parentPane,
+ Composite parent) {
+
+ super(parentPane, parent, false);
+ }
+
+
+
+ @Override
+ protected void initializeLayout(Composite container) {
+ addJarFilesList(container);
+ }
+
+ protected void addJarFilesList(Composite container) {
+ // List pane
+ new AddRemoveListPane<PersistenceUnit>(
+ this,
+ container,
+ this.buildAdapter(),
+ this.buildItemListHolder(),
+ this.buildSelectedItemHolder(),
+ this.buildLabelProvider(),
+ JpaHelpContextIds.PERSISTENCE_XML_GENERAL
+ ) {
+ @Override
+ protected Composite addContainer(Composite parent) {
+ parent = super.addContainer(parent);
+ updateGridData(parent);
+ return parent;
+ }
+
+ @Override
+ protected void initializeLayout(Composite container) {
+ super.initializeLayout(container);
+ updateGridData(getContainer());
+ }
+ };
+ }
+
+ private void updateGridData(Composite container) {
+ GridData gridData = new GridData();
+ gridData.grabExcessHorizontalSpace = true;
+ gridData.grabExcessVerticalSpace = true;
+ gridData.horizontalAlignment = SWT.FILL;
+ gridData.verticalAlignment = SWT.FILL;
+ container.setLayoutData(gridData);
+ }
+
+ private Adapter buildAdapter() {
+ return new AddRemoveListPane.AbstractAdapter() {
+ public void addNewItem(ObjectListSelectionModel listSelectionModel) {
+ addJarFileRef(listSelectionModel);
+ }
+
+ public void removeSelectedItems(ObjectListSelectionModel listSelectionModel) {
+ for (Object item : listSelectionModel.selectedValues()) {
+ getSubject().removeJarFileRef((JarFileRef) item);
+ }
+ }
+ };
+ }
+
+ private ListValueModel<JarFileRef> buildItemListHolder() {
+ return new ItemPropertyListValueModelAdapter<JarFileRef>(
+ buildListHolder(),
+ JarFileRef.FILE_NAME_PROPERTY
+ );
+ }
+
+ private ListValueModel<JarFileRef> buildListHolder() {
+ return new ListAspectAdapter<PersistenceUnit, JarFileRef>(getSubjectHolder(), PersistenceUnit.JAR_FILE_REFS_LIST) {
+ @Override
+ protected ListIterator<JarFileRef> listIterator_() {
+ return this.subject.jarFileRefs();
+ }
+
+ @Override
+ protected int size_() {
+ return this.subject.jarFileRefsSize();
+ }
+ };
+ }
+
+ private WritablePropertyValueModel<JarFileRef> buildSelectedItemHolder() {
+ return new SimplePropertyValueModel<JarFileRef>();
+ }
+
+ private ILabelProvider buildLabelProvider() {
+ return new LabelProvider() {
+ @Override
+ public Image getImage(Object element) {
+ return JptJpaUiPlugin.getImage(JptUiIcons.JAR_FILE_REF);
+ }
+
+ @Override
+ public String getText(Object element) {
+ JarFileRef jarFileRef = (JarFileRef) element;
+ String name = jarFileRef.getFileName();
+
+ if (name == null) {
+ name = JptUiPersistenceMessages.PersistenceUnitJarFilesComposite_noFileName;
+ }
+
+ return name;
+ }
+ };
+ }
+
+ private void addJarFileRef(ObjectListSelectionModel listSelectionModel) {
+ IProject project = getSubject().getJpaProject().getProject();
+
+ ElementTreeSelectionDialog dialog = new ArchiveFileSelectionDialog(
+ getShell(), buildJarFileDeploymentPathCalculator());
+
+ dialog.setHelpAvailable(false);
+ dialog.setTitle(JptUiPersistenceMessages.PersistenceUnitMappingFilesComposite_jarFileDialog_title);
+ dialog.setMessage(JptUiPersistenceMessages.PersistenceUnitMappingFilesComposite_jarFileDialog_message);
+ dialog.setInput(project);
+
+ SWTUtil.show(
+ dialog,
+ buildSelectionDialogPostExecution(listSelectionModel)
+ );
+ }
+
+ protected ArchiveFileSelectionDialog.DeploymentPathCalculator buildJarFileDeploymentPathCalculator() {
+ return new ArchiveFileSelectionDialog.ModuleDeploymentPathCalculator();
+ }
+
+ private PostExecution<ElementTreeSelectionDialog> buildSelectionDialogPostExecution(
+ final ObjectListSelectionModel listSelectionModel) {
+ return new PostExecution<ElementTreeSelectionDialog>() {
+ public void execute(ElementTreeSelectionDialog dialog) {
+ if (dialog.getReturnCode() == IDialogConstants.CANCEL_ID) {
+ return;
+ }
+
+ for (Object result : dialog.getResult()) {
+ String filePath = (String) result;
+ if (jarFileRefExists(filePath)) {
+ continue;
+ }
+ JarFileRef jarFileRef = getSubject().addJarFileRef(filePath);
+
+ listSelectionModel.addSelectedValue(jarFileRef);
+ }
+ }
+ };
+ }
+
+ private boolean jarFileRefExists(String fileName) {
+ for (JarFileRef each : CollectionTools.iterable(getSubject().jarFileRefs())) {
+ if (each.getFileName().equals(fileName)) {
+ return true;
+ }
+ }
+ return false;
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/persistence/details/PersistenceUnitMappingFilesComposite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/persistence/details/PersistenceUnitMappingFilesComposite.java
new file mode 100644
index 0000000000..a0afca0774
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/persistence/details/PersistenceUnitMappingFilesComposite.java
@@ -0,0 +1,261 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 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.ui.internal.persistence.details;
+
+import java.util.ListIterator;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IFolder;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jpt.common.core.JptCommonCorePlugin;
+import org.eclipse.jpt.common.ui.internal.util.SWTUtil;
+import org.eclipse.jpt.common.ui.internal.widgets.AddRemoveListPane;
+import org.eclipse.jpt.common.ui.internal.widgets.Pane;
+import org.eclipse.jpt.common.ui.internal.widgets.PostExecution;
+import org.eclipse.jpt.common.ui.internal.widgets.AddRemovePane.Adapter;
+import org.eclipse.jpt.common.utility.internal.model.value.ItemPropertyListValueModelAdapter;
+import org.eclipse.jpt.common.utility.internal.model.value.ListAspectAdapter;
+import org.eclipse.jpt.common.utility.internal.model.value.SimplePropertyValueModel;
+import org.eclipse.jpt.common.utility.internal.model.value.swing.ObjectListSelectionModel;
+import org.eclipse.jpt.common.utility.model.value.ListValueModel;
+import org.eclipse.jpt.common.utility.model.value.WritablePropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.persistence.MappingFileRef;
+import org.eclipse.jpt.jpa.core.context.persistence.PersistenceUnit;
+import org.eclipse.jpt.jpa.ui.JptJpaUiPlugin;
+import org.eclipse.jpt.jpa.ui.internal.JpaHelpContextIds;
+import org.eclipse.jpt.jpa.ui.internal.JptUiIcons;
+import org.eclipse.jpt.jpa.ui.internal.jface.XmlMappingFileViewerFilter;
+import org.eclipse.jpt.jpa.ui.internal.persistence.JptUiPersistenceMessages;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.ui.dialogs.ElementTreeSelectionDialog;
+import org.eclipse.ui.dialogs.ISelectionStatusValidator;
+import org.eclipse.ui.model.WorkbenchContentProvider;
+import org.eclipse.ui.model.WorkbenchLabelProvider;
+import org.eclipse.ui.views.navigator.ResourceComparator;
+
+@SuppressWarnings("nls")
+public abstract class PersistenceUnitMappingFilesComposite
+ extends Pane<PersistenceUnit> {
+
+ public PersistenceUnitMappingFilesComposite(
+ Pane<? extends PersistenceUnit> parentPane, Composite parent) {
+
+ super(parentPane, parent);
+ }
+
+
+ protected void addMappingFilesList(Composite container) {
+ // List pane
+ new AddRemoveListPane<PersistenceUnit>(
+ this,
+ container,
+ buildAdapter(),
+ buildItemListHolder(),
+ buildSelectedItemHolder(),
+ buildLabelProvider(),
+ JpaHelpContextIds.PERSISTENCE_XML_GENERAL) {
+
+ @Override
+ protected Composite addContainer(Composite parent) {
+ parent = super.addContainer(parent);
+ updateGridData(parent);
+ return parent;
+ }
+
+ @Override
+ protected void initializeLayout(Composite container) {
+ super.initializeLayout(container);
+ updateGridData(getContainer());
+ }
+ };
+ }
+
+ /**
+ * Prompts a dialog showing a tree structure of the source paths where the
+ * only files shown are JPA mapping descriptors file. The XML file has to be
+ * an XML file with the root tag: {@code <entity-mappings>}.
+ *
+ * @param listSelectionModel The selection model used to select the new files
+ */
+ private void addJPAMappingDescriptor(ObjectListSelectionModel listSelectionModel) {
+
+ IProject project = getSubject().getJpaProject().getProject();
+
+ ElementTreeSelectionDialog dialog = new ElementTreeSelectionDialog(
+ getShell(),
+ new WorkbenchLabelProvider(),
+ new WorkbenchContentProvider());
+
+ dialog.setHelpAvailable(false);
+ dialog.setValidator(buildValidator());
+ dialog.setTitle(JptUiPersistenceMessages.PersistenceUnitMappingFilesComposite_mappingFileDialog_title);
+ dialog.setMessage(JptUiPersistenceMessages.PersistenceUnitMappingFilesComposite_mappingFileDialog_message);
+ dialog.addFilter(new XmlMappingFileViewerFilter(getSubject().getJpaProject()));
+ dialog.setInput(project);
+ dialog.setComparator(new ResourceComparator(ResourceComparator.NAME));
+
+ SWTUtil.show(
+ dialog,
+ buildSelectionDialogPostExecution(listSelectionModel));
+ }
+
+ private Adapter buildAdapter() {
+ return new AddRemoveListPane.AbstractAdapter() {
+ public void addNewItem(ObjectListSelectionModel listSelectionModel) {
+ addJPAMappingDescriptor(listSelectionModel);
+ }
+
+ public void removeSelectedItems(ObjectListSelectionModel listSelectionModel) {
+ for (Object item : listSelectionModel.selectedValues()) {
+ getSubject().removeSpecifiedMappingFileRef((MappingFileRef) item);
+ }
+ }
+ };
+ }
+
+ @Override
+ protected Composite addContainer(Composite parent) {
+
+ GridLayout layout = new GridLayout(1, true);
+ layout.marginHeight = 0;
+ layout.marginWidth = 0;
+ layout.marginTop = 0;
+ layout.marginLeft = 0;
+ layout.marginBottom = 0;
+ layout.marginRight = 0;
+
+ Composite container = addPane(parent, layout);
+ updateGridData(container);
+
+ return container;
+ }
+
+ private ListValueModel<MappingFileRef> buildItemListHolder() {
+ return new ItemPropertyListValueModelAdapter<MappingFileRef>(
+ buildListHolder(),
+ MappingFileRef.FILE_NAME_PROPERTY);
+ }
+
+ private ILabelProvider buildLabelProvider() {
+ return new LabelProvider() {
+ @Override
+ public Image getImage(Object element) {
+ return JptJpaUiPlugin.getImage(JptUiIcons.MAPPING_FILE_REF);
+ }
+
+ @Override
+ public String getText(Object element) {
+ MappingFileRef mappingFileRef = (MappingFileRef) element;
+ String name = mappingFileRef.getFileName();
+
+ if (name == null) {
+ name = JptUiPersistenceMessages.PersistenceUnitMappingFilesComposite_ormNoName;
+ }
+
+ return name;
+ }
+ };
+ }
+
+ private ListValueModel<MappingFileRef> buildListHolder() {
+ return new ListAspectAdapter<PersistenceUnit, MappingFileRef>(
+ getSubjectHolder(), PersistenceUnit.SPECIFIED_MAPPING_FILE_REFS_LIST) {
+
+ @Override
+ protected ListIterator<MappingFileRef> listIterator_() {
+ return this.subject.specifiedMappingFileRefs();
+ }
+
+ @Override
+ protected int size_() {
+ return this.subject.specifiedMappingFileRefsSize();
+ }
+ };
+ }
+
+ private WritablePropertyValueModel<MappingFileRef> buildSelectedItemHolder() {
+ return new SimplePropertyValueModel<MappingFileRef>();
+ }
+
+ private PostExecution<ElementTreeSelectionDialog> buildSelectionDialogPostExecution(
+ final ObjectListSelectionModel listSelectionModel) {
+
+ return new PostExecution<ElementTreeSelectionDialog>() {
+
+ public void execute(ElementTreeSelectionDialog dialog) {
+
+ if (dialog.getReturnCode() == IDialogConstants.CANCEL_ID) {
+ return;
+ }
+
+ for (Object result : dialog.getResult()) {
+ IFile file = (IFile) result;
+ IProject project = file.getProject();
+ IPath runtimePath = JptCommonCorePlugin.getResourceLocator(project).getRuntimePath(project, file.getFullPath());
+ String fileName = runtimePath.toPortableString();
+ if (mappingFileRefExists(fileName)) {
+ continue;
+ }
+ MappingFileRef mappingFileRef = getSubject().addSpecifiedMappingFileRef(fileName);
+
+ listSelectionModel.addSelectedValue(mappingFileRef);
+ }
+ }
+ };
+ }
+
+ private boolean mappingFileRefExists(String fileName) {
+ for ( ListIterator<MappingFileRef> i = getSubject().specifiedMappingFileRefs(); i.hasNext(); ) {
+ MappingFileRef mappingFileRef = i.next();
+ if( mappingFileRef.getFileName().equals(fileName)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ private ISelectionStatusValidator buildValidator() {
+ return new ISelectionStatusValidator() {
+ public IStatus validate(Object[] selection) {
+
+ if (selection.length == 0) {
+ return new Status(IStatus.ERROR, JptJpaUiPlugin.PLUGIN_ID, "");
+ }
+
+ for (Object item : selection) {
+ if (item instanceof IFolder) {
+ return new Status(IStatus.ERROR, JptJpaUiPlugin.PLUGIN_ID, "");
+ }
+ }
+
+ return new Status(IStatus.OK, JptJpaUiPlugin.PLUGIN_ID, "");
+ }
+ };
+ }
+
+ private void updateGridData(Composite container) {
+
+ GridData gridData = new GridData();
+ gridData.grabExcessHorizontalSpace = true;
+ gridData.grabExcessVerticalSpace = true;
+ gridData.horizontalAlignment = SWT.FILL;
+ gridData.verticalAlignment = SWT.FILL;
+ container.setLayoutData(gridData);
+ }
+} \ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/persistence/details/PersistenceUnitPropertiesComposite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/persistence/details/PersistenceUnitPropertiesComposite.java
new file mode 100644
index 0000000000..9c8c70e698
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/persistence/details/PersistenceUnitPropertiesComposite.java
@@ -0,0 +1,419 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 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.ui.internal.persistence.details;
+
+import java.util.ListIterator;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.viewers.CellEditor;
+import org.eclipse.jface.viewers.IBaseLabelProvider;
+import org.eclipse.jface.viewers.ICellModifier;
+import org.eclipse.jface.viewers.ITableLabelProvider;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.jface.viewers.TextCellEditor;
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.ui.internal.swt.ColumnAdapter;
+import org.eclipse.jpt.common.ui.internal.util.SWTUtil;
+import org.eclipse.jpt.common.ui.internal.widgets.AddRemoveTablePane;
+import org.eclipse.jpt.common.ui.internal.widgets.Pane;
+import org.eclipse.jpt.common.utility.internal.model.value.ListAspectAdapter;
+import org.eclipse.jpt.common.utility.internal.model.value.PropertyAspectAdapter;
+import org.eclipse.jpt.common.utility.internal.model.value.SimplePropertyValueModel;
+import org.eclipse.jpt.common.utility.internal.model.value.swing.ObjectListSelectionModel;
+import org.eclipse.jpt.common.utility.model.event.ListAddEvent;
+import org.eclipse.jpt.common.utility.model.event.ListChangeEvent;
+import org.eclipse.jpt.common.utility.model.event.ListRemoveEvent;
+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.core.context.persistence.PersistenceUnit;
+import org.eclipse.jpt.jpa.ui.details.JpaPageComposite;
+import org.eclipse.jpt.jpa.ui.internal.JpaHelpContextIds;
+import org.eclipse.jpt.jpa.ui.internal.details.java.BaseJavaUiFactory;
+import org.eclipse.jpt.jpa.ui.internal.persistence.JptUiPersistenceMessages;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.TableColumn;
+import org.eclipse.swt.widgets.TableItem;
+
+/**
+ * Here the layout of this pane:
+ * <pre>
+ * -----------------------------------------------------------------------------
+ * | - Properties ------------------------------------------------------------ |
+ * | |
+ * | Description |
+ * | |
+ * | ----------------------------------------------------------------------- |
+ * | | | |
+ * | | AddRemoveTablePane | |
+ * | | | |
+ * | ----------------------------------------------------------------------- |
+ * -----------------------------------------------------------------------------</pre>
+ *
+ * @see PersistenceUnit
+ * @see BaseJavaUiFactory - The invoker
+ * @see AddRemoveTablePane
+ *
+ * @version 2.3
+ * @since 2.0
+ */
+@SuppressWarnings("nls")
+public class PersistenceUnitPropertiesComposite extends Pane<PersistenceUnit>
+ implements JpaPageComposite
+{
+ private WritablePropertyValueModel<PersistenceUnit.Property> propertyHolder;
+ private TablePane tablePane;
+
+ /**
+ * Creates a new <code>PersistenceUnitPropertiesComposite</code>.
+ *
+ * @param subjectHolder The holder of this pane's subject
+ * @param parent The parent container
+ * @param widgetFactory The factory used to create various common widgets
+ */
+ public PersistenceUnitPropertiesComposite(PropertyValueModel<PersistenceUnit> subjectHolder,
+ Composite container,
+ WidgetFactory widgetFactory) {
+
+ super(subjectHolder, container, widgetFactory);
+ }
+
+ private ListValueModel<PersistenceUnit.Property> buildPropertiesListHolder() {
+ return new ListAspectAdapter<PersistenceUnit, PersistenceUnit.Property>(getSubjectHolder(), PersistenceUnit.PROPERTIES_LIST) {
+ @Override
+ protected ListIterator<PersistenceUnit.Property> listIterator_() {
+ return subject.properties();
+ }
+
+ @Override
+ protected int size_() {
+ return subject.propertiesSize();
+ }
+ };
+ }
+
+ private ITableLabelProvider buildPropertyLabelProvider() {
+ return new TableLabelProvider();
+ }
+
+ private AddRemoveTablePane.Adapter buildTableAdapter() {
+ return new AddRemoveTablePane.AbstractAdapter() {
+
+ public void addNewItem(ObjectListSelectionModel listSelectionModel) {
+
+ PersistenceUnit.Property property = getSubject().addProperty();
+ propertyHolder.setValue(property);
+
+ tablePane.getTableViewer().editElement(
+ property,
+ PropertyColumnAdapter.NAME_COLUMN
+ );
+ }
+
+ public void removeSelectedItems(ObjectListSelectionModel listSelectionModel) {
+ for (Object item : listSelectionModel.selectedValues()) {
+ getSubject().removeProperty((PersistenceUnit.Property) item);
+ }
+ }
+ };
+ }
+
+ public String getHelpID() {
+ return JpaHelpContextIds.PERSISTENCE_XML_PROPERTIES;
+ }
+
+ public ImageDescriptor getPageImageDescriptor() {
+ return null;
+ }
+
+ public String getPageText() {
+ return JptUiPersistenceMessages.PersistenceUnitPropertiesComposite_properties;
+ }
+
+ @Override
+ protected void initialize() {
+ super.initialize();
+ propertyHolder = new SimplePropertyValueModel<PersistenceUnit.Property>();
+ }
+
+ @Override
+ protected void initializeLayout(Composite container) {
+
+ addLabel(
+ container,
+ JptUiPersistenceMessages.PersistenceUnitPropertiesComposite_properties_description
+ );
+
+ tablePane = new TablePane(container);
+ container.setLayoutData(new GridData(GridData.FILL_BOTH));
+ }
+
+ private static class PropertyColumnAdapter implements ColumnAdapter<PersistenceUnit.Property> {
+
+ public static final int COLUMN_COUNT = 3;
+ public static final int NAME_COLUMN = 1;
+ public static final int SELECTION_COLUMN = 0;
+ public static final int VALUE_COLUMN = 2;
+
+ private WritablePropertyValueModel<String> buildNameHolder(PersistenceUnit.Property subject) {
+ return new PropertyAspectAdapter<PersistenceUnit.Property, String>(PersistenceUnit.Property.NAME_PROPERTY, subject) {
+ @Override
+ protected String buildValue_() {
+ return subject.getName();
+ }
+
+ @Override
+ protected void setValue_(String value) {
+ subject.setName(value);
+ }
+ };
+ }
+
+ private WritablePropertyValueModel<String> buildValueHolder(PersistenceUnit.Property subject) {
+ return new PropertyAspectAdapter<PersistenceUnit.Property, String>(PersistenceUnit.Property.VALUE_PROPERTY, subject) {
+ @Override
+ protected String buildValue_() {
+ return subject.getValue();
+ }
+
+ @Override
+ protected void setValue_(String value) {
+ subject.setValue(value);
+ }
+ };
+ }
+
+ public WritablePropertyValueModel<?>[] cellModels(PersistenceUnit.Property subject) {
+ WritablePropertyValueModel<?>[] holders = new WritablePropertyValueModel<?>[COLUMN_COUNT];
+ holders[SELECTION_COLUMN] = new SimplePropertyValueModel<Object>();
+ holders[NAME_COLUMN] = buildNameHolder(subject);
+ holders[VALUE_COLUMN] = buildValueHolder(subject);
+ return holders;
+ }
+
+ public int columnCount() {
+ return COLUMN_COUNT;
+ }
+
+ public String columnName(int columnIndex) {
+
+ switch (columnIndex) {
+ case PropertyColumnAdapter.NAME_COLUMN: {
+ return JptUiPersistenceMessages.PersistenceUnitPropertiesComposite_nameColumn;
+ }
+
+ case PropertyColumnAdapter.VALUE_COLUMN: {
+ return JptUiPersistenceMessages.PersistenceUnitPropertiesComposite_valueColumn;
+ }
+
+ default: {
+ return null;
+ }
+ }
+ }
+ }
+
+ private class TableLabelProvider extends LabelProvider
+ implements ITableLabelProvider {
+
+ public Image getColumnImage(Object element, int columnIndex) {
+ return null;
+ }
+
+ public String getColumnText(Object element, int columnIndex) {
+
+ PersistenceUnit.Property property = (PersistenceUnit.Property) element;
+ String value = null;
+
+ switch (columnIndex) {
+ case PropertyColumnAdapter.NAME_COLUMN: {
+ value = property.getName();
+ break;
+ }
+
+ case PropertyColumnAdapter.VALUE_COLUMN: {
+ value = property.getValue();
+ break;
+ }
+ }
+
+ if (value == null) {
+ value = "";
+ }
+
+ return value;
+ }
+ }
+
+ private class TablePane extends AddRemoveTablePane<PersistenceUnit> {
+
+ private final String SELECTION_COLUMN = "selection";
+
+ private TableViewer tableViewer;
+
+ private TablePane(Composite parent) {
+ super(PersistenceUnitPropertiesComposite.this,
+ parent,
+ buildTableAdapter(),
+ buildPropertiesListHolder(),
+ propertyHolder,
+ buildPropertyLabelProvider());
+ }
+
+ @Override
+ protected Composite addContainer(Composite parent) {
+ Composite container = super.addContainer(parent);
+ container.setLayoutData(new GridData(GridData.FILL_BOTH));
+ return container;
+ }
+
+ private CellEditor[] buildCellEditors(Table table) {
+ return new CellEditor[] {
+ null,
+ new TextCellEditor(table),
+ new TextCellEditor(table)
+ };
+ }
+
+ private ICellModifier buildCellModifier() {
+ return new ICellModifier() {
+
+ public boolean canModify(Object element, String property) {
+ return !SELECTION_COLUMN.equals(property);
+ }
+
+ public Object getValue(Object element, String property) {
+ PersistenceUnit.Property propertyModel = (PersistenceUnit.Property) element;
+ String value = null;
+
+ if (property == PersistenceUnit.Property.NAME_PROPERTY) {
+ value = propertyModel.getName();
+ }
+ else if (property == PersistenceUnit.Property.VALUE_PROPERTY) {
+ value = propertyModel.getValue();
+ }
+
+ if (value == null) {
+ value = "";
+ }
+
+ return value;
+ }
+
+ public void modify(Object element, String property, Object value) {
+ PersistenceUnit.Property propertyModel;
+
+ if (element instanceof TableItem) {
+ TableItem tableItem = (TableItem) element;
+ propertyModel = (PersistenceUnit.Property) tableItem.getData();
+ }
+ else {
+ propertyModel = (PersistenceUnit.Property) element;
+ }
+
+ if (property == PersistenceUnit.Property.NAME_PROPERTY) {
+ propertyModel.setName(value.toString());
+ }
+ else if (property == PersistenceUnit.Property.VALUE_PROPERTY) {
+ propertyModel.setValue(value.toString());
+ }
+ }
+ };
+ }
+
+ @Override
+ protected ColumnAdapter<?> buildColumnAdapter() {
+ return new PropertyColumnAdapter();
+ }
+
+ private String[] buildColumnProperties() {
+ return new String[] {
+ SELECTION_COLUMN,
+ PersistenceUnit.Property.NAME_PROPERTY,
+ PersistenceUnit.Property.VALUE_PROPERTY
+ };
+ }
+
+ TableViewer getTableViewer() {
+ return tableViewer;
+ }
+
+ @Override
+ protected void initializeMainComposite(Composite container,
+ Adapter adapter,
+ ListValueModel<?> listHolder,
+ WritablePropertyValueModel<?> selectedItemHolder,
+ IBaseLabelProvider labelProvider,
+ String helpId) {
+
+ super.initializeMainComposite(
+ container,
+ adapter,
+ listHolder,
+ selectedItemHolder,
+ labelProvider,
+ helpId
+ );
+
+ Table table = getMainControl();
+ table.setLayoutData(new GridData(GridData.FILL_BOTH));
+
+ // Make the selection column non-resizable since it's only used to
+ // ease the selection of rows
+ TableColumn selectionColumn = table.getColumn(PropertyColumnAdapter.SELECTION_COLUMN);
+ selectionColumn.setResizable(false);
+ selectionColumn.setWidth(20);
+
+ // Install the editors
+ tableViewer = new TableViewer(table);
+ tableViewer.setCellEditors(buildCellEditors(table));
+ tableViewer.setCellModifier(buildCellModifier());
+ tableViewer.setColumnProperties(buildColumnProperties());
+ }
+
+ @Override
+ protected void itemsAdded(ListAddEvent e) {
+ super.itemsAdded(e);
+ revalidateLayout();
+ }
+
+ @Override
+ protected void itemsRemoved(ListRemoveEvent e) {
+ super.itemsRemoved(e);
+ revalidateLayout();
+ }
+
+ @Override
+ protected void listChanged(ListChangeEvent e) {
+ super.listChanged(e);
+ revalidateLayout();
+ }
+
+ /**
+ * Revalidates the table layout after the list of items has changed. The
+ * layout has to be done in a new UI thread because our listener might be
+ * notified before the table has been updated (table column added or removed).
+ */
+ private void revalidateLayout() {
+ SWTUtil.asyncExec(new Runnable() { public void run() {
+ Table table = getMainControl();
+ if (!table.isDisposed()) {
+ // We have to do a total relayout of the tab otherwise the
+ // table might become cut off at the bottom
+ SWTUtil.reflow(table);
+ }
+ }});
+ }
+ }
+} \ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/persistence/details/PersistenceXmlUiDefinition.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/persistence/details/PersistenceXmlUiDefinition.java
new file mode 100644
index 0000000000..ee2d04c5bb
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/persistence/details/PersistenceXmlUiDefinition.java
@@ -0,0 +1,53 @@
+/*******************************************************************************
+ * Copyright (c) 2009 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.ui.internal.persistence.details;
+
+import org.eclipse.jpt.common.core.JptResourceType;
+import org.eclipse.jpt.jpa.core.JptJpaCorePlugin;
+import org.eclipse.jpt.jpa.ui.ResourceUiDefinition;
+import org.eclipse.jpt.jpa.ui.internal.structure.PersistenceResourceModelStructureProvider;
+import org.eclipse.jpt.jpa.ui.structure.JpaStructureProvider;
+
+public class PersistenceXmlUiDefinition extends AbstractPersistenceXmlResourceUiDefinition
+{
+ // singleton
+ private static final ResourceUiDefinition INSTANCE = new PersistenceXmlUiDefinition();
+
+
+ /**
+ * Return the singleton
+ */
+ public static ResourceUiDefinition instance() {
+ return INSTANCE;
+ }
+
+
+ /**
+ * Enforce singleton usage
+ */
+ private PersistenceXmlUiDefinition() {
+ super();
+ }
+
+
+ @Override
+ protected PersistenceXmlUiFactory buildPersistenceXmlUiFactory() {
+ return new GenericPersistenceXmlUiFactory();
+ }
+
+ public boolean providesUi(JptResourceType resourceType) {
+ return resourceType.equals(JptJpaCorePlugin.PERSISTENCE_XML_1_0_RESOURCE_TYPE);
+ }
+
+ public JpaStructureProvider getStructureProvider() {
+ return PersistenceResourceModelStructureProvider.instance();
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/persistence/details/PersistenceXmlUiFactory.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/persistence/details/PersistenceXmlUiFactory.java
new file mode 100644
index 0000000000..6f546cd681
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/persistence/details/PersistenceXmlUiFactory.java
@@ -0,0 +1,38 @@
+/*******************************************************************************
+ * Copyright (c) 2009 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.ui.internal.persistence.details;
+
+import java.util.ListIterator;
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.persistence.PersistenceUnit;
+import org.eclipse.jpt.jpa.ui.details.JpaPageComposite;
+import org.eclipse.swt.widgets.Composite;
+
+public interface PersistenceXmlUiFactory
+{
+ // **************** persistence unit composites ****************************
+
+ /**
+ * Creates the list of <code>JpaComposite</code>s used to edit a
+ * <code>PersistenceUnit</code>. The properties can be regrouped into
+ * sections that will be shown in the editor as pages.
+ *
+ * @param subjectHolder The holder of the pertistence unit
+ * @param parent The parent container
+ * @param widgetFactory The factory used to create the widgets
+ * @return A new <code>JpaComposite</code>
+ */
+ ListIterator<JpaPageComposite> createPersistenceUnitComposites(
+ PropertyValueModel<PersistenceUnit> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory);
+
+} \ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/perspective/JpaPerspectiveFactory.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/perspective/JpaPerspectiveFactory.java
new file mode 100644
index 0000000000..9291f08315
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/perspective/JpaPerspectiveFactory.java
@@ -0,0 +1,51 @@
+/*******************************************************************************
+ * 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.jpa.ui.internal.perspective;
+
+import org.eclipse.jdt.ui.JavaUI;
+import org.eclipse.ui.IFolderLayout;
+import org.eclipse.ui.IPageLayout;
+import org.eclipse.ui.IPerspectiveFactory;
+import org.eclipse.ui.navigator.resources.ProjectExplorer;
+import org.eclipse.ui.progress.IProgressConstants;
+
+public class JpaPerspectiveFactory implements IPerspectiveFactory {
+
+ public void createInitialLayout(IPageLayout layout) {
+ String editorArea = layout.getEditorArea();
+
+ //Package area
+ IFolderLayout folder = layout.createFolder(
+ "left", IPageLayout.LEFT, (float) 0.25, editorArea); //$NON-NLS-1$
+ folder.addView(ProjectExplorer.VIEW_ID);
+ folder.addPlaceholder(JavaUI.ID_TYPE_HIERARCHY);
+ folder.addPlaceholder(IPageLayout.ID_RES_NAV);
+
+ //Database Explorer area
+ layout.addView("org.eclipse.datatools.connectivity.DataSourceExplorerNavigator", //$NON-NLS-1$
+ IPageLayout.BOTTOM, (float) 0.60, ProjectExplorer.VIEW_ID);
+
+ //Problems/Console area
+ IFolderLayout outputFolder = layout.createFolder(
+ "bottom", IPageLayout.BOTTOM, (float) 0.60, editorArea); //$NON-NLS-1$
+ outputFolder.addView(IPageLayout.ID_PROBLEM_VIEW);
+ outputFolder.addPlaceholder(IPageLayout.ID_BOOKMARKS);
+ outputFolder.addPlaceholder(IProgressConstants.PROGRESS_VIEW_ID);
+
+ //JPA Details (Split with Problems/Console area)
+ layout.addView("org.eclipse.jpt.jpa.ui.jpaDetailsView", //$NON-NLS-1$
+ IPageLayout.RIGHT, (float) .60, "bottom"); //$NON-NLS-1$
+
+ //JPA Structure area
+ IFolderLayout outlineFolder = layout.createFolder(
+ "right", IPageLayout.RIGHT, (float) 0.75, editorArea); //$NON-NLS-1$
+ outlineFolder.addView("org.eclipse.jpt.jpa.ui.jpaStructureView"); //$NON-NLS-1$
+ outlineFolder.addView(IPageLayout.ID_OUTLINE);
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/platform/JpaPlatformUiRegistry.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/platform/JpaPlatformUiRegistry.java
new file mode 100644
index 0000000000..5d617afb1f
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/platform/JpaPlatformUiRegistry.java
@@ -0,0 +1,190 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2009 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.ui.internal.platform;
+
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IExtension;
+import org.eclipse.core.runtime.IExtensionPoint;
+import org.eclipse.core.runtime.IExtensionRegistry;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.jpt.common.utility.internal.CollectionTools;
+import org.eclipse.jpt.common.utility.internal.iterators.CompositeIterator;
+import org.eclipse.jpt.common.utility.internal.iterators.TransformationIterator;
+import org.eclipse.jpt.jpa.ui.JpaPlatformUi;
+import org.eclipse.jpt.jpa.ui.JpaPlatformUiFactory;
+import org.eclipse.jpt.jpa.ui.JptJpaUiPlugin;
+
+public class JpaPlatformUiRegistry
+{
+ // singleton
+ private static final JpaPlatformUiRegistry INSTANCE = new JpaPlatformUiRegistry();
+
+ /**
+ * Return the singleton.
+ */
+ public static JpaPlatformUiRegistry instance() {
+ return INSTANCE;
+ }
+
+ private static final String EXTENSION_ID =
+ "jpaPlatformUis"; //$NON-NLS-1$
+
+ private static final String EL_PLATFORM_UI =
+ "jpaPlatformUi"; //$NON-NLS-1$
+
+ private static final String AT_ID =
+ "id"; //$NON-NLS-1$
+
+ private static final String AT_JPA_PLATFORM =
+ "jpaPlatform"; //$NON-NLS-1$
+
+ private static final String AT_FACTORY_CLASS =
+ "factoryClass"; //$NON-NLS-1$
+
+ // key: String id value: IConfigurationElement class descriptor
+ private Map<String, IConfigurationElement> jpaPlatformUiConfigElements;
+
+ //cache the jpaPlatformUis when they are built
+ //key: jpa platform id value: JpaPlaformUi
+ private Map<String, JpaPlatformUi> jpaPlatformUis;
+
+ /* (non Java doc)
+ * restrict access
+ */
+ private JpaPlatformUiRegistry() {
+ buildJpaPlatformUiConfigElements();
+ this.jpaPlatformUis = new HashMap<String, JpaPlatformUi>();
+ }
+
+
+ private void buildJpaPlatformUiConfigElements() {
+ this.jpaPlatformUiConfigElements = new HashMap<String, IConfigurationElement>();
+
+ for (Iterator<IConfigurationElement> stream = allConfigElements(); stream.hasNext(); ) {
+ buildJpaPlatformUi(stream.next());
+ }
+ }
+
+ private void buildJpaPlatformUi(IConfigurationElement configElement) {
+ if (! configElement.getName().equals(EL_PLATFORM_UI)) {
+ return;
+ }
+
+ String platformUiId = configElement.getAttribute(AT_ID);
+ String platform = configElement.getAttribute(AT_JPA_PLATFORM);
+ String platformUiFactoryClass = configElement.getAttribute(AT_FACTORY_CLASS);
+
+ if ((platformUiId == null) || (platformUiFactoryClass == null)) {
+ if (platformUiId == null) {
+ reportMissingAttribute(configElement, AT_ID);
+ }
+ if (platform == null) {
+ reportMissingAttribute(configElement, AT_JPA_PLATFORM);
+ }
+ if (platformUiFactoryClass == null) {
+ reportMissingAttribute(configElement, AT_FACTORY_CLASS);
+ }
+ return;
+ }
+
+ if (this.jpaPlatformUiConfigElements.containsKey(platformUiId)) {
+ IConfigurationElement otherConfigElement = this.jpaPlatformUiConfigElements.get(platform);
+ reportDuplicatePlatformUi(configElement, otherConfigElement);
+ }
+
+ this.jpaPlatformUiConfigElements.put(platformUiId, configElement);
+ }
+
+ public JpaPlatformUi getJpaPlatformUi(String platformId) {
+ if (this.jpaPlatformUis.containsKey(platformId)) {
+ return this.jpaPlatformUis.get(platformId);
+ }
+ IConfigurationElement registeredConfigElement = null;
+ for (IConfigurationElement configurationElement : this.jpaPlatformUiConfigElements.values()) {
+ if (configurationElement.getAttribute(AT_JPA_PLATFORM).equals(platformId)) {
+ registeredConfigElement = configurationElement;
+ break;
+ }
+ }
+
+ if (registeredConfigElement == null) {
+ return null;
+ }
+ JpaPlatformUiFactory jpaPlatformUiFactory;
+ try {
+ jpaPlatformUiFactory = (JpaPlatformUiFactory) registeredConfigElement.createExecutableExtension(AT_FACTORY_CLASS);
+ }
+ catch (CoreException ce) {
+ reportFailedInstantiation(registeredConfigElement);
+ throw new IllegalArgumentException(platformId);
+ }
+ JpaPlatformUi platformUi = jpaPlatformUiFactory.buildJpaPlatformUi();
+ this.jpaPlatformUis.put(platformId, platformUi);
+ return platformUi;
+ }
+
+ private Iterator<IConfigurationElement> allConfigElements() {
+ IExtensionRegistry registry = Platform.getExtensionRegistry();
+ IExtensionPoint extensionPoint =
+ registry.getExtensionPoint(JptJpaUiPlugin.PLUGIN_ID, EXTENSION_ID);
+ IExtension[] extensions = extensionPoint.getExtensions();
+
+ return new CompositeIterator<IConfigurationElement>(
+ new TransformationIterator<IExtension, Iterator<IConfigurationElement>>(CollectionTools.iterator(extensions)) {
+ @Override
+ protected Iterator<IConfigurationElement> transform(IExtension extension) {
+ return CollectionTools.iterator(extension.getConfigurationElements());
+ }
+ }
+ );
+ }
+
+ // TODO externalize strings
+ private void reportMissingAttribute(IConfigurationElement configElement, String attributeName) {
+ String message =
+ "An extension element \""
+ + configElement.getName()
+ + "\" in plugin \""
+ + configElement.getContributor().getName()
+ + "\" is missing a required attribute \""
+ + attributeName
+ + "\".";
+ JptJpaUiPlugin.log(message);
+ }
+
+ // TODO externalize strings
+ private void reportDuplicatePlatformUi(
+ IConfigurationElement oneConfigElement, IConfigurationElement otherConfigElement) {
+ String message =
+ "The plugins \""
+ + oneConfigElement.getContributor().getName()
+ + "\" and \""
+ + otherConfigElement.getContributor().getName()
+ + "\" have registered a duplicate attribute \"id\" "
+ + "for the extension element \"jpaPlatformUi\".";
+ JptJpaUiPlugin.log(message);
+ }
+
+ // TODO externalize strings
+ private void reportFailedInstantiation(IConfigurationElement configElement) {
+ String message =
+ "Could not instantiate the class \""
+ + configElement.getAttribute(AT_FACTORY_CLASS)
+ + "\" for the extension element \""
+ + configElement.getName()
+ + "\" in the plugin \""
+ + configElement.getContributor().getName()
+ + "\".";
+ JptJpaUiPlugin.log(message);
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/platform/base/BaseJpaPlatformUi.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/platform/base/BaseJpaPlatformUi.java
new file mode 100644
index 0000000000..a01135e3a4
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/platform/base/BaseJpaPlatformUi.java
@@ -0,0 +1,191 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 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.ui.internal.platform.base;
+
+import java.util.Iterator;
+import java.util.ListIterator;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jpt.common.core.JptResourceType;
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.utility.internal.CollectionTools;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.JpaFile;
+import org.eclipse.jpt.jpa.core.JpaProject;
+import org.eclipse.jpt.jpa.core.JpaStructureNode;
+import org.eclipse.jpt.jpa.core.context.AttributeMapping;
+import org.eclipse.jpt.jpa.core.context.PersistentType;
+import org.eclipse.jpt.jpa.core.context.ReadOnlyPersistentAttribute;
+import org.eclipse.jpt.jpa.core.context.TypeMapping;
+import org.eclipse.jpt.jpa.ui.JpaPlatformUi;
+import org.eclipse.jpt.jpa.ui.JpaPlatformUiProvider;
+import org.eclipse.jpt.jpa.ui.JptJpaUiPlugin;
+import org.eclipse.jpt.jpa.ui.MappingResourceUiDefinition;
+import org.eclipse.jpt.jpa.ui.ResourceUiDefinition;
+import org.eclipse.jpt.jpa.ui.details.DefaultMappingUiDefinition;
+import org.eclipse.jpt.jpa.ui.details.JpaComposite;
+import org.eclipse.jpt.jpa.ui.details.JpaDetailsPage;
+import org.eclipse.jpt.jpa.ui.details.JpaDetailsProvider;
+import org.eclipse.jpt.jpa.ui.details.MappingUiDefinition;
+import org.eclipse.jpt.jpa.ui.navigator.JpaNavigatorProvider;
+import org.eclipse.jpt.jpa.ui.structure.JpaStructureProvider;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Shell;
+
+public abstract class BaseJpaPlatformUi
+ implements JpaPlatformUi
+{
+ private final JpaNavigatorProvider navigatorProvider;
+
+ private final JpaPlatformUiProvider platformUiProvider;
+
+
+ protected BaseJpaPlatformUi(
+ JpaNavigatorProvider navigatorProvider, JpaPlatformUiProvider platformUiProvider) {
+
+ super();
+ this.navigatorProvider = navigatorProvider;
+ this.platformUiProvider = platformUiProvider;
+ }
+
+
+ // ********** navigator provider **********
+
+ public JpaNavigatorProvider getNavigatorProvider() {
+ return this.navigatorProvider;
+ }
+
+
+ // ********** structure providers **********
+
+ public JpaStructureProvider getStructureProvider(JpaFile jpaFile) {
+ JptResourceType resourceType = jpaFile.getResourceModel().getResourceType();
+ return (resourceType == null) ? null : this.getStructureProvider(resourceType);
+ }
+
+ protected JpaStructureProvider getStructureProvider(JptResourceType resourceType) {
+ ResourceUiDefinition definition;
+ try {
+ definition = getResourceUiDefinition(resourceType);
+ }
+ catch (IllegalArgumentException iae) {
+ JptJpaUiPlugin.log(iae);
+ return null;
+ }
+ return definition.getStructureProvider();
+ }
+
+
+ // ********** details providers **********
+
+ public JpaDetailsPage<? extends JpaStructureNode> buildJpaDetailsPage(
+ Composite parent, JpaStructureNode structureNode, WidgetFactory widgetFactory) {
+
+ JpaDetailsProvider jpaDetailsProvider = getDetailsProvider(structureNode);
+ return jpaDetailsProvider == null ? null : jpaDetailsProvider.buildDetailsPage(parent, widgetFactory);
+ }
+
+ protected JpaDetailsProvider getDetailsProvider(JpaStructureNode structureNode) {
+ for (JpaDetailsProvider provider : CollectionTools.iterable(this.detailsProviders())) {
+ if (provider.providesDetails(structureNode)) {
+ return provider;
+ }
+ }
+ return null;//return null, some structure nodes do not have a details page
+ }
+
+ protected ListIterator<JpaDetailsProvider> detailsProviders() {
+ return this.platformUiProvider.detailsProviders();
+ }
+
+
+ // ********** mapping ui definitions **********
+
+ public JpaComposite buildTypeMappingComposite(
+ JptResourceType resourceType,
+ String mappingKey,
+ Composite parent,
+ PropertyValueModel<TypeMapping> mappingHolder,
+ WidgetFactory widgetFactory) {
+
+ return getMappingResourceUiDefinition(resourceType).buildTypeMappingComposite(
+ mappingKey, mappingHolder, parent, widgetFactory);
+ }
+
+ public JpaComposite buildAttributeMappingComposite(
+ JptResourceType resourceType,
+ String mappingKey,
+ Composite parent,
+ PropertyValueModel<AttributeMapping> mappingHolder,
+ WidgetFactory widgetFactory) {
+
+ return getMappingResourceUiDefinition(resourceType).buildAttributeMappingComposite(
+ mappingKey, mappingHolder, parent, widgetFactory);
+ }
+
+ public DefaultMappingUiDefinition<ReadOnlyPersistentAttribute, ? extends AttributeMapping> getDefaultAttributeMappingUiDefinition(JptResourceType resourceType, String mappingKey) {
+ return getMappingResourceUiDefinition(resourceType).getDefaultAttributeMappingUiDefinition(mappingKey);
+ }
+
+ public Iterator<MappingUiDefinition<ReadOnlyPersistentAttribute, ? extends AttributeMapping>> attributeMappingUiDefinitions(JptResourceType resourceType) {
+ return getMappingResourceUiDefinition(resourceType).attributeMappingUiDefinitions();
+ }
+
+ public DefaultMappingUiDefinition<PersistentType, ? extends TypeMapping> getDefaultTypeMappingUiDefinition(JptResourceType resourceType) {
+ return getMappingResourceUiDefinition(resourceType).getDefaultTypeMappingUiDefinition();
+ }
+
+ public Iterator<MappingUiDefinition<PersistentType, ? extends TypeMapping>> typeMappingUiDefinitions(JptResourceType resourceType) {
+ return getMappingResourceUiDefinition(resourceType).typeMappingUiDefinitions();
+ }
+
+
+ // ********** resource ui definitions **********
+
+ protected ListIterator<ResourceUiDefinition> resourceUiDefinitions() {
+ return this.platformUiProvider.resourceUiDefinitions();
+ }
+
+ public ResourceUiDefinition getResourceUiDefinition(JptResourceType resourceType) {
+ for (ResourceUiDefinition definition : CollectionTools.iterable(this.resourceUiDefinitions())) {
+ if (definition.providesUi(resourceType)) {
+ return definition;
+ }
+ }
+ // TODO (bug 313632) - return a null resource ui definition?
+ throw new IllegalArgumentException("No resource UI definition for the resource type: " + resourceType); //$NON-NLS-1$
+ }
+
+ public MappingResourceUiDefinition getMappingResourceUiDefinition(JptResourceType resourceType) {
+ ResourceUiDefinition def = this.getResourceUiDefinition(resourceType);
+ try {
+ return (MappingResourceUiDefinition) def;
+ } catch (ClassCastException cce) {
+ // TODO (bug 313632) - return a null resource ui definition?
+ throw new IllegalArgumentException("No mapping resource UI definition for the resource type: " + resourceType, cce); //$NON-NLS-1$
+ }
+ }
+
+
+ // ********** entity generation **********
+
+ public void generateEntities(JpaProject project, IStructuredSelection selection) {
+ EntitiesGenerator.generate(project, selection);
+ }
+
+
+ // ********** convenience methods **********
+
+ protected void displayMessage(String title, String message) {
+ Shell currentShell = Display.getCurrent().getActiveShell();
+ MessageDialog.openInformation(currentShell, title, message);
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/platform/base/EntitiesGenerator.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/platform/base/EntitiesGenerator.java
new file mode 100644
index 0000000000..76591440ac
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/platform/base/EntitiesGenerator.java
@@ -0,0 +1,66 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2010 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.ui.internal.platform.base;
+
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.window.Window;
+import org.eclipse.jface.wizard.WizardDialog;
+import org.eclipse.jpt.jpa.core.JpaProject;
+import org.eclipse.jpt.jpa.ui.internal.wizards.gen.GenerateEntitiesFromSchemaWizard;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Shell;
+
+/**
+ * EntitiesGenerator
+ */
+public class EntitiesGenerator {
+ private JpaProject project;
+ private IStructuredSelection selection;
+
+ public static void generate(JpaProject project, IStructuredSelection selection) {
+ new EntitiesGenerator(project, selection).generate();
+ }
+
+ private EntitiesGenerator(JpaProject project, IStructuredSelection selection) {
+ super();
+ if (project == null) {
+ throw new NullPointerException();
+ }
+ this.project = project;
+ this.selection = selection;
+ }
+
+
+ // ********** generate **********
+
+ /**
+ * prompt the user with a wizard;
+ * schedule a job to generate the entities;
+ * optionally schedule a job to synchronize persistence.xml to
+ * run afterwards
+ */
+ protected void generate() {
+ GenerateEntitiesFromSchemaWizard wizard = new GenerateEntitiesFromSchemaWizard(this.project, this.selection);
+ WizardDialog dialog = new WizardDialog(this.getCurrentShell(), wizard);
+ dialog.create();
+ int returnCode = dialog.open();
+ if (returnCode != Window.OK) {
+ return;
+ }
+ //Entities generation happens in the GenerateEntitiesFromSchemaWizard.performFinish()
+ //method
+ }
+
+ private Shell getCurrentShell() {
+ return Display.getCurrent().getActiveShell();
+ }
+
+
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/platform/generic/ClassRefItemLabelProvider.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/platform/generic/ClassRefItemLabelProvider.java
new file mode 100644
index 0000000000..f2b488aca9
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/platform/generic/ClassRefItemLabelProvider.java
@@ -0,0 +1,64 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 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.ui.internal.platform.generic;
+
+import org.eclipse.jpt.common.ui.internal.jface.AbstractItemLabelProvider;
+import org.eclipse.jpt.common.ui.jface.DelegatingContentAndLabelProvider;
+import org.eclipse.jpt.common.utility.internal.model.value.PropertyAspectAdapter;
+import org.eclipse.jpt.common.utility.internal.model.value.StaticPropertyValueModel;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.persistence.ClassRef;
+import org.eclipse.jpt.jpa.ui.JptJpaUiPlugin;
+import org.eclipse.jpt.jpa.ui.internal.JptUiIcons;
+import org.eclipse.swt.graphics.Image;
+
+public class ClassRefItemLabelProvider extends AbstractItemLabelProvider
+{
+ public ClassRefItemLabelProvider(
+ ClassRef classRef, DelegatingContentAndLabelProvider labelProvider) {
+ super(classRef, labelProvider);
+ }
+
+
+ @Override
+ protected PropertyValueModel<Image> buildImageModel() {
+ Image image;
+ if (((ClassRef) model()).isVirtual()) {
+ image = JptUiIcons.ghost(JptUiIcons.CLASS_REF);
+ }
+ else {
+ image = JptJpaUiPlugin.getImage(JptUiIcons.CLASS_REF);
+ }
+ return new StaticPropertyValueModel<Image>(image);
+ }
+
+ @Override
+ protected PropertyValueModel<String> buildTextModel() {
+ return new PropertyAspectAdapter<ClassRef, String>(ClassRef.CLASS_NAME_PROPERTY, (ClassRef) model()) {
+ @Override
+ protected String buildValue_() {
+ return subject.getClassName();
+ }
+ };
+ }
+
+ @Override
+ protected PropertyValueModel<String> buildDescriptionModel() {
+ //TODO also need to listen to the PersistenceUnit name property since this value depends on it
+ return new PropertyAspectAdapter<ClassRef, String>(ClassRef.CLASS_NAME_PROPERTY, (ClassRef) model()) {
+ @Override
+ protected String buildValue_() {
+ return subject.getPersistenceUnit().getName()
+ + "/\"" + subject.getClassName()
+ + "\" - " + subject.getResource().getFullPath().makeRelative();
+ }
+ };
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/platform/generic/EntityMappingsItemLabelProvider.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/platform/generic/EntityMappingsItemLabelProvider.java
new file mode 100644
index 0000000000..0d28953cc3
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/platform/generic/EntityMappingsItemLabelProvider.java
@@ -0,0 +1,48 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2009 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.ui.internal.platform.generic;
+
+import org.eclipse.jpt.common.ui.internal.jface.AbstractItemLabelProvider;
+import org.eclipse.jpt.common.ui.jface.DelegatingContentAndLabelProvider;
+import org.eclipse.jpt.common.utility.internal.model.value.StaticPropertyValueModel;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.orm.EntityMappings;
+import org.eclipse.jpt.jpa.ui.JptJpaUiPlugin;
+import org.eclipse.jpt.jpa.ui.internal.JptUiIcons;
+import org.eclipse.jpt.jpa.ui.internal.JptUiMessages;
+import org.eclipse.swt.graphics.Image;
+
+public class EntityMappingsItemLabelProvider extends AbstractItemLabelProvider
+{
+ public EntityMappingsItemLabelProvider(
+ EntityMappings entityMappings, DelegatingContentAndLabelProvider labelProvider) {
+ super(entityMappings, labelProvider);
+ }
+
+
+ @Override
+ protected PropertyValueModel<Image> buildImageModel() {
+ return new StaticPropertyValueModel<Image>(
+ JptJpaUiPlugin.getImage(JptUiIcons.ENTITY_MAPPINGS));
+ }
+
+ @Override
+ protected PropertyValueModel<String> buildTextModel() {
+ return new StaticPropertyValueModel<String>(
+ JptUiMessages.OrmItemLabelProviderFactory_entityMappingsLabel);
+ }
+
+ @Override
+ protected PropertyValueModel<String> buildDescriptionModel() {
+ return new StaticPropertyValueModel<String>(
+ JptUiMessages.OrmItemLabelProviderFactory_entityMappingsLabel
+ + " - " + ((EntityMappings) model()).getResource().getFullPath().makeRelative());
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/platform/generic/GenericJpaPlatformUi.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/platform/generic/GenericJpaPlatformUi.java
new file mode 100644
index 0000000000..d0baf65cac
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/platform/generic/GenericJpaPlatformUi.java
@@ -0,0 +1,34 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 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.ui.internal.platform.generic;
+
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jpt.jpa.core.JpaProject;
+import org.eclipse.jpt.jpa.ui.JpaPlatformUiProvider;
+import org.eclipse.jpt.jpa.ui.internal.JptUiMessages;
+import org.eclipse.jpt.jpa.ui.internal.platform.base.BaseJpaPlatformUi;
+import org.eclipse.jpt.jpa.ui.navigator.JpaNavigatorProvider;
+
+public class GenericJpaPlatformUi
+ extends BaseJpaPlatformUi
+{
+ public GenericJpaPlatformUi(
+ JpaNavigatorProvider navigatorProvider, JpaPlatformUiProvider platformUiProvider) {
+
+ super(navigatorProvider, platformUiProvider);
+ }
+
+
+ // ********** DDL generation **********
+
+ public void generateDDL(JpaProject project, IStructuredSelection selection) {
+ this.displayMessage(JptUiMessages.GenericPlatformUiDialog_notSupportedMessageTitle, JptUiMessages.GenericPlatformUiDialog_notSupportedMessageText);
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/platform/generic/GenericJpaPlatformUiFactory.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/platform/generic/GenericJpaPlatformUiFactory.java
new file mode 100644
index 0000000000..263287fe77
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/platform/generic/GenericJpaPlatformUiFactory.java
@@ -0,0 +1,32 @@
+/*******************************************************************************
+ * Copyright (c) 2009 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.ui.internal.platform.generic;
+
+import org.eclipse.jpt.jpa.ui.JpaPlatformUi;
+import org.eclipse.jpt.jpa.ui.JpaPlatformUiFactory;
+import org.eclipse.jpt.jpa.ui.internal.GenericJpaPlatformUiProvider;
+
+public class GenericJpaPlatformUiFactory implements JpaPlatformUiFactory
+{
+
+ /**
+ * Zero arg constructor for extension point
+ */
+ public GenericJpaPlatformUiFactory() {
+ super();
+ }
+
+ public JpaPlatformUi buildJpaPlatformUi() {
+ return new GenericJpaPlatformUi(
+ new GenericNavigatorProvider(),
+ GenericJpaPlatformUiProvider.instance()
+ );
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/platform/generic/GenericNavigatorItemContentProviderFactory.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/platform/generic/GenericNavigatorItemContentProviderFactory.java
new file mode 100644
index 0000000000..e7475f8cd9
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/platform/generic/GenericNavigatorItemContentProviderFactory.java
@@ -0,0 +1,255 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 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.ui.internal.platform.generic;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.ListIterator;
+
+import org.eclipse.jpt.common.ui.internal.jface.AbstractTreeItemContentProvider;
+import org.eclipse.jpt.common.ui.internal.jface.DelegatingTreeContentAndLabelProvider;
+import org.eclipse.jpt.common.ui.jface.DelegatingContentAndLabelProvider;
+import org.eclipse.jpt.common.ui.jface.TreeItemContentProvider;
+import org.eclipse.jpt.common.ui.jface.TreeItemContentProviderFactory;
+import org.eclipse.jpt.common.utility.internal.iterables.FilteringIterable;
+import org.eclipse.jpt.common.utility.internal.model.value.CollectionAspectAdapter;
+import org.eclipse.jpt.common.utility.internal.model.value.CompositeCollectionValueModel;
+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.ListAspectAdapter;
+import org.eclipse.jpt.common.utility.internal.model.value.ListCollectionValueModelAdapter;
+import org.eclipse.jpt.common.utility.internal.model.value.PropertyAspectAdapter;
+import org.eclipse.jpt.common.utility.internal.model.value.PropertyCollectionValueModelAdapter;
+import org.eclipse.jpt.common.utility.internal.model.value.TransformationListValueModel;
+import org.eclipse.jpt.common.utility.model.value.CollectionValueModel;
+import org.eclipse.jpt.jpa.core.context.JpaContextNode;
+import org.eclipse.jpt.jpa.core.context.JpaRootContextNode;
+import org.eclipse.jpt.jpa.core.context.MappingFile;
+import org.eclipse.jpt.jpa.core.context.PersistentAttribute;
+import org.eclipse.jpt.jpa.core.context.PersistentType;
+import org.eclipse.jpt.jpa.core.context.java.JarFile;
+import org.eclipse.jpt.jpa.core.context.java.JavaPersistentType;
+import org.eclipse.jpt.jpa.core.context.orm.OrmPersistentType;
+import org.eclipse.jpt.jpa.core.context.orm.OrmXml;
+import org.eclipse.jpt.jpa.core.context.persistence.ClassRef;
+import org.eclipse.jpt.jpa.core.context.persistence.JarFileRef;
+import org.eclipse.jpt.jpa.core.context.persistence.MappingFileRef;
+import org.eclipse.jpt.jpa.core.context.persistence.PersistenceUnit;
+import org.eclipse.jpt.jpa.core.context.persistence.PersistenceXml;
+
+public class GenericNavigatorItemContentProviderFactory
+ implements TreeItemContentProviderFactory
+{
+ public TreeItemContentProvider buildItemContentProvider(Object item, DelegatingContentAndLabelProvider contentAndLabelProvider) {
+ DelegatingTreeContentAndLabelProvider treeContentAndLabelProvider = (DelegatingTreeContentAndLabelProvider) contentAndLabelProvider;
+
+ if (item instanceof JpaRootContextNode) {
+ return new RootContextItemContentProvider((JpaRootContextNode) item, treeContentAndLabelProvider);
+ }
+ else if (item instanceof PersistenceXml) {
+ return new PersistenceXmlItemContentProvider((PersistenceXml) item, treeContentAndLabelProvider);
+ }
+ else if (item instanceof PersistenceUnit) {
+ return new PersistenceUnitItemContentProvider((PersistenceUnit) item, treeContentAndLabelProvider);
+ }
+ else if (item instanceof OrmXml) {
+ return new OrmXmlItemContentProvider((OrmXml) item, treeContentAndLabelProvider);
+ }
+ else if (item instanceof OrmPersistentType) {
+ return new OrmPersistentTypeItemContentProvider((OrmPersistentType) item, treeContentAndLabelProvider);
+ }
+ else if (item instanceof JavaPersistentType) {
+ return new JavaPersistentTypeItemContentProvider((JavaPersistentType) item, treeContentAndLabelProvider);
+ }
+ else if (item instanceof PersistentAttribute) {
+ return new PersistentAttributeItemContentProvider((PersistentAttribute) item, treeContentAndLabelProvider);
+ }
+ return null;
+ }
+
+
+ public static class PersistenceUnitItemContentProvider extends AbstractTreeItemContentProvider<JpaContextNode>
+ {
+ public PersistenceUnitItemContentProvider(
+ PersistenceUnit persistenceUnit, DelegatingTreeContentAndLabelProvider contentProvider) {
+ super(persistenceUnit, contentProvider);
+ }
+
+ @Override
+ public PersistenceUnit getModel() {
+ return (PersistenceUnit) super.getModel();
+ }
+
+ @Override
+ public PersistenceXml getParent() {
+ return getModel().getParent().getParent();
+ }
+
+ @Override
+ protected CollectionValueModel<JpaContextNode> buildChildrenModel() {
+ List<CollectionValueModel<? extends JpaContextNode>> list = new ArrayList<CollectionValueModel<? extends JpaContextNode>>();
+ list.add(buildSpecifiedOrmXmlCvm());
+ list.add(buildImpliedMappingFileCvm());
+ list.add(buildPersistentTypeCvm());
+ list.add(buildJarFileCvm());
+ return new CompositeCollectionValueModel<CollectionValueModel<? extends JpaContextNode>, JpaContextNode>(list);
+ }
+
+ protected CollectionValueModel<JpaContextNode> buildSpecifiedOrmXmlCvm() {
+ return new FilteringCollectionValueModel<JpaContextNode>(
+ new ListCollectionValueModelAdapter<MappingFile>(
+ new TransformationListValueModel<MappingFileRef, MappingFile>(
+ new ItemPropertyListValueModelAdapter<MappingFileRef>(
+ new ListAspectAdapter<PersistenceUnit, MappingFileRef>(
+ PersistenceUnit.SPECIFIED_MAPPING_FILE_REFS_LIST,
+ getModel()) {
+ @Override
+ protected ListIterator<MappingFileRef> listIterator_() {
+ return subject.specifiedMappingFileRefs();
+ }
+ @Override
+ protected int size_() {
+ return subject.specifiedMappingFileRefsSize();
+ }
+ }, MappingFileRef.MAPPING_FILE_PROPERTY)) {
+ @Override
+ protected MappingFile transformItem(MappingFileRef item) {
+ return item.getMappingFile();
+ }
+ })) {
+ @Override
+ protected Iterable<JpaContextNode> filter(Iterable<? extends JpaContextNode> items) {
+ return new FilteringIterable<JpaContextNode>(items) {
+ @Override
+ protected boolean accept(JpaContextNode o) {
+ return o != null;
+ }
+ };
+ }
+ };
+ }
+
+ protected CollectionValueModel<MappingFile> buildImpliedMappingFileCvm() {
+ return new PropertyCollectionValueModelAdapter<MappingFile>(
+ new PropertyAspectAdapter<MappingFileRef, MappingFile>(
+ new PropertyAspectAdapter<PersistenceUnit, MappingFileRef>(
+ PersistenceUnit.IMPLIED_MAPPING_FILE_REF_PROPERTY,
+ getModel()) {
+ @Override
+ protected MappingFileRef buildValue_() {
+ return subject.getImpliedMappingFileRef();
+ }
+ },
+ MappingFileRef.MAPPING_FILE_PROPERTY) {
+ @Override
+ protected MappingFile buildValue_() {
+ return subject.getMappingFile();
+ }
+ }
+ );
+ }
+
+ protected CollectionValueModel<JpaContextNode> buildPersistentTypeCvm() {
+ return new FilteringCollectionValueModel<JpaContextNode>(
+ new ListCollectionValueModelAdapter<PersistentType>(
+ new TransformationListValueModel<ClassRef, PersistentType>(
+ new ItemPropertyListValueModelAdapter<ClassRef>(buildClassRefCvm(), ClassRef.JAVA_PERSISTENT_TYPE_PROPERTY)) {
+ @Override
+ protected PersistentType transformItem(ClassRef item) {
+ return item.getJavaPersistentType();
+ }
+ })) {
+ @Override
+ protected Iterable<JpaContextNode> filter(Iterable<? extends JpaContextNode> items) {
+ return new FilteringIterable<JpaContextNode>(items) {
+ @Override
+ protected boolean accept(JpaContextNode o) {
+ return o != null;
+ }
+ };
+ }
+ };
+ }
+
+ protected CollectionValueModel<ClassRef> buildClassRefCvm() {
+ ArrayList<CollectionValueModel<ClassRef>> holders = new ArrayList<CollectionValueModel<ClassRef>>(2);
+ holders.add(buildSpecifiedClassRefCvm());
+ holders.add(buildImpliedClassRefCvm());
+ return new CompositeCollectionValueModel<CollectionValueModel<ClassRef>, ClassRef>(holders);
+ }
+
+ protected CollectionValueModel<ClassRef> buildSpecifiedClassRefCvm() {
+ return new ListCollectionValueModelAdapter<ClassRef>(
+ new ListAspectAdapter<PersistenceUnit, ClassRef>(
+ PersistenceUnit.SPECIFIED_CLASS_REFS_LIST, getModel()) {
+ @Override
+ protected ListIterator<ClassRef> listIterator_() {
+ return subject.specifiedClassRefs();
+ }
+ @Override
+ protected int size_() {
+ return subject.specifiedClassRefsSize();
+ }
+ });
+ }
+
+ protected CollectionValueModel<ClassRef> buildImpliedClassRefCvm() {
+ return new CollectionAspectAdapter<PersistenceUnit, ClassRef>(
+ PersistenceUnit.IMPLIED_CLASS_REFS_COLLECTION, getModel()) {
+ @Override
+ protected Iterator<ClassRef> iterator_() {
+ return subject.impliedClassRefs();
+ }
+ @Override
+ protected int size_() {
+ return subject.impliedClassRefsSize();
+ }
+ };
+ }
+
+ protected CollectionValueModel<JpaContextNode> buildJarFileCvm() {
+ return new FilteringCollectionValueModel<JpaContextNode>(
+ new ListCollectionValueModelAdapter<JarFile>(
+ new TransformationListValueModel<JarFileRef, JarFile>(
+ new ItemPropertyListValueModelAdapter<JarFileRef>(buildJarFileRefCvm(), JarFileRef.JAR_FILE_PROPERTY)) {
+ @Override
+ protected JarFile transformItem(JarFileRef item) {
+ return item.getJarFile();
+ }
+ })) {
+ @Override
+ protected Iterable<JpaContextNode> filter(Iterable<? extends JpaContextNode> items) {
+ return new FilteringIterable<JpaContextNode>(items) {
+ @Override
+ protected boolean accept(JpaContextNode o) {
+ return o != null;
+ }
+ };
+ }
+ };
+ }
+
+ protected CollectionValueModel<JarFileRef> buildJarFileRefCvm() {
+ return new ListCollectionValueModelAdapter<JarFileRef>(
+ new ListAspectAdapter<PersistenceUnit, JarFileRef>(
+ PersistenceUnit.JAR_FILE_REFS_LIST, getModel()) {
+ @Override
+ protected ListIterator<JarFileRef> listIterator_() {
+ return subject.jarFileRefs();
+ }
+ @Override
+ protected int size_() {
+ return subject.jarFileRefsSize();
+ }
+ });
+ }
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/platform/generic/GenericNavigatorItemLabelProviderFactory.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/platform/generic/GenericNavigatorItemLabelProviderFactory.java
new file mode 100644
index 0000000000..f3063b5be2
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/platform/generic/GenericNavigatorItemLabelProviderFactory.java
@@ -0,0 +1,51 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2009 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.ui.internal.platform.generic;
+
+import org.eclipse.jpt.common.ui.jface.DelegatingContentAndLabelProvider;
+import org.eclipse.jpt.common.ui.jface.ItemLabelProvider;
+import org.eclipse.jpt.common.ui.jface.ItemLabelProviderFactory;
+import org.eclipse.jpt.jpa.core.context.JpaRootContextNode;
+import org.eclipse.jpt.jpa.core.context.PersistentAttribute;
+import org.eclipse.jpt.jpa.core.context.PersistentType;
+import org.eclipse.jpt.jpa.core.context.java.JarFile;
+import org.eclipse.jpt.jpa.core.context.orm.OrmXml;
+import org.eclipse.jpt.jpa.core.context.persistence.PersistenceUnit;
+import org.eclipse.jpt.jpa.core.context.persistence.PersistenceXml;
+import org.eclipse.jpt.jpa.ui.internal.jface.JarFileItemLabelProvider;
+
+public class GenericNavigatorItemLabelProviderFactory
+ implements ItemLabelProviderFactory
+{
+ public ItemLabelProvider buildItemLabelProvider(Object item, DelegatingContentAndLabelProvider contentAndLabelProvider) {
+ if (item instanceof JpaRootContextNode) {
+ return new RootContextItemLabelProvider((JpaRootContextNode) item, contentAndLabelProvider);
+ }
+ else if (item instanceof PersistenceXml) {
+ return new PersistenceXmlItemLabelProvider((PersistenceXml) item, contentAndLabelProvider);
+ }
+ else if (item instanceof PersistenceUnit) {
+ return new PersistenceUnitItemLabelProvider((PersistenceUnit) item, contentAndLabelProvider);
+ }
+ else if (item instanceof OrmXml) {
+ return new OrmXmlItemLabelProvider((OrmXml) item, contentAndLabelProvider);
+ }
+ else if (item instanceof PersistentType) {
+ return new PersistentTypeItemLabelProvider((PersistentType) item, contentAndLabelProvider);
+ }
+ else if (item instanceof PersistentAttribute) {
+ return new PersistentAttributeItemLabelProvider((PersistentAttribute) item, contentAndLabelProvider);
+ }
+ else if (item instanceof JarFile) {
+ return new JarFileItemLabelProvider((JarFile) item, contentAndLabelProvider);
+ }
+ return null;
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/platform/generic/GenericNavigatorProvider.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/platform/generic/GenericNavigatorProvider.java
new file mode 100644
index 0000000000..a1d3997bf3
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/platform/generic/GenericNavigatorProvider.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 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.jpa.ui.internal.platform.generic;
+
+import org.eclipse.jpt.common.ui.jface.ItemLabelProviderFactory;
+import org.eclipse.jpt.common.ui.jface.TreeItemContentProviderFactory;
+import org.eclipse.jpt.jpa.ui.navigator.JpaNavigatorProvider;
+
+public class GenericNavigatorProvider implements JpaNavigatorProvider
+{
+ public ItemLabelProviderFactory getItemLabelProviderFactory() {
+ return new GenericNavigatorItemLabelProviderFactory();
+ }
+
+ public TreeItemContentProviderFactory getTreeItemContentProviderFactory() {
+ return new GenericNavigatorItemContentProviderFactory();
+ }
+
+ public void dispose() {
+ // TODO Auto-generated method stub
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/platform/generic/JarFileRefItemLabelProvider.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/platform/generic/JarFileRefItemLabelProvider.java
new file mode 100644
index 0000000000..c21c58fb9b
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/platform/generic/JarFileRefItemLabelProvider.java
@@ -0,0 +1,57 @@
+/*******************************************************************************
+ * Copyright (c) 2009 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.ui.internal.platform.generic;
+
+import org.eclipse.jpt.common.ui.internal.jface.AbstractItemLabelProvider;
+import org.eclipse.jpt.common.ui.jface.DelegatingContentAndLabelProvider;
+import org.eclipse.jpt.common.utility.internal.model.value.PropertyAspectAdapter;
+import org.eclipse.jpt.common.utility.internal.model.value.StaticPropertyValueModel;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.persistence.JarFileRef;
+import org.eclipse.jpt.jpa.ui.JptJpaUiPlugin;
+import org.eclipse.jpt.jpa.ui.internal.JptUiIcons;
+import org.eclipse.swt.graphics.Image;
+
+public class JarFileRefItemLabelProvider extends AbstractItemLabelProvider
+{
+ public JarFileRefItemLabelProvider(
+ JarFileRef jarFileRef, DelegatingContentAndLabelProvider labelProvider) {
+ super(jarFileRef, labelProvider);
+ }
+
+
+ @Override
+ protected PropertyValueModel<String> buildTextModel() {
+ return new PropertyAspectAdapter<JarFileRef, String>(JarFileRef.FILE_NAME_PROPERTY, (JarFileRef) model()) {
+ @Override
+ protected String buildValue_() {
+ return subject.getFileName();
+ }
+ };
+ }
+
+ @Override
+ protected PropertyValueModel<Image> buildImageModel() {
+ return new StaticPropertyValueModel<Image>(JptJpaUiPlugin.getImage(JptUiIcons.JAR_FILE_REF));
+ }
+
+ @Override
+ protected PropertyValueModel<String> buildDescriptionModel() {
+ return new PropertyAspectAdapter<JarFileRef, String>(JarFileRef.FILE_NAME_PROPERTY, (JarFileRef) model()) {
+ @Override
+ protected String buildValue_() {
+ return subject.getPersistenceUnit().getName()
+ + "/\"" + subject.getFileName()
+ + "\" - " + subject.getResource().getFullPath().makeRelative();
+ }
+ };
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/platform/generic/JavaPersistentTypeItemContentProvider.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/platform/generic/JavaPersistentTypeItemContentProvider.java
new file mode 100644
index 0000000000..436dc21c86
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/platform/generic/JavaPersistentTypeItemContentProvider.java
@@ -0,0 +1,53 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 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.ui.internal.platform.generic;
+
+import java.util.ListIterator;
+import org.eclipse.jpt.common.ui.internal.jface.AbstractTreeItemContentProvider;
+import org.eclipse.jpt.common.ui.internal.jface.DelegatingTreeContentAndLabelProvider;
+import org.eclipse.jpt.common.utility.internal.model.value.ListAspectAdapter;
+import org.eclipse.jpt.common.utility.internal.model.value.ListCollectionValueModelAdapter;
+import org.eclipse.jpt.common.utility.model.value.CollectionValueModel;
+import org.eclipse.jpt.jpa.core.context.java.JavaPersistentAttribute;
+import org.eclipse.jpt.jpa.core.context.java.JavaPersistentType;
+
+public class JavaPersistentTypeItemContentProvider extends AbstractTreeItemContentProvider<JavaPersistentAttribute>
+{
+ public JavaPersistentTypeItemContentProvider(
+ JavaPersistentType persistentType, DelegatingTreeContentAndLabelProvider contentProvider) {
+ super(persistentType, contentProvider);
+ }
+
+ @Override
+ public JavaPersistentType getModel() {
+ return (JavaPersistentType) super.getModel();
+ }
+
+ @Override
+ public Object getParent() {
+ return getModel().getParent();
+ }
+
+ @Override
+ protected CollectionValueModel<JavaPersistentAttribute> buildChildrenModel() {
+ return new ListCollectionValueModelAdapter<JavaPersistentAttribute>(
+ new ListAspectAdapter<JavaPersistentType, JavaPersistentAttribute>(JavaPersistentType.ATTRIBUTES_LIST, getModel()) {
+ @Override
+ protected ListIterator<JavaPersistentAttribute> listIterator_() {
+ return subject.attributes();
+ }
+
+ @Override
+ protected int size_() {
+ return subject.attributesSize();
+ }
+ });
+ }
+} \ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/platform/generic/MappingFileRefItemLabelProvider.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/platform/generic/MappingFileRefItemLabelProvider.java
new file mode 100644
index 0000000000..bf1af296e0
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/platform/generic/MappingFileRefItemLabelProvider.java
@@ -0,0 +1,63 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 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.ui.internal.platform.generic;
+
+import org.eclipse.jpt.common.ui.internal.jface.AbstractItemLabelProvider;
+import org.eclipse.jpt.common.ui.jface.DelegatingContentAndLabelProvider;
+import org.eclipse.jpt.common.utility.internal.model.value.PropertyAspectAdapter;
+import org.eclipse.jpt.common.utility.internal.model.value.StaticPropertyValueModel;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.persistence.MappingFileRef;
+import org.eclipse.jpt.jpa.ui.JptJpaUiPlugin;
+import org.eclipse.jpt.jpa.ui.internal.JptUiIcons;
+import org.eclipse.swt.graphics.Image;
+
+public class MappingFileRefItemLabelProvider extends AbstractItemLabelProvider
+{
+ public MappingFileRefItemLabelProvider(
+ MappingFileRef mappingFileRef, DelegatingContentAndLabelProvider labelProvider) {
+ super(mappingFileRef, labelProvider);
+ }
+
+
+ @Override
+ protected PropertyValueModel<Image> buildImageModel() {
+ Image image;
+ if (((MappingFileRef) model()).isImplied()) {
+ image = JptUiIcons.ghost(JptUiIcons.MAPPING_FILE_REF);
+ }
+ else {
+ image = JptJpaUiPlugin.getImage(JptUiIcons.MAPPING_FILE_REF);
+ }
+ return new StaticPropertyValueModel<Image>(image);
+ }
+
+ @Override
+ protected PropertyValueModel<String> buildTextModel() {
+ return new PropertyAspectAdapter<MappingFileRef, String>(MappingFileRef.FILE_NAME_PROPERTY, (MappingFileRef) model()) {
+ @Override
+ protected String buildValue_() {
+ return subject.getFileName();
+ }
+ };
+ }
+
+ @Override
+ protected PropertyValueModel<String> buildDescriptionModel() {
+ return new PropertyAspectAdapter<MappingFileRef, String>(MappingFileRef.FILE_NAME_PROPERTY, (MappingFileRef) model()) {
+ @Override
+ protected String buildValue_() {
+ return subject.getPersistenceUnit().getName()
+ + "/\"" + subject.getFileName() + "\""
+ + " - " + subject.getResource().getFullPath().makeRelative();
+ }
+ };
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/platform/generic/OrmPersistentTypeItemContentProvider.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/platform/generic/OrmPersistentTypeItemContentProvider.java
new file mode 100644
index 0000000000..34e16ca326
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/platform/generic/OrmPersistentTypeItemContentProvider.java
@@ -0,0 +1,82 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 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.ui.internal.platform.generic;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.ListIterator;
+import org.eclipse.jpt.common.ui.internal.jface.AbstractTreeItemContentProvider;
+import org.eclipse.jpt.common.ui.internal.jface.DelegatingTreeContentAndLabelProvider;
+import org.eclipse.jpt.common.utility.internal.iterators.SuperListIteratorWrapper;
+import org.eclipse.jpt.common.utility.internal.model.value.CompositeCollectionValueModel;
+import org.eclipse.jpt.common.utility.internal.model.value.ListAspectAdapter;
+import org.eclipse.jpt.common.utility.internal.model.value.ListCollectionValueModelAdapter;
+import org.eclipse.jpt.common.utility.model.value.CollectionValueModel;
+import org.eclipse.jpt.jpa.core.context.orm.OrmPersistentAttribute;
+import org.eclipse.jpt.jpa.core.context.orm.OrmPersistentType;
+import org.eclipse.jpt.jpa.core.context.orm.OrmReadOnlyPersistentAttribute;
+
+public class OrmPersistentTypeItemContentProvider
+ extends AbstractTreeItemContentProvider<OrmReadOnlyPersistentAttribute>
+{
+ public OrmPersistentTypeItemContentProvider(
+ OrmPersistentType persistentType, DelegatingTreeContentAndLabelProvider contentProvider) {
+ super(persistentType, contentProvider);
+ }
+
+ @Override
+ public OrmPersistentType getModel() {
+ return (OrmPersistentType) super.getModel();
+ }
+
+ @Override
+ public Object getParent() {
+ return getModel().getParent();
+ }
+
+ @Override
+ protected CollectionValueModel<OrmReadOnlyPersistentAttribute> buildChildrenModel() {
+ List<CollectionValueModel<OrmReadOnlyPersistentAttribute>> list = new ArrayList<CollectionValueModel<OrmReadOnlyPersistentAttribute>>(2);
+ list.add(buildSpecifiedPersistentAttributesModel());
+ list.add(buildVirtualPersistentAttributesModel());
+ return new CompositeCollectionValueModel<CollectionValueModel<OrmReadOnlyPersistentAttribute>, OrmReadOnlyPersistentAttribute>(list);
+ }
+
+ protected CollectionValueModel<OrmReadOnlyPersistentAttribute> buildSpecifiedPersistentAttributesModel() {
+ return new ListCollectionValueModelAdapter<OrmReadOnlyPersistentAttribute>(
+ new ListAspectAdapter<OrmPersistentType, OrmReadOnlyPersistentAttribute>(OrmPersistentType.SPECIFIED_ATTRIBUTES_LIST, getModel()) {
+ @Override
+ protected ListIterator<OrmReadOnlyPersistentAttribute> listIterator_() {
+ return new SuperListIteratorWrapper<OrmReadOnlyPersistentAttribute>(this.specifiedAttributes());
+ }
+ protected ListIterator<OrmPersistentAttribute> specifiedAttributes() {
+ return this.subject.specifiedAttributes();
+ }
+ @Override
+ protected int size_() {
+ return this.subject.specifiedAttributesSize();
+ }
+ });
+ }
+
+ protected CollectionValueModel<OrmReadOnlyPersistentAttribute> buildVirtualPersistentAttributesModel() {
+ return new ListCollectionValueModelAdapter<OrmReadOnlyPersistentAttribute>(
+ new ListAspectAdapter<OrmPersistentType, OrmReadOnlyPersistentAttribute>(OrmPersistentType.VIRTUAL_ATTRIBUTES_LIST, getModel()) {
+ @Override
+ protected ListIterator<OrmReadOnlyPersistentAttribute> listIterator_() {
+ return subject.virtualAttributes();
+ }
+ @Override
+ protected int size_() {
+ return subject.virtualAttributesSize();
+ }
+ });
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/platform/generic/OrmXmlItemContentProvider.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/platform/generic/OrmXmlItemContentProvider.java
new file mode 100644
index 0000000000..7e29fc2532
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/platform/generic/OrmXmlItemContentProvider.java
@@ -0,0 +1,69 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2009 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.ui.internal.platform.generic;
+
+import org.eclipse.jpt.common.ui.internal.jface.AbstractTreeItemContentProvider;
+import org.eclipse.jpt.common.ui.internal.jface.DelegatingTreeContentAndLabelProvider;
+import org.eclipse.jpt.common.utility.internal.iterables.ListIterable;
+import org.eclipse.jpt.common.utility.internal.model.value.ListAspectAdapter;
+import org.eclipse.jpt.common.utility.internal.model.value.ListCollectionValueModelAdapter;
+import org.eclipse.jpt.common.utility.internal.model.value.PropertyAspectAdapter;
+import org.eclipse.jpt.common.utility.model.value.CollectionValueModel;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.orm.EntityMappings;
+import org.eclipse.jpt.jpa.core.context.orm.OrmPersistentType;
+import org.eclipse.jpt.jpa.core.context.orm.OrmXml;
+import org.eclipse.jpt.jpa.core.context.persistence.PersistenceUnit;
+
+public class OrmXmlItemContentProvider
+ extends AbstractTreeItemContentProvider<OrmPersistentType>
+{
+ public OrmXmlItemContentProvider(
+ OrmXml ormXml, DelegatingTreeContentAndLabelProvider contentProvider) {
+ super(ormXml, contentProvider);
+ }
+
+ @Override
+ public OrmXml getModel() {
+ return (OrmXml) super.getModel();
+ }
+
+ @Override
+ public PersistenceUnit getParent() {
+ return getModel().getPersistenceUnit();
+ }
+
+ @Override
+ protected CollectionValueModel<OrmPersistentType> buildChildrenModel() {
+ return new ListCollectionValueModelAdapter<OrmPersistentType>(
+ new ListAspectAdapter<EntityMappings, OrmPersistentType>(
+ buildEntityMappingsHolder(),
+ EntityMappings.PERSISTENT_TYPES_LIST) {
+ @Override
+ protected ListIterable<OrmPersistentType> getListIterable() {
+ return subject.getPersistentTypes();
+ }
+ @Override
+ protected int size_() {
+ return subject.getPersistentTypesSize();
+ }
+ });
+ }
+
+ protected PropertyValueModel<EntityMappings> buildEntityMappingsHolder() {
+ return new PropertyAspectAdapter<OrmXml, EntityMappings>(
+ OrmXml.ROOT_PROPERTY, getModel()) {
+ @Override
+ protected EntityMappings buildValue_() {
+ return subject.getRoot();
+ }
+ };
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/platform/generic/OrmXmlItemLabelProvider.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/platform/generic/OrmXmlItemLabelProvider.java
new file mode 100644
index 0000000000..2593c4dadb
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/platform/generic/OrmXmlItemLabelProvider.java
@@ -0,0 +1,46 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2009 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.ui.internal.platform.generic;
+
+import org.eclipse.jpt.common.ui.internal.jface.AbstractItemLabelProvider;
+import org.eclipse.jpt.common.ui.jface.DelegatingContentAndLabelProvider;
+import org.eclipse.jpt.common.utility.internal.model.value.StaticPropertyValueModel;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.orm.OrmXml;
+import org.eclipse.jpt.jpa.ui.JptJpaUiPlugin;
+import org.eclipse.jpt.jpa.ui.internal.JptUiIcons;
+import org.eclipse.swt.graphics.Image;
+
+public class OrmXmlItemLabelProvider extends AbstractItemLabelProvider
+{
+ public OrmXmlItemLabelProvider(
+ OrmXml ormXml, DelegatingContentAndLabelProvider labelProvider) {
+ super(ormXml, labelProvider);
+ }
+
+
+ @Override
+ protected PropertyValueModel<Image> buildImageModel() {
+ return new StaticPropertyValueModel<Image>(JptJpaUiPlugin.getImage(JptUiIcons.JPA_FILE));
+ }
+
+ @Override
+ protected PropertyValueModel<String> buildTextModel() {
+ return new StaticPropertyValueModel<String>(((OrmXml) model()).getResource().getName());
+ }
+
+ @Override
+ protected PropertyValueModel<String> buildDescriptionModel() {
+ OrmXml ormXml = (OrmXml) model();
+ return new StaticPropertyValueModel<String>(
+ ormXml.getResource().getName()
+ + " - " + ormXml.getResource().getParent().getFullPath().makeRelative().toString());
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/platform/generic/PersistenceItemLabelProvider.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/platform/generic/PersistenceItemLabelProvider.java
new file mode 100644
index 0000000000..c3706213e7
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/platform/generic/PersistenceItemLabelProvider.java
@@ -0,0 +1,47 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2009 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.ui.internal.platform.generic;
+
+import org.eclipse.jpt.common.ui.internal.jface.AbstractItemLabelProvider;
+import org.eclipse.jpt.common.ui.jface.DelegatingContentAndLabelProvider;
+import org.eclipse.jpt.common.utility.internal.model.value.StaticPropertyValueModel;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.persistence.Persistence;
+import org.eclipse.jpt.jpa.ui.JptJpaUiPlugin;
+import org.eclipse.jpt.jpa.ui.internal.JptUiIcons;
+import org.eclipse.jpt.jpa.ui.internal.JptUiMessages;
+import org.eclipse.swt.graphics.Image;
+
+public class PersistenceItemLabelProvider extends AbstractItemLabelProvider
+{
+ public PersistenceItemLabelProvider(
+ Persistence persistence, DelegatingContentAndLabelProvider labelProvider) {
+ super(persistence, labelProvider);
+ }
+
+
+ @Override
+ protected PropertyValueModel<Image> buildImageModel() {
+ return new StaticPropertyValueModel<Image>(JptJpaUiPlugin.getImage(JptUiIcons.PERSISTENCE));
+ }
+
+ @Override
+ protected PropertyValueModel<String> buildTextModel() {
+ return new StaticPropertyValueModel<String>(
+ JptUiMessages.PersistenceItemLabelProviderFactory_persistenceLabel);
+ }
+
+ @Override
+ protected PropertyValueModel<String> buildDescriptionModel() {
+ return new StaticPropertyValueModel<String>(
+ JptUiMessages.PersistenceItemLabelProviderFactory_persistenceLabel
+ + " - " + ((Persistence) model()).getResource().getFullPath().makeRelative());
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/platform/generic/PersistenceUnitItemLabelProvider.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/platform/generic/PersistenceUnitItemLabelProvider.java
new file mode 100644
index 0000000000..eaa8423760
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/platform/generic/PersistenceUnitItemLabelProvider.java
@@ -0,0 +1,55 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2009 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.ui.internal.platform.generic;
+
+import org.eclipse.jpt.common.ui.internal.jface.AbstractItemLabelProvider;
+import org.eclipse.jpt.common.ui.jface.DelegatingContentAndLabelProvider;
+import org.eclipse.jpt.common.utility.internal.model.value.PropertyAspectAdapter;
+import org.eclipse.jpt.common.utility.internal.model.value.StaticPropertyValueModel;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.persistence.PersistenceUnit;
+import org.eclipse.jpt.jpa.ui.JptJpaUiPlugin;
+import org.eclipse.jpt.jpa.ui.internal.JptUiIcons;
+import org.eclipse.swt.graphics.Image;
+
+public class PersistenceUnitItemLabelProvider extends AbstractItemLabelProvider
+{
+ public PersistenceUnitItemLabelProvider(
+ PersistenceUnit persistenceUnit, DelegatingContentAndLabelProvider labelProvider) {
+ super(persistenceUnit, labelProvider);
+ }
+
+
+ @Override
+ protected PropertyValueModel<Image> buildImageModel() {
+ return new StaticPropertyValueModel<Image>(JptJpaUiPlugin.getImage(JptUiIcons.PERSISTENCE_UNIT));
+ }
+
+ @Override
+ protected PropertyValueModel<String> buildTextModel() {
+ return new PropertyAspectAdapter<PersistenceUnit, String>(PersistenceUnit.NAME_PROPERTY, (PersistenceUnit) model()) {
+ @Override
+ protected String buildValue_() {
+ return subject.getName();
+ }
+ };
+ }
+
+ @Override
+ protected PropertyValueModel<String> buildDescriptionModel() {
+ return new PropertyAspectAdapter<PersistenceUnit, String>(PersistenceUnit.NAME_PROPERTY, (PersistenceUnit) model()) {
+ @Override
+ protected String buildValue_() {
+ return subject.getName()
+ + " - " + subject.getResource().getFullPath().makeRelative();
+ }
+ };
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/platform/generic/PersistenceXmlItemContentProvider.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/platform/generic/PersistenceXmlItemContentProvider.java
new file mode 100644
index 0000000000..7e8ebbaf5b
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/platform/generic/PersistenceXmlItemContentProvider.java
@@ -0,0 +1,61 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2009 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.ui.internal.platform.generic;
+
+import java.util.ListIterator;
+
+import org.eclipse.jpt.common.ui.internal.jface.AbstractTreeItemContentProvider;
+import org.eclipse.jpt.common.ui.internal.jface.DelegatingTreeContentAndLabelProvider;
+import org.eclipse.jpt.common.utility.internal.model.value.ListAspectAdapter;
+import org.eclipse.jpt.common.utility.internal.model.value.ListCollectionValueModelAdapter;
+import org.eclipse.jpt.common.utility.internal.model.value.PropertyAspectAdapter;
+import org.eclipse.jpt.common.utility.model.value.CollectionValueModel;
+import org.eclipse.jpt.jpa.core.context.JpaRootContextNode;
+import org.eclipse.jpt.jpa.core.context.persistence.Persistence;
+import org.eclipse.jpt.jpa.core.context.persistence.PersistenceUnit;
+import org.eclipse.jpt.jpa.core.context.persistence.PersistenceXml;
+
+public class PersistenceXmlItemContentProvider
+ extends AbstractTreeItemContentProvider<PersistenceUnit>
+{
+ public PersistenceXmlItemContentProvider(
+ PersistenceXml persistenceXml, DelegatingTreeContentAndLabelProvider contentProvider) {
+ super(persistenceXml, contentProvider);
+ }
+
+ @Override
+ public PersistenceXml getModel() {
+ return (PersistenceXml) super.getModel();
+ }
+
+ @Override
+ public JpaRootContextNode getParent() {
+ return (JpaRootContextNode) getModel().getParent();
+ }
+
+ @Override
+ protected CollectionValueModel<PersistenceUnit> buildChildrenModel() {
+ return new ListCollectionValueModelAdapter<PersistenceUnit>(
+ new ListAspectAdapter<Persistence, PersistenceUnit>(
+ new PropertyAspectAdapter<PersistenceXml, Persistence>(
+ PersistenceXml.PERSISTENCE_PROPERTY, getModel()) {
+ @Override
+ protected Persistence buildValue_() {
+ return subject.getPersistence();
+ }
+ },
+ Persistence.PERSISTENCE_UNITS_LIST) {
+ @Override
+ protected ListIterator<PersistenceUnit> listIterator_() {
+ return subject.persistenceUnits();
+ }
+ });
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/platform/generic/PersistenceXmlItemLabelProvider.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/platform/generic/PersistenceXmlItemLabelProvider.java
new file mode 100644
index 0000000000..3e6220ca59
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/platform/generic/PersistenceXmlItemLabelProvider.java
@@ -0,0 +1,46 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2009 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.ui.internal.platform.generic;
+
+import org.eclipse.jpt.common.ui.internal.jface.AbstractItemLabelProvider;
+import org.eclipse.jpt.common.ui.jface.DelegatingContentAndLabelProvider;
+import org.eclipse.jpt.common.utility.internal.model.value.StaticPropertyValueModel;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.persistence.PersistenceXml;
+import org.eclipse.jpt.jpa.ui.JptJpaUiPlugin;
+import org.eclipse.jpt.jpa.ui.internal.JptUiIcons;
+import org.eclipse.swt.graphics.Image;
+
+public class PersistenceXmlItemLabelProvider extends AbstractItemLabelProvider
+{
+ public PersistenceXmlItemLabelProvider(
+ PersistenceXml persistenceXml, DelegatingContentAndLabelProvider labelProvider) {
+ super(persistenceXml, labelProvider);
+ }
+
+
+ @Override
+ protected PropertyValueModel<Image> buildImageModel() {
+ return new StaticPropertyValueModel<Image>(JptJpaUiPlugin.getImage(JptUiIcons.JPA_FILE));
+ }
+
+ @Override
+ protected PropertyValueModel<String> buildTextModel() {
+ return new StaticPropertyValueModel<String>(((PersistenceXml) model()).getResource().getName());
+ }
+
+ @Override
+ protected PropertyValueModel<String> buildDescriptionModel() {
+ PersistenceXml persistenceXml = (PersistenceXml) model();
+ return new StaticPropertyValueModel<String>(
+ persistenceXml.getResource().getName()
+ + " - " + persistenceXml.getResource().getParent().getFullPath().makeRelative().toString());
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/platform/generic/PersistentAttributeItemContentProvider.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/platform/generic/PersistentAttributeItemContentProvider.java
new file mode 100644
index 0000000000..bdde1fde4e
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/platform/generic/PersistentAttributeItemContentProvider.java
@@ -0,0 +1,39 @@
+/*******************************************************************************
+ * Copyright (c) 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.jpa.ui.internal.platform.generic;
+
+import org.eclipse.jpt.common.ui.internal.jface.AbstractTreeItemContentProvider;
+import org.eclipse.jpt.common.ui.internal.jface.DelegatingTreeContentAndLabelProvider;
+import org.eclipse.jpt.jpa.core.context.PersistentAttribute;
+
+@SuppressWarnings("unchecked")
+public class PersistentAttributeItemContentProvider extends AbstractTreeItemContentProvider
+{
+ public PersistentAttributeItemContentProvider(
+ PersistentAttribute persistentAttribute, DelegatingTreeContentAndLabelProvider contentProvider) {
+ super(persistentAttribute, contentProvider);
+ }
+
+ @Override
+ public PersistentAttribute getModel() {
+ return (PersistentAttribute) super.getModel();
+ }
+
+ @Override
+ public Object getParent() {
+ return getModel().getParent();
+ }
+
+ @Override
+ public boolean hasChildren() {
+ return false;
+ }
+} \ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/platform/generic/PersistentAttributeItemLabelProvider.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/platform/generic/PersistentAttributeItemLabelProvider.java
new file mode 100644
index 0000000000..213a1b1c86
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/platform/generic/PersistentAttributeItemLabelProvider.java
@@ -0,0 +1,77 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 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.ui.internal.platform.generic;
+
+import org.eclipse.core.resources.IResource;
+import org.eclipse.jpt.common.ui.internal.jface.AbstractItemLabelProvider;
+import org.eclipse.jpt.common.ui.jface.DelegatingContentAndLabelProvider;
+import org.eclipse.jpt.common.utility.internal.model.value.PropertyAspectAdapter;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.ReadOnlyPersistentAttribute;
+import org.eclipse.jpt.jpa.ui.internal.JpaMappingImageHelper;
+import org.eclipse.jpt.jpa.ui.internal.JptUiIcons;
+import org.eclipse.swt.graphics.Image;
+
+public class PersistentAttributeItemLabelProvider
+ extends AbstractItemLabelProvider
+{
+ public PersistentAttributeItemLabelProvider(
+ ReadOnlyPersistentAttribute persistentAttribute, DelegatingContentAndLabelProvider labelProvider) {
+ super(persistentAttribute, labelProvider);
+ }
+
+
+
+ @Override
+ protected PropertyValueModel<Image> buildImageModel() {
+ return new PropertyAspectAdapter<ReadOnlyPersistentAttribute, Image>(
+ new String[] {ReadOnlyPersistentAttribute.DEFAULT_MAPPING_KEY_PROPERTY, ReadOnlyPersistentAttribute.MAPPING_PROPERTY},
+ (ReadOnlyPersistentAttribute) model()) {
+ @Override
+ protected Image buildValue_() {
+ if (((ReadOnlyPersistentAttribute) model()).isVirtual()) {
+ return JptUiIcons.ghost(JpaMappingImageHelper.iconKeyForAttributeMapping(this.subject.getMappingKey()));
+ }
+ return JpaMappingImageHelper.imageForAttributeMapping(this.subject.getMappingKey());
+ }
+ };
+ }
+
+ @Override
+ protected PropertyValueModel<String> buildTextModel() {
+ return new PropertyAspectAdapter<ReadOnlyPersistentAttribute, String>(ReadOnlyPersistentAttribute.NAME_PROPERTY, (ReadOnlyPersistentAttribute) model()) {
+ @Override
+ protected String buildValue_() {
+ return subject.getName();
+ }
+ };
+ }
+
+ @Override
+ protected PropertyValueModel<String> buildDescriptionModel() {
+ return new PropertyAspectAdapter<ReadOnlyPersistentAttribute, String>(ReadOnlyPersistentAttribute.NAME_PROPERTY, (ReadOnlyPersistentAttribute) model()) {
+ @Override
+ protected String buildValue_() {
+ StringBuilder sb = new StringBuilder();
+ sb.append(this.subject.getPersistenceUnit().getName());
+ sb.append('/');
+ sb.append(this.subject.getOwningPersistentType().getName());
+ sb.append('/');
+ sb.append(this.subject.getName());
+ IResource resource = this.subject.getResource();
+ if (resource != null) {
+ sb.append(" - "); //$NON-NLS-1$
+ sb.append(resource.getFullPath().makeRelative());
+ }
+ return sb.toString();
+ }
+ };
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/platform/generic/PersistentTypeItemLabelProvider.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/platform/generic/PersistentTypeItemLabelProvider.java
new file mode 100644
index 0000000000..5541917411
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/platform/generic/PersistentTypeItemLabelProvider.java
@@ -0,0 +1,67 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 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.ui.internal.platform.generic;
+
+import org.eclipse.core.resources.IResource;
+import org.eclipse.jpt.common.ui.internal.jface.AbstractItemLabelProvider;
+import org.eclipse.jpt.common.ui.jface.DelegatingContentAndLabelProvider;
+import org.eclipse.jpt.common.utility.internal.model.value.PropertyAspectAdapter;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.PersistentType;
+import org.eclipse.jpt.jpa.ui.internal.JpaMappingImageHelper;
+import org.eclipse.swt.graphics.Image;
+
+public class PersistentTypeItemLabelProvider extends AbstractItemLabelProvider
+{
+ public PersistentTypeItemLabelProvider(
+ PersistentType persistentType, DelegatingContentAndLabelProvider labelProvider) {
+ super(persistentType, labelProvider);
+ }
+
+
+ @Override
+ protected PropertyValueModel<Image> buildImageModel() {
+ return new PropertyAspectAdapter<PersistentType, Image>(PersistentType.MAPPING_PROPERTY, (PersistentType) model()) {
+ @Override
+ protected Image buildValue_() {
+ return JpaMappingImageHelper.imageForTypeMapping(subject.getMappingKey());
+ }
+ };
+ }
+
+ @Override
+ protected PropertyValueModel<String> buildTextModel() {
+ return new PropertyAspectAdapter<PersistentType, String>(PersistentType.NAME_PROPERTY, (PersistentType) model()) {
+ @Override
+ protected String buildValue_() {
+ return subject.getSimpleName();
+ }
+ };
+ }
+
+ @Override
+ protected PropertyValueModel<String> buildDescriptionModel() {
+ return new PropertyAspectAdapter<PersistentType, String>(PersistentType.NAME_PROPERTY, (PersistentType) model()) {
+ @Override
+ protected String buildValue_() {
+ StringBuilder sb = new StringBuilder();
+ sb.append(this.subject.getPersistenceUnit().getName());
+ sb.append('/');
+ sb.append(this.subject.getName());
+ IResource resource = this.subject.getResource();
+ if (resource != null) {
+ sb.append(" - "); //$NON-NLS-1$
+ sb.append(resource.getFullPath().makeRelative());
+ }
+ return sb.toString();
+ }
+ };
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/platform/generic/RootContextItemContentProvider.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/platform/generic/RootContextItemContentProvider.java
new file mode 100644
index 0000000000..ef65255289
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/platform/generic/RootContextItemContentProvider.java
@@ -0,0 +1,51 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2009 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.ui.internal.platform.generic;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.jpt.common.ui.internal.jface.AbstractTreeItemContentProvider;
+import org.eclipse.jpt.common.ui.internal.jface.DelegatingTreeContentAndLabelProvider;
+import org.eclipse.jpt.common.utility.internal.model.value.PropertyAspectAdapter;
+import org.eclipse.jpt.common.utility.internal.model.value.PropertyCollectionValueModelAdapter;
+import org.eclipse.jpt.common.utility.model.value.CollectionValueModel;
+import org.eclipse.jpt.jpa.core.context.JpaRootContextNode;
+import org.eclipse.jpt.jpa.core.context.persistence.PersistenceXml;
+
+public class RootContextItemContentProvider
+ extends AbstractTreeItemContentProvider<PersistenceXml>
+{
+ public RootContextItemContentProvider(
+ JpaRootContextNode rootContext, DelegatingTreeContentAndLabelProvider contentProvider) {
+ super(rootContext, contentProvider);
+ }
+
+ @Override
+ public JpaRootContextNode getModel() {
+ return (JpaRootContextNode) super.getModel();
+ }
+
+ @Override
+ public IProject getParent() {
+ return getModel().getJpaProject().getProject();
+ }
+
+ @Override
+ protected CollectionValueModel<PersistenceXml> buildChildrenModel() {
+ return new PropertyCollectionValueModelAdapter<PersistenceXml>(
+ new PropertyAspectAdapter<JpaRootContextNode, PersistenceXml>(
+ JpaRootContextNode.PERSISTENCE_XML_PROPERTY,
+ getModel()) {
+ @Override
+ protected PersistenceXml buildValue_() {
+ return subject.getPersistenceXml();
+ }
+ });
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/platform/generic/RootContextItemLabelProvider.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/platform/generic/RootContextItemLabelProvider.java
new file mode 100644
index 0000000000..d00996f6c8
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/platform/generic/RootContextItemLabelProvider.java
@@ -0,0 +1,46 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2009 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.ui.internal.platform.generic;
+
+import org.eclipse.jpt.common.ui.internal.jface.AbstractItemLabelProvider;
+import org.eclipse.jpt.common.ui.jface.DelegatingContentAndLabelProvider;
+import org.eclipse.jpt.common.utility.internal.model.value.StaticPropertyValueModel;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.JpaRootContextNode;
+import org.eclipse.jpt.jpa.ui.JptJpaUiPlugin;
+import org.eclipse.jpt.jpa.ui.internal.JptUiIcons;
+import org.eclipse.jpt.jpa.ui.internal.JptUiMessages;
+import org.eclipse.swt.graphics.Image;
+
+public class RootContextItemLabelProvider extends AbstractItemLabelProvider
+{
+ public RootContextItemLabelProvider(
+ JpaRootContextNode rootContextNode, DelegatingContentAndLabelProvider labelProvider) {
+ super(rootContextNode, labelProvider);
+ }
+
+
+ @Override
+ protected PropertyValueModel<Image> buildImageModel() {
+ return new StaticPropertyValueModel<Image>(JptJpaUiPlugin.getImage(JptUiIcons.JPA_CONTENT));
+ }
+
+ @Override
+ protected PropertyValueModel<String> buildTextModel() {
+ return new StaticPropertyValueModel<String>(JptUiMessages.JpaContent_label);
+ }
+
+ @Override
+ protected PropertyValueModel<String> buildDescriptionModel() {
+ return new StaticPropertyValueModel<String>(
+ JptUiMessages.JpaContent_label
+ + " - " + ((JpaRootContextNode) model()).getResource().getFullPath().makeRelative());
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/preferences/JpaPreferencesPage.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/preferences/JpaPreferencesPage.java
new file mode 100644
index 0000000000..743281463a
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/preferences/JpaPreferencesPage.java
@@ -0,0 +1,68 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2009 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.ui.internal.preferences;
+
+import org.eclipse.jface.preference.PreferencePage;
+import org.eclipse.jpt.jpa.ui.JptJpaUiPlugin;
+import org.eclipse.jpt.jpa.ui.internal.JptUiMessages;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchPreferencePage;
+
+/**
+ * This is the root of the Java Persistence preferences hierarchy in the IDE
+ * preferences dialog.
+ * <p>
+ * Structure:
+ * <p>
+ * Java Persistence<br>
+ * |- Errors/Warnings
+ *
+ * @version 2.2
+ * @since 2.2
+ */
+public class JpaPreferencesPage extends PreferencePage
+ implements IWorkbenchPreferencePage {
+
+ /**
+ * Creates a new <code>JpaPreferencesPage</code>.
+ */
+ public JpaPreferencesPage() {
+ super();
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ protected Control createContents(Composite parent) {
+ parent = new Composite(parent, SWT.NONE);
+ parent.setLayout(new GridLayout(1, false));
+
+ // Message label
+ Label label = new Label(parent, SWT.NONE);
+ label.setText(JptUiMessages.JpaPreferencesPage_Description);
+ label.setData(new GridData(GridData.BEGINNING, GridData.BEGINNING, true, true));
+
+ return parent;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public void init(IWorkbench workbench) {
+ setPreferenceStore(JptJpaUiPlugin.instance().getPreferenceStore());
+ }
+} \ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/preferences/JpaProblemSeveritiesPage.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/preferences/JpaProblemSeveritiesPage.java
new file mode 100644
index 0000000000..6dd7083534
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/preferences/JpaProblemSeveritiesPage.java
@@ -0,0 +1,941 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2010 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.ui.internal.preferences;
+
+import java.lang.reflect.InvocationTargetException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IWorkspace;
+import org.eclipse.core.resources.IWorkspaceRunnable;
+import org.eclipse.core.resources.IncrementalProjectBuilder;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.preferences.IEclipsePreferences;
+import org.eclipse.jdt.internal.ui.JavaPlugin;
+import org.eclipse.jdt.internal.ui.preferences.PropertyAndPreferencePage;
+import org.eclipse.jdt.internal.ui.preferences.ScrolledPageContent;
+import org.eclipse.jface.dialogs.IDialogSettings;
+import org.eclipse.jface.dialogs.ProgressMonitorDialog;
+import org.eclipse.jface.layout.PixelConverter;
+import org.eclipse.jface.operation.IRunnableContext;
+import org.eclipse.jface.operation.IRunnableWithProgress;
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.jpt.jpa.core.JptJpaCorePlugin;
+import org.eclipse.jpt.jpa.core.internal.validation.JpaValidationMessages;
+import org.eclipse.jpt.jpa.core.internal.validation.JpaValidationPreferences;
+import org.eclipse.jpt.jpa.ui.JptJpaUiPlugin;
+import org.eclipse.jpt.jpa.ui.internal.JptUiMessages;
+import org.eclipse.jpt.jpa.ui.internal.JptUiValidationPreferenceMessages;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.forms.events.ExpansionAdapter;
+import org.eclipse.ui.forms.events.ExpansionEvent;
+import org.eclipse.ui.forms.widgets.ExpandableComposite;
+
+/**
+ * This page shows the Java Persistence validation options. It supports
+ * workspace and project levels severities.
+ *
+ * @version 2.3
+ * @since 2.2
+ */
+@SuppressWarnings("restriction")
+public class JpaProblemSeveritiesPage extends PropertyAndPreferencePage {
+
+ /**
+ * Severity level state is stored in this Map and is either committed or discarded
+ * based on user action.
+ * <br> key is the preferenceKey which is also the validation message key @see JpaValidationMessages.
+ * <br> value is a severity level - @see JpaValidationPreferences#ERROR WARNING INFO IGNORE
+ */
+ private Map<String, String> severityLevels;
+
+ /**
+ * Default severity levels are stored here, ERROR is the default default so only need
+ * to include WARNING, INFO, IGNORE in this Map. These will be displayed if neither the project
+ * or workspace preference applies.
+ * <br> key is the preferenceKey which is also the validation message key @see JpaValidationMessages.
+ * <br> value is a severity level - @see JpaValidationPreferences#ERROR WARNING INFO IGNORE
+ */
+ private Map<String, String> defaultSeverities;
+
+ /**
+ * The list of <code>Combo</code>s is cached in order to perform a revert of
+ * the properties.
+ */
+ private List<Combo> combos;
+
+ /**
+ * The list of <code>ExpandableComposite</code> is cached in order to save
+ * and restore the expansion state.
+ */
+ private List<ExpandableComposite> expandablePanes;
+
+ /**
+ * The position of the "Error" choice in the combo's model.
+ */
+ private static final int ERROR_INDEX = 0;
+
+ /**
+ * The position of the "Warning" choice in the combo's model.
+ */
+ private static final int WARNING_INDEX = 1;
+
+ /**
+ * The position of the "Info" choice in the combo's model.
+ */
+ private static final int INFO_INDEX = 2;
+
+ /**
+ * The position of the "Ignore" choice in the combo's model.
+ */
+ private static final int IGNORE_INDEX = 3;
+
+ /**
+ * The unique identifier for this page when it is shown in the IDE
+ * preferences dialog.
+ */
+ private static final String JPT_PREFERENCES_PROBLEM_SEVERITIES_ID = "org.eclipse.jpt.jpa.ui.jpaProblemSeveritiesPreferences"; //$NON-NLS-1$
+
+ /**
+ * The unique identifier for this page when it is shown in the project
+ * preferences dialog.
+ */
+ private static final String JPT_PROPERTY_PAGES_PROBLEM_SEVERITIES_ID = "org.eclipse.jpt.jpa.ui.jpaProblemSeveritiesProperties"; //$NON-NLS-1$
+
+ /**
+ * A constant used to store and retrieve the preference key (message ID) from
+ * the combo.
+ */
+ private static final String PREFERENCE_KEY = "preferenceKey"; //$NON-NLS-1$
+
+ /**
+ * The scrollable pane used to show the content of this page.
+ */
+ private ScrolledPageContent scrollable;
+
+ /**
+ * The possible choices which describes the severity of a single problem.
+ */
+ private String[] severityDisplayStrings;
+
+ /**
+ * Constant used to store the expansion state of each expandable pane.
+ */
+ public static final String SETTINGS_EXPANDED = "expanded"; //$NON-NLS-1$
+
+ /**
+ * The preference key used to retrieve the dialog settings where the expansion
+ * states have been stored.
+ */
+ public static final String SETTINGS_SECTION_NAME = "JpaProblemSeveritiesPage"; //$NON-NLS-1$
+
+ private Boolean hasProjectSpecificPreferences = null;
+
+ /**
+ * Creates a new <code>JpaProblemSeveritiesPage</code>.
+ */
+ public JpaProblemSeveritiesPage() {
+ super();
+ initialize();
+ }
+
+ @Override
+ public void init(IWorkbench workbench) {
+ this.setPreferenceStore(JptJpaUiPlugin.instance().getPreferenceStore());
+ this.setDescription(JptUiMessages.JpaProblemSeveritiesPage_Description);
+ }
+
+ protected void initialize() {
+ this.combos = new ArrayList<Combo>();
+ this.expandablePanes = new ArrayList<ExpandableComposite>();
+ this.severityDisplayStrings = buildSeverityDisplayStrings();
+ this.severityLevels = new HashMap<String, String>();
+ this.defaultSeverities = buildDefaultSeverties();
+ }
+
+ //since most of our problems have a default severity of ERROR, we are just defining the WARNING, INFO, IGNORE cases
+ protected Map<String, String> buildDefaultSeverties() {
+ Map<String, String> defaultSeverities = new HashMap<String, String>();
+
+ defaultSeverities.put(JpaValidationMessages.PROJECT_NO_CONNECTION, JpaValidationPreferences.WARNING);
+ defaultSeverities.put(JpaValidationMessages.PROJECT_INVALID_CONNECTION, JpaValidationPreferences.WARNING);
+ defaultSeverities.put(JpaValidationMessages.PROJECT_INACTIVE_CONNECTION, JpaValidationPreferences.WARNING);
+ defaultSeverities.put(JpaValidationMessages.ENTITY_ABSTRACT_DISCRIMINATOR_VALUE_DEFINED, JpaValidationPreferences.WARNING);
+ defaultSeverities.put(JpaValidationMessages.ENTITY_TABLE_PER_CLASS_DISCRIMINATOR_VALUE_DEFINED, JpaValidationPreferences.WARNING);
+ defaultSeverities.put(JpaValidationMessages.ENTITY_TABLE_PER_CLASS_NOT_PORTABLE_ON_PLATFORM, JpaValidationPreferences.WARNING);
+ defaultSeverities.put(JpaValidationMessages.PERSISTENCE_UNIT_JAR_FILE_DEPLOYMENT_PATH_WARNING, JpaValidationPreferences.WARNING);
+ defaultSeverities.put(JpaValidationMessages.MAPPING_FILE_EXTRANEOUS_PERSISTENCE_UNIT_METADATA, JpaValidationPreferences.WARNING);
+ defaultSeverities.put(JpaValidationMessages.PERSISTENT_TYPE_ANNOTATED_BUT_NOT_INCLUDED_IN_PERSISTENCE_UNIT, JpaValidationPreferences.WARNING);
+ defaultSeverities.put(JpaValidationMessages.PERSISTENT_ATTRIBUTE_INHERITED_ATTRIBUTES_NOT_SUPPORTED, JpaValidationPreferences.WARNING);
+ defaultSeverities.put(JpaValidationMessages.PERSISTENCE_MULTIPLE_PERSISTENCE_UNITS, JpaValidationPreferences.WARNING);
+
+ defaultSeverities.put(JpaValidationMessages.XML_VERSION_NOT_LATEST, JpaValidationPreferences.INFO);
+ defaultSeverities.put(JpaValidationMessages.PERSISTENCE_UNIT_REDUNDANT_CLASS, JpaValidationPreferences.INFO);
+
+ return defaultSeverities;
+ }
+
+ @Override
+ protected Control createPreferenceContent(Composite parent) {
+
+ PixelConverter pixelConverter = new PixelConverter(parent);
+
+ // Create a container because the caller will set the GridData and we need
+ // to change the heightHint of the first child and we also need to set the
+ // font otherwise the layout won't be calculated correctly
+ Composite container = new Composite(parent, SWT.NONE);
+ container.setFont(parent.getFont());
+ GridLayout layout = new GridLayout(1, false);
+ layout.marginHeight = 0;
+ layout.marginWidth = 0;
+ container.setLayout(layout);
+
+ // Create the main composite of this page
+ this.scrollable = new ScrolledPageContent(container);
+
+ GridData gridData = new GridData(GridData.FILL, GridData.FILL, true, true);
+ gridData.heightHint = pixelConverter.convertHeightInCharsToPixels(20);
+ this.scrollable.setLayoutData(gridData);
+
+ // Update the layout of the ScrolledPageContent's body
+ layout = new GridLayout(1, false);
+ layout.marginHeight = 0;
+ layout.marginWidth = 0;
+
+ parent = this.scrollable.getBody();
+ parent.setLayoutData(new GridData(GridData.FILL, GridData.FILL, true, true));
+ parent.setLayout(layout);
+
+ // Add each expandable category
+ addProjectLevelCategory(parent);
+ addPersistenceUnitLevelCategory(parent);
+ addTypeLevelCategory(parent);
+ addAttributeLevelCategory(parent);
+ addDatabaseCategory(parent);
+ addInheritanceStrategyCategory(parent);
+ addQueriesGeneratorsCategory(parent);
+
+ // Restore the expansion states
+ restoreSectionExpansionStates(getDialogPreferences());
+
+ return container;
+ }
+
+ protected void restoreSectionExpansionStates(IDialogSettings settings) {
+ for (int index = this.expandablePanes.size(); --index >= 0; ) {
+ ExpandableComposite expandablePane = this.expandablePanes.get(index);
+
+ if (settings == null) {
+ // Only expand the first node by default
+ expandablePane.setExpanded(index == 0);
+ }
+ else {
+ expandablePane.setExpanded(settings.getBoolean(SETTINGS_EXPANDED + index));
+ }
+ }
+ }
+
+ @Override
+ public Point computeSize() {
+ return this.doComputeSize();
+ }
+
+ private void addProjectLevelCategory(Composite parent) {
+
+ parent = addExpandableSection(parent, JptUiValidationPreferenceMessages.PROJECT_LEVEL_CATEGORY);
+
+ addLabeledCombo(parent, JptUiValidationPreferenceMessages.NO_JPA_PROJECT, JpaValidationMessages.NO_JPA_PROJECT);
+ addLabeledCombo(parent, JptUiValidationPreferenceMessages.PROJECT_NO_CONNECTION, JpaValidationMessages.PROJECT_NO_CONNECTION);
+ addLabeledCombo(parent, JptUiValidationPreferenceMessages.PROJECT_INVALID_CONNECTION, JpaValidationMessages.PROJECT_INVALID_CONNECTION);
+ addLabeledCombo(parent, JptUiValidationPreferenceMessages.PROJECT_INACTIVE_CONNECTION, JpaValidationMessages.PROJECT_INACTIVE_CONNECTION);
+ addLabeledCombo(parent, JptUiValidationPreferenceMessages.XML_VERSION_NOT_LATEST, JpaValidationMessages.XML_VERSION_NOT_LATEST);
+ addLabeledCombo(parent, JptUiValidationPreferenceMessages.PROJECT_NO_PERSISTENCE_XML, JpaValidationMessages.PROJECT_NO_PERSISTENCE_XML);
+ addLabeledCombo(parent, JptUiValidationPreferenceMessages.PROJECT_MULTIPLE_PERSISTENCE_XML, JpaValidationMessages.PROJECT_MULTIPLE_PERSISTENCE_XML);
+ addLabeledCombo(parent, JptUiValidationPreferenceMessages.PERSISTENCE_NO_PERSISTENCE_UNIT, JpaValidationMessages.PERSISTENCE_NO_PERSISTENCE_UNIT);
+ addLabeledCombo(parent, JptUiValidationPreferenceMessages.PERSISTENCE_MULTIPLE_PERSISTENCE_UNITS, JpaValidationMessages.PERSISTENCE_MULTIPLE_PERSISTENCE_UNITS);
+ addLabeledCombo(parent, JptUiValidationPreferenceMessages.PERSISTENCE_XML_INVALID_CONTENT, JpaValidationMessages.PERSISTENCE_XML_INVALID_CONTENT);
+ }
+
+ private void addPersistenceUnitLevelCategory(Composite parent) {
+
+ parent = addExpandableSection(parent, JptUiValidationPreferenceMessages.PERSISTENCE_UNIT_LEVEL_CATEGORY);
+
+ addLabeledCombo(parent, JptUiValidationPreferenceMessages.PERSISTENCE_UNIT_UNSPECIFIED_MAPPING_FILE, JpaValidationMessages.PERSISTENCE_UNIT_UNSPECIFIED_MAPPING_FILE);
+ addLabeledCombo(parent, JptUiValidationPreferenceMessages.PERSISTENCE_UNIT_UNSUPPORTED_MAPPING_FILE_CONTENT, JpaValidationMessages.PERSISTENCE_UNIT_UNSUPPORTED_MAPPING_FILE_CONTENT);
+ addLabeledCombo(parent, JptUiValidationPreferenceMessages.PERSISTENCE_UNIT_NONEXISTENT_MAPPING_FILE, JpaValidationMessages.PERSISTENCE_UNIT_NONEXISTENT_MAPPING_FILE);
+ addLabeledCombo(parent, JptUiValidationPreferenceMessages.PERSISTENCE_UNIT_INVALID_MAPPING_FILE, JpaValidationMessages.PERSISTENCE_UNIT_INVALID_MAPPING_FILE);
+ addLabeledCombo(parent, JptUiValidationPreferenceMessages.PERSISTENCE_UNIT_DUPLICATE_MAPPING_FILE, JpaValidationMessages.PERSISTENCE_UNIT_DUPLICATE_MAPPING_FILE);
+ addLabeledCombo(parent, JptUiValidationPreferenceMessages.PERSISTENCE_UNIT_UNSPECIFIED_CLASS, JpaValidationMessages.PERSISTENCE_UNIT_UNSPECIFIED_CLASS);
+ addLabeledCombo(parent, JptUiValidationPreferenceMessages.PERSISTENCE_UNIT_NONEXISTENT_CLASS, JpaValidationMessages.PERSISTENCE_UNIT_NONEXISTENT_CLASS);
+ addLabeledCombo(parent, JptUiValidationPreferenceMessages.PERSISTENCE_UNIT_INVALID_CLASS, JpaValidationMessages.PERSISTENCE_UNIT_INVALID_CLASS);
+ addLabeledCombo(parent, JptUiValidationPreferenceMessages.PERSISTENCE_UNIT_DUPLICATE_CLASS, JpaValidationMessages.PERSISTENCE_UNIT_DUPLICATE_CLASS);
+ addLabeledCombo(parent, JptUiValidationPreferenceMessages.PERSISTENCE_UNIT_REDUNDANT_CLASS, JpaValidationMessages.PERSISTENCE_UNIT_REDUNDANT_CLASS);
+ addLabeledCombo(parent, JptUiValidationPreferenceMessages.PERSISTENCE_UNIT_DUPLICATE_JAR_FILE, JpaValidationMessages.PERSISTENCE_UNIT_DUPLICATE_JAR_FILE);
+ addLabeledCombo(parent, JptUiValidationPreferenceMessages.PERSISTENCE_UNIT_UNSPECIFIED_JAR_FILE, JpaValidationMessages.PERSISTENCE_UNIT_UNSPECIFIED_JAR_FILE);
+ addLabeledCombo(parent, JptUiValidationPreferenceMessages.PERSISTENCE_UNIT_JAR_FILE_DEPLOYMENT_PATH_WARNING, JpaValidationMessages.PERSISTENCE_UNIT_JAR_FILE_DEPLOYMENT_PATH_WARNING);
+ addLabeledCombo(parent, JptUiValidationPreferenceMessages.PERSISTENCE_UNIT_NONEXISTENT_JAR_FILE, JpaValidationMessages.PERSISTENCE_UNIT_NONEXISTENT_JAR_FILE);
+ addLabeledCombo(parent, JptUiValidationPreferenceMessages.MAPPING_FILE_EXTRANEOUS_PERSISTENCE_UNIT_METADATA, JpaValidationMessages.MAPPING_FILE_EXTRANEOUS_PERSISTENCE_UNIT_METADATA);
+ }
+
+ private void addTypeLevelCategory(Composite parent) {
+
+ parent = addExpandableSection(parent, JptUiValidationPreferenceMessages.TYPE_LEVEL_CATEGORY);
+
+ addLabeledCombo(
+ parent, JptUiValidationPreferenceMessages.PERSISTENT_TYPE_MAPPED_BUT_NOT_INCLUDED_IN_PERSISTENCE_UNIT,
+ JpaValidationMessages.PERSISTENT_TYPE_MAPPED_BUT_NOT_INCLUDED_IN_PERSISTENCE_UNIT);
+ addLabeledCombo(
+ parent, JptUiValidationPreferenceMessages.PERSISTENT_TYPE_ANNOTATED_BUT_NOT_INCLUDED_IN_PERSISTENCE_UNIT,
+ JpaValidationMessages.PERSISTENT_TYPE_ANNOTATED_BUT_NOT_INCLUDED_IN_PERSISTENCE_UNIT);
+ addLabeledCombo(
+ parent, JptUiValidationPreferenceMessages.PERSISTENT_TYPE_UNSPECIFIED_CLASS,
+ JpaValidationMessages.PERSISTENT_TYPE_UNSPECIFIED_CLASS);
+ addLabeledCombo(
+ parent, JptUiValidationPreferenceMessages.PERSISTENT_TYPE_UNRESOLVED_CLASS,
+ JpaValidationMessages.PERSISTENT_TYPE_UNRESOLVED_CLASS);
+ addLabeledCombo(
+ parent, JptUiValidationPreferenceMessages.ENTITY_NO_PK,
+ JpaValidationMessages.ENTITY_NO_PK);
+ addLabeledCombo(
+ parent, JptUiValidationPreferenceMessages.TYPE_MAPPING_FINAL_CLASS,
+ JpaValidationMessages.TYPE_MAPPING_FINAL_CLASS);
+ addLabeledCombo(
+ parent, JptUiValidationPreferenceMessages.TYPE_MAPPING_MEMBER_CLASS,
+ JpaValidationMessages.TYPE_MAPPING_MEMBER_CLASS);
+ addLabeledCombo(
+ parent, JptUiValidationPreferenceMessages.TYPE_MAPPING_CLASS_MISSING_NO_ARG_CONSTRUCTOR,
+ JpaValidationMessages.TYPE_MAPPING_CLASS_MISSING_NO_ARG_CONSTRUCTOR);
+ addLabeledCombo(
+ parent, JptUiValidationPreferenceMessages.TYPE_MAPPING_CLASS_PRIVATE_NO_ARG_CONSTRUCTOR,
+ JpaValidationMessages.TYPE_MAPPING_CLASS_PRIVATE_NO_ARG_CONSTRUCTOR);
+ }
+
+ private void addAttributeLevelCategory(Composite parent) {
+
+ parent = addExpandableSection(parent, JptUiValidationPreferenceMessages.ATTRIBUTE_LEVEL_CATEGORY);
+
+ addLabeledCombo(
+ parent, JptUiValidationPreferenceMessages.PERSISTENT_ATTRIBUTE_UNSPECIFIED_NAME,
+ JpaValidationMessages.PERSISTENT_ATTRIBUTE_UNSPECIFIED_NAME);
+ addLabeledCombo(
+ parent, JptUiValidationPreferenceMessages.PERSISTENT_ATTRIBUTE_UNRESOLVED_NAME,
+ JpaValidationMessages.PERSISTENT_ATTRIBUTE_UNRESOLVED_NAME);
+ addLabeledCombo(
+ parent, JptUiValidationPreferenceMessages.PERSISTENT_ATTRIBUTE_INHERITED_ATTRIBUTES_NOT_SUPPORTED
+ , JpaValidationMessages.PERSISTENT_ATTRIBUTE_INHERITED_ATTRIBUTES_NOT_SUPPORTED);
+ addLabeledCombo(
+ parent, JptUiValidationPreferenceMessages.PERSISTENT_ATTRIBUTE_INVALID_MAPPING,
+ JpaValidationMessages.PERSISTENT_ATTRIBUTE_INVALID_MAPPING);
+ addLabeledCombo(
+ parent, JptUiValidationPreferenceMessages.PERSISTENT_ATTRIBUTE_FINAL_FIELD,
+ JpaValidationMessages.PERSISTENT_ATTRIBUTE_FINAL_FIELD);
+ addLabeledCombo(
+ parent, JptUiValidationPreferenceMessages.PERSISTENT_ATTRIBUTE_FINAL_GETTER,
+ JpaValidationMessages.PERSISTENT_ATTRIBUTE_FINAL_GETTER);
+ addLabeledCombo(
+ parent, JptUiValidationPreferenceMessages.PERSISTENT_ATTRIBUTE_PUBLIC_FIELD,
+ JpaValidationMessages.PERSISTENT_ATTRIBUTE_PUBLIC_FIELD);
+ addLabeledCombo(
+ parent, JptUiValidationPreferenceMessages.MAPPING_UNRESOLVED_MAPPED_BY,
+ JpaValidationMessages.MAPPING_UNRESOLVED_MAPPED_BY);
+ addLabeledCombo(
+ parent, JptUiValidationPreferenceMessages.MAPPING_INVALID_MAPPED_BY,
+ JpaValidationMessages.MAPPING_INVALID_MAPPED_BY);
+ addLabeledCombo(
+ parent, JptUiValidationPreferenceMessages.MAPPING_MAPPED_BY_ON_BOTH_SIDES,
+ JpaValidationMessages.MAPPING_MAPPED_BY_ON_BOTH_SIDES);
+ addLabeledCombo(
+ parent, JptUiValidationPreferenceMessages.TARGET_ENTITY_NOT_DEFINED,
+ JpaValidationMessages.TARGET_ENTITY_NOT_DEFINED);
+ addLabeledCombo(
+ parent, JptUiValidationPreferenceMessages.TARGET_ENTITY_IS_NOT_AN_ENTITY,
+ JpaValidationMessages.TARGET_ENTITY_IS_NOT_AN_ENTITY);
+ addLabeledCombo(
+ parent, JptUiValidationPreferenceMessages.MAPS_ID_VALUE_NOT_SPECIFIED,
+ JpaValidationMessages.MAPS_ID_VALUE_NOT_SPECIFIED);
+ addLabeledCombo(
+ parent, JptUiValidationPreferenceMessages.MAPS_ID_VALUE_NOT_RESOLVED,
+ JpaValidationMessages.MAPS_ID_VALUE_NOT_RESOLVED);
+ addLabeledCombo(
+ parent, JptUiValidationPreferenceMessages.MAPS_ID_VALUE_INVALID,
+ JpaValidationMessages.MAPS_ID_VALUE_INVALID);
+ addLabeledCombo(
+ parent, JptUiValidationPreferenceMessages.ORDER_COLUMN_AND_ORDER_BY_BOTH_SPECIFIED,
+ JpaValidationMessages.ORDER_COLUMN_AND_ORDER_BY_BOTH_SPECIFIED);
+ addLabeledCombo(
+ parent, JptUiValidationPreferenceMessages.ELEMENT_COLLECTION_TARGET_CLASS_NOT_DEFINED,
+ JpaValidationMessages.ELEMENT_COLLECTION_TARGET_CLASS_NOT_DEFINED);
+ addLabeledCombo(
+ parent, JptUiValidationPreferenceMessages.ELEMENT_COLLECTION_TARGET_CLASS_MUST_BE_EMBEDDABLE_OR_BASIC_TYPE,
+ JpaValidationMessages.ELEMENT_COLLECTION_TARGET_CLASS_MUST_BE_EMBEDDABLE_OR_BASIC_TYPE);
+ addLabeledCombo(
+ parent, JptUiValidationPreferenceMessages.ELEMENT_COLLECTION_MAP_KEY_CLASS_NOT_DEFINED,
+ JpaValidationMessages.ELEMENT_COLLECTION_MAP_KEY_CLASS_NOT_DEFINED);
+
+ parent = addSubExpandableSection(parent, JptUiValidationPreferenceMessages.IMPLIED_ATTRIBUTE_LEVEL_CATEGORY);
+
+ addLabeledCombo(
+ parent, JptUiValidationPreferenceMessages.VIRTUAL_ATTRIBUTE_TARGET_ENTITY_IS_NOT_AN_ENTITY,
+ JpaValidationMessages.VIRTUAL_ATTRIBUTE_TARGET_ENTITY_IS_NOT_AN_ENTITY);
+ addLabeledCombo(
+ parent, JptUiValidationPreferenceMessages.VIRTUAL_ATTRIBUTE_TARGET_ENTITY_NOT_DEFINED,
+ JpaValidationMessages.VIRTUAL_ATTRIBUTE_TARGET_ENTITY_NOT_DEFINED);
+ addLabeledCombo(
+ parent, JptUiValidationPreferenceMessages.VIRTUAL_ATTRIBUTE_ELEMENT_COLLECTION_TARGET_CLASS_NOT_DEFINED,
+ JpaValidationMessages.VIRTUAL_ATTRIBUTE_ELEMENT_COLLECTION_TARGET_CLASS_NOT_DEFINED);
+ addLabeledCombo(
+ parent, JptUiValidationPreferenceMessages.VIRTUAL_ATTRIBUTE_ELEMENT_COLLECTION_TARGET_CLASS_MUST_BE_EMBEDDABLE_OR_BASIC_TYPE,
+ JpaValidationMessages.VIRTUAL_ATTRIBUTE_ELEMENT_COLLECTION_TARGET_CLASS_MUST_BE_EMBEDDABLE_OR_BASIC_TYPE);
+ addLabeledCombo(
+ parent, JptUiValidationPreferenceMessages.VIRTUAL_ATTRIBUTE_ELEMENT_COLLECTION_MAP_KEY_CLASS_NOT_DEFINED,
+ JpaValidationMessages.VIRTUAL_ATTRIBUTE_ELEMENT_COLLECTION_MAP_KEY_CLASS_NOT_DEFINED);
+ }
+
+ private void addDatabaseCategory(Composite parent) {
+ parent = addExpandableSection(parent, JptUiValidationPreferenceMessages.DATABASE_CATEGORY);
+ parent.setLayout(new GridLayout(1, false));
+
+ addTableCategory(parent);
+ addColumnCategory(parent);
+ addOverridesCategory(parent);
+ }
+
+ private void addTableCategory(Composite parent) {
+
+ parent = addExpandableSection(parent, JptUiValidationPreferenceMessages.TABLE_CATEGORY);
+
+ addLabeledCombo(parent, JptUiValidationPreferenceMessages.TABLE_UNRESOLVED_CATALOG, JpaValidationMessages.TABLE_UNRESOLVED_CATALOG);
+ addLabeledCombo(parent, JptUiValidationPreferenceMessages.TABLE_UNRESOLVED_SCHEMA, JpaValidationMessages.TABLE_UNRESOLVED_SCHEMA);
+ addLabeledCombo(parent, JptUiValidationPreferenceMessages.TABLE_UNRESOLVED_NAME, JpaValidationMessages.TABLE_UNRESOLVED_NAME);
+ addLabeledCombo(parent, JptUiValidationPreferenceMessages.SECONDARY_TABLE_UNRESOLVED_CATALOG, JpaValidationMessages.SECONDARY_TABLE_UNRESOLVED_CATALOG);
+ addLabeledCombo(parent, JptUiValidationPreferenceMessages.SECONDARY_TABLE_UNRESOLVED_SCHEMA, JpaValidationMessages.SECONDARY_TABLE_UNRESOLVED_SCHEMA);
+ addLabeledCombo(parent, JptUiValidationPreferenceMessages.SECONDARY_TABLE_UNRESOLVED_NAME, JpaValidationMessages.SECONDARY_TABLE_UNRESOLVED_NAME);
+ addLabeledCombo(parent, JptUiValidationPreferenceMessages.JOIN_TABLE_UNRESOLVED_CATALOG, JpaValidationMessages.JOIN_TABLE_UNRESOLVED_CATALOG);
+ addLabeledCombo(parent, JptUiValidationPreferenceMessages.JOIN_TABLE_UNRESOLVED_SCHEMA, JpaValidationMessages.JOIN_TABLE_UNRESOLVED_SCHEMA);
+ addLabeledCombo(parent, JptUiValidationPreferenceMessages.JOIN_TABLE_UNRESOLVED_NAME, JpaValidationMessages.JOIN_TABLE_UNRESOLVED_NAME);
+ addLabeledCombo(parent, JptUiValidationPreferenceMessages.VIRTUAL_SECONDARY_TABLE_PRIMARY_KEY_JOIN_COLUMN_UNRESOLVED_NAME, JpaValidationMessages.VIRTUAL_SECONDARY_TABLE_PRIMARY_KEY_JOIN_COLUMN_UNRESOLVED_NAME);
+ addLabeledCombo(parent, JptUiValidationPreferenceMessages.VIRTUAL_SECONDARY_TABLE_PRIMARY_KEY_JOIN_COLUMN_UNRESOLVED_REFERENCED_COLUMN_NAME, JpaValidationMessages.VIRTUAL_SECONDARY_TABLE_PRIMARY_KEY_JOIN_COLUMN_UNRESOLVED_REFERENCED_COLUMN_NAME);
+ addLabeledCombo(parent, JptUiValidationPreferenceMessages.VIRTUAL_SECONDARY_TABLE_PRIMARY_KEY_JOIN_COLUMN_NAME_MUST_BE_SPECIFIED_MULTIPLE_JOIN_COLUMNS, JpaValidationMessages.VIRTUAL_SECONDARY_TABLE_PRIMARY_KEY_JOIN_COLUMN_NAME_MUST_BE_SPECIFIED_MULTIPLE_JOIN_COLUMNS);
+ addLabeledCombo(parent, JptUiValidationPreferenceMessages.VIRTUAL_SECONDARY_TABLE_PRIMARY_KEY_JOIN_COLUMN_REFERENCED_COLUMN_NAME_MUST_BE_SPECIFIED_MULTIPLE_JOIN_COLUMNS, JpaValidationMessages.VIRTUAL_SECONDARY_TABLE_PRIMARY_KEY_JOIN_COLUMN_REFERENCED_COLUMN_NAME_MUST_BE_SPECIFIED_MULTIPLE_JOIN_COLUMNS);
+ addLabeledCombo(parent, JptUiValidationPreferenceMessages.COLLECTION_TABLE_UNRESOLVED_CATALOG, JpaValidationMessages.COLLECTION_TABLE_UNRESOLVED_CATALOG);
+ addLabeledCombo(parent, JptUiValidationPreferenceMessages.COLLECTION_TABLE_UNRESOLVED_SCHEMA, JpaValidationMessages.COLLECTION_TABLE_UNRESOLVED_SCHEMA);
+ addLabeledCombo(parent, JptUiValidationPreferenceMessages.COLLECTION_TABLE_UNRESOLVED_NAME, JpaValidationMessages.COLLECTION_TABLE_UNRESOLVED_NAME);
+
+ parent = addSubExpandableSection(parent, JptUiValidationPreferenceMessages.IMPLIED_ATTRIBUTE_LEVEL_CATEGORY);
+
+ addLabeledCombo(parent, JptUiValidationPreferenceMessages.VIRTUAL_ATTRIBUTE_JOIN_TABLE_UNRESOLVED_CATALOG, JpaValidationMessages.VIRTUAL_ATTRIBUTE_JOIN_TABLE_UNRESOLVED_CATALOG);
+ addLabeledCombo(parent, JptUiValidationPreferenceMessages.VIRTUAL_ATTRIBUTE_JOIN_TABLE_UNRESOLVED_SCHEMA, JpaValidationMessages.VIRTUAL_ATTRIBUTE_JOIN_TABLE_UNRESOLVED_SCHEMA);
+ addLabeledCombo(parent, JptUiValidationPreferenceMessages.VIRTUAL_ATTRIBUTE_JOIN_TABLE_UNRESOLVED_NAME, JpaValidationMessages.VIRTUAL_ATTRIBUTE_JOIN_TABLE_UNRESOLVED_NAME);
+ addLabeledCombo(parent, JptUiValidationPreferenceMessages.VIRTUAL_ATTRIBUTE_COLLECTION_TABLE_UNRESOLVED_CATALOG, JpaValidationMessages.VIRTUAL_ATTRIBUTE_COLLECTION_TABLE_UNRESOLVED_CATALOG);
+ addLabeledCombo(parent, JptUiValidationPreferenceMessages.VIRTUAL_ATTRIBUTE_COLLECTION_TABLE_UNRESOLVED_SCHEMA, JpaValidationMessages.VIRTUAL_ATTRIBUTE_COLLECTION_TABLE_UNRESOLVED_SCHEMA);
+ addLabeledCombo(parent, JptUiValidationPreferenceMessages.VIRTUAL_ATTRIBUTE_COLLECTION_TABLE_UNRESOLVED_NAME, JpaValidationMessages.VIRTUAL_ATTRIBUTE_COLLECTION_TABLE_UNRESOLVED_NAME);
+ }
+
+ private void addColumnCategory(Composite parent) {
+ parent = addExpandableSection(parent, JptUiValidationPreferenceMessages.COLUMN_CATEGORY);
+
+ addLabeledCombo(parent, JptUiValidationPreferenceMessages.COLUMN_TABLE_NOT_VALID, JpaValidationMessages.COLUMN_TABLE_NOT_VALID);
+ addLabeledCombo(parent, JptUiValidationPreferenceMessages.COLUMN_UNRESOLVED_TABLE, JpaValidationMessages.COLUMN_UNRESOLVED_TABLE);
+ addLabeledCombo(parent, JptUiValidationPreferenceMessages.COLUMN_UNRESOLVED_NAME, JpaValidationMessages.COLUMN_UNRESOLVED_NAME);
+ addLabeledCombo(parent, JptUiValidationPreferenceMessages.JOIN_COLUMN_TABLE_NOT_VALID, JpaValidationMessages.JOIN_COLUMN_TABLE_NOT_VALID);
+ addLabeledCombo(parent, JptUiValidationPreferenceMessages.JOIN_COLUMN_UNRESOLVED_NAME, JpaValidationMessages.JOIN_COLUMN_UNRESOLVED_NAME);
+ addLabeledCombo(parent, JptUiValidationPreferenceMessages.JOIN_COLUMN_NAME_MUST_BE_SPECIFIED_MULTIPLE_JOIN_COLUMNS, JpaValidationMessages.JOIN_COLUMN_NAME_MUST_BE_SPECIFIED_MULTIPLE_JOIN_COLUMNS);
+ addLabeledCombo(parent, JptUiValidationPreferenceMessages.JOIN_COLUMN_UNRESOLVED_REFERENCED_COLUMN_NAME, JpaValidationMessages.JOIN_COLUMN_UNRESOLVED_REFERENCED_COLUMN_NAME);
+ addLabeledCombo(parent, JptUiValidationPreferenceMessages.JOIN_COLUMN_REFERENCED_COLUMN_NAME_MUST_BE_SPECIFIED_MULTIPLE_JOIN_COLUMNS, JpaValidationMessages.JOIN_COLUMN_REFERENCED_COLUMN_NAME_MUST_BE_SPECIFIED_MULTIPLE_JOIN_COLUMNS);
+ addLabeledCombo(parent, JptUiValidationPreferenceMessages.INVERSE_JOIN_COLUMN_TABLE_NOT_VALID, JpaValidationMessages.INVERSE_JOIN_COLUMN_TABLE_NOT_VALID);
+ addLabeledCombo(parent, JptUiValidationPreferenceMessages.INVERSE_JOIN_COLUMN_UNRESOLVED_NAME, JpaValidationMessages.INVERSE_JOIN_COLUMN_UNRESOLVED_NAME);
+ addLabeledCombo(parent, JptUiValidationPreferenceMessages.INVERSE_JOIN_COLUMN_NAME_MUST_BE_SPECIFIED_MULTIPLE_JOIN_COLUMNS, JpaValidationMessages.INVERSE_JOIN_COLUMN_NAME_MUST_BE_SPECIFIED_MULTIPLE_JOIN_COLUMNS);
+ addLabeledCombo(parent, JptUiValidationPreferenceMessages.INVERSE_JOIN_COLUMN_UNRESOLVED_REFERENCED_COLUMN_NAME, JpaValidationMessages.INVERSE_JOIN_COLUMN_UNRESOLVED_REFERENCED_COLUMN_NAME);
+ addLabeledCombo(parent, JptUiValidationPreferenceMessages.INVERSE_JOIN_COLUMN_REFERENCED_COLUMN_NAME_MUST_BE_SPECIFIED_MULTIPLE_JOIN_COLUMNS, JpaValidationMessages.INVERSE_JOIN_COLUMN_REFERENCED_COLUMN_NAME_MUST_BE_SPECIFIED_MULTIPLE_JOIN_COLUMNS);
+ addLabeledCombo(parent, JptUiValidationPreferenceMessages.PRIMARY_KEY_JOIN_COLUMN_UNRESOLVED_NAME, JpaValidationMessages.PRIMARY_KEY_JOIN_COLUMN_UNRESOLVED_NAME);
+ addLabeledCombo(parent, JptUiValidationPreferenceMessages.PRIMARY_KEY_JOIN_COLUMN_NAME_MUST_BE_SPECIFIED_MULTIPLE_JOIN_COLUMNS, JpaValidationMessages.PRIMARY_KEY_JOIN_COLUMN_NAME_MUST_BE_SPECIFIED_MULTIPLE_JOIN_COLUMNS);
+ addLabeledCombo(parent, JptUiValidationPreferenceMessages.PRIMARY_KEY_JOIN_COLUMN_UNRESOLVED_REFERENCED_COLUMN_NAME, JpaValidationMessages.PRIMARY_KEY_JOIN_COLUMN_UNRESOLVED_REFERENCED_COLUMN_NAME);
+ addLabeledCombo(parent, JptUiValidationPreferenceMessages.PRIMARY_KEY_JOIN_COLUMN_REFERENCED_COLUMN_NAME_MUST_BE_SPECIFIED_MULTIPLE_JOIN_COLUMNS,JpaValidationMessages.PRIMARY_KEY_JOIN_COLUMN_REFERENCED_COLUMN_NAME_MUST_BE_SPECIFIED_MULTIPLE_JOIN_COLUMNS);
+ addLabeledCombo(parent, JptUiValidationPreferenceMessages.VIRTUAL_PRIMARY_KEY_JOIN_COLUMN_UNRESOLVED_NAME, JpaValidationMessages.VIRTUAL_PRIMARY_KEY_JOIN_COLUMN_UNRESOLVED_NAME);
+ addLabeledCombo(parent, JptUiValidationPreferenceMessages.VIRTUAL_PRIMARY_KEY_JOIN_COLUMN_NAME_MUST_BE_SPECIFIED_MULTIPLE_JOIN_COLUMNS, JpaValidationMessages.VIRTUAL_PRIMARY_KEY_JOIN_COLUMN_NAME_MUST_BE_SPECIFIED_MULTIPLE_JOIN_COLUMNS);
+ addLabeledCombo(parent, JptUiValidationPreferenceMessages.VIRTUAL_PRIMARY_KEY_JOIN_COLUMN_UNRESOLVED_REFERENCED_COLUMN_NAME, JpaValidationMessages.VIRTUAL_PRIMARY_KEY_JOIN_COLUMN_UNRESOLVED_REFERENCED_COLUMN_NAME);
+ addLabeledCombo(parent, JptUiValidationPreferenceMessages.VIRTUAL_PRIMARY_KEY_JOIN_COLUMN_REFERENCED_COLUMN_NAME_MUST_BE_SPECIFIED_MULTIPLE_JOIN_COLUMNS, JpaValidationMessages.VIRTUAL_PRIMARY_KEY_JOIN_COLUMN_REFERENCED_COLUMN_NAME_MUST_BE_SPECIFIED_MULTIPLE_JOIN_COLUMNS);
+ addLabeledCombo(parent, JptUiValidationPreferenceMessages.ORDER_COLUMN_UNRESOLVED_NAME, JpaValidationMessages.ORDER_COLUMN_UNRESOLVED_NAME);
+ addLabeledCombo(parent, JptUiValidationPreferenceMessages.MAP_KEY_COLUMN_TABLE_NOT_VALID, JpaValidationMessages.MAP_KEY_COLUMN_TABLE_NOT_VALID);
+
+ parent = addSubExpandableSection(parent, JptUiValidationPreferenceMessages.IMPLIED_ATTRIBUTE_LEVEL_CATEGORY);
+
+ addLabeledCombo(parent, JptUiValidationPreferenceMessages.VIRTUAL_ATTRIBUTE_COLUMN_UNRESOLVED_NAME, JpaValidationMessages.VIRTUAL_ATTRIBUTE_COLUMN_UNRESOLVED_NAME);
+ addLabeledCombo(parent, JptUiValidationPreferenceMessages.VIRTUAL_ATTRIBUTE_COLUMN_TABLE_NOT_VALID, JpaValidationMessages.VIRTUAL_ATTRIBUTE_COLUMN_TABLE_NOT_VALID);
+ addLabeledCombo(parent, JptUiValidationPreferenceMessages.VIRTUAL_ATTRIBUTE_JOIN_COLUMN_UNRESOLVED_TABLE, JpaValidationMessages.VIRTUAL_ATTRIBUTE_JOIN_COLUMN_UNRESOLVED_TABLE);
+ addLabeledCombo(parent, JptUiValidationPreferenceMessages.VIRTUAL_ATTRIBUTE_JOIN_COLUMN_UNRESOLVED_NAME, JpaValidationMessages.VIRTUAL_ATTRIBUTE_JOIN_COLUMN_UNRESOLVED_NAME);
+ addLabeledCombo(parent, JptUiValidationPreferenceMessages.VIRTUAL_ATTRIBUTE_JOIN_COLUMN_NAME_MUST_BE_SPECIFIED_MULTIPLE_JOIN_COLUMNS, JpaValidationMessages.VIRTUAL_ATTRIBUTE_JOIN_COLUMN_NAME_MUST_BE_SPECIFIED_MULTIPLE_JOIN_COLUMNS);
+ addLabeledCombo(parent, JptUiValidationPreferenceMessages.VIRTUAL_ATTRIBUTE_JOIN_COLUMN_UNRESOLVED_REFERENCED_COLUMN_NAME, JpaValidationMessages.VIRTUAL_ATTRIBUTE_JOIN_COLUMN_UNRESOLVED_REFERENCED_COLUMN_NAME);
+ addLabeledCombo(parent, JptUiValidationPreferenceMessages.VIRTUAL_ATTRIBUTE_JOIN_COLUMN_REFERENCED_COLUMN_NAME_MUST_BE_SPECIFIED_MULTIPLE_JOIN_COLUMNS, JpaValidationMessages.VIRTUAL_ATTRIBUTE_JOIN_COLUMN_REFERENCED_COLUMN_NAME_MUST_BE_SPECIFIED_MULTIPLE_JOIN_COLUMNS);
+ addLabeledCombo(parent, JptUiValidationPreferenceMessages.VIRTUAL_ATTRIBUTE_JOIN_COLUMN_TABLE_NOT_VALID, JpaValidationMessages.VIRTUAL_ATTRIBUTE_JOIN_COLUMN_TABLE_NOT_VALID);
+ addLabeledCombo(parent, JptUiValidationPreferenceMessages.VIRTUAL_ATTRIBUTE_INVERSE_JOIN_COLUMN_TABLE_NOT_VALID, JpaValidationMessages.VIRTUAL_ATTRIBUTE_INVERSE_JOIN_COLUMN_TABLE_NOT_VALID);
+ addLabeledCombo(parent, JptUiValidationPreferenceMessages.VIRTUAL_ATTRIBUTE_INVERSE_JOIN_COLUMN_UNRESOLVED_NAME, JpaValidationMessages.VIRTUAL_ATTRIBUTE_INVERSE_JOIN_COLUMN_UNRESOLVED_NAME);
+ addLabeledCombo(parent, JptUiValidationPreferenceMessages.VIRTUAL_ATTRIBUTE_INVERSE_JOIN_COLUMN_NAME_MUST_BE_SPECIFIED_MULTIPLE_JOIN_COLUMNS, JpaValidationMessages.VIRTUAL_ATTRIBUTE_INVERSE_JOIN_COLUMN_NAME_MUST_BE_SPECIFIED_MULTIPLE_JOIN_COLUMNS);
+ addLabeledCombo(parent, JptUiValidationPreferenceMessages.VIRTUAL_ATTRIBUTE_INVERSE_JOIN_COLUMN_UNRESOLVED_REFERENCED_COLUMN_NAME, JpaValidationMessages.VIRTUAL_ATTRIBUTE_INVERSE_JOIN_COLUMN_UNRESOLVED_REFERENCED_COLUMN_NAME);
+ addLabeledCombo(parent, JptUiValidationPreferenceMessages.VIRTUAL_ATTRIBUTE_INVERSE_JOIN_COLUMN_REFERENCED_COLUMN_NAME_MUST_BE_SPECIFIED_MULTIPLE_JOIN_COLUMNS, JpaValidationMessages.VIRTUAL_ATTRIBUTE_INVERSE_JOIN_COLUMN_REFERENCED_COLUMN_NAME_MUST_BE_SPECIFIED_MULTIPLE_JOIN_COLUMNS);
+ addLabeledCombo(parent, JptUiValidationPreferenceMessages.PRIMARY_KEY_JOIN_COLUMN_UNRESOLVED_NAME, JpaValidationMessages.VIRTUAL_ATTRIBUTE_PRIMARY_KEY_JOIN_COLUMN_UNRESOLVED_NAME);
+ addLabeledCombo(parent, JptUiValidationPreferenceMessages.PRIMARY_KEY_JOIN_COLUMN_NAME_MUST_BE_SPECIFIED_MULTIPLE_JOIN_COLUMNS, JpaValidationMessages.VIRTUAL_ATTRIBUTE_PRIMARY_KEY_JOIN_COLUMN_NAME_MUST_BE_SPECIFIED_MULTIPLE_JOIN_COLUMNS);
+ addLabeledCombo(parent, JptUiValidationPreferenceMessages.PRIMARY_KEY_JOIN_COLUMN_UNRESOLVED_REFERENCED_COLUMN_NAME, JpaValidationMessages.VIRTUAL_ATTRIBUTE_PRIMARY_KEY_JOIN_COLUMN_UNRESOLVED_REFERENCED_COLUMN_NAME);
+ addLabeledCombo(parent, JptUiValidationPreferenceMessages.PRIMARY_KEY_JOIN_COLUMN_REFERENCED_COLUMN_NAME_MUST_BE_SPECIFIED_MULTIPLE_JOIN_COLUMNS, JpaValidationMessages.VIRTUAL_ATTRIBUTE_PRIMARY_KEY_JOIN_COLUMN_REFERENCED_COLUMN_NAME_MUST_BE_SPECIFIED_MULTIPLE_JOIN_COLUMNS);
+ addLabeledCombo(parent, JptUiValidationPreferenceMessages.VIRTUAL_ATTRIBUTE_ORDER_COLUMN_UNRESOLVED_NAME, JpaValidationMessages.VIRTUAL_ATTRIBUTE_ORDER_COLUMN_UNRESOLVED_NAME);
+ addLabeledCombo(parent, JptUiValidationPreferenceMessages.VIRTUAL_ATTRIBUTE_MAP_KEY_COLUMN_TABLE_NOT_VALID, JpaValidationMessages.VIRTUAL_ATTRIBUTE_MAP_KEY_COLUMN_TABLE_NOT_VALID);
+ }
+
+ private void addOverridesCategory(Composite parent) {
+
+ parent = addExpandableSection(parent, JptUiValidationPreferenceMessages.OVERRIDES_CATEGORY);
+
+ addLabeledCombo(parent, JptUiValidationPreferenceMessages.ATTRIBUTE_OVERRIDE_INVALID_NAME, JpaValidationMessages.ATTRIBUTE_OVERRIDE_INVALID_NAME);
+ addLabeledCombo(parent, JptUiValidationPreferenceMessages.ASSOCIATION_OVERRIDE_INVALID_NAME, JpaValidationMessages.ASSOCIATION_OVERRIDE_INVALID_NAME);
+ addLabeledCombo(parent, JptUiValidationPreferenceMessages.VIRTUAL_ATTRIBUTE_OVERRIDE_INVALID_NAME, JpaValidationMessages.VIRTUAL_ATTRIBUTE_OVERRIDE_INVALID_NAME);
+ addLabeledCombo(parent, JptUiValidationPreferenceMessages.VIRTUAL_ASSOCIATION_OVERRIDE_INVALID_NAME, JpaValidationMessages.VIRTUAL_ASSOCIATION_OVERRIDE_INVALID_NAME);
+ addLabeledCombo(parent, JptUiValidationPreferenceMessages.VIRTUAL_MAP_KEY_ATTRIBUTE_OVERRIDE_INVALID_NAME, JpaValidationMessages.VIRTUAL_MAP_KEY_ATTRIBUTE_OVERRIDE_INVALID_NAME);
+ addLabeledCombo(parent, JptUiValidationPreferenceMessages.VIRTUAL_ATTRIBUTE_OVERRIDE_COLUMN_TABLE_NOT_VALID, JpaValidationMessages.VIRTUAL_ATTRIBUTE_OVERRIDE_COLUMN_TABLE_NOT_VALID);
+ addLabeledCombo(parent, JptUiValidationPreferenceMessages.VIRTUAL_ATTRIBUTE_OVERRIDE_COLUMN_UNRESOLVED_NAME, JpaValidationMessages.VIRTUAL_ATTRIBUTE_OVERRIDE_COLUMN_UNRESOLVED_NAME);
+ addLabeledCombo(parent, JptUiValidationPreferenceMessages.VIRTUAL_MAP_KEY_ATTRIBUTE_OVERRIDE_COLUMN_TABLE_NOT_VALID, JpaValidationMessages.VIRTUAL_MAP_KEY_ATTRIBUTE_OVERRIDE_COLUMN_TABLE_NOT_VALID);
+ addLabeledCombo(parent, JptUiValidationPreferenceMessages.VIRTUAL_ASSOCIATION_OVERRIDE_JOIN_TABLE_UNRESOLVED_CATALOG, JpaValidationMessages.VIRTUAL_ASSOCIATION_OVERRIDE_JOIN_TABLE_UNRESOLVED_CATALOG);
+ addLabeledCombo(parent, JptUiValidationPreferenceMessages.VIRTUAL_ASSOCIATION_OVERRIDE_JOIN_TABLE_UNRESOLVED_SCHEMA, JpaValidationMessages.VIRTUAL_ASSOCIATION_OVERRIDE_JOIN_TABLE_UNRESOLVED_SCHEMA);
+ addLabeledCombo(parent, JptUiValidationPreferenceMessages.VIRTUAL_ASSOCIATION_OVERRIDE_JOIN_TABLE_UNRESOLVED_NAME, JpaValidationMessages.VIRTUAL_ASSOCIATION_OVERRIDE_JOIN_TABLE_UNRESOLVED_NAME);
+ addLabeledCombo(parent, JptUiValidationPreferenceMessages.VIRTUAL_ASSOCIATION_OVERRIDE_JOIN_COLUMN_UNRESOLVED_NAME, JpaValidationMessages.VIRTUAL_ASSOCIATION_OVERRIDE_JOIN_COLUMN_UNRESOLVED_NAME);
+ addLabeledCombo(parent, JptUiValidationPreferenceMessages.VIRTUAL_ASSOCIATION_OVERRIDE_JOIN_COLUMN_UNRESOLVED_REFERENCED_COLUMN_NAME, JpaValidationMessages.VIRTUAL_ASSOCIATION_OVERRIDE_JOIN_COLUMN_UNRESOLVED_REFERENCED_COLUMN_NAME);
+ addLabeledCombo(parent, JptUiValidationPreferenceMessages.VIRTUAL_ASSOCIATION_OVERRIDE_JOIN_COLUMN_TABLE_NOT_VALID, JpaValidationMessages.VIRTUAL_ASSOCIATION_OVERRIDE_JOIN_COLUMN_TABLE_NOT_VALID);
+ addLabeledCombo(parent, JptUiValidationPreferenceMessages.VIRTUAL_ASSOCIATION_OVERRIDE_JOIN_COLUMN_NAME_MUST_BE_SPECIFIED_MULTIPLE_JOIN_COLUMNS, JpaValidationMessages.VIRTUAL_ASSOCIATION_OVERRIDE_JOIN_COLUMN_NAME_MUST_BE_SPECIFIED_MULTIPLE_JOIN_COLUMNS);
+ addLabeledCombo(parent, JptUiValidationPreferenceMessages.VIRTUAL_ASSOCIATION_OVERRIDE_JOIN_COLUMN_REFERENCED_COLUMN_NAME_MUST_BE_SPECIFIED_MULTIPLE_JOIN_COLUMNS, JpaValidationMessages.VIRTUAL_ASSOCIATION_OVERRIDE_JOIN_COLUMN_REFERENCED_COLUMN_NAME_MUST_BE_SPECIFIED_MULTIPLE_JOIN_COLUMNS);
+ addLabeledCombo(parent, JptUiValidationPreferenceMessages.VIRTUAL_ASSOCIATION_OVERRIDE_INVERSE_JOIN_COLUMN_UNRESOLVED_NAME, JpaValidationMessages.VIRTUAL_ASSOCIATION_OVERRIDE_INVERSE_JOIN_COLUMN_UNRESOLVED_NAME);
+ addLabeledCombo(parent, JptUiValidationPreferenceMessages.VIRTUAL_ASSOCIATION_OVERRIDE_INVERSE_JOIN_COLUMN_UNRESOLVED_REFERENCED_COLUMN_NAME, JpaValidationMessages.VIRTUAL_ASSOCIATION_OVERRIDE_INVERSE_JOIN_COLUMN_UNRESOLVED_REFERENCED_COLUMN_NAME);
+ addLabeledCombo(parent, JptUiValidationPreferenceMessages.VIRTUAL_ASSOCIATION_OVERRIDE_INVERSE_JOIN_COLUMN_TABLE_NOT_VALID, JpaValidationMessages.VIRTUAL_ASSOCIATION_OVERRIDE_INVERSE_JOIN_COLUMN_TABLE_NOT_VALID);
+ addLabeledCombo(parent, JptUiValidationPreferenceMessages.VIRTUAL_ASSOCIATION_OVERRIDE_INVERSE_JOIN_COLUMN_NAME_MUST_BE_SPECIFIED_MULTIPLE_INVERSE_JOIN_COLUMNS, JpaValidationMessages.VIRTUAL_ASSOCIATION_OVERRIDE_INVERSE_JOIN_COLUMN_NAME_MUST_BE_SPECIFIED_MULTIPLE_INVERSE_JOIN_COLUMNS);
+ addLabeledCombo(parent, JptUiValidationPreferenceMessages.VIRTUAL_ASSOCIATION_OVERRIDE_INVERSE_JOIN_COLUMN_REFERENCED_COLUMN_NAME_MUST_BE_SPECIFIED_MULTIPLE_INVERSE_JOIN_COLUMNS, JpaValidationMessages.VIRTUAL_ASSOCIATION_OVERRIDE_INVERSE_JOIN_COLUMN_REFERENCED_COLUMN_NAME_MUST_BE_SPECIFIED_MULTIPLE_INVERSE_JOIN_COLUMNS);
+
+
+ parent = addSubExpandableSection(parent, JptUiValidationPreferenceMessages.IMPLIED_ATTRIBUTE_LEVEL_CATEGORY);
+
+ addLabeledCombo(parent, JptUiValidationPreferenceMessages.VIRTUAL_ATTRIBUTE_ATTRIBUTE_OVERRIDE_INVALID_NAME, JpaValidationMessages.VIRTUAL_ATTRIBUTE_ATTRIBUTE_OVERRIDE_INVALID_NAME);
+ addLabeledCombo(parent, JptUiValidationPreferenceMessages.VIRTUAL_ATTRIBUTE_ASSOCIATION_OVERRIDE_INVALID_NAME, JpaValidationMessages.VIRTUAL_ATTRIBUTE_ASSOCIATION_OVERRIDE_INVALID_NAME);
+ addLabeledCombo(parent, JptUiValidationPreferenceMessages.VIRTUAL_ATTRIBUTE_MAP_KEY_ATTRIBUTE_OVERRIDE_INVALID_NAME, JpaValidationMessages.VIRTUAL_ATTRIBUTE_MAP_KEY_ATTRIBUTE_OVERRIDE_INVALID_NAME);
+ addLabeledCombo(parent, JptUiValidationPreferenceMessages.VIRTUAL_ATTRIBUTE_ATTRIBUTE_OVERRIDE_COLUMN_TABLE_NOT_VALID, JpaValidationMessages.VIRTUAL_ATTRIBUTE_ATTRIBUTE_OVERRIDE_COLUMN_TABLE_NOT_VALID);
+ addLabeledCombo(parent, JptUiValidationPreferenceMessages.VIRTUAL_ATTRIBUTE_ATTRIBUTE_OVERRIDE_COLUMN_UNRESOLVED_NAME, JpaValidationMessages.VIRTUAL_ATTRIBUTE_ATTRIBUTE_OVERRIDE_COLUMN_UNRESOLVED_NAME);
+ addLabeledCombo(parent, JptUiValidationPreferenceMessages.VIRTUAL_ATTRIBUTE_MAP_KEY_ATTRIBUTE_OVERRIDE_COLUMN_TABLE_NOT_VALID, JpaValidationMessages.VIRTUAL_ATTRIBUTE_MAP_KEY_ATTRIBUTE_OVERRIDE_COLUMN_TABLE_NOT_VALID);
+ addLabeledCombo(parent, JptUiValidationPreferenceMessages.VIRTUAL_ATTRIBUTE_ASSOCIATION_OVERRIDE_JOIN_COLUMN_TABLE_NOT_VALID, JpaValidationMessages.VIRTUAL_ATTRIBUTE_ASSOCIATION_OVERRIDE_JOIN_COLUMN_TABLE_NOT_VALID);
+ addLabeledCombo(parent, JptUiValidationPreferenceMessages.VIRTUAL_ATTRIBUTE_ASSOCIATION_OVERRIDE_JOIN_COLUMN_UNRESOLVED_NAME, JpaValidationMessages.VIRTUAL_ATTRIBUTE_ASSOCIATION_OVERRIDE_JOIN_COLUMN_UNRESOLVED_NAME);
+ addLabeledCombo(parent, JptUiValidationPreferenceMessages.VIRTUAL_ATTRIBUTE_ASSOCIATION_OVERRIDE_JOIN_COLUMN_REFERENCED_COLUMN_UNRESOLVED_NAME, JpaValidationMessages.VIRTUAL_ATTRIBUTE_ASSOCIATION_OVERRIDE_JOIN_COLUMN_REFERENCED_COLUMN_UNRESOLVED_NAME);
+ addLabeledCombo(parent, JptUiValidationPreferenceMessages.VIRTUAL_ATTRIBUTE_ASSOCIATION_OVERRIDE_JOIN_COLUMN_NAME_MUST_BE_SPECIFIED_MULTIPLE_JOIN_COLUMNS, JpaValidationMessages.VIRTUAL_ATTRIBUTE_ASSOCIATION_OVERRIDE_JOIN_COLUMN_NAME_MUST_BE_SPECIFIED_MULTIPLE_JOIN_COLUMNS);
+ addLabeledCombo(parent, JptUiValidationPreferenceMessages.VIRTUAL_ATTRIBUTE_ASSOCIATION_OVERRIDE_JOIN_COLUMN_REFERENCED_COLUMN_NAME_MUST_BE_SPECIFIED_MULTIPLE_JOIN_COLUMNS, JpaValidationMessages.VIRTUAL_ATTRIBUTE_ASSOCIATION_OVERRIDE_JOIN_COLUMN_REFERENCED_COLUMN_NAME_MUST_BE_SPECIFIED_MULTIPLE_JOIN_COLUMNS);
+ addLabeledCombo(parent, JptUiValidationPreferenceMessages.VIRTUAL_ATTRIBUTE_ASSOCIATION_OVERRIDE_INVERSE_JOIN_COLUMN_TABLE_NOT_VALID, JpaValidationMessages.VIRTUAL_ATTRIBUTE_ASSOCIATION_OVERRIDE_INVERSE_JOIN_COLUMN_TABLE_NOT_VALID);
+ addLabeledCombo(parent, JptUiValidationPreferenceMessages.VIRTUAL_ATTRIBUTE_ASSOCIATION_OVERRIDE_INVERSE_JOIN_COLUMN_UNRESOLVED_NAME, JpaValidationMessages.VIRTUAL_ATTRIBUTE_ASSOCIATION_OVERRIDE_INVERSE_JOIN_COLUMN_UNRESOLVED_NAME);
+ addLabeledCombo(parent, JptUiValidationPreferenceMessages.VIRTUAL_ATTRIBUTE_ASSOCIATION_OVERRIDE_INVERSE_JOIN_COLUMN_REFERENCED_COLUMN_UNRESOLVED_NAME, JpaValidationMessages.VIRTUAL_ATTRIBUTE_ASSOCIATION_OVERRIDE_INVERSE_JOIN_COLUMN_REFERENCED_COLUMN_UNRESOLVED_NAME);
+ addLabeledCombo(parent, JptUiValidationPreferenceMessages.VIRTUAL_ATTRIBUTE_ASSOCIATION_OVERRIDE_INVERSE_JOIN_COLUMN_NAME_MUST_BE_SPECIFIED_MULTIPLE_INVERSE_JOIN_COLUMNS, JpaValidationMessages.VIRTUAL_ATTRIBUTE_ASSOCIATION_OVERRIDE_INVERSE_JOIN_COLUMN_NAME_MUST_BE_SPECIFIED_MULTIPLE_INVERSE_JOIN_COLUMNS);
+ addLabeledCombo(parent, JptUiValidationPreferenceMessages.VIRTUAL_ATTRIBUTE_ASSOCIATION_OVERRIDE_INVERSE_JOIN_COLUMN_REFERENCED_COLUMN_NAME_MUST_BE_SPECIFIED_MULTIPLE_INVERSE_JOIN_COLUMNS, JpaValidationMessages.VIRTUAL_ATTRIBUTE_ASSOCIATION_OVERRIDE_INVERSE_JOIN_COLUMN_REFERENCED_COLUMN_NAME_MUST_BE_SPECIFIED_MULTIPLE_INVERSE_JOIN_COLUMNS);
+ }
+
+ private void addInheritanceStrategyCategory(Composite parent) {
+
+ parent = addExpandableSection(parent, JptUiValidationPreferenceMessages.INHERITANCE_CATEGORY);
+
+ addLabeledCombo(
+ parent, JptUiValidationPreferenceMessages.DISCRIMINATOR_COLUMN_UNRESOLVED_NAME,
+ JpaValidationMessages.DISCRIMINATOR_COLUMN_UNRESOLVED_NAME);
+ addLabeledCombo(
+ parent, JptUiValidationPreferenceMessages.ENTITY_TABLE_PER_CLASS_NOT_SUPPORTED_ON_PLATFORM,
+ JpaValidationMessages.ENTITY_TABLE_PER_CLASS_NOT_SUPPORTED_ON_PLATFORM);
+ addLabeledCombo(
+ parent, JptUiValidationPreferenceMessages.ENTITY_TABLE_PER_CLASS_NOT_PORTABLE_ON_PLATFORM,
+ JpaValidationMessages.ENTITY_TABLE_PER_CLASS_NOT_PORTABLE_ON_PLATFORM);
+ addLabeledCombo(
+ parent, JptUiValidationPreferenceMessages.ENTITY_SINGLE_TABLE_DESCENDANT_DEFINES_TABLE,
+ JpaValidationMessages.ENTITY_SINGLE_TABLE_DESCENDANT_DEFINES_TABLE);
+ addLabeledCombo(
+ parent, JptUiValidationPreferenceMessages.ENTITY_ABSTRACT_TABLE_PER_CLASS_DEFINES_TABLE,
+ JpaValidationMessages.ENTITY_ABSTRACT_TABLE_PER_CLASS_DEFINES_TABLE);
+ addLabeledCombo(
+ parent, JptUiValidationPreferenceMessages.ENTITY_ABSTRACT_DISCRIMINATOR_VALUE_DEFINED,
+ JpaValidationMessages.ENTITY_ABSTRACT_DISCRIMINATOR_VALUE_DEFINED);
+ addLabeledCombo(
+ parent, JptUiValidationPreferenceMessages.ENTITY_TABLE_PER_CLASS_DISCRIMINATOR_VALUE_DEFINED,
+ JpaValidationMessages.ENTITY_TABLE_PER_CLASS_DISCRIMINATOR_VALUE_DEFINED);
+ addLabeledCombo(
+ parent, JptUiValidationPreferenceMessages.ENTITY_NON_ROOT_DISCRIMINATOR_COLUMN_DEFINED,
+ JpaValidationMessages.ENTITY_NON_ROOT_DISCRIMINATOR_COLUMN_DEFINED);
+ addLabeledCombo(
+ parent, JptUiValidationPreferenceMessages.ENTITY_TABLE_PER_CLASS_DISCRIMINATOR_COLUMN_DEFINED,
+ JpaValidationMessages.ENTITY_TABLE_PER_CLASS_DISCRIMINATOR_COLUMN_DEFINED);
+ }
+
+ private void addQueriesGeneratorsCategory(Composite parent) {
+
+ parent = addExpandableSection(parent, JptUiValidationPreferenceMessages.QUERIES_GENERATORS_CATEGORY);
+
+ addLabeledCombo(parent, JptUiValidationPreferenceMessages.GENERATOR_DUPLICATE_NAME, JpaValidationMessages.GENERATOR_DUPLICATE_NAME);
+ addLabeledCombo(parent, JptUiValidationPreferenceMessages.ID_MAPPING_UNRESOLVED_GENERATOR_NAME, JpaValidationMessages.ID_MAPPING_UNRESOLVED_GENERATOR_NAME);
+ addLabeledCombo(parent, JptUiValidationPreferenceMessages.GENERATED_VALUE_UNRESOLVED_GENERATOR, JpaValidationMessages.GENERATED_VALUE_UNRESOLVED_GENERATOR);
+ addLabeledCombo(parent, JptUiValidationPreferenceMessages.QUERY_DUPLICATE_NAME, JpaValidationMessages.QUERY_DUPLICATE_NAME);
+ }
+
+ private Composite addExpandableSection(Composite parent, String text) {
+ return addExpandableSection(parent, text, new GridData(GridData.FILL, GridData.FILL, true, false));
+ }
+
+ private Composite addSubExpandableSection(Composite parent, String text) {
+ return addExpandableSection(parent, text, new GridData(GridData.FILL, GridData.FILL, true, false, 2, 1));
+ }
+
+ /**
+ * Creates and adds to the given <code>Composite</code> an expandable pane
+ * where its content can be shown or hidden depending on the expansion state.
+ *
+ * @param parent The parent container
+ * @param text The title of the expandable section
+ * @return The container to which widgets can be added, which is a child of
+ * the expandable pane
+ */
+ private Composite addExpandableSection(Composite parent, String text, GridData gridData) {
+ ExpandableComposite expandablePane = new ExpandableComposite(
+ parent,
+ SWT.NONE,
+ ExpandableComposite.TWISTIE | ExpandableComposite.CLIENT_INDENT
+ );
+
+ expandablePane.setText(text);
+ expandablePane.setExpanded(false);
+ expandablePane.setFont(JFaceResources.getFontRegistry().getBold(JFaceResources.DIALOG_FONT));
+ expandablePane.setLayoutData(gridData);
+ expandablePane.addExpansionListener(buildExpansionListener());
+
+ this.scrollable.adaptChild(expandablePane);
+ this.expandablePanes.add(expandablePane);
+
+ parent = new Composite(expandablePane, SWT.NONE);
+ parent.setLayout(new GridLayout(2, false));
+ expandablePane.setClient(parent);
+
+ return parent;
+ }
+
+ /**
+ * Creates and adds to the given parent a labeled combo where the possible
+ * choices are "Ignore", "Error" and "Warning".
+ *
+ * @param parent The parent to which the widgets are added
+ * @param labelText The text labelling the combo
+ * @param preferenceKey The key used to retrieve and to store the value
+ * associated with the validation problem
+ */
+ private void addLabeledCombo(Composite parent, String labelText, String preferenceKey) {
+ Label label = new Label(parent, SWT.NONE);
+ label.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+ label.setText(labelText);
+
+ Combo combo = new Combo(parent, SWT.READ_ONLY);
+ combo.setItems(this.severityDisplayStrings);
+ combo.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL));
+ combo.setData(PREFERENCE_KEY, preferenceKey);
+ combo.select(convertPreferenceKeyToComboIndex(preferenceKey));
+ combo.addSelectionListener(buildComboSelectionListener());
+
+ this.scrollable.adaptChild(combo);
+ this.combos.add(combo);
+ }
+
+ private SelectionListener buildComboSelectionListener() {
+ return new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ Combo combo = (Combo) e.widget;
+ String preferenceKey = (String) combo.getData(PREFERENCE_KEY);
+ String value = convertToPreferenceValue(combo.getSelectionIndex());
+ JpaProblemSeveritiesPage.this.severityLevels.put(preferenceKey, value);
+ }
+ };
+ }
+
+ private ExpansionAdapter buildExpansionListener() {
+ return new ExpansionAdapter() {
+ @Override
+ public void expansionStateChanged(ExpansionEvent e) {
+ JpaProblemSeveritiesPage.this.expansionStateChanged();
+ }
+ };
+ }
+
+ protected String[] buildSeverityDisplayStrings() {
+ String[] severities = new String[4];
+ severities[ERROR_INDEX] = JptUiMessages.JpaProblemSeveritiesPage_Error;
+ severities[WARNING_INDEX] = JptUiMessages.JpaProblemSeveritiesPage_Warning;
+ severities[INFO_INDEX] = JptUiMessages.JpaProblemSeveritiesPage_Info;
+ severities[IGNORE_INDEX] = JptUiMessages.JpaProblemSeveritiesPage_Ignore;
+ return severities;
+ }
+
+ protected int convertPreferenceKeyToComboIndex(String preferenceKey) {
+ return convertPreferenceValueToComboIndex(getPreferenceValue(preferenceKey));
+ }
+
+ protected String getPreferenceValue(String preferenceKey) {
+ String preference = null;
+ if (isProjectPreferencePage() && hasProjectSpecificOptions(getProject())) { //useProjectSettings() won't work since the page is being built
+ preference = JpaValidationPreferences.getProjectLevelProblemPreference(getProject(), preferenceKey);
+ }
+ else {
+ //don't get the workspace preference when the project has overridden workspace preferences
+ preference = JpaValidationPreferences.getWorkspaceLevelProblemPreference(preferenceKey);
+ }
+ if (preference == null) {
+ preference = getDefaultPreferenceValue(preferenceKey);
+ }
+ return preference;
+ }
+
+ /**
+ * Return the default severity or ERROR if no default exists.
+ */
+ protected String getDefaultPreferenceValue(String preferenceKey) {
+ String preference = this.defaultSeverities.get(preferenceKey);
+ return preference == null ? JpaValidationPreferences.ERROR : preference;
+ }
+
+ protected int convertPreferenceValueToComboIndex(String preferenceValue) {
+ if (JpaValidationPreferences.ERROR.equals(preferenceValue)) {
+ return ERROR_INDEX;
+ }
+ if (JpaValidationPreferences.WARNING.equals(preferenceValue)) {
+ return WARNING_INDEX;
+ }
+ if (JpaValidationPreferences.INFO.equals(preferenceValue)) {
+ return INFO_INDEX;
+ }
+ if (JpaValidationPreferences.IGNORE.equals(preferenceValue)) {
+ return IGNORE_INDEX;
+ }
+ throw new IllegalStateException();
+ }
+
+ protected String convertToPreferenceValue(int selectionIndex) {
+ switch (selectionIndex) {
+ case ERROR_INDEX: return JpaValidationPreferences.ERROR;
+ case WARNING_INDEX: return JpaValidationPreferences.WARNING;
+ case INFO_INDEX: return JpaValidationPreferences.INFO;
+ case IGNORE_INDEX: return JpaValidationPreferences.IGNORE;
+ default: return null;
+ }
+ }
+
+ /**
+ * Revalidates the layout in order to show or hide the vertical scroll bar
+ * after a section was either expanded or collapsed. This unfortunately does
+ * not happen automatically.
+ */
+ protected void expansionStateChanged() {
+ this.scrollable.reflow(true);
+ }
+
+ @Override
+ protected String getPreferencePageID() {
+ return JPT_PREFERENCES_PROBLEM_SEVERITIES_ID;
+ }
+
+ @Override
+ protected String getPropertyPageID() {
+ return JPT_PROPERTY_PAGES_PROBLEM_SEVERITIES_ID;
+ }
+
+ protected IEclipsePreferences getProjectPreferences(IProject project) {
+ return JptJpaCorePlugin.getProjectPreferences(project);
+ }
+
+ @Override
+ protected boolean hasProjectSpecificOptions(IProject project) {
+ IEclipsePreferences projectPreferences = getProjectPreferences(project);
+ return projectPreferences.getBoolean(JpaValidationPreferences.WORKSPACE_PREFERENCES_OVERRIDEN, false);
+ }
+
+ @Override
+ protected void performDefaults() {
+ super.performDefaults();
+ //this call would be redundant on project preference page - bug in the JDT superclass
+ if (!isProjectPreferencePage()) {
+ revertToDefault();
+ }
+ }
+
+ @Override
+ protected void enableProjectSpecificSettings(boolean useProjectSpecificSettings) {
+ super.enableProjectSpecificSettings(useProjectSpecificSettings);
+ if (getDefaultsButton() == null) {
+ //@Hack("If the defaults button is null the control is currently being built," +
+ // "otherwise the 'enable project specific settings' checkbox is being pressed")
+ return;
+ }
+
+ this.hasProjectSpecificPreferences = Boolean.valueOf(useProjectSpecificSettings);
+
+ //set all specified workspace preferences in the project preferences
+ if (useProjectSpecificSettings){
+ this.overrideWorkspacePreferences();
+ }
+ else {//remove any project specific settings if set to false
+ this.revertToDefault();
+ }
+ }
+
+ @Override
+ protected void noDefaultAndApplyButton() {
+ throw new IllegalStateException("Don't call this, see enableProjectSpecificSettings for the hack that looks for the defaultsButton being null"); //$NON-NLS-1$
+ }
+
+ protected void revertToDefault() {
+ for (Combo combo : this.combos) {
+ String preferenceKey = (String) combo.getData(PREFERENCE_KEY);
+ String preference = JpaValidationPreferences.getWorkspaceLevelProblemPreference(preferenceKey);
+ if (preference == null) {
+ preference = getDefaultPreferenceValue(preferenceKey);
+ }
+ combo.select(convertPreferenceValueToComboIndex(preference));
+ //UI will show the defaults from the workspace, but set all preferences
+ //to null so they will be deleted from project preferences
+ this.severityLevels.put(preferenceKey, null);
+ }
+ }
+
+ protected void overrideWorkspacePreferences() {
+ for (Combo combo : this.combos) {
+ String preferenceKey = (String) combo.getData(PREFERENCE_KEY);
+ String workspacePreference = JpaValidationPreferences.getWorkspaceLevelProblemPreference(preferenceKey);
+ String defaultPreference = getDefaultPreferenceValue(preferenceKey);
+ if (workspacePreference != null && !workspacePreference.equals(defaultPreference)) {
+ combo.select(convertPreferenceValueToComboIndex(workspacePreference));
+ //silly combo doesn't fire a selection event, so we can't expect our listener to set this
+ this.severityLevels.put(preferenceKey, workspacePreference);
+ }
+ else {
+ combo.select(convertPreferenceValueToComboIndex(defaultPreference));
+ }
+ }
+ }
+
+ // ********** OK/Revert/Apply behavior **********
+
+ @Override
+ public boolean performOk() {
+ super.performOk();
+ if (this.hasProjectSpecificPreferences != null) {
+ IEclipsePreferences projectPreferences = getProjectPreferences(getProject());
+ if (this.hasProjectSpecificPreferences.booleanValue()) {
+ projectPreferences.putBoolean(JpaValidationPreferences.WORKSPACE_PREFERENCES_OVERRIDEN, true);
+ }
+ else {
+ projectPreferences.remove(JpaValidationPreferences.WORKSPACE_PREFERENCES_OVERRIDEN);
+ }
+ JpaValidationPreferences.flush(projectPreferences);
+ }
+ for (String validationPreferenceKey : this.severityLevels.keySet()) {
+ updatePreference(validationPreferenceKey, this.severityLevels.get(validationPreferenceKey));
+ }
+ try {
+ // true=fork; false=uncancellable
+ this.buildOkProgressMonitorDialog().run(true, false, this.buildOkRunnableWithProgress());
+ }
+ catch (InterruptedException ex) {
+ return false;
+ }
+ catch (InvocationTargetException ex) {
+ throw new RuntimeException(ex.getTargetException());
+ }
+
+ return true;
+ }
+
+ protected void updatePreference(String preferenceKey, String value) {
+ if (isProjectPreferencePage()) {
+ JpaValidationPreferences.setProjectLevelProblemPreference(getProject(), preferenceKey, value);
+ }
+ else {
+ JpaValidationPreferences.setWorkspaceLevelProblemPreference(preferenceKey, value);
+ }
+ }
+
+ private IRunnableContext buildOkProgressMonitorDialog() {
+ return new ProgressMonitorDialog(this.getShell());
+ }
+
+ private IRunnableWithProgress buildOkRunnableWithProgress() {
+ return new IRunnableWithProgress() {
+ public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
+ IWorkspace ws = ResourcesPlugin.getWorkspace();
+ try {
+ // the build we execute in #performOk_() locks the workspace root,
+ // so we need to use the workspace root as our scheduling rule here
+ ws.run(
+ JpaProblemSeveritiesPage.this.buildOkWorkspaceRunnable(),
+ ws.getRoot(),
+ IWorkspace.AVOID_UPDATE,
+ monitor
+ );
+ }
+ catch (CoreException ex) {
+ throw new InvocationTargetException(ex);
+ }
+ }
+ };
+ }
+
+ IWorkspaceRunnable buildOkWorkspaceRunnable() {
+ return new IWorkspaceRunnable() {
+ public void run(IProgressMonitor monitor) throws CoreException {
+ JpaProblemSeveritiesPage.this.performOk_(monitor);
+ }
+ };
+ }
+
+ void performOk_(IProgressMonitor monitor) throws CoreException {
+ //if project is null this is a workspace preference page
+ if (this.getProject()==null) {
+ JavaPlugin.getWorkspace().build(IncrementalProjectBuilder.FULL_BUILD, monitor);
+ }
+ else this.getProject().build(IncrementalProjectBuilder.FULL_BUILD, monitor);
+ }
+
+ @Override
+ public void dispose() {
+ storeSectionExpansionStates(getDialogPreferences());
+ super.dispose();
+ }
+
+ protected IDialogSettings getDialogPreferences() {
+ IDialogSettings rootSettings = JptJpaUiPlugin.instance().getDialogSettings();
+ IDialogSettings settings = rootSettings.getSection(SETTINGS_SECTION_NAME);
+ if (settings == null) {
+ settings = rootSettings.addNewSection(SETTINGS_SECTION_NAME);
+ }
+ return settings;
+ }
+
+ protected void storeSectionExpansionStates(IDialogSettings settings) {
+ for (int index = this.expandablePanes.size(); --index >= 0; ) {
+ ExpandableComposite expandablePane = this.expandablePanes.get(index);
+ settings.put(SETTINGS_EXPANDED + index, expandablePane.isExpanded());
+ }
+ }
+
+} \ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/properties/DataModelPropertyPage.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/properties/DataModelPropertyPage.java
new file mode 100644
index 0000000000..0786ddb62a
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/properties/DataModelPropertyPage.java
@@ -0,0 +1,309 @@
+/*******************************************************************************
+ * Copyright (c) 2007 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.ui.internal.properties;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.jface.dialogs.IMessageProvider;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.dialogs.PropertyPage;
+import org.eclipse.wst.common.frameworks.datamodel.DataModelEvent;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModelListener;
+import org.eclipse.wst.common.frameworks.internal.datamodel.ui.DataModelSynchHelper;
+import org.eclipse.wst.common.frameworks.internal.ui.ValidationStatus;
+
+public abstract class DataModelPropertyPage
+ extends PropertyPage
+ implements Listener, IDataModelListener
+{
+ protected IDataModel model;
+
+ private ValidationStatus status = new ValidationStatus();
+ private Map validationMap;
+ private String[] validationPropertyNames;
+ private boolean isValidating = false;
+
+ protected DataModelSynchHelper synchHelper;
+
+ private String infopopID;
+
+
+ protected DataModelPropertyPage(IDataModel model) {
+ super();
+ this.model = model;
+ model.addListener(this);
+ synchHelper = initializeSynchHelper(model);
+ }
+
+
+ /**
+ * @return
+ */
+ public DataModelSynchHelper initializeSynchHelper(IDataModel dm) {
+ return new DataModelSynchHelper(dm);
+ }
+
+
+ @Override
+ protected Control createContents(Composite parent) {
+ Composite top = createTopLevelComposite(parent);
+ setupInfopop(top);
+ setDefaults();
+ addListeners();
+ initializeValidationProperties();
+ return top;
+ }
+
+ private void initializeValidationProperties() {
+ validationPropertyNames = getValidationPropertyNames();
+ if (validationPropertyNames == null || validationPropertyNames.length == 0)
+ validationMap = Collections.EMPTY_MAP;
+ else {
+ validationMap = new HashMap(validationPropertyNames.length);
+ for (int i = 0; i < validationPropertyNames.length; i++)
+ validationMap.put(validationPropertyNames[i], new Integer(i));
+ }
+ }
+
+ /**
+ * Subclass should return the model property names that need to be validated on this page in the
+ * order that they should present their messages.
+ *
+ * @return
+ */
+ protected abstract String[] getValidationPropertyNames();
+
+ /**
+ * Return the top level Composite for this page.
+ */
+ protected abstract Composite createTopLevelComposite(Composite parent);
+
+ /**
+ * Set up info pop hooks if set.
+ */
+ protected void setupInfopop(Control parent) {
+ if (getInfopopID() != null)
+ PlatformUI.getWorkbench().getHelpSystem().setHelp(parent, getInfopopID());
+ }
+
+ /**
+ * Setup the default values for this page. Subclasses should override to provide appropriate
+ * defaults.
+ */
+ protected void setDefaults() {
+ restoreDefaultSettings();
+ }
+
+ /**
+ * Subclasses should implement this method if they have default settings that have been stored
+ * and need to be restored.
+ *
+ * @see storeDefaultSettings()
+ */
+ protected void restoreDefaultSettings() {
+ }
+
+ /**
+ * Add Listeners to controls at this point to avoid unnecessary events. Subclasses should
+ * override to add listeners to its controls.
+ */
+ protected void addListeners() {
+ }
+
+ /**
+ * Exiting the page. Subclasses may extend.
+ */
+ protected void exit() {
+ }
+
+ protected boolean getStatus(Integer key) {
+ return status.hasError(key);
+ }
+
+ /**
+ * Sent when an event that the receiver has registered for occurs. If a subclass overrides this
+ * method, it must call super.
+ *
+ * @param event
+ * the event which occurred
+ */
+ public void handleEvent(org.eclipse.swt.widgets.Event event) {
+ }
+
+ /**
+ * Set the error message for this page based on the last error in the ValidationStatus.
+ */
+ protected void setErrorMessage() {
+ String error = status.getLastErrMsg();
+ if (error == null) {
+ if (getErrorMessage() != null)
+ setErrorMessage((String) null);
+ String warning = status.getLastWarningMsg();
+ if (warning == null) {
+ if (getMessage() != null && getMessageType() == IMessageProvider.WARNING)
+ setMessage(null, IMessageProvider.WARNING);
+ else {
+ String info = status.getLastInfoMsg();
+ if (info == null) {
+ if (getMessage() != null && getMessageType() == IMessageProvider.INFORMATION)
+ setMessage(null, IMessageProvider.INFORMATION);
+ } else if (!info.equals(getMessage())) {
+ setMessage(info, IMessageProvider.INFORMATION);
+ }
+ }
+ } else if (!warning.equals(getMessage()))
+ setMessage(warning, IMessageProvider.WARNING);
+ } else if (!error.equals(getErrorMessage()))
+ setErrorMessage(error);
+ }
+
+ protected void setErrorStatus(Integer key, String errorMessage) {
+ status.setErrorStatus(key, errorMessage);
+ }
+
+ protected void setWarningStatus(Integer key, String warningMessage) {
+ status.setWarningStatus(key, warningMessage);
+ }
+
+ protected void setInfoStatus(Integer key, String infoMessage) {
+ status.setInfoStatus(key, infoMessage);
+ }
+
+ protected void setOKStatus(Integer key) {
+ status.setOKStatus(key);
+ }
+
+ /**
+ * This should be called by the Wizard just prior to running the performFinish operation.
+ * Subclasses should override to store their default settings.
+ */
+ public void storeDefaultSettings() {
+ }
+
+ /**
+ * The page is now being validated. At this time, each control is validated and then the
+ * controls are updated based on the results in the ValidationStatus which was updated during
+ * <code>validateControls()</code>. Finally, it will display the last error message and it
+ * will set the page complete. Subclasses will not typically override this method.
+ */
+ protected void validatePage() {
+ if (!isValidating) {
+ isValidating = true;
+ try {
+ validateControlsBase();
+ updateControls();
+ setErrorMessage();
+ setValid(status.getLastErrMsg() == null);
+ }
+ finally {
+ isValidating = false;
+ }
+ }
+ }
+
+ /**
+ * Validate individual controls. Use validation keys to keep track of errors.
+ *
+ * @see setOKStatus(Integer) and setErrorMessage(Integer, String)
+ */
+ protected final String validateControlsBase() {
+ if (!validationMap.isEmpty()) {
+ String propName;
+ for (int i = 0; i < validationPropertyNames.length; i++) {
+ propName = validationPropertyNames[i];
+ Integer valKey = (Integer) validationMap.get(propName);
+ if (valKey != null)
+ validateProperty(propName, valKey);
+ if (!getStatus(valKey))
+ return propName;
+ }
+ }
+ return null;
+ }
+
+ /**
+ * @param propertyName
+ * @param validationkey
+ */
+ private void validateProperty(String propertyName, Integer validationKey) {
+ setOKStatus(validationKey);
+ IStatus status1 = model.validateProperty(propertyName);
+ if (!status1.isOK()) {
+ String message = status1.isMultiStatus() ? status1.getChildren()[0].getMessage() : status1.getMessage();
+ switch (status1.getSeverity()) {
+ case IStatus.ERROR :
+ setErrorStatus(validationKey, message);
+ break;
+ case IStatus.WARNING :
+ setWarningStatus(validationKey, message);
+ break;
+ case IStatus.INFO :
+ setInfoStatus(validationKey, message);
+ break;
+ }
+ }
+ }
+
+ /**
+ * Update the enablement of controls after validation. Sublcasses should check the status of
+ * validation keys to determine enablement.
+ */
+ protected void updateControls() {
+ }
+
+
+ /*
+ * If a property changes that we want to validate, force validation on this page.
+ *
+ * @see org.eclipse.wst.common.frameworks.internal.operation.WTPOperationDataModelListener#propertyChanged(java.lang.String,
+ * java.lang.Object, java.lang.Object)
+ */
+ public void propertyChanged(DataModelEvent event) {
+ String propertyName = event.getPropertyName();
+ if (validationPropertyNames != null && (event.getFlag() == DataModelEvent.VALUE_CHG || (!isValid() && event.getFlag() == DataModelEvent.VALID_VALUES_CHG))) {
+ for (int i = 0; i < validationPropertyNames.length; i++) {
+ if (validationPropertyNames[i].equals(propertyName)) {
+ validatePage();
+ break;
+ }
+ }
+ }
+ }
+
+ /**
+ * @return Returns the model.
+ */
+ protected IDataModel getDataModel() {
+ return model;
+ }
+
+ public void dispose() {
+ super.dispose();
+ if (synchHelper != null) {
+ synchHelper.dispose();
+ synchHelper = null;
+ }
+ }
+
+ protected String getInfopopID() {
+ return infopopID;
+ }
+
+ public void setInfopopID(String infopopID) {
+ this.infopopID = infopopID;
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/properties/JpaProjectPropertiesPage.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/properties/JpaProjectPropertiesPage.java
new file mode 100644
index 0000000000..84a6c706e3
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/properties/JpaProjectPropertiesPage.java
@@ -0,0 +1,1617 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2010 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.ui.internal.properties;
+
+import static org.eclipse.jst.common.project.facet.ui.libprov.LibraryProviderFrameworkUi.createInstallLibraryPanel;
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.jdt.core.ElementChangedEvent;
+import org.eclipse.jdt.core.IElementChangedListener;
+import org.eclipse.jdt.core.IJavaElement;
+import org.eclipse.jdt.core.IJavaElementDelta;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.jpt.common.ui.internal.listeners.SWTPropertyChangeListenerWrapper;
+import org.eclipse.jpt.common.ui.internal.properties.JptProjectPropertiesPage;
+import org.eclipse.jpt.common.ui.internal.util.SWTUtil;
+import org.eclipse.jpt.common.ui.internal.utility.swt.SWTTools;
+import org.eclipse.jpt.common.utility.internal.BitTools;
+import org.eclipse.jpt.common.utility.internal.CollectionTools;
+import org.eclipse.jpt.common.utility.internal.NotBooleanTransformer;
+import org.eclipse.jpt.common.utility.internal.StringConverter;
+import org.eclipse.jpt.common.utility.internal.StringTools;
+import org.eclipse.jpt.common.utility.internal.iterables.EmptyIterable;
+import org.eclipse.jpt.common.utility.internal.iterables.FilteringIterable;
+import org.eclipse.jpt.common.utility.internal.iterables.TransformationIterable;
+import org.eclipse.jpt.common.utility.internal.model.value.AbstractCollectionValueModel;
+import org.eclipse.jpt.common.utility.internal.model.value.AspectCollectionValueModelAdapter;
+import org.eclipse.jpt.common.utility.internal.model.value.AspectPropertyValueModelAdapter;
+import org.eclipse.jpt.common.utility.internal.model.value.BufferedWritablePropertyValueModel;
+import org.eclipse.jpt.common.utility.internal.model.value.CachingTransformationPropertyValueModel;
+import org.eclipse.jpt.common.utility.internal.model.value.CompositeCollectionValueModel;
+import org.eclipse.jpt.common.utility.internal.model.value.CompositePropertyValueModel;
+import org.eclipse.jpt.common.utility.internal.model.value.ExtendedListValueModelWrapper;
+import org.eclipse.jpt.common.utility.internal.model.value.PropertyAspectAdapter;
+import org.eclipse.jpt.common.utility.internal.model.value.PropertyCollectionValueModelAdapter;
+import org.eclipse.jpt.common.utility.internal.model.value.SetCollectionValueModel;
+import org.eclipse.jpt.common.utility.internal.model.value.SortedListValueModelAdapter;
+import org.eclipse.jpt.common.utility.internal.model.value.StaticCollectionValueModel;
+import org.eclipse.jpt.common.utility.internal.model.value.TransformationPropertyValueModel;
+import org.eclipse.jpt.common.utility.internal.model.value.TransformationWritablePropertyValueModel;
+import org.eclipse.jpt.common.utility.model.Model;
+import org.eclipse.jpt.common.utility.model.event.CollectionAddEvent;
+import org.eclipse.jpt.common.utility.model.event.PropertyChangeEvent;
+import org.eclipse.jpt.common.utility.model.listener.CollectionChangeAdapter;
+import org.eclipse.jpt.common.utility.model.listener.CollectionChangeListener;
+import org.eclipse.jpt.common.utility.model.listener.PropertyChangeListener;
+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.core.JpaDataSource;
+import org.eclipse.jpt.jpa.core.JpaFacet;
+import org.eclipse.jpt.jpa.core.JpaProject;
+import org.eclipse.jpt.jpa.core.JpaProjectManager;
+import org.eclipse.jpt.jpa.core.JptJpaCorePlugin;
+import org.eclipse.jpt.jpa.core.internal.JptCoreMessages;
+import org.eclipse.jpt.jpa.core.jpa2.JpaProject2_0;
+import org.eclipse.jpt.jpa.core.libprov.JpaLibraryProviderInstallOperationConfig;
+import org.eclipse.jpt.jpa.core.platform.JpaPlatformDescription;
+import org.eclipse.jpt.jpa.db.Catalog;
+import org.eclipse.jpt.jpa.db.ConnectionAdapter;
+import org.eclipse.jpt.jpa.db.ConnectionListener;
+import org.eclipse.jpt.jpa.db.ConnectionProfile;
+import org.eclipse.jpt.jpa.db.ConnectionProfileFactory;
+import org.eclipse.jpt.jpa.db.ConnectionProfileListener;
+import org.eclipse.jpt.jpa.db.Database;
+import org.eclipse.jpt.jpa.db.JptJpaDbPlugin;
+import org.eclipse.jpt.jpa.db.SchemaContainer;
+import org.eclipse.jpt.jpa.db.ui.internal.DTPUiTools;
+import org.eclipse.jpt.jpa.ui.internal.JpaHelpContextIds;
+import org.eclipse.jpt.jpa.ui.internal.JptUiMessages;
+import org.eclipse.jpt.jpa.ui.internal.jpa2.Jpa2_0ProjectFlagModel;
+import org.eclipse.jst.common.project.facet.core.libprov.ILibraryProvider;
+import org.eclipse.jst.common.project.facet.core.libprov.LibraryInstallDelegate;
+import org.eclipse.jst.common.project.facet.core.libprov.LibraryProviderOperationConfig;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Link;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.preferences.IWorkbenchPreferenceContainer;
+import org.eclipse.wst.common.project.facet.core.IProjectFacetVersion;
+import com.ibm.icu.text.Collator;
+
+/**
+ * Way more complicated UI than you would think....
+ */
+public class JpaProjectPropertiesPage
+ extends JptProjectPropertiesPage {
+
+ public static final String PROP_ID = "org.eclipse.jpt.jpa.ui.jpaProjectProperties"; //$NON-NLS-1$
+
+ private PropertyValueModel<JpaProject> jpaProjectModel;
+
+ private BufferedWritablePropertyValueModel<String> platformIdModel;
+ private PropertyChangeListener platformIdListener;
+
+ private BufferedWritablePropertyValueModel<String> connectionModel;
+ private PropertyValueModel<ConnectionProfile> connectionProfileModel;
+ private PropertyValueModel<Boolean> disconnectedModel;
+ private PropertyChangeListener disconnectedModelListener;
+ private Link connectLink;
+
+ private BufferedWritablePropertyValueModel<Boolean> userOverrideDefaultCatalogFlagModel;
+ private BufferedWritablePropertyValueModel<String> userOverrideDefaultCatalogModel;
+ private WritablePropertyValueModel<String> defaultCatalogModel;
+ private ListValueModel<String> catalogChoicesModel;
+
+ private BufferedWritablePropertyValueModel<Boolean> userOverrideDefaultSchemaFlagModel;
+ private BufferedWritablePropertyValueModel<String> userOverrideDefaultSchemaModel;
+ private WritablePropertyValueModel<String> defaultSchemaModel;
+ private ListValueModel<String> schemaChoicesModel;
+
+ private BufferedWritablePropertyValueModel<Boolean> discoverAnnotatedClassesModel;
+ private WritablePropertyValueModel<Boolean> listAnnotatedClassesModel;
+
+ private PropertyValueModel<Boolean> jpa2_0ProjectFlagModel;
+
+ private BufferedWritablePropertyValueModel<String> metamodelSourceFolderModel;
+ private ListValueModel<String> javaSourceFolderChoicesModel;
+
+ private static final String BUILD_PATHS_PROPERTY_PAGE_ID = "org.eclipse.jdt.ui.propertyPages.BuildPathsPropertyPage"; //$NON-NLS-1$
+
+
+ @SuppressWarnings("unchecked")
+ /* private */ static final Comparator<String> STRING_COMPARATOR = Collator.getInstance();
+
+
+ // ************ construction ************
+
+ public JpaProjectPropertiesPage() {
+ super();
+ }
+
+ @Override
+ protected void buildModels() {
+ this.jpaProjectModel = new JpaProjectModel(this.projectModel);
+
+ this.platformIdModel = this.buildPlatformIdModel();
+ this.platformIdListener = this.buildPlatformIdListener();
+
+ this.connectionModel = this.buildConnectionModel();
+ this.connectionProfileModel = this.buildConnectionProfileModel();
+ this.disconnectedModel = this.buildDisconnectedModel();
+ this.disconnectedModelListener = buildDisconnectedModelListener();
+
+ this.userOverrideDefaultCatalogFlagModel = this.buildUserOverrideDefaultCatalogFlagModel();
+ this.userOverrideDefaultCatalogModel = this.buildUserOverrideDefaultCatalogModel();
+ this.defaultCatalogModel = this.buildDefaultCatalogModel();
+ this.catalogChoicesModel = this.buildCatalogChoicesModel();
+
+ this.userOverrideDefaultSchemaFlagModel = this.buildUserOverrideDefaultSchemaFlagModel();
+ this.userOverrideDefaultSchemaModel = this.buildUserOverrideDefaultSchemaModel();
+ this.defaultSchemaModel = this.buildDefaultSchemaModel();
+ this.schemaChoicesModel = this.buildSchemaChoicesModel();
+
+ this.discoverAnnotatedClassesModel = this.buildDiscoverAnnotatedClassesModel();
+ this.listAnnotatedClassesModel = this.buildListAnnotatedClassesModel();
+
+ this.jpa2_0ProjectFlagModel = this.buildJpa2_0ProjectFlagModel();
+
+ this.metamodelSourceFolderModel = this.buildMetamodelSourceFolderModel();
+ this.javaSourceFolderChoicesModel = this.buildJavaSourceFolderChoicesModel();
+ }
+
+ // ***** platform ID model
+ private BufferedWritablePropertyValueModel<String> buildPlatformIdModel() {
+ return new BufferedWritablePropertyValueModel<String>(new PlatformIdModel(this.jpaProjectModel), this.trigger);
+ }
+
+ private PropertyChangeListener buildPlatformIdListener(){
+ return new PropertyChangeListener() {
+ public void propertyChanged(PropertyChangeEvent event) {
+ JpaProjectPropertiesPage.this.platformIdChanged((String) event.getNewValue());
+ }
+ };
+ }
+
+ void platformIdChanged(String newPlatformId) {
+ if ( ! this.getControl().isDisposed()) {
+ // handle null, in the case the jpa facet is changed via the facets page,
+ // the library install delegate is temporarily null
+ adjustLibraryProviders();
+ }
+ }
+
+ // ***** connection models
+ private BufferedWritablePropertyValueModel<String> buildConnectionModel() {
+ return new BufferedWritablePropertyValueModel<String>(new ConnectionModel(this.jpaProjectModel), this.trigger);
+ }
+
+ private PropertyValueModel<ConnectionProfile> buildConnectionProfileModel() {
+ return new ConnectionProfileModel(this.connectionModel);
+ }
+
+ private PropertyValueModel<Boolean> buildDisconnectedModel() {
+ return new DisconnectedModel(this.connectionProfileModel);
+ }
+
+ // ***** catalog models
+ private BufferedWritablePropertyValueModel<Boolean> buildUserOverrideDefaultCatalogFlagModel() {
+ return new BufferedWritablePropertyValueModel<Boolean>(new UserOverrideDefaultCatalogFlagModel(this.jpaProjectModel), this.trigger);
+ }
+
+ private BufferedWritablePropertyValueModel<String> buildUserOverrideDefaultCatalogModel() {
+ return new BufferedWritablePropertyValueModel<String>(new UserOverrideDefaultCatalogModel(this.jpaProjectModel), this.trigger);
+ }
+
+ private WritablePropertyValueModel<String> buildDefaultCatalogModel() {
+ return new DefaultModel(
+ this.userOverrideDefaultCatalogFlagModel,
+ this.userOverrideDefaultCatalogModel,
+ this.buildDatabaseDefaultCatalogModel()
+ );
+ }
+
+ private PropertyValueModel<String> buildDatabaseDefaultCatalogModel() {
+ return new DatabaseDefaultCatalogModel(this.connectionProfileModel);
+ }
+
+ /**
+ * Add the default catalog if it is not on the list from the database
+ */
+ private ListValueModel<String> buildCatalogChoicesModel() {
+ return new SortedListValueModelAdapter<String>(this.buildUnsortedCatalogChoicesModel(), STRING_COMPARATOR);
+ }
+
+ /**
+ * Add the default catalog if it is not on the list from the database
+ */
+ @SuppressWarnings("unchecked")
+ private CollectionValueModel<String> buildUnsortedCatalogChoicesModel() {
+ return new SetCollectionValueModel<String>(
+ new CompositeCollectionValueModel<CollectionValueModel<String>, String>(
+ new PropertyCollectionValueModelAdapter<String>(this.defaultCatalogModel),
+ this.buildDatabaseCatalogChoicesModel()
+ )
+ );
+ }
+
+ private CollectionValueModel<String> buildDatabaseCatalogChoicesModel() {
+ return new DatabaseCatalogChoicesModel(this.connectionProfileModel);
+ }
+
+ // ***** schema models
+ private BufferedWritablePropertyValueModel<Boolean> buildUserOverrideDefaultSchemaFlagModel() {
+ return new BufferedWritablePropertyValueModel<Boolean>(new UserOverrideDefaultSchemaFlagModel(this.jpaProjectModel), this.trigger);
+ }
+
+ private BufferedWritablePropertyValueModel<String> buildUserOverrideDefaultSchemaModel() {
+ return new BufferedWritablePropertyValueModel<String>(new UserOverrideDefaultSchemaModel(this.jpaProjectModel), this.trigger);
+ }
+
+ private WritablePropertyValueModel<String> buildDefaultSchemaModel() {
+ return new DefaultModel(
+ this.userOverrideDefaultSchemaFlagModel,
+ this.userOverrideDefaultSchemaModel,
+ this.buildDatabaseDefaultSchemaModel()
+ );
+ }
+
+ private PropertyValueModel<String> buildDatabaseDefaultSchemaModel() {
+ return new DatabaseDefaultSchemaModel(this.connectionProfileModel, this.defaultCatalogModel);
+ }
+
+ /**
+ * Add the default catalog if it is not on the list from the database
+ */
+ private ListValueModel<String> buildSchemaChoicesModel() {
+ return new SortedListValueModelAdapter<String>(this.buildUnsortedSchemaChoicesModel(), STRING_COMPARATOR);
+ }
+
+ @SuppressWarnings("unchecked")
+ private CollectionValueModel<String> buildUnsortedSchemaChoicesModel() {
+ return new SetCollectionValueModel<String>(
+ new CompositeCollectionValueModel<CollectionValueModel<String>, String>(
+ new PropertyCollectionValueModelAdapter<String>(this.defaultSchemaModel),
+ this.buildDatabaseSchemaChoicesModel()
+ )
+ );
+ }
+
+ private CollectionValueModel<String> buildDatabaseSchemaChoicesModel() {
+ return new DatabaseSchemaChoicesModel(this.connectionProfileModel, this.defaultCatalogModel);
+ }
+
+ // ***** discover/list annotated classes models
+ private BufferedWritablePropertyValueModel<Boolean> buildDiscoverAnnotatedClassesModel() {
+ return new BufferedWritablePropertyValueModel<Boolean>(new DiscoverAnnotatedClassesModel(this.jpaProjectModel), this.trigger);
+ }
+
+ /**
+ * The opposite of the "discover annotated classes" flag.
+ */
+ private WritablePropertyValueModel<Boolean> buildListAnnotatedClassesModel() {
+ return new TransformationWritablePropertyValueModel<Boolean, Boolean>(this.discoverAnnotatedClassesModel, NotBooleanTransformer.instance());
+ }
+
+ // ***** JPA 2.0 project flag
+ private PropertyValueModel<Boolean> buildJpa2_0ProjectFlagModel() {
+ return new Jpa2_0ProjectFlagModel<JpaProject>(this.jpaProjectModel);
+ }
+
+ // ***** metamodel models
+ private BufferedWritablePropertyValueModel<String> buildMetamodelSourceFolderModel() {
+ return new BufferedWritablePropertyValueModel<String>(new MetamodelSourceFolderModel(this.jpaProjectModel), this.trigger);
+ }
+
+ private ListValueModel<String> buildJavaSourceFolderChoicesModel() {
+ // by default, ExtendedListValueModelWrapper puts a null at the top of the list
+ return new ExtendedListValueModelWrapper<String>(
+ new SortedListValueModelAdapter<String>(
+ new JavaSourceFolderChoicesModel(this.jpaProjectModel),
+ STRING_COMPARATOR
+ )
+ );
+ }
+
+
+ // ********** convenience methods **********
+
+ private String getConnectionName() {
+ return this.connectionModel.getValue();
+ }
+
+ private ConnectionProfile getConnectionProfile() {
+ return this.connectionProfileModel.getValue();
+ }
+
+ private boolean userOverrideDefaultCatalogFlagIsSet() {
+ return flagIsSet(this.userOverrideDefaultCatalogFlagModel);
+ }
+
+ private String getUserOverrideDefaultCatalog() {
+ return this.userOverrideDefaultCatalogModel.getValue();
+ }
+
+ private boolean userOverrideDefaultSchemaFlagIsSet() {
+ return flagIsSet(this.userOverrideDefaultSchemaFlagModel);
+ }
+
+ private String getUserOverrideDefaultSchema() {
+ return this.userOverrideDefaultSchemaModel.getValue();
+ }
+
+ private IWorkbenchPreferenceContainer getWorkbenchPreferenceContainer() {
+ IWorkbenchPreferenceContainer container= (IWorkbenchPreferenceContainer) getContainer();
+ return container;
+ }
+
+ // ********** LibraryFacetPropertyPage implementation **********
+
+ @Override
+ public IProjectFacetVersion getProjectFacetVersion() {
+ return this.getFacetedProject().getInstalledVersion(JpaFacet.FACET);
+ }
+
+ @Override
+ protected void adjustLibraryProviders() {
+ LibraryInstallDelegate lid = this.getLibraryInstallDelegate();
+ if (lid != null) {
+ List<JpaLibraryProviderInstallOperationConfig> jpaConfigs
+ = new ArrayList<JpaLibraryProviderInstallOperationConfig>();
+ // add the currently selected one first
+ JpaLibraryProviderInstallOperationConfig currentJpaConfig = null;
+ LibraryProviderOperationConfig config = lid.getLibraryProviderOperationConfig();
+ if (config instanceof JpaLibraryProviderInstallOperationConfig) {
+ currentJpaConfig = (JpaLibraryProviderInstallOperationConfig) config;
+ jpaConfigs.add(currentJpaConfig);
+ }
+ for (ILibraryProvider lp : lid.getLibraryProviders()) {
+ config = lid.getLibraryProviderOperationConfig(lp);
+ if (config instanceof JpaLibraryProviderInstallOperationConfig
+ && ! config.equals(currentJpaConfig)) {
+ jpaConfigs.add((JpaLibraryProviderInstallOperationConfig) config);
+ }
+ }
+ for (JpaLibraryProviderInstallOperationConfig jpaConfig : jpaConfigs) {
+ jpaConfig.setJpaPlatform(JptJpaCorePlugin.getJpaPlatformManager().getJpaPlatform(this.platformIdModel.getValue()));
+ }
+ }
+ }
+
+
+ // ********** page **********
+
+ @Override
+ protected void createWidgets(Composite parent) {
+ this.buildPlatformGroup(parent);
+
+ Control libraryProviderComposite = createInstallLibraryPanel(
+ parent,
+ this.getLibraryInstallDelegate(),
+ JptUiMessages.JpaFacetWizardPage_jpaImplementationLabel);
+
+ libraryProviderComposite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+ this.buildConnectionGroup(parent);
+ this.buildPersistentClassManagementGroup(parent);
+ this.buildMetamodelGroup(parent);
+
+ PlatformUI.getWorkbench().getHelpSystem().setHelp(parent, JpaHelpContextIds.PROPERTIES_JAVA_PERSISTENCE);
+ }
+
+ @Override
+ protected void engageListeners() {
+ super.engageListeners();
+ this.platformIdModel.addPropertyChangeListener(PropertyValueModel.VALUE, this.platformIdListener);
+ this.disconnectedModel.addPropertyChangeListener(PropertyValueModel.VALUE, this.disconnectedModelListener);
+ }
+
+ @Override
+ protected void disengageListeners() {
+ this.platformIdModel.removePropertyChangeListener(PropertyValueModel.VALUE, this.platformIdListener);
+ this.disconnectedModel.removePropertyChangeListener(PropertyValueModel.VALUE, this.disconnectedModelListener);
+ super.disengageListeners();
+ }
+
+
+ // ********** platform group **********
+
+ private void buildPlatformGroup(Composite composite) {
+ Group group = new Group(composite, SWT.NONE);
+ group.setText(JptUiMessages.JpaFacetWizardPage_platformLabel);
+ group.setLayout(new GridLayout());
+ group.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+ Combo platformDropDown = buildDropDown(group);
+ SWTTools.bind(
+ buildPlatformChoicesModel(),
+ this.platformIdModel,
+ platformDropDown,
+ JPA_PLATFORM_LABEL_CONVERTER);
+
+ buildFacetsPageLink(group, JptUiMessages.JpaFacetWizardPage_facetsPageLink);
+ }
+
+ /**
+ * Add the project's JPA platform if it is not on the list of valid
+ * platforms.
+ * <p>
+ * This is probably only useful if the project is corrupted
+ * and has a platform that exists in the registry but is not on the
+ * list of valid platforms for the project's JPA facet version.
+ * Because, if the project's JPA platform is completely invalid, there
+ * would be no JPA project!
+ */
+ @SuppressWarnings("unchecked")
+ private ListValueModel<String> buildPlatformChoicesModel() {
+ return new SortedListValueModelAdapter<String>(
+ new SetCollectionValueModel<String>(
+ new CompositeCollectionValueModel<CollectionValueModel<String>, String>(
+ new PropertyCollectionValueModelAdapter<String>(this.platformIdModel),
+ this.buildRegistryPlatformsModel()
+ )
+ ),
+ JPA_PLATFORM_COMPARATOR
+ );
+ }
+
+ private CollectionValueModel<String> buildRegistryPlatformsModel() {
+ Iterable<String> enabledPlatformIds =
+ new TransformationIterable<JpaPlatformDescription, String>(
+ new FilteringIterable<JpaPlatformDescription>(JptJpaCorePlugin.getJpaPlatformManager().getJpaPlatforms()) {
+ @Override
+ protected boolean accept(JpaPlatformDescription o) {
+ return o.supportsJpaFacetVersion(getProjectFacetVersion());
+ }
+ }) {
+ @Override
+ protected String transform(JpaPlatformDescription o) {
+ return o.getId();
+ }
+ };
+ return new StaticCollectionValueModel<String>(enabledPlatformIds);
+ }
+
+ private static final Comparator<String> JPA_PLATFORM_COMPARATOR =
+ new Comparator<String>() {
+ public int compare(String id1, String id2) {
+ String label1 = getJpaPlatformLabel(id1);
+ String label2 = getJpaPlatformLabel(id2);
+ return STRING_COMPARATOR.compare(label1, label2);
+ }
+ };
+
+ private static final StringConverter<String> JPA_PLATFORM_LABEL_CONVERTER =
+ new StringConverter<String>() {
+ public String convertToString(String id) {
+ return getJpaPlatformLabel(id);
+ }
+ };
+
+ /* private */ static String getJpaPlatformLabel(String id) {
+ return JptJpaCorePlugin.getJpaPlatformManager().getJpaPlatform(id).getLabel();
+ }
+
+
+ // ********** connection group **********
+
+ private void buildConnectionGroup(Composite composite) {
+ Group group = new Group(composite, SWT.NONE);
+ group.setText(JptUiMessages.JpaFacetWizardPage_connectionLabel);
+ group.setLayout(new GridLayout(3, false));
+ group.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+ PlatformUI.getWorkbench().getHelpSystem().setHelp(group, JpaHelpContextIds.PROPERTIES_JAVA_PERSISTENCE_CONNECTION);
+
+ Combo connectionDropDown = this.buildDropDown(group, 3);
+ SWTTools.bind(
+ CONNECTION_CHOICES_MODEL,
+ this.connectionModel,
+ connectionDropDown,
+ SIMPLE_STRING_CONVERTER
+ );
+
+ Link addConnectionLink = this.buildLink(group, JptUiMessages.JpaFacetWizardPage_connectionLink);
+ addConnectionLink.addSelectionListener(this.buildAddConnectionLinkListener()); // the link will be GCed
+
+ this.connectLink = this.buildLink(group, buildConnectLinkText());
+ SWTTools.controlEnabledState(this.disconnectedModel, this.connectLink);
+ this.connectLink.addSelectionListener(this.buildConnectLinkListener()); // the link will be GCed
+
+ // override default catalog
+ Button overrideDefaultCatalogCheckBox = this.buildCheckBox(group, 3, JptUiMessages.JpaFacetWizardPage_overrideDefaultCatalogLabel);
+ SWTTools.bind(this.userOverrideDefaultCatalogFlagModel, overrideDefaultCatalogCheckBox);
+
+ Label defaultCatalogLabel = this.buildLabel(group, JptUiMessages.JpaFacetWizardPage_defaultCatalogLabel);
+ Combo defaultCatalogDropDown = this.buildDropDown(group);
+ SWTTools.bind(this.catalogChoicesModel, this.defaultCatalogModel, defaultCatalogDropDown);
+
+ SWTTools.controlEnabledState(this.userOverrideDefaultCatalogFlagModel, defaultCatalogLabel, defaultCatalogDropDown);
+
+ // override default schema
+ Button overrideDefaultSchemaButton = this.buildCheckBox(group, 3, JptUiMessages.JpaFacetWizardPage_overrideDefaultSchemaLabel);
+ SWTTools.bind(this.userOverrideDefaultSchemaFlagModel, overrideDefaultSchemaButton);
+
+ Label defaultSchemaLabel = this.buildLabel(group, JptUiMessages.JpaFacetWizardPage_defaultSchemaLabel);
+ Combo defaultSchemaDropDown = this.buildDropDown(group);
+ SWTTools.bind(this.schemaChoicesModel, this.defaultSchemaModel, defaultSchemaDropDown);
+
+ SWTTools.controlEnabledState(this.userOverrideDefaultSchemaFlagModel, defaultSchemaLabel, defaultSchemaDropDown);
+ }
+
+ private static final StringConverter<String> SIMPLE_STRING_CONVERTER =
+ new StringConverter<String>() {
+ public String convertToString(String string) {
+ return (string != null) ? string : JptUiMessages.JpaFacetWizardPage_none;
+ }
+ };
+
+ private PropertyChangeListener buildDisconnectedModelListener() {
+ return new SWTPropertyChangeListenerWrapper(buildDisconnectedModelListener_());
+ }
+
+ private PropertyChangeListener buildDisconnectedModelListener_() {
+ return new PropertyChangeListener() {
+
+ public void propertyChanged(PropertyChangeEvent event) {
+ JpaProjectPropertiesPage.this.updateConnectLinkText(buildConnectLinkText());
+ }
+ };
+ }
+
+ private String buildConnectLinkText(){
+ ConnectionProfile connectionProfile = getConnectionProfile();
+ if (connectionProfile != null && connectionProfile.isConnected()) {
+ return JptUiMessages.JpaFacetWizardPage_connectedText;
+ }
+ else {
+ return JptUiMessages.JpaFacetWizardPage_connectLink;
+ }
+ }
+
+ private void updateConnectLinkText(String text) {
+ connectLink.setText(text);
+ SWTUtil.reflow(connectLink.getParent());
+ }
+
+ private SelectionListener buildAddConnectionLinkListener() {
+ return new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ JpaProjectPropertiesPage.this.openNewConnectionWizard();
+ }
+ @Override
+ public String toString() {
+ return "connection link listener"; //$NON-NLS-1$
+ }
+ };
+ }
+
+ void openNewConnectionWizard() {
+ String connectionName = DTPUiTools.createNewConnectionProfile();
+ if (connectionName != null) {
+ this.connectionModel.setValue(connectionName);
+ }
+ }
+
+ private SelectionListener buildConnectLinkListener() {
+ return new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ JpaProjectPropertiesPage.this.openConnectionProfile();
+ }
+ @Override
+ public String toString() {
+ return "connect link listener"; //$NON-NLS-1$
+ }
+ };
+ }
+
+ void openConnectionProfile() {
+ ConnectionProfile cp = this.getConnectionProfile();
+ if (cp != null) {
+ cp.connect();
+ }
+ }
+
+
+ // ********** persistent class management group **********
+
+ private void buildPersistentClassManagementGroup(Composite composite) {
+ Group group = new Group(composite, SWT.NONE);
+ group.setText(JptUiMessages.JpaFacetWizardPage_persistentClassManagementLabel);
+ group.setLayout(new GridLayout());
+ group.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+ Button discoverClassesRadioButton = this.buildRadioButton(group, 1, JptUiMessages.JpaFacetWizardPage_discoverClassesButton);
+ SWTTools.bind(this.discoverAnnotatedClassesModel, discoverClassesRadioButton);
+
+ Button listClassesRadioButton = this.buildRadioButton(group, 1, JptUiMessages.JpaFacetWizardPage_listClassesButton);
+ SWTTools.bind(this.listAnnotatedClassesModel, listClassesRadioButton);
+ }
+
+
+ // ********** metamodel group **********
+
+ private void buildMetamodelGroup(Composite composite) {
+ Group group = new Group(composite, SWT.NONE);
+ group.setText(JptUiMessages.JpaFacetWizardPage_metamodelLabel);
+ group.setLayout(new GridLayout(3, false));
+ group.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+ Link metamodelSourceFolderLink = this.buildLink(group, JptUiMessages.JpaFacetWizardPage_metamodelSourceFolderLink);
+ metamodelSourceFolderLink.addSelectionListener(buildMetamodelSourceFolderLinkListener());
+ Combo metamodelSourceFolderDropDown = this.buildDropDown(group);
+ SWTTools.bind(
+ this.javaSourceFolderChoicesModel,
+ this.metamodelSourceFolderModel,
+ metamodelSourceFolderDropDown,
+ SIMPLE_STRING_CONVERTER
+ );
+
+ PlatformUI.getWorkbench().getHelpSystem().setHelp(group, JpaHelpContextIds.PROPERTIES_JAVA_PERSISTENCE_METAMODEL);
+
+ SWTTools.controlVisibleState(this.jpa2_0ProjectFlagModel, group, metamodelSourceFolderLink, metamodelSourceFolderDropDown);
+ }
+
+ private SelectionListener buildMetamodelSourceFolderLinkListener() {
+ return new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ JpaProjectPropertiesPage.this.openJavaBuildPathPage();
+ }
+ @Override
+ public String toString() {
+ return "metamodel source folder link listener"; //$NON-NLS-1$
+ }
+ };
+ }
+
+ void openJavaBuildPathPage() {
+ IWorkbenchPreferenceContainer container = getWorkbenchPreferenceContainer();
+ container.openPage(BUILD_PATHS_PROPERTY_PAGE_ID, null);
+ }
+
+ // ********** OK/Revert/Apply behavior **********
+
+ @Override
+ protected boolean projectRebuildRequired() {
+ return this.platformIdModel.isBuffering();
+ }
+
+ @Override
+ protected void rebuildProject() {
+ // if the JPA platform is changed, we need to completely rebuild the JPA project
+ JptJpaCorePlugin.rebuildJpaProject(this.getProject());
+ }
+
+ @Override
+ protected BufferedWritablePropertyValueModel<?>[] buildBufferedModels() {
+ return new BufferedWritablePropertyValueModel[] {
+ this.platformIdModel,
+ this.connectionModel,
+ this.userOverrideDefaultCatalogFlagModel,
+ this.userOverrideDefaultCatalogModel,
+ this.userOverrideDefaultSchemaFlagModel,
+ this.userOverrideDefaultSchemaModel,
+ this.discoverAnnotatedClassesModel,
+ this.metamodelSourceFolderModel
+ };
+ }
+
+
+ // ********** validation **********
+
+ @Override
+ protected Model[] buildValidationModels() {
+ return new Model[] {
+ this.platformIdModel,
+ this.connectionModel,
+ this.userOverrideDefaultCatalogFlagModel,
+ this.defaultCatalogModel,
+ this.userOverrideDefaultSchemaFlagModel,
+ this.defaultSchemaModel,
+ this.discoverAnnotatedClassesModel
+ };
+ }
+
+ @Override
+ protected void performValidation(Map<Integer, ArrayList<IStatus>> statuses) {
+ /* platform */
+ // user is unable to unset the platform, so no validation necessary
+
+ /* library provider */
+ super.performValidation(statuses);
+
+ /* connection */
+ ConnectionProfile connectionProfile = this.getConnectionProfile();
+ String connectionName = this.getConnectionName();
+ if ( ! StringTools.stringIsEmpty(connectionName)) {
+ if (connectionProfile == null) {
+ statuses.get(ERROR_STATUS).add(this.buildErrorStatus(NLS.bind(
+ JptCoreMessages.VALIDATE_CONNECTION_INVALID,
+ connectionName)));
+ }
+ else if ( ! connectionProfile.isActive()) {
+ statuses.get(INFO_STATUS).add(this.buildInfoStatus(JptCoreMessages.VALIDATE_CONNECTION_NOT_CONNECTED));
+ }
+ }
+
+ /* default catalog */
+ if (this.userOverrideDefaultCatalogFlagIsSet()) {
+ String defaultCatalog = this.getUserOverrideDefaultCatalog();
+ if (StringTools.stringIsEmpty(defaultCatalog)) {
+ statuses.get(ERROR_STATUS).add(this.buildErrorStatus(JptCoreMessages.VALIDATE_DEFAULT_CATALOG_NOT_SPECIFIED));
+ }
+ else if ((connectionProfile != null)
+ && connectionProfile.isConnected()
+ && ! CollectionTools.contains(this.catalogChoicesModel.iterator(), defaultCatalog)) {
+ statuses.get(WARNING_STATUS).add(this.buildWarningStatus(NLS.bind(
+ JptCoreMessages.VALIDATE_CONNECTION_DOESNT_CONTAIN_CATALOG,
+ defaultCatalog
+ )));
+ }
+ }
+
+ /* default schema */
+ if (this.userOverrideDefaultSchemaFlagIsSet()) {
+ String defaultSchema = this.getUserOverrideDefaultSchema();
+ if (StringTools.stringIsEmpty(defaultSchema)) {
+ statuses.get(ERROR_STATUS).add(this.buildErrorStatus(JptCoreMessages.VALIDATE_DEFAULT_SCHEMA_NOT_SPECIFIED));
+ }
+ else if ((connectionProfile != null)
+ && connectionProfile.isConnected()
+ && ! CollectionTools.contains(this.schemaChoicesModel.iterator(), defaultSchema)) {
+ statuses.get(WARNING_STATUS).add(this.buildWarningStatus(NLS.bind(
+ JptCoreMessages.VALIDATE_CONNECTION_DOESNT_CONTAIN_SCHEMA,
+ defaultSchema
+ )));
+ }
+ }
+ }
+
+
+ // ********** UI model adapters **********
+
+ /**
+ * Treat the JPA project as an "aspect" of the Eclipse project (IProject);
+ * but the JPA project is stored in the JPA model, not the Eclipse project
+ * itself....
+ * We also need to listen for the JPA project to be rebuilt if the user
+ * changes the Eclipse project's JPA platform (which is stored in the
+ * Eclipse project's preferences).
+ */
+ static class JpaProjectModel
+ extends AspectPropertyValueModelAdapter<IProject, JpaProject> {
+
+ /**
+ * The JPA project may also change via another page (notably, the project facets page).
+ * In that case, the preference change occurs before we actually have another project,
+ * so we must listen to the projects manager
+ */
+ private final CollectionChangeListener projectManagerListener;
+
+
+ JpaProjectModel(PropertyValueModel<IProject> projectModel) {
+ super(projectModel);
+ this.projectManagerListener = buildProjectManagerListener();
+ }
+
+ private CollectionChangeListener buildProjectManagerListener() {
+ return new CollectionChangeAdapter() {
+ // we are only looking for the project rebuild *add* event here so we can
+ // determine if the platform has changed.
+ // the other events are unimportant in this case
+ @Override
+ public void itemsAdded(CollectionAddEvent event) {
+ JpaProjectModel.this.platformChanged();
+ }
+ };
+ }
+
+ void platformChanged() {
+ this.propertyChanged();
+ }
+
+ @Override
+ protected void engageSubject_() {
+ JptJpaCorePlugin.getJpaProjectManager().addCollectionChangeListener(
+ JpaProjectManager.JPA_PROJECTS_COLLECTION, this.projectManagerListener);
+ }
+
+ @Override
+ protected void disengageSubject_() {
+ JptJpaCorePlugin.getJpaProjectManager().removeCollectionChangeListener(
+ JpaProjectManager.JPA_PROJECTS_COLLECTION, this.projectManagerListener);
+ }
+
+ @Override
+ protected JpaProject buildValue_() {
+ return JptJpaCorePlugin.getJpaProject(this.subject);
+ }
+ }
+
+
+ /**
+ * The JPA project's data source is an auxiliary object that never changes;
+ * so if we have a JPA project, we have a JPA data source also.
+ */
+ static class DataSourceModel
+ extends TransformationPropertyValueModel<JpaProject, JpaDataSource>
+ {
+ DataSourceModel(PropertyValueModel<JpaProject> jpaProjectModel) {
+ super(jpaProjectModel);
+ }
+
+ @Override
+ protected JpaDataSource transform_(JpaProject value) {
+ return value.getDataSource();
+ }
+ }
+
+
+ /**
+ * The DTP connection profile name is an aspect of the JPA project's
+ * data source
+ */
+ static class ConnectionModel
+ extends PropertyAspectAdapter<JpaDataSource, String>
+ {
+ ConnectionModel(PropertyValueModel<JpaProject> jpaProjectModel) {
+ super(new DataSourceModel(jpaProjectModel), JpaDataSource.CONNECTION_PROFILE_NAME_PROPERTY);
+ }
+
+ @Override
+ protected String buildValue_() {
+ return this.subject.getConnectionProfileName();
+ }
+
+ @Override
+ public void setValue_(String connection) {
+ this.subject.setConnectionProfileName(connection);
+ }
+ }
+
+
+ /**
+ * Convert the selected connection profile name to a connection profile
+ */
+ static class ConnectionProfileModel
+ extends CachingTransformationPropertyValueModel<String, ConnectionProfile>
+ {
+ ConnectionProfileModel(PropertyValueModel<String> connectionModel) {
+ super(connectionModel);
+ }
+
+ @Override
+ protected ConnectionProfile transform_(String connectionName) {
+ return JptJpaDbPlugin.getConnectionProfileFactory().buildConnectionProfile(connectionName);
+ }
+ }
+
+
+ /**
+ * Treat the JPA platform ID as an "aspect" of the JPA project.
+ * The platform ID is stored in the project preferences.
+ * The platform ID does not change for a JPA project - if the user wants a
+ * different platform, we build an entirely new JPA project.
+ */
+ static class PlatformIdModel
+ extends AspectPropertyValueModelAdapter<JpaProject, String>
+ {
+ PlatformIdModel(PropertyValueModel<JpaProject> jpaProjectModel) {
+ super(jpaProjectModel);
+ }
+
+ @Override
+ protected String buildValue_() {
+ return JptJpaCorePlugin.getJpaPlatformId(this.subject.getProject());
+ }
+
+ @Override
+ public void setValue_(String newPlatformId) {
+ JptJpaCorePlugin.setJpaPlatformId(this.subject.getProject(), newPlatformId);
+ }
+
+ @Override
+ protected void engageSubject_() {
+ // the platform ID does not change
+ }
+
+ @Override
+ protected void disengageSubject_() {
+ // the platform ID does not change
+ }
+ }
+
+
+ /**
+ * The connections are held by a singleton, so the model can be a singleton
+ * also.
+ */
+ // by default, ExtendedListValueModelWrapper puts a null at the top of the list
+ private static final ListValueModel<String> CONNECTION_CHOICES_MODEL =
+ new ExtendedListValueModelWrapper<String>(
+ new SortedListValueModelAdapter<String>(
+ new ConnectionChoicesModel(),
+ STRING_COMPARATOR
+ )
+ );
+
+ /**
+ * Wrap the connection profile names held by the connection profile
+ * factory singleton.
+ */
+ static class ConnectionChoicesModel
+ extends AbstractCollectionValueModel
+ implements CollectionValueModel<String>
+ {
+ private final ConnectionProfileListener connectionProfileListener;
+
+ ConnectionChoicesModel() {
+ super();
+ this.connectionProfileListener = this.buildConnectionProfileListener();
+ }
+
+ private ConnectionProfileListener buildConnectionProfileListener() {
+ return new ConnectionProfileListener() {
+ public void connectionProfileAdded(String name) {
+ ConnectionChoicesModel.this.collectionChanged();
+ }
+ public void connectionProfileRemoved(String name) {
+ ConnectionChoicesModel.this.collectionChanged();
+ }
+ public void connectionProfileRenamed(String oldName, String newName) {
+ // Ignore this event for now. Connecting a profile actually
+ // throws a connection renamed event, which messes up the
+ // list selection. There shouldn't be a connection renamed
+ // within the scope of this dialog anyhow.
+ // ConnectionChoicesModel.this.collectionChanged();
+ }
+ };
+ }
+
+ void collectionChanged() {
+ this.fireCollectionChanged(CollectionValueModel.VALUES, CollectionTools.collection(this.iterator()));
+ }
+
+ public Iterator<String> iterator() {
+ return this.getConnectionProfileFactory().getConnectionProfileNames().iterator();
+ }
+
+ public int size() {
+ return CollectionTools.size(this.iterator());
+ }
+
+ @Override
+ protected void engageModel() {
+ this.getConnectionProfileFactory().addConnectionProfileListener(this.connectionProfileListener);
+ }
+
+ @Override
+ protected void disengageModel() {
+ this.getConnectionProfileFactory().removeConnectionProfileListener(this.connectionProfileListener);
+ }
+
+ private ConnectionProfileFactory getConnectionProfileFactory() {
+ return JptJpaDbPlugin.getConnectionProfileFactory();
+ }
+ }
+
+
+ /**
+ * Adapt whether the JPA project has a user override specified
+ * (either catalog or schema);
+ */
+ abstract static class UserOverrideDefaultFlagModel
+ extends PropertyAspectAdapter<JpaProject, Boolean>
+ {
+ UserOverrideDefaultFlagModel(PropertyValueModel<JpaProject> jpaProjectModel, String propertyName) {
+ super(jpaProjectModel, propertyName);
+ }
+
+ @Override
+ protected Boolean buildValue_() {
+ return Boolean.valueOf(this.specifiesUserOverrideDefault());
+ }
+
+ boolean specifiesUserOverrideDefault() {
+ return ! StringTools.stringIsEmpty(this.getUserOverrideDefault());
+ }
+
+ abstract String getUserOverrideDefault();
+
+ @Override
+ protected void setValue_(Boolean value) {
+ // ignore
+ }
+ }
+
+
+ /**
+ * Whether the JPA project has a user override default catalog specified.
+ */
+ static class UserOverrideDefaultCatalogFlagModel
+ extends UserOverrideDefaultFlagModel
+ {
+ UserOverrideDefaultCatalogFlagModel(PropertyValueModel<JpaProject> jpaProjectModel) {
+ super(jpaProjectModel, JpaProject.USER_OVERRIDE_DEFAULT_CATALOG_PROPERTY);
+ }
+ @Override
+ public String getUserOverrideDefault() {
+ return this.subject.getUserOverrideDefaultCatalog();
+ }
+ }
+
+
+ /**
+ * Whether the JPA project has a user override default schema specified.
+ */
+ static class UserOverrideDefaultSchemaFlagModel
+ extends UserOverrideDefaultFlagModel
+ {
+ UserOverrideDefaultSchemaFlagModel(PropertyValueModel<JpaProject> jpaProjectModel) {
+ super(jpaProjectModel, JpaProject.USER_OVERRIDE_DEFAULT_SCHEMA_PROPERTY);
+ }
+ @Override
+ public String getUserOverrideDefault() {
+ return this.subject.getUserOverrideDefaultSchema();
+ }
+ }
+
+
+ /**
+ * The JPA project's user override default catalog
+ */
+ static class UserOverrideDefaultCatalogModel
+ extends PropertyAspectAdapter<JpaProject, String>
+ {
+ UserOverrideDefaultCatalogModel(PropertyValueModel<JpaProject> jpaProjectModel) {
+ super(jpaProjectModel, JpaProject.USER_OVERRIDE_DEFAULT_CATALOG_PROPERTY);
+ }
+
+ @Override
+ protected String buildValue_() {
+ return this.subject.getUserOverrideDefaultCatalog();
+ }
+
+ @Override
+ public void setValue_(String catalog) {
+ this.subject.setUserOverrideDefaultCatalog(catalog);
+ }
+ }
+
+
+ /**
+ * The JPA project's user override default catalog
+ */
+ static class UserOverrideDefaultSchemaModel
+ extends PropertyAspectAdapter<JpaProject, String>
+ {
+ UserOverrideDefaultSchemaModel(PropertyValueModel<JpaProject> jpaProjectModel) {
+ super(jpaProjectModel, JpaProject.USER_OVERRIDE_DEFAULT_SCHEMA_PROPERTY);
+ }
+
+ @Override
+ protected String buildValue_() {
+ return this.subject.getUserOverrideDefaultSchema();
+ }
+
+ @Override
+ public void setValue_(String schema) {
+ this.subject.setUserOverrideDefaultSchema(schema);
+ }
+ }
+
+
+ /**
+ * Flag on the JPA project indicating whether it should discover annotated
+ * classes
+ */
+ static class DiscoverAnnotatedClassesModel
+ extends PropertyAspectAdapter<JpaProject, Boolean>
+ {
+ DiscoverAnnotatedClassesModel(PropertyValueModel<JpaProject> jpaProjectModel) {
+ super(jpaProjectModel, JpaProject.DISCOVERS_ANNOTATED_CLASSES_PROPERTY);
+ }
+
+ @Override
+ protected Boolean buildValue_() {
+ return Boolean.valueOf(this.subject.discoversAnnotatedClasses());
+ }
+
+ @Override
+ protected void setValue_(Boolean value) {
+ this.subject.setDiscoversAnnotatedClasses(value.booleanValue());
+ }
+ }
+
+ /**
+ * The folder where the source for the generated Canonical Metamodel
+ * is written.
+ */
+ static class MetamodelSourceFolderModel
+ extends PropertyAspectAdapter<JpaProject, String>
+ {
+ MetamodelSourceFolderModel(PropertyValueModel<JpaProject> jpaProjectModel) {
+ super(jpaProjectModel, JpaProject2_0.METAMODEL_SOURCE_FOLDER_NAME_PROPERTY);
+ }
+
+ @Override
+ protected String buildValue_() {
+ return jpaProjectIsJpa2_0() ? ((JpaProject2_0) this.subject).getMetamodelSourceFolderName() : null;
+ }
+
+ @Override
+ protected void setValue_(String value) {
+ if (this.jpaProjectIsJpa2_0()) {
+ ((JpaProject2_0) this.subject).setMetamodelSourceFolderName(value);
+ }
+ }
+
+ private boolean jpaProjectIsJpa2_0() {
+ return JptJpaCorePlugin.nodeIsJpa2_0Compatible(this.subject);
+ }
+ }
+
+
+ /**
+ * Java project source folders.
+ * We keep the metamodel source folder in synch with the Java source folders
+ * (i.e. if a Java source folder is deleted or removed from the build path,
+ * we remove the metamodel source folder); therefore the list of folder
+ * choices does not need to be augmented with the current folder (as we do
+ * when the current folder is not in the list of choices).
+ */
+ static class JavaSourceFolderChoicesModel
+ extends AspectCollectionValueModelAdapter<JpaProject, String>
+ {
+ private final IElementChangedListener javaElementChangedListener;
+
+ JavaSourceFolderChoicesModel(PropertyValueModel<JpaProject> jpaProjectModel) {
+ super(jpaProjectModel);
+ this.javaElementChangedListener = this.buildJavaElementChangedListener();
+ }
+
+ private IElementChangedListener buildJavaElementChangedListener() {
+ return new IElementChangedListener() {
+ public void elementChanged(ElementChangedEvent event) {
+ JavaSourceFolderChoicesModel.this.processJavaDelta(event.getDelta());
+ }
+ };
+ }
+
+ void processJavaDelta(IJavaElementDelta delta) {
+ switch (delta.getElement().getElementType()) {
+ case IJavaElement.JAVA_MODEL :
+ this.processJavaDeltaChildren(delta);
+ break;
+ case IJavaElement.JAVA_PROJECT :
+ this.processJavaProjectDelta(delta);
+ break;
+ default :
+ break; // ignore everything else
+ }
+ }
+
+ private void processJavaDeltaChildren(IJavaElementDelta delta) {
+ for (IJavaElementDelta child : delta.getAffectedChildren()) {
+ this.processJavaDelta(child); // recurse
+ }
+ }
+
+ private void processJavaProjectDelta(IJavaElementDelta delta) {
+ IJavaProject javaProject = (IJavaProject) delta.getElement();
+ if (javaProject.equals(this.subject.getJavaProject()) && this.classpathHasChanged(delta)) {
+ this.fireCollectionChanged(CollectionValueModel.VALUES, CollectionTools.collection(this.iterator()));
+ }
+ }
+
+ private boolean classpathHasChanged(IJavaElementDelta delta) {
+ return this.deltaFlagIsSet(delta, IJavaElementDelta.F_RESOLVED_CLASSPATH_CHANGED);
+ }
+
+ private boolean deltaFlagIsSet(IJavaElementDelta delta, int flag) {
+ return (delta.getKind() == IJavaElementDelta.CHANGED) &&
+ BitTools.flagIsSet(delta.getFlags(), flag);
+ }
+
+ @Override
+ protected Iterable<String> getIterable() {
+ return this.jpaProjectIsJpa2_0() ?
+ ((JpaProject2_0) this.subject).getJavaSourceFolderNames() :
+ EmptyIterable.<String>instance();
+ }
+
+ private boolean jpaProjectIsJpa2_0() {
+ return JptJpaCorePlugin.nodeIsJpa2_0Compatible(this.subject);
+ }
+
+ @Override
+ protected void engageSubject_() {
+ JavaCore.addElementChangedListener(this.javaElementChangedListener);
+ }
+
+ @Override
+ protected void disengageSubject_() {
+ JavaCore.removeElementChangedListener(this.javaElementChangedListener);
+ }
+ }
+
+
+ /**
+ * Abstract property aspect adapter for DTP connection profile connection/database
+ */
+ abstract static class ConnectionProfilePropertyAspectAdapter<V>
+ extends AspectPropertyValueModelAdapter<ConnectionProfile, V>
+ {
+ private final ConnectionListener connectionListener;
+
+ ConnectionProfilePropertyAspectAdapter(PropertyValueModel<ConnectionProfile> connectionProfileModel) {
+ super(connectionProfileModel);
+ this.connectionListener = this.buildConnectionListener();
+ }
+
+ // the connection opening is probably the only thing that will happen...
+ private ConnectionListener buildConnectionListener() {
+ return new ConnectionAdapter() {
+ @Override
+ public void opened(ConnectionProfile profile) {
+ ConnectionProfilePropertyAspectAdapter.this.connectionOpened(profile);
+ }
+ };
+ }
+
+ void connectionOpened(ConnectionProfile profile) {
+ if (profile.equals(this.subject)) {
+ this.propertyChanged();
+ }
+ }
+
+ @Override
+ protected void engageSubject_() {
+ this.subject.addConnectionListener(this.connectionListener);
+ }
+
+ @Override
+ protected void disengageSubject_() {
+ this.subject.removeConnectionListener(this.connectionListener);
+ }
+ }
+
+
+ /**
+ * Monitor the connection profile's connection to the database
+ * (used to enable the "Connect" link)
+ */
+ static class DisconnectedModel
+ extends ConnectionProfilePropertyAspectAdapter<Boolean>
+ {
+ DisconnectedModel(PropertyValueModel<ConnectionProfile> connectionProfileModel) {
+ super(connectionProfileModel);
+ }
+
+ @Override
+ protected Boolean buildValue_() {
+ return Boolean.valueOf((this.subject != null) && this.subject.isDisconnected());
+ }
+ }
+
+
+ /**
+ * Database-determined default catalog
+ */
+ static class DatabaseDefaultCatalogModel
+ extends ConnectionProfilePropertyAspectAdapter<String>
+ {
+ DatabaseDefaultCatalogModel(PropertyValueModel<ConnectionProfile> connectionProfileModel) {
+ super(connectionProfileModel);
+ }
+
+ @Override
+ protected String buildValue_() {
+ Database db = this.subject.getDatabase();
+ return (db == null) ? null : db.getDefaultCatalogIdentifier();
+ }
+ }
+
+
+ /**
+ * The default schema is not derived purely from the database; it is also dependent
+ * on the current value of the default catalog (which may be overridden
+ * by the user).
+ */
+ static class DatabaseDefaultSchemaModel
+ extends ConnectionProfilePropertyAspectAdapter<String>
+ {
+ private final PropertyValueModel<String> defaultCatalogModel;
+ private final PropertyChangeListener catalogListener;
+
+ DatabaseDefaultSchemaModel(
+ PropertyValueModel<ConnectionProfile> connectionProfileModel,
+ PropertyValueModel<String> defaultCatalogModel
+ ) {
+ super(connectionProfileModel);
+ this.defaultCatalogModel = defaultCatalogModel;
+ this.catalogListener = this.buildCatalogListener();
+ }
+
+ private PropertyChangeListener buildCatalogListener() {
+ return new PropertyChangeListener() {
+ public void propertyChanged(PropertyChangeEvent event) {
+ DatabaseDefaultSchemaModel.this.catalogChanged();
+ }
+ };
+ }
+
+ void catalogChanged() {
+ this.propertyChanged();
+ }
+
+ @Override
+ protected void engageSubject_() {
+ super.engageSubject_();
+ this.defaultCatalogModel.addPropertyChangeListener(PropertyValueModel.VALUE, this.catalogListener);
+ }
+
+ @Override
+ protected void disengageSubject_() {
+ this.defaultCatalogModel.removePropertyChangeListener(PropertyValueModel.VALUE, this.catalogListener);
+ super.disengageSubject_();
+ }
+
+ @Override
+ protected String buildValue_() {
+ SchemaContainer sc = this.getSchemaContainer();
+ return (sc == null) ? null : sc.getDefaultSchemaIdentifier();
+ }
+
+ private SchemaContainer getSchemaContainer() {
+ return this.databaseSupportsCatalogs() ? this.getCatalog() : this.getDatabase();
+ }
+
+ private boolean databaseSupportsCatalogs() {
+ Database db = this.getDatabase();
+ return (db != null) && db.supportsCatalogs();
+ }
+
+ private Catalog getCatalog() {
+ String name = this.defaultCatalogModel.getValue();
+ // if we get here we know the database is not null
+ return (name == null) ? null : this.getDatabase().getCatalogForIdentifier(name);
+ }
+
+ private Database getDatabase() {
+ return this.subject.getDatabase();
+ }
+ }
+
+
+ /**
+ * Abstract collection aspect adapter for DTP connection profile connection/database
+ */
+ abstract static class ConnectionProfileCollectionAspectAdapter<E>
+ extends AspectCollectionValueModelAdapter<ConnectionProfile, E>
+ {
+ private final ConnectionListener connectionListener;
+
+ ConnectionProfileCollectionAspectAdapter(PropertyValueModel<ConnectionProfile> connectionProfileModel) {
+ super(connectionProfileModel);
+ this.connectionListener = this.buildConnectionListener();
+ }
+
+ // the connection opening is probably the only thing that will happen...
+ private ConnectionListener buildConnectionListener() {
+ return new ConnectionAdapter() {
+ @Override
+ public void opened(ConnectionProfile profile) {
+ ConnectionProfileCollectionAspectAdapter.this.connectionOpened(profile);
+ }
+ };
+ }
+
+ void connectionOpened(ConnectionProfile profile) {
+ if (profile.equals(this.subject)) {
+ this.collectionChanged();
+ }
+ }
+
+ @Override
+ protected void engageSubject_() {
+ this.subject.addConnectionListener(this.connectionListener);
+ }
+
+ @Override
+ protected void disengageSubject_() {
+ this.subject.removeConnectionListener(this.connectionListener);
+ }
+ }
+
+
+ /**
+ * Catalogs on the database.
+ */
+ static class DatabaseCatalogChoicesModel
+ extends ConnectionProfileCollectionAspectAdapter<String>
+ {
+ DatabaseCatalogChoicesModel(PropertyValueModel<ConnectionProfile> connectionProfileModel) {
+ super(connectionProfileModel);
+ }
+
+ @Override
+ protected Iterable<String> getIterable() {
+ Database db = this.subject.getDatabase();
+ // use catalog *identifiers* since the string ends up being the "default" for various text entries
+ return (db != null) ? db.getSortedCatalogIdentifiers() : EmptyIterable.<String>instance();
+ }
+ }
+
+
+ /**
+ * Schemas on the database or catalog.
+ * This list is not derived purely from the database; it is also dependent
+ * on the current value of the default catalog (which may be overridden
+ * by the user).
+ */
+ static class DatabaseSchemaChoicesModel
+ extends ConnectionProfileCollectionAspectAdapter<String>
+ {
+ private final PropertyValueModel<String> defaultCatalogModel;
+ private final PropertyChangeListener catalogListener;
+
+ DatabaseSchemaChoicesModel(
+ PropertyValueModel<ConnectionProfile> connectionProfileModel,
+ PropertyValueModel<String> defaultCatalogModel
+ ) {
+ super(connectionProfileModel);
+ this.defaultCatalogModel = defaultCatalogModel;
+ this.catalogListener = this.buildCatalogListener();
+ }
+
+ private PropertyChangeListener buildCatalogListener() {
+ return new PropertyChangeListener() {
+ public void propertyChanged(PropertyChangeEvent event) {
+ DatabaseSchemaChoicesModel.this.catalogChanged();
+ }
+ };
+ }
+
+ void catalogChanged() {
+ this.collectionChanged();
+ }
+
+ @Override
+ protected void engageSubject_() {
+ super.engageSubject_();
+ this.defaultCatalogModel.addPropertyChangeListener(PropertyValueModel.VALUE, this.catalogListener);
+ }
+
+ @Override
+ protected void disengageSubject_() {
+ this.defaultCatalogModel.removePropertyChangeListener(PropertyValueModel.VALUE, this.catalogListener);
+ super.disengageSubject_();
+ }
+
+ @Override
+ protected Iterable<String> getIterable() {
+ SchemaContainer sc = this.getSchemaContainer();
+ // use schema *identifiers* since the string ends up being the "default" for various text entries
+ return (sc != null) ? sc.getSortedSchemaIdentifiers() : EmptyIterable.<String>instance();
+ }
+
+ private SchemaContainer getSchemaContainer() {
+ return this.databaseSupportsCatalogs() ? this.getCatalog() : this.getDatabase();
+ }
+
+ private boolean databaseSupportsCatalogs() {
+ Database db = this.getDatabase();
+ return (db != null) && db.supportsCatalogs();
+ }
+
+ private Catalog getCatalog() {
+ String name = this.defaultCatalogModel.getValue();
+ // if we get here we know the database is not null
+ return (name == null) ? null : this.getDatabase().getCatalogForIdentifier(name);
+ }
+
+ private Database getDatabase() {
+ return this.subject.getDatabase();
+ }
+ }
+
+ /**
+ * Combine various models to determine the default catalog or schema.
+ * If the user has checked the "Override Default" check-box, the default
+ * is the JPA project's user override default, otherwise the default is
+ * determined by the database.
+ */
+ static class DefaultModel
+ extends CompositePropertyValueModel<String>
+ implements WritablePropertyValueModel<String>
+ {
+ private final PropertyValueModel<Boolean> userOverrideDefaultFlagModel;
+ private final WritablePropertyValueModel<String> userOverrideDefaultModel;
+ private final PropertyValueModel<String> databaseDefaultModel;
+
+ DefaultModel(
+ PropertyValueModel<Boolean> userOverrideDefaultFlagModel,
+ WritablePropertyValueModel<String> userOverrideDefaultModel,
+ PropertyValueModel<String> databaseDefaultModel
+ ) {
+ super(userOverrideDefaultFlagModel, userOverrideDefaultModel, databaseDefaultModel);
+ this.userOverrideDefaultFlagModel = userOverrideDefaultFlagModel;
+ this.userOverrideDefaultModel = userOverrideDefaultModel;
+ this.databaseDefaultModel = databaseDefaultModel;
+ }
+
+ /**
+ * If the checkbox has been unchecked, we need to clear out the JPA
+ * project's user override.
+ */
+ @Override
+ protected void propertyChanged(PropertyChangeEvent event) {
+ super.propertyChanged(event);
+ if (event.getSource() == this.userOverrideDefaultFlagModel) {
+ if ( ! this.userOverrideDefaultFlagIsSet()) {
+ this.userOverrideDefaultModel.setValue(null);
+ }
+ }
+ }
+
+ /**
+ * If the checkbox is checked, return the user override from the JPA project;
+ * otherwise return the default from the database
+ */
+ @Override
+ protected String buildValue() {
+ return this.userOverrideDefaultFlagIsSet() ?
+ this.userOverrideDefaultModel.getValue() :
+ this.databaseDefaultModel.getValue();
+ }
+
+ /**
+ * This will be called when the user makes a selection from the
+ * drop-down; which is only possible when the checkbox is checked
+ * (and the drop-down is enabled).
+ */
+ public void setValue(String value) {
+ this.userOverrideDefaultModel.setValue(value);
+ this.propertyChanged();
+ }
+
+ private boolean userOverrideDefaultFlagIsSet() {
+ return flagIsSet(this.userOverrideDefaultFlagModel);
+ }
+
+ @Override
+ public void toString(StringBuilder sb) {
+ sb.append(this.getValue());
+ }
+ }
+
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/selection/DefaultJpaSelection.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/selection/DefaultJpaSelection.java
new file mode 100644
index 0000000000..20b5e9c322
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/selection/DefaultJpaSelection.java
@@ -0,0 +1,60 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 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.jpa.ui.internal.selection;
+
+import org.eclipse.jpt.jpa.core.JpaStructureNode;
+
+/**
+ * Straightforward implementation of the JpaSelection interface.
+ */
+public class DefaultJpaSelection
+ implements JpaSelection
+{
+ private final JpaStructureNode selectedNode;
+
+
+ public DefaultJpaSelection(JpaStructureNode selectedNode) {
+ super();
+ if (selectedNode == null) {
+ throw new NullPointerException("A 'selectedNode' is required; otherwise use NULL_SELECTION.");
+ }
+ this.selectedNode = selectedNode;
+ }
+
+ public JpaStructureNode getSelectedNode() {
+ return this.selectedNode;
+ }
+
+ public boolean isEmpty() {
+ // by definition, this selection is never empty
+ // use IJpaSelection.NULL_SELECTION for empty selections
+ return false;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (! (obj instanceof JpaSelection)) {
+ return false;
+ }
+ JpaSelection other = (JpaSelection) obj;
+ return ( ! other.isEmpty()) && this.selectedNode.equals(other.getSelectedNode());
+ }
+
+ @Override
+ public int hashCode() {
+ return this.selectedNode.hashCode();
+ }
+
+ @Override
+ public String toString() {
+ return this.selectedNode.toString();
+ }
+
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/selection/DefaultJpaSelectionManager.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/selection/DefaultJpaSelectionManager.java
new file mode 100644
index 0000000000..8538d64fa7
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/selection/DefaultJpaSelectionManager.java
@@ -0,0 +1,288 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2009 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.ui.internal.selection;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Set;
+import org.eclipse.jpt.common.utility.internal.iterators.CloneIterator;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IPageListener;
+import org.eclipse.ui.IPartListener2;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.IWorkbenchPartReference;
+import org.eclipse.ui.IWorkbenchWindow;
+
+/**
+ * A {@link JpaSelectionManager} stores the current {@link JpaSelection} and
+ * notifies <code>ISelectionListener</code>s when the selection changes.
+ */
+public class DefaultJpaSelectionManager
+ implements JpaSelectionManager
+{
+ /* The window for which this object manages selections */
+ private IWorkbenchWindow window;
+
+ /* The set of pages for which this object is managing selections */
+ private Set<IWorkbenchPage> pages;
+
+ /* The active editor part */
+ private IEditorPart activeEditor;
+
+ private JpaSelection currentSelection;
+
+ /* The map of <code>IJpaSelectionParticipant</code>s (keyed by part) */
+ private Map<IWorkbenchPart, JpaSelectionParticipant> selectionParticipants;
+
+ private IPageListener pageListener;
+
+ private IPartListener2 partListener;
+
+
+ public DefaultJpaSelectionManager() {
+ super();
+ pages = Collections.synchronizedSet(new HashSet<IWorkbenchPage>());
+ selectionParticipants = Collections.synchronizedMap(new HashMap<IWorkbenchPart, JpaSelectionParticipant>());
+ pageListener = new PageListener();
+ partListener = new PartListener();
+ currentSelection = DefaultJpaSelection.NULL_SELECTION;
+ }
+
+ void init(IWorkbenchWindow aWindow) {
+ window = aWindow;
+ aWindow.addPageListener(pageListener);
+ initPage(aWindow.getActivePage());
+ }
+
+ private void initPage(IWorkbenchPage page) {
+ if ((page != null) && (! pages.contains(page))) {
+ page.addPartListener(partListener);
+ pages.add(page);
+ activateEditor(page.getActiveEditor());
+ }
+ }
+
+ private void disposePage(IWorkbenchPage page) {
+ if ((page != null) && (pages.contains(page))) {
+ page.removePartListener(partListener);
+ pages.remove(page);
+ }
+ }
+
+ private void activateEditor(IEditorPart editor) {
+ if (editor == activeEditor) {
+ return;
+ }
+ if (activeEditor != null) {
+ inactivateEditor(activeEditor);
+ }
+ initPart(editor);
+ activeEditor = editor;
+ selectEditor(activeEditor);
+ }
+
+ private void inactivateEditor(IEditorPart editor) {
+
+ }
+
+ void initPart(IWorkbenchPart part) {
+ if (part != null) {
+ if (selectionParticipants.get(part) == null) {
+ JpaSelectionParticipant selectionParticipant =
+ (JpaSelectionParticipant) part.getAdapter(JpaSelectionParticipant.class);
+ if (selectionParticipant != null) {
+ selectionParticipants.put(part, selectionParticipant);
+ }
+ }
+ }
+ }
+
+ private void selectEditor(IEditorPart editor) {
+ selectPart(editor);
+ }
+
+ void selectPart(IWorkbenchPart part) {
+ JpaSelectionParticipant selectionParticipant = getSelectionParticipant(part);
+ if (selectionParticipant != null) {
+ select(selectionParticipant.getSelection(), selectionParticipant);
+ }
+ }
+
+ void hidePart(IWorkbenchPart part) {
+ JpaSelectionParticipant selectionParticipant = getSelectionParticipant(part);
+ if ((selectionParticipant != null) && (selectionParticipant.disposeOnHide())) {
+ closePart(part);
+ }
+ }
+
+ void closePart(IWorkbenchPart part) {
+ JpaSelectionParticipant selectionParticipant = getSelectionParticipant(part);
+ if (selectionParticipant != null) {
+ disposePart(part);
+ checkForNoEditors();
+ }
+ }
+
+ void disposePart(IWorkbenchPart part) {
+ if ((part != null) && (selectionParticipants.containsKey(part))) {
+ selectionParticipants.remove(part).dispose();
+ }
+ }
+
+ void checkForNoEditors() {
+ IWorkbenchPage activePage = window.getActivePage();
+ if ((activePage == null)
+ || (activePage.getEditorReferences().length == 0)) {
+ select(DefaultJpaSelection.NULL_SELECTION, null);
+ }
+ }
+
+ public void register(IWorkbenchPart part) {
+ initPart(part);
+ }
+
+ public boolean isRegistered(IWorkbenchPart part) {
+ return selectionParticipants.get(part) != null;
+ }
+
+ public void select(JpaSelection newSelection, JpaSelectionParticipant source) {
+ if (currentSelection.equals(newSelection)) {
+ return;
+ }
+
+ currentSelection = newSelection;
+ Object nonNullSource = (source == null) ? this : source;
+ fireSelectionChange(
+ new JpaSelectionEvent(newSelection, JpaSelectionEvent.SELECTION, nonNullSource)
+ );
+ }
+
+ public void deselect(JpaSelection oldSelection, JpaSelectionParticipant source) {
+ if (currentSelection.equals(oldSelection)) {
+ currentSelection = DefaultJpaSelection.NULL_SELECTION;
+ Object nonNullSource = (source == null) ? this : source;
+ fireSelectionChange(
+ new JpaSelectionEvent(oldSelection, JpaSelectionEvent.DESELECTION, nonNullSource)
+ );
+ }
+ }
+
+ private void fireSelectionChange(JpaSelectionEvent event) {
+ for (JpaSelectionParticipant sp : selectionParticipants.values()) {
+ sp.selectionChanged(event);
+ }
+ }
+
+ private JpaSelectionParticipant getSelectionParticipant(IWorkbenchPart part) {
+ return selectionParticipants.get(part);
+ }
+
+ public JpaSelection getCurrentSelection() {
+ return currentSelection;
+ }
+
+ public void dispose() {
+ window.removePageListener(pageListener);
+ selectionParticipants.clear();
+
+ for (Iterator<IWorkbenchPage> stream = new CloneIterator<IWorkbenchPage>(this.pages); stream.hasNext(); ) {
+ this.disposePage(stream.next());
+ }
+
+ for (Iterator<IWorkbenchPart> stream = new CloneIterator<IWorkbenchPart>(selectionParticipants.keySet()); stream.hasNext(); ) {
+ this.disposePart(stream.next());
+ }
+ }
+
+
+ private class PageListener implements IPageListener
+ {
+ public void pageActivated(IWorkbenchPage page) {
+ // nop
+ }
+
+ PageListener() {
+ super();
+ }
+
+ public void pageClosed(IWorkbenchPage page) {
+ DefaultJpaSelectionManager.this.disposePage(page);
+ }
+
+ public void pageOpened(IWorkbenchPage page) {
+ DefaultJpaSelectionManager.this.initPage(page);
+ }
+ }
+
+
+ private class PartListener implements IPartListener2
+ {
+ PartListener() {
+ super();
+ }
+
+ public void partActivated(IWorkbenchPartReference partRef) {
+ IWorkbenchPart part = partRef.getPart(false);
+ if (part != null) {
+ DefaultJpaSelectionManager.this.initPart(part);
+ DefaultJpaSelectionManager.this.selectPart(part);
+ }
+ }
+
+ public void partBroughtToTop(IWorkbenchPartReference partRef) {
+ IWorkbenchPart part = partRef.getPart(false);
+ if (part != null) {
+ initPart(part);
+ }
+ }
+
+ public void partClosed(IWorkbenchPartReference partRef) {
+ IWorkbenchPart part = partRef.getPart(false);
+ if (part != null) {
+ DefaultJpaSelectionManager.this.closePart(part);
+ DefaultJpaSelectionManager.this.disposePart(part);
+ DefaultJpaSelectionManager.this.checkForNoEditors();
+ }
+ }
+
+ public void partDeactivated(IWorkbenchPartReference partRef) {
+ // nop
+ }
+
+ public void partHidden(IWorkbenchPartReference partRef) {
+ IWorkbenchPart part = partRef.getPart(false);
+ if (part != null) {
+ DefaultJpaSelectionManager.this.hidePart(part);
+ }
+ }
+
+ public void partInputChanged(IWorkbenchPartReference partRef) {
+ // nop
+ }
+
+ public void partOpened(IWorkbenchPartReference partRef) {
+ IWorkbenchPart part = partRef.getPart(false);
+ if (part != null) {
+ initPart(part);
+ }
+ }
+
+ public void partVisible(IWorkbenchPartReference partRef) {
+ IWorkbenchPart part = partRef.getPart(false);
+ if (part != null) {
+ initPart(part);
+ }
+ }
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/selection/JpaDetailsSelectionParticipant.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/selection/JpaDetailsSelectionParticipant.java
new file mode 100644
index 0000000000..7ac9003d2c
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/selection/JpaDetailsSelectionParticipant.java
@@ -0,0 +1,42 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 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.jpa.ui.internal.selection;
+
+import org.eclipse.jpt.jpa.ui.internal.views.JpaDetailsView;
+
+
+public class JpaDetailsSelectionParticipant
+ implements JpaSelectionParticipant
+{
+ private final JpaDetailsView detailsView;
+
+
+ public JpaDetailsSelectionParticipant(JpaDetailsView detailsView) {
+ super();
+ this.detailsView = detailsView;
+ }
+
+ public JpaSelection getSelection() {
+ return this.detailsView.getSelection();
+ }
+
+ public void selectionChanged(JpaSelectionEvent evt) {
+ this.detailsView.select(evt.getSelection());
+ }
+
+ public boolean disposeOnHide() {
+ return false;
+ }
+
+ public void dispose() {
+ // NOP
+ }
+
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/selection/JpaSelection.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/selection/JpaSelection.java
new file mode 100644
index 0000000000..667ead1c58
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/selection/JpaSelection.java
@@ -0,0 +1,37 @@
+/*******************************************************************************
+ * 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.jpa.ui.internal.selection;
+
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jpt.jpa.core.JpaStructureNode;
+
+@SuppressWarnings("nls")
+public interface JpaSelection extends ISelection
+{
+ static JpaSelection NULL_SELECTION =
+ new JpaSelection() {
+ public JpaStructureNode getSelectedNode() {
+ return null;
+ }
+
+ public boolean isEmpty() {
+ return true;
+ }
+
+ @Override
+ public String toString() {
+ return "NULL SELECTION";
+ }
+ };
+
+
+ JpaStructureNode getSelectedNode();
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/selection/JpaSelectionEvent.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/selection/JpaSelectionEvent.java
new file mode 100644
index 0000000000..81e4aac5b9
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/selection/JpaSelectionEvent.java
@@ -0,0 +1,64 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 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.jpa.ui.internal.selection;
+
+import java.util.EventObject;
+
+public class JpaSelectionEvent extends EventObject
+{
+ /**
+ * Serializable uid
+ * @since 0.5
+ */
+ private static final long serialVersionUID = 1L;
+
+
+ /**
+ * Indicates that the selection object is now selected
+ */
+ public static int SELECTION = 1;
+
+ /**
+ * Indicates that the selection object has now been deselected
+ */
+ public static int DESELECTION = 2;
+
+
+ /**
+ * The selection object whose selection status has changed
+ */
+ private JpaSelection selection;
+
+ /**
+ * The type of the selection event, either a SELECTION or a DESELECTION
+ */
+ private int type;
+
+
+ public JpaSelectionEvent(JpaSelection theSelection, int theType, Object source) {
+ super(source);
+ selection = theSelection;
+ type = theType;
+ }
+
+ /**
+ * Return the selection object whose selection status has changed
+ */
+ public JpaSelection getSelection() {
+ return selection;
+ }
+
+ /**
+ * Return the type of selection event, either a SELECTION or a DESELECTION
+ */
+ public int getType() {
+ return type;
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/selection/JpaSelectionManager.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/selection/JpaSelectionManager.java
new file mode 100644
index 0000000000..daa17b7801
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/selection/JpaSelectionManager.java
@@ -0,0 +1,57 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 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.jpa.ui.internal.selection;
+
+import org.eclipse.ui.IWorkbenchPart;
+
+public interface JpaSelectionManager
+{
+ /**
+ * Return the current selection.
+ * This will never be null, but it may be empty.
+ */
+ public JpaSelection getCurrentSelection();
+
+ /**
+ * Not to be called lightly, this will affect the selection for all interested
+ * objects in a window.
+ * @param newSelection The new selection for the current window.
+ * @param source The selection participant (if any) that is causing the
+ * selection. May be null.
+ */
+ public void select(JpaSelection newSelection, JpaSelectionParticipant source);
+
+ /**
+ * Not to be called lightly, this will affect the selection for all interested
+ * objects in a window.
+ * @param oldSelection The oldSelection will be deselected, iff it matches
+ * the current selection. If so, the new selection will be an empty JpaSelection.
+ * @param source The selection participant (if any) that is causing the
+ * selection. May be null.
+ */
+ public void deselect(JpaSelection oldSelection, JpaSelectionParticipant source);
+
+ /**
+ * This may be used to register a part with the selection manager if the part
+ * is known to need access to the selection manager before it is ever activated
+ * or in the case it may be activated prior to the selection manager being
+ * created.
+ *
+ * It should not be necessary to deregister a part, as that happens when the
+ * part is closed.
+ */
+ public void register(IWorkbenchPart part);
+
+ /**
+ * Returns true if the part is currently registered to respond to selections
+ * from this selection manager
+ */
+ public boolean isRegistered(IWorkbenchPart part);
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/selection/JpaSelectionParticipant.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/selection/JpaSelectionParticipant.java
new file mode 100644
index 0000000000..4145c013ac
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/selection/JpaSelectionParticipant.java
@@ -0,0 +1,38 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 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.jpa.ui.internal.selection;
+
+public interface JpaSelectionParticipant
+{
+ /**
+ * Return the current selection of the participant
+ */
+ JpaSelection getSelection();
+
+ /**
+ * The selection has changed in the central selection manager.
+ * Update this participant accordingly.
+ */
+ void selectionChanged(JpaSelectionEvent evt);
+
+ /**
+ * Return whether this selection participant should disconnect itself from
+ * its part when its part is hidden from view.
+ * <b>Typically</b> editor participants will return true and view participants will
+ * return false.
+ */
+ boolean disposeOnHide();
+
+ /**
+ * This participant is no longer needed (most likely because its part has
+ * closed). Dispose of it.
+ */
+ void dispose();
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/selection/JpaStructureSelectionParticipant.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/selection/JpaStructureSelectionParticipant.java
new file mode 100644
index 0000000000..aded24a836
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/selection/JpaStructureSelectionParticipant.java
@@ -0,0 +1,69 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 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.jpa.ui.internal.selection;
+
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jpt.jpa.ui.internal.views.structure.JpaStructureView;
+
+public class JpaStructureSelectionParticipant
+ implements JpaSelectionParticipant
+{
+ final JpaStructureView structureView;
+
+
+ public JpaStructureSelectionParticipant(JpaSelectionManager selectionManager, JpaStructureView structureView) {
+ super();
+ this.structureView = structureView;
+ structureView.addSelectionChangedListener(new StructureViewSelectionListener(selectionManager, structureView));
+ }
+
+ public JpaSelection getSelection() {
+ return this.structureView.getJpaSelection();
+ }
+
+ public void selectionChanged(JpaSelectionEvent evt) {
+ if (evt.getSource() != this) {
+ this.structureView.select(evt.getSelection());
+ }
+ }
+
+ public boolean disposeOnHide() {
+ return false;
+ }
+
+ public void dispose() {
+ // NOP
+ }
+
+
+ // ********** listener **********
+
+ private class StructureViewSelectionListener
+ implements ISelectionChangedListener
+ {
+ private final JpaSelectionManager selectionManager;
+
+ StructureViewSelectionListener(JpaSelectionManager selectionManager, JpaStructureView structureView) {
+ super();
+ this.selectionManager = selectionManager;
+ }
+
+ public void selectionChanged(SelectionChangedEvent event) {
+ if (structureView.getViewSite().getWorkbenchWindow().getPartService().getActivePart() == structureView) {
+ selectionManager.select(this.structureViewSelection(), JpaStructureSelectionParticipant.this);
+ }
+ }
+
+ private JpaSelection structureViewSelection() {
+ return JpaStructureSelectionParticipant.this.structureView.getJpaSelection();
+ }
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/selection/SelectionManagerFactory.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/selection/SelectionManagerFactory.java
new file mode 100644
index 0000000000..b9bc9b9140
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/selection/SelectionManagerFactory.java
@@ -0,0 +1,105 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2009 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.ui.internal.selection;
+
+import java.util.HashMap;
+import java.util.Map;
+import org.eclipse.ui.IWindowListener;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PlatformUI;
+
+public class SelectionManagerFactory
+{
+ private static volatile SelectionManagerFactory INSTANCE;
+
+ private static Object MUTEX = new Object();
+
+
+ /**
+ * Each <code>IWorkbenchWindow</code> has its own <code>JpaSelectionManager</code>
+ * to track the selection events in the <code>IWorkbenchWindow</code>. All
+ * <code>ISelectionListener</code>s in the same <code>IWorkbenchWindow</code>
+ * share the same <code>JpaSelectionManager</code>.
+ *
+ * @return The <code>JpaSelectionManager</code> associated with the current
+ * <code>IWorkbenchWindow</code>
+ */
+ public static JpaSelectionManager getSelectionManager(IWorkbenchWindow window) {
+ if (INSTANCE == null) {
+ // this is thread safe for now. you never know whats comming
+ synchronized (MUTEX) {
+ if(INSTANCE == null) {
+ INSTANCE = new SelectionManagerFactory();
+ // if we do the init inside the constructor we end up in a loop
+ // because the addWindowListener(this) does a callback to us
+ INSTANCE.init();
+ }
+ }
+ }
+ return INSTANCE.internalGetSelectionManager(window);
+ }
+
+
+ Map<IWorkbenchWindow, DefaultJpaSelectionManager> managers;
+
+ private WindowListener windowListener;
+
+
+ private SelectionManagerFactory() {
+ managers = new HashMap<IWorkbenchWindow, DefaultJpaSelectionManager>();
+ windowListener = new WindowListener();
+ }
+
+ private void init() {
+ IWorkbench workbench = PlatformUI.getWorkbench();
+ workbench.addWindowListener(windowListener);
+ }
+
+ /**
+ * Returns the JpaSelectionManager for the IWorkbenchWindow.
+ * Creates a new one if none exists yet.
+ */
+ DefaultJpaSelectionManager internalGetSelectionManager(IWorkbenchWindow window) {
+ if (window == null) {
+ throw new IllegalArgumentException("The IWorkbenchWindow cannot be null"); //$NON-NLS-1$
+ }
+
+ if (! managers.containsKey(window)) {
+ DefaultJpaSelectionManager manager = new DefaultJpaSelectionManager();
+ this.managers.put(window, manager);
+ manager.init(window);
+ }
+
+ return managers.get(window);
+ }
+
+
+ class WindowListener implements IWindowListener
+ {
+ public void windowOpened(IWorkbenchWindow aWindow) {
+ // do nothing
+ }
+
+ public void windowClosed(IWorkbenchWindow aWindow) {
+ DefaultJpaSelectionManager manager = internalGetSelectionManager(aWindow);
+ manager.dispose();
+ managers.remove(aWindow);
+ }
+
+ public void windowActivated(IWorkbenchWindow aWindow) {
+ // do nothing
+ }
+
+ public void windowDeactivated(IWorkbenchWindow aWindow) {
+ // do nothing
+ }
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/selection/TextEditorSelectionParticipant.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/selection/TextEditorSelectionParticipant.java
new file mode 100644
index 0000000000..dbc24cc8b2
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/selection/TextEditorSelectionParticipant.java
@@ -0,0 +1,215 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 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.jpa.ui.internal.selection;
+
+import org.eclipse.jface.text.ITextSelection;
+import org.eclipse.jface.viewers.IPostSelectionProvider;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jpt.common.core.utility.TextRange;
+import org.eclipse.jpt.jpa.core.JpaFile;
+import org.eclipse.jpt.jpa.core.JpaStructureNode;
+import org.eclipse.jpt.jpa.core.JptJpaCorePlugin;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IFileEditorInput;
+import org.eclipse.ui.IPropertyListener;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.texteditor.ITextEditor;
+
+public class TextEditorSelectionParticipant
+ implements JpaSelectionParticipant
+{
+ private final JpaSelectionManager selectionManager;
+
+ final ITextEditor textEditor;
+
+ private final IPropertyListener editorInputListener;
+
+ private final ISelectionChangedListener editorSelectionListener;
+
+ private JpaSelection currentSelection;
+
+ private boolean forwardSelection = true; // TODO this just smells wrong ~bjv
+
+
+ public TextEditorSelectionParticipant(JpaSelectionManager selectionManager, ITextEditor textEditor) {
+ super();
+ this.selectionManager = selectionManager;
+ this.textEditor = textEditor;
+ this.editorInputListener = new EditorInputListener();
+ this.textEditor.addPropertyListener(this.editorInputListener);
+ this.editorSelectionListener = new EditorSelectionListener();
+ this.getPostSelectionProvider().addPostSelectionChangedListener(this.editorSelectionListener);
+ this.currentSelection = this.calculateSelection();
+ }
+
+ // ********** IJpaSelectionParticipant implementation **********
+
+ public JpaSelection getSelection() {
+ return this.currentSelection;
+ }
+
+ public void selectionChanged(JpaSelectionEvent evt) {
+ JpaSelection newSelection = evt.getSelection();
+
+ if ((newSelection == JpaSelection.NULL_SELECTION)
+ || newSelection.equals(this.currentSelection)) {
+ return;
+ }
+
+ if (getActiveTextEditor() != this.textEditor) {
+ return;
+ }
+
+ this.forwardSelection = false;
+ TextRange textRange = newSelection.getSelectedNode().getSelectionTextRange();
+ if (textRange != null) {
+ this.textEditor.selectAndReveal(textRange.getOffset(), textRange.getLength());
+ this.currentSelection = newSelection;
+ }
+ this.forwardSelection = true;
+ }
+
+ public boolean disposeOnHide() {
+ return true;
+ }
+
+ public void dispose() {
+ this.textEditor.removePropertyListener(this.editorInputListener);
+ this.getPostSelectionProvider().removePostSelectionChangedListener(this.editorSelectionListener);
+ }
+
+
+ // ********** internal methods **********
+
+ protected JpaSelection calculateSelection() {
+ ISelection selection = this.textEditor.getSelectionProvider().getSelection();
+ if (! (selection instanceof ITextSelection)) {
+ return JpaSelection.NULL_SELECTION;
+ }
+
+ JpaFile jpaFile = this.getJpaFile();
+ if (jpaFile == null) {
+ return JpaSelection.NULL_SELECTION;
+ }
+
+ return this.buildSelection(jpaFile.getStructureNode(((ITextSelection) selection).getOffset()));
+ }
+
+ protected JpaSelection buildSelection(JpaStructureNode selectedNode) {
+ return (selectedNode == null) ? JpaSelection.NULL_SELECTION : new DefaultJpaSelection(selectedNode);
+ }
+
+ protected IWorkbenchPage getActivePage() {
+ return this.textEditor.getEditorSite().getWorkbenchWindow().getActivePage();
+ }
+
+ protected IWorkbenchPart getActivePart() {
+ IWorkbenchPage activePage = getActivePage();
+ return (activePage == null) ? null: activePage.getActivePart();
+ }
+
+ protected IEditorPart getActiveEditor() {
+ IWorkbenchPage activePage = getActivePage();
+ return (activePage == null) ? null: activePage.getActiveEditor();
+ }
+
+ protected ITextEditor getActiveTextEditor() {
+ return getTextEditor(getActiveEditor());
+ }
+
+ protected ITextEditor getTextEditor(IWorkbenchPart part) {
+ return (part == null) ? null : (ITextEditor) part.getAdapter(ITextEditor.class);
+ }
+
+ protected JpaFile getJpaFile() {
+ IEditorInput input = this.textEditor.getEditorInput();
+ if ( ! (input instanceof IFileEditorInput)) {
+ return null;
+ }
+ return JptJpaCorePlugin.getJpaFile(((IFileEditorInput) input).getFile());
+ }
+
+ protected IPostSelectionProvider getPostSelectionProvider() {
+ return (IPostSelectionProvider) this.textEditor.getSelectionProvider();
+ }
+
+
+ // ********** listener callbacks **********
+
+ protected void editorInputChanged() {
+ this.selectionChanged();
+ }
+
+ protected void editorSelectionChanged(SelectionChangedEvent event) {
+ // This is a bit kludgey. We check to see if the selection event
+ // occurred when a participating part is active (and so, ostensibly,
+ // *because* of the participating part). If so, we reselect the valid
+ // text.
+ IWorkbenchPart activePart = getActivePart();
+ if (getTextEditor(activePart) != this.textEditor && this.selectionManager.isRegistered(activePart)) {
+ if (this.currentSelection.isEmpty()) {
+ return;
+ }
+
+ this.forwardSelection = false;
+ TextRange textRange = this.currentSelection.getSelectedNode().getSelectionTextRange();
+ if (textRange != null) {
+ this.textEditor.selectAndReveal(textRange.getOffset(), textRange.getLength());
+ }
+ this.forwardSelection = true;
+
+ return;
+ }
+
+ this.selectionChanged();
+ }
+
+ protected void selectionChanged() {
+ JpaSelection newSelection = this.calculateSelection();
+ if (newSelection.equals(this.currentSelection)) {
+ return;
+ }
+ this.currentSelection = newSelection;
+
+ if (this.forwardSelection) {
+ this.selectionManager.select(newSelection, this);
+ }
+ }
+
+
+ // ********** listeners **********
+
+ protected class EditorInputListener implements IPropertyListener {
+ protected EditorInputListener() {
+ super();
+ }
+ public void propertyChanged(Object source, int propId) {
+ if ((source == TextEditorSelectionParticipant.this.textEditor)
+ && (propId == IEditorPart.PROP_INPUT)) {
+ TextEditorSelectionParticipant.this.editorInputChanged();
+ }
+ }
+ }
+
+
+ protected class EditorSelectionListener implements ISelectionChangedListener {
+ protected EditorSelectionListener() {
+ super();
+ }
+ public void selectionChanged(SelectionChangedEvent event) {
+ TextEditorSelectionParticipant.this.editorSelectionChanged(event);
+ }
+ }
+
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/selection/WorkbenchPartAdapterFactory.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/selection/WorkbenchPartAdapterFactory.java
new file mode 100644
index 0000000000..bea07321cd
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/selection/WorkbenchPartAdapterFactory.java
@@ -0,0 +1,61 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2009 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.ui.internal.selection;
+
+import org.eclipse.core.runtime.IAdapterFactory;
+import org.eclipse.jpt.jpa.ui.internal.views.JpaDetailsView;
+import org.eclipse.jpt.jpa.ui.internal.views.structure.JpaStructureView;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.texteditor.ITextEditor;
+
+/**
+ * Factory to build adapters for a workbench part:
+ * - JPA selection participant (if the editor part is a text editor etc.)
+ *
+ * See org.eclipse.jpt.jpa.ui plugin.xml.
+ */
+public class WorkbenchPartAdapterFactory
+ implements IAdapterFactory
+{
+ private static final Class<?>[] ADAPTER_LIST = new Class[] { JpaSelectionParticipant.class };
+
+ public Class<?>[] getAdapterList() {
+ return ADAPTER_LIST;
+ }
+
+ public Object getAdapter(Object adaptableObject, @SuppressWarnings("unchecked") Class adapterType) {
+ if (adaptableObject instanceof IWorkbenchPart) {
+ return this.getAdapter((IWorkbenchPart) adaptableObject, adapterType);
+ }
+ return null;
+ }
+
+ private Object getAdapter(IWorkbenchPart workbenchPart, Class<?> adapterType) {
+ if (adapterType == JpaSelectionParticipant.class) {
+ return this.buildJpaSelectionParticipant(workbenchPart);
+ }
+ return null;
+ }
+
+ private JpaSelectionParticipant buildJpaSelectionParticipant(IWorkbenchPart workbenchPart) {
+ JpaSelectionManager selectionManager = SelectionManagerFactory.getSelectionManager(workbenchPart.getSite().getWorkbenchWindow());
+ if (workbenchPart instanceof ITextEditor) {
+ return new TextEditorSelectionParticipant(selectionManager, (ITextEditor) workbenchPart);
+ }
+ if (workbenchPart instanceof JpaStructureView) {
+ return new JpaStructureSelectionParticipant(selectionManager, (JpaStructureView) workbenchPart);
+ }
+ if (workbenchPart instanceof JpaDetailsView) {
+ return new JpaDetailsSelectionParticipant((JpaDetailsView) workbenchPart);
+ }
+ return null;
+ }
+
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/structure/GeneralJpaMappingItemLabelProviderFactory.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/structure/GeneralJpaMappingItemLabelProviderFactory.java
new file mode 100644
index 0000000000..e18da9c246
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/structure/GeneralJpaMappingItemLabelProviderFactory.java
@@ -0,0 +1,33 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 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.ui.internal.structure;
+
+import org.eclipse.jpt.common.ui.jface.DelegatingContentAndLabelProvider;
+import org.eclipse.jpt.common.ui.jface.ItemLabelProvider;
+import org.eclipse.jpt.common.ui.jface.ItemLabelProviderFactory;
+import org.eclipse.jpt.jpa.core.context.PersistentType;
+import org.eclipse.jpt.jpa.core.context.ReadOnlyPersistentAttribute;
+import org.eclipse.jpt.jpa.ui.internal.platform.generic.PersistentAttributeItemLabelProvider;
+import org.eclipse.jpt.jpa.ui.internal.platform.generic.PersistentTypeItemLabelProvider;
+
+public abstract class GeneralJpaMappingItemLabelProviderFactory
+ implements ItemLabelProviderFactory
+{
+ public ItemLabelProvider buildItemLabelProvider(
+ Object item, DelegatingContentAndLabelProvider labelProvider) {
+ if (item instanceof PersistentType) {
+ return new PersistentTypeItemLabelProvider((PersistentType) item, labelProvider);
+ }
+ if (item instanceof ReadOnlyPersistentAttribute) {
+ return new PersistentAttributeItemLabelProvider((ReadOnlyPersistentAttribute) item, labelProvider);
+ }
+ return null;
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/structure/JavaItemContentProviderFactory.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/structure/JavaItemContentProviderFactory.java
new file mode 100644
index 0000000000..c9d19d7812
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/structure/JavaItemContentProviderFactory.java
@@ -0,0 +1,39 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 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.ui.internal.structure;
+
+import org.eclipse.jpt.common.ui.internal.jface.DelegatingTreeContentAndLabelProvider;
+import org.eclipse.jpt.common.ui.jface.DelegatingContentAndLabelProvider;
+import org.eclipse.jpt.common.ui.jface.TreeItemContentProvider;
+import org.eclipse.jpt.common.ui.jface.TreeItemContentProviderFactory;
+import org.eclipse.jpt.jpa.core.JpaFile;
+import org.eclipse.jpt.jpa.core.context.java.JavaPersistentAttribute;
+import org.eclipse.jpt.jpa.core.context.java.JavaPersistentType;
+import org.eclipse.jpt.jpa.ui.internal.platform.generic.JavaPersistentTypeItemContentProvider;
+import org.eclipse.jpt.jpa.ui.internal.platform.generic.PersistentAttributeItemContentProvider;
+
+
+public class JavaItemContentProviderFactory implements TreeItemContentProviderFactory
+{
+ public TreeItemContentProvider buildItemContentProvider(
+ Object item, DelegatingContentAndLabelProvider contentProvider) {
+ DelegatingTreeContentAndLabelProvider treeContentProvider = (DelegatingTreeContentAndLabelProvider) contentProvider;
+ if (item instanceof JpaFile) {
+ return new ResourceModelItemContentProvider((JpaFile) item, treeContentProvider);
+ }
+ if (item instanceof JavaPersistentType) {
+ return new JavaPersistentTypeItemContentProvider((JavaPersistentType) item, treeContentProvider);
+ }
+ if (item instanceof JavaPersistentAttribute) {
+ return new PersistentAttributeItemContentProvider((JavaPersistentAttribute) item, treeContentProvider);
+ }
+ return null;
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/structure/JavaItemLabelProviderFactory.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/structure/JavaItemLabelProviderFactory.java
new file mode 100644
index 0000000000..ed3c54199f
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/structure/JavaItemLabelProviderFactory.java
@@ -0,0 +1,17 @@
+/*******************************************************************************
+ * 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.jpa.ui.internal.structure;
+
+
+public class JavaItemLabelProviderFactory extends GeneralJpaMappingItemLabelProviderFactory
+{
+
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/structure/JavaResourceModelStructureProvider.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/structure/JavaResourceModelStructureProvider.java
new file mode 100644
index 0000000000..0d07161408
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/structure/JavaResourceModelStructureProvider.java
@@ -0,0 +1,45 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2009 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.ui.internal.structure;
+
+import org.eclipse.jpt.common.ui.jface.ItemLabelProviderFactory;
+import org.eclipse.jpt.common.ui.jface.TreeItemContentProviderFactory;
+import org.eclipse.jpt.jpa.ui.structure.JpaStructureProvider;
+
+public class JavaResourceModelStructureProvider
+ implements JpaStructureProvider
+{
+ // singleton
+ private static final JpaStructureProvider INSTANCE = new JavaResourceModelStructureProvider();
+
+
+ /**
+ * Return the singleton
+ */
+ public static JpaStructureProvider instance() {
+ return INSTANCE;
+ }
+
+
+ /**
+ * Enforce singleton usage
+ */
+ private JavaResourceModelStructureProvider() {
+ super();
+ }
+
+ public TreeItemContentProviderFactory getTreeItemContentProviderFactory() {
+ return new JavaItemContentProviderFactory();
+ }
+
+ public ItemLabelProviderFactory getItemLabelProviderFactory() {
+ return new JavaItemLabelProviderFactory();
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/structure/OrmItemContentProviderFactory.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/structure/OrmItemContentProviderFactory.java
new file mode 100644
index 0000000000..5b3de90068
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/structure/OrmItemContentProviderFactory.java
@@ -0,0 +1,79 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 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.ui.internal.structure;
+
+import org.eclipse.jpt.common.ui.internal.jface.AbstractTreeItemContentProvider;
+import org.eclipse.jpt.common.ui.internal.jface.DelegatingTreeContentAndLabelProvider;
+import org.eclipse.jpt.common.ui.jface.DelegatingContentAndLabelProvider;
+import org.eclipse.jpt.common.ui.jface.TreeItemContentProvider;
+import org.eclipse.jpt.common.ui.jface.TreeItemContentProviderFactory;
+import org.eclipse.jpt.common.utility.internal.iterables.ListIterable;
+import org.eclipse.jpt.common.utility.internal.model.value.ListAspectAdapter;
+import org.eclipse.jpt.common.utility.internal.model.value.ListCollectionValueModelAdapter;
+import org.eclipse.jpt.common.utility.model.value.CollectionValueModel;
+import org.eclipse.jpt.jpa.core.JpaFile;
+import org.eclipse.jpt.jpa.core.context.orm.EntityMappings;
+import org.eclipse.jpt.jpa.core.context.orm.OrmPersistentAttribute;
+import org.eclipse.jpt.jpa.core.context.orm.OrmPersistentType;
+import org.eclipse.jpt.jpa.ui.internal.platform.generic.OrmPersistentTypeItemContentProvider;
+import org.eclipse.jpt.jpa.ui.internal.platform.generic.PersistentAttributeItemContentProvider;
+
+public class OrmItemContentProviderFactory implements TreeItemContentProviderFactory
+{
+ public TreeItemContentProvider buildItemContentProvider(
+ Object item, DelegatingContentAndLabelProvider contentProvider) {
+ DelegatingTreeContentAndLabelProvider treeContentProvider = (DelegatingTreeContentAndLabelProvider) contentProvider;
+ if (item instanceof JpaFile) {
+ return new ResourceModelItemContentProvider((JpaFile) item, treeContentProvider);
+ }
+ if (item instanceof EntityMappings) {
+ return new EntityMappingsItemContentProvider((EntityMappings) item, treeContentProvider);
+ }
+ if (item instanceof OrmPersistentType) {
+ return new OrmPersistentTypeItemContentProvider((OrmPersistentType) item, treeContentProvider);
+ }
+ if (item instanceof OrmPersistentAttribute) {
+ return new PersistentAttributeItemContentProvider((OrmPersistentAttribute) item, treeContentProvider);
+ }
+ return null;
+ }
+
+ public static class EntityMappingsItemContentProvider extends AbstractTreeItemContentProvider<OrmPersistentType>
+ {
+ public EntityMappingsItemContentProvider(
+ EntityMappings entityMappings, DelegatingTreeContentAndLabelProvider contentProvider) {
+ super(entityMappings, contentProvider);
+ }
+
+ @Override
+ public EntityMappings getModel() {
+ return (EntityMappings) super.getModel();
+ }
+
+ @Override
+ public Object getParent() {
+ // I'd like to return the resource model here, but that involves a hefty
+ // API change - we'll see what happens with this code first
+ return null;
+ }
+
+ @Override
+ protected CollectionValueModel<OrmPersistentType> buildChildrenModel() {
+ return new ListCollectionValueModelAdapter<OrmPersistentType>(
+ new ListAspectAdapter<EntityMappings, OrmPersistentType>(
+ EntityMappings.PERSISTENT_TYPES_LIST, getModel()) {
+ @Override
+ protected ListIterable<OrmPersistentType> getListIterable() {
+ return this.subject.getPersistentTypes();
+ }
+ });
+ }
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/structure/OrmItemLabelProviderFactory.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/structure/OrmItemLabelProviderFactory.java
new file mode 100644
index 0000000000..b4d21ac29a
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/structure/OrmItemLabelProviderFactory.java
@@ -0,0 +1,27 @@
+/*******************************************************************************
+ * 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.jpa.ui.internal.structure;
+
+import org.eclipse.jpt.common.ui.jface.DelegatingContentAndLabelProvider;
+import org.eclipse.jpt.common.ui.jface.ItemLabelProvider;
+import org.eclipse.jpt.jpa.core.context.orm.EntityMappings;
+import org.eclipse.jpt.jpa.ui.internal.platform.generic.EntityMappingsItemLabelProvider;
+
+public class OrmItemLabelProviderFactory extends GeneralJpaMappingItemLabelProviderFactory
+{
+ @Override
+ public ItemLabelProvider buildItemLabelProvider(
+ Object item, DelegatingContentAndLabelProvider labelProvider) {
+ if (item instanceof EntityMappings) {
+ return new EntityMappingsItemLabelProvider((EntityMappings) item, labelProvider);
+ }
+ return super.buildItemLabelProvider(item, labelProvider);
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/structure/OrmResourceModelStructureProvider.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/structure/OrmResourceModelStructureProvider.java
new file mode 100644
index 0000000000..b48afb9177
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/structure/OrmResourceModelStructureProvider.java
@@ -0,0 +1,46 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2009 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.ui.internal.structure;
+
+import org.eclipse.jpt.common.ui.jface.ItemLabelProviderFactory;
+import org.eclipse.jpt.common.ui.jface.TreeItemContentProviderFactory;
+import org.eclipse.jpt.jpa.ui.structure.JpaStructureProvider;
+
+public class OrmResourceModelStructureProvider
+ implements JpaStructureProvider
+{
+ // singleton
+ private static final JpaStructureProvider INSTANCE = new OrmResourceModelStructureProvider();
+
+
+ /**
+ * Return the singleton
+ */
+ public static JpaStructureProvider instance() {
+ return INSTANCE;
+ }
+
+
+ /**
+ * Enforce singleton usage
+ */
+ private OrmResourceModelStructureProvider() {
+ super();
+ }
+
+
+ public TreeItemContentProviderFactory getTreeItemContentProviderFactory() {
+ return new OrmItemContentProviderFactory();
+ }
+
+ public ItemLabelProviderFactory getItemLabelProviderFactory() {
+ return new OrmItemLabelProviderFactory();
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/structure/PersistenceItemContentProviderFactory.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/structure/PersistenceItemContentProviderFactory.java
new file mode 100644
index 0000000000..ec0f08e2a7
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/structure/PersistenceItemContentProviderFactory.java
@@ -0,0 +1,271 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 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.ui.internal.structure;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.ListIterator;
+import org.eclipse.jpt.common.ui.internal.jface.AbstractTreeItemContentProvider;
+import org.eclipse.jpt.common.ui.internal.jface.DelegatingTreeContentAndLabelProvider;
+import org.eclipse.jpt.common.ui.jface.DelegatingContentAndLabelProvider;
+import org.eclipse.jpt.common.ui.jface.TreeItemContentProvider;
+import org.eclipse.jpt.common.ui.jface.TreeItemContentProviderFactory;
+import org.eclipse.jpt.common.utility.internal.model.value.CollectionAspectAdapter;
+import org.eclipse.jpt.common.utility.internal.model.value.CollectionListValueModelAdapter;
+import org.eclipse.jpt.common.utility.internal.model.value.CompositeListValueModel;
+import org.eclipse.jpt.common.utility.internal.model.value.ListAspectAdapter;
+import org.eclipse.jpt.common.utility.internal.model.value.ListCollectionValueModelAdapter;
+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.model.value.CollectionValueModel;
+import org.eclipse.jpt.common.utility.model.value.ListValueModel;
+import org.eclipse.jpt.jpa.core.JpaFile;
+import org.eclipse.jpt.jpa.core.JpaStructureNode;
+import org.eclipse.jpt.jpa.core.context.persistence.ClassRef;
+import org.eclipse.jpt.jpa.core.context.persistence.JarFileRef;
+import org.eclipse.jpt.jpa.core.context.persistence.MappingFileRef;
+import org.eclipse.jpt.jpa.core.context.persistence.Persistence;
+import org.eclipse.jpt.jpa.core.context.persistence.PersistenceUnit;
+
+public class PersistenceItemContentProviderFactory
+ implements TreeItemContentProviderFactory
+{
+ public TreeItemContentProvider buildItemContentProvider(
+ Object item, DelegatingContentAndLabelProvider contentAndLabelProvider) {
+ DelegatingTreeContentAndLabelProvider treeContentProvider = (DelegatingTreeContentAndLabelProvider) contentAndLabelProvider;
+ if (item instanceof JpaFile) {
+ return new ResourceModelItemContentProvider((JpaFile) item, treeContentProvider);
+ }
+ else if (item instanceof Persistence) {
+ return new PersistenceItemContentProvider((Persistence) item, treeContentProvider);
+ }
+ else if (item instanceof PersistenceUnit) {
+ return new PersistenceUnitItemContentProvider((PersistenceUnit) item, treeContentProvider);
+ }
+ else if (item instanceof MappingFileRef) {
+ return new MappingFileRefItemContentProvider((MappingFileRef) item, treeContentProvider);
+ }
+ else if (item instanceof ClassRef) {
+ return new ClassRefItemContentProvider((ClassRef) item, treeContentProvider);
+ }
+ else if (item instanceof JarFileRef) {
+ return new JarFileRefItemContentProvider((JarFileRef) item, treeContentProvider);
+ }
+ return null;
+ }
+
+
+ public static class PersistenceItemContentProvider extends AbstractTreeItemContentProvider<PersistenceUnit>
+ {
+ public PersistenceItemContentProvider(
+ Persistence persistence, DelegatingTreeContentAndLabelProvider contentProvider) {
+ super(persistence, contentProvider);
+ }
+
+ @Override
+ public Persistence getModel() {
+ return (Persistence) super.getModel();
+ }
+
+ @Override
+ public Object getParent() {
+ // I'd like to return the resource model here, but that involves a hefty
+ // API change - we'll see what happens with this code first
+ return null;
+ }
+
+ @Override
+ protected CollectionValueModel<PersistenceUnit> buildChildrenModel() {
+ return new ListCollectionValueModelAdapter<PersistenceUnit>(
+ new ListAspectAdapter<Persistence, PersistenceUnit>(Persistence.PERSISTENCE_UNITS_LIST, getModel()) {
+ @Override
+ protected ListIterator<PersistenceUnit> listIterator_() {
+ return subject.persistenceUnits();
+ }
+ @Override
+ protected int size_() {
+ return subject.persistenceUnitsSize();
+ }
+ });
+ }
+ }
+
+
+ public static class PersistenceUnitItemContentProvider extends AbstractTreeItemContentProvider<JpaStructureNode>
+ {
+ public PersistenceUnitItemContentProvider(
+ PersistenceUnit persistenceUnit, DelegatingTreeContentAndLabelProvider contentProvider) {
+ super(persistenceUnit, contentProvider);
+ }
+
+ @Override
+ public PersistenceUnit getModel() {
+ return (PersistenceUnit) super.getModel();
+ }
+
+ @Override
+ public Persistence getParent() {
+ return getModel().getParent();
+ }
+
+ @Override
+ protected CollectionValueModel<JpaStructureNode> buildChildrenModel() {
+ ListValueModel<MappingFileRef> specifiedMappingFileLvm =
+ new ListAspectAdapter<PersistenceUnit, MappingFileRef>(
+ PersistenceUnit.SPECIFIED_MAPPING_FILE_REFS_LIST,
+ getModel()) {
+ @Override
+ protected ListIterator<MappingFileRef> listIterator_() {
+ return subject.specifiedMappingFileRefs();
+ }
+ @Override
+ protected int size_() {
+ return subject.specifiedMappingFileRefsSize();
+ }
+ };
+
+ ListValueModel<MappingFileRef> impliedMappingFileCvm =
+ new PropertyListValueModelAdapter<MappingFileRef>(
+ new PropertyAspectAdapter<PersistenceUnit, MappingFileRef>(
+ PersistenceUnit.IMPLIED_MAPPING_FILE_REF_PROPERTY,
+ getModel()) {
+ @Override
+ protected MappingFileRef buildValue_() {
+ return subject.getImpliedMappingFileRef();
+ }
+ }
+ );
+ ListValueModel<ClassRef> specifiedClassCvm =
+ new ListAspectAdapter<PersistenceUnit, ClassRef>(
+ PersistenceUnit.SPECIFIED_CLASS_REFS_LIST,
+ getModel()) {
+ @Override
+ protected ListIterator<ClassRef> listIterator_() {
+ return subject.specifiedClassRefs();
+ }
+ @Override
+ protected int size_() {
+ return subject.specifiedClassRefsSize();
+ }
+ };
+ ListValueModel<ClassRef> impliedClassCvm =
+ new CollectionListValueModelAdapter<ClassRef>(
+ new CollectionAspectAdapter<PersistenceUnit, ClassRef>(
+ PersistenceUnit.IMPLIED_CLASS_REFS_COLLECTION,
+ getModel()) {
+ @Override
+ protected Iterator<ClassRef> iterator_() {
+ return subject.impliedClassRefs();
+ }
+ @Override
+ protected int size_() {
+ return subject.impliedClassRefsSize();
+ }
+ });
+ ListValueModel<JarFileRef> jarFileCvm =
+ new ListAspectAdapter<PersistenceUnit, JarFileRef>(
+ PersistenceUnit.JAR_FILE_REFS_LIST,
+ getModel()) {
+ @Override
+ protected ListIterator<JarFileRef> listIterator_() {
+ return subject.jarFileRefs();
+ }
+ @Override
+ protected int size_() {
+ return subject.jarFileRefsSize();
+ }
+ };
+ List<ListValueModel<? extends JpaStructureNode>> list = new ArrayList<ListValueModel<? extends JpaStructureNode>>(4);
+ list.add(specifiedMappingFileLvm);
+ list.add(impliedMappingFileCvm);
+ list.add(specifiedClassCvm);
+ list.add(impliedClassCvm);
+ list.add(jarFileCvm);
+
+ return new ListCollectionValueModelAdapter<JpaStructureNode>(
+ new CompositeListValueModel
+ <ListValueModel<? extends JpaStructureNode>, JpaStructureNode>
+ (list));
+ }
+ }
+
+
+ public static class MappingFileRefItemContentProvider extends AbstractTreeItemContentProvider<MappingFileRef>
+ {
+ public MappingFileRefItemContentProvider(
+ MappingFileRef mappingFileRef, DelegatingTreeContentAndLabelProvider contentProvider) {
+ super(mappingFileRef, contentProvider);
+ }
+
+ @Override
+ public MappingFileRef getModel() {
+ return (MappingFileRef) super.getModel();
+ }
+
+ @Override
+ public Object getParent() {
+ return getModel().getPersistenceUnit();
+ }
+
+ @Override
+ public boolean hasChildren() {
+ return false;
+ }
+ }
+
+
+ public static class ClassRefItemContentProvider extends AbstractTreeItemContentProvider<ClassRef>
+ {
+ public ClassRefItemContentProvider(
+ ClassRef classRef, DelegatingTreeContentAndLabelProvider contentProvider) {
+ super(classRef, contentProvider);
+ }
+
+ @Override
+ public ClassRef getModel() {
+ return (ClassRef) super.getModel();
+ }
+
+ @Override
+ public Object getParent() {
+ return getModel().getPersistenceUnit();
+ }
+
+ @Override
+ public boolean hasChildren() {
+ return false;
+ }
+ }
+
+
+ public static class JarFileRefItemContentProvider extends AbstractTreeItemContentProvider<JarFileRef>
+ {
+ public JarFileRefItemContentProvider(
+ JarFileRef jarFileRef, DelegatingTreeContentAndLabelProvider contentProvider) {
+ super(jarFileRef, contentProvider);
+ }
+
+ @Override
+ public JarFileRef getModel() {
+ return (JarFileRef) super.getModel();
+ }
+
+ @Override
+ public Object getParent() {
+ return getModel().getPersistenceUnit();
+ }
+
+ @Override
+ public boolean hasChildren() {
+ return false;
+ }
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/structure/PersistenceItemLabelProviderFactory.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/structure/PersistenceItemLabelProviderFactory.java
new file mode 100644
index 0000000000..f7b35ae415
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/structure/PersistenceItemLabelProviderFactory.java
@@ -0,0 +1,48 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 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.ui.internal.structure;
+
+import org.eclipse.jpt.common.ui.jface.DelegatingContentAndLabelProvider;
+import org.eclipse.jpt.common.ui.jface.ItemLabelProvider;
+import org.eclipse.jpt.common.ui.jface.ItemLabelProviderFactory;
+import org.eclipse.jpt.jpa.core.context.persistence.ClassRef;
+import org.eclipse.jpt.jpa.core.context.persistence.JarFileRef;
+import org.eclipse.jpt.jpa.core.context.persistence.MappingFileRef;
+import org.eclipse.jpt.jpa.core.context.persistence.Persistence;
+import org.eclipse.jpt.jpa.core.context.persistence.PersistenceUnit;
+import org.eclipse.jpt.jpa.ui.internal.platform.generic.ClassRefItemLabelProvider;
+import org.eclipse.jpt.jpa.ui.internal.platform.generic.JarFileRefItemLabelProvider;
+import org.eclipse.jpt.jpa.ui.internal.platform.generic.MappingFileRefItemLabelProvider;
+import org.eclipse.jpt.jpa.ui.internal.platform.generic.PersistenceItemLabelProvider;
+import org.eclipse.jpt.jpa.ui.internal.platform.generic.PersistenceUnitItemLabelProvider;
+
+public class PersistenceItemLabelProviderFactory
+ implements ItemLabelProviderFactory
+{
+ public ItemLabelProvider buildItemLabelProvider(
+ Object item, DelegatingContentAndLabelProvider contentAndLabelProvider) {
+ if (item instanceof Persistence) {
+ return new PersistenceItemLabelProvider((Persistence) item, contentAndLabelProvider);
+ }
+ else if (item instanceof PersistenceUnit) {
+ return new PersistenceUnitItemLabelProvider((PersistenceUnit) item, contentAndLabelProvider);
+ }
+ else if (item instanceof MappingFileRef) {
+ return new MappingFileRefItemLabelProvider((MappingFileRef) item, contentAndLabelProvider);
+ }
+ else if (item instanceof ClassRef) {
+ return new ClassRefItemLabelProvider((ClassRef) item, contentAndLabelProvider);
+ }
+ else if (item instanceof JarFileRef) {
+ return new JarFileRefItemLabelProvider((JarFileRef) item, contentAndLabelProvider);
+ }
+ return null;
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/structure/PersistenceResourceModelStructureProvider.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/structure/PersistenceResourceModelStructureProvider.java
new file mode 100644
index 0000000000..f69524ca05
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/structure/PersistenceResourceModelStructureProvider.java
@@ -0,0 +1,46 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2009 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.ui.internal.structure;
+
+import org.eclipse.jpt.common.ui.jface.ItemLabelProviderFactory;
+import org.eclipse.jpt.common.ui.jface.TreeItemContentProviderFactory;
+import org.eclipse.jpt.jpa.ui.structure.JpaStructureProvider;
+
+public class PersistenceResourceModelStructureProvider
+ implements JpaStructureProvider
+{
+ // singleton
+ private static final JpaStructureProvider INSTANCE = new PersistenceResourceModelStructureProvider();
+
+
+ /**
+ * Return the singleton
+ */
+ public static JpaStructureProvider instance() {
+ return INSTANCE;
+ }
+
+
+ /**
+ * Enforce singleton usage
+ */
+ private PersistenceResourceModelStructureProvider() {
+ super();
+ }
+
+
+ public TreeItemContentProviderFactory getTreeItemContentProviderFactory() {
+ return new PersistenceItemContentProviderFactory();
+ }
+
+ public ItemLabelProviderFactory getItemLabelProviderFactory() {
+ return new PersistenceItemLabelProviderFactory();
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/structure/ResourceModelItemContentProvider.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/structure/ResourceModelItemContentProvider.java
new file mode 100644
index 0000000000..ef3a7db03a
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/structure/ResourceModelItemContentProvider.java
@@ -0,0 +1,55 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2009 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.ui.internal.structure;
+
+import java.util.Iterator;
+
+import org.eclipse.jpt.common.ui.internal.jface.AbstractTreeItemContentProvider;
+import org.eclipse.jpt.common.ui.internal.jface.DelegatingTreeContentAndLabelProvider;
+import org.eclipse.jpt.common.utility.internal.model.value.CollectionAspectAdapter;
+import org.eclipse.jpt.common.utility.internal.model.value.SimplePropertyValueModel;
+import org.eclipse.jpt.common.utility.model.value.CollectionValueModel;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.JpaFile;
+import org.eclipse.jpt.jpa.core.JpaStructureNode;
+
+public class ResourceModelItemContentProvider extends AbstractTreeItemContentProvider<JpaStructureNode>
+{
+ public ResourceModelItemContentProvider(
+ JpaFile jpaFile,
+ DelegatingTreeContentAndLabelProvider contentProvider) {
+ super(jpaFile, contentProvider);
+ }
+
+ @Override
+ public Object getParent() {
+ return null;
+ }
+
+ @Override
+ public JpaFile getModel() {
+ return (JpaFile) super.getModel();
+ }
+
+ @Override
+ protected CollectionValueModel<JpaStructureNode> buildChildrenModel() {
+ return new CollectionAspectAdapter<JpaFile, JpaStructureNode>(
+ buildJpaFileValueModel(), JpaFile.ROOT_STRUCTURE_NODES_COLLECTION) {
+ @Override
+ protected Iterator<JpaStructureNode> iterator_() {
+ return subject.rootStructureNodes();
+ }
+ };
+ }
+
+ protected PropertyValueModel<JpaFile> buildJpaFileValueModel() {
+ return new SimplePropertyValueModel<JpaFile>(this.getModel());
+ }
+} \ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/views/AbstractJpaView.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/views/AbstractJpaView.java
new file mode 100644
index 0000000000..9c4a2e4be4
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/views/AbstractJpaView.java
@@ -0,0 +1,166 @@
+/********************************************************************************
+ * Copyright (c) 2006, 2009 Versant. 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: Versant and Others. - initial API and implementation
+ ********************************************************************************/
+package org.eclipse.jpt.jpa.ui.internal.views;
+
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.ui.internal.widgets.FormWidgetFactory;
+import org.eclipse.jpt.common.ui.internal.widgets.PropertySheetWidgetFactory;
+import org.eclipse.jpt.jpa.ui.JptJpaUiPlugin;
+import org.eclipse.jpt.jpa.ui.internal.selection.JpaSelection;
+import org.eclipse.jpt.jpa.ui.internal.selection.JpaSelectionManager;
+import org.eclipse.jpt.jpa.ui.internal.selection.SelectionManagerFactory;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.FillLayout;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+import org.eclipse.ui.forms.widgets.ScrolledForm;
+import org.eclipse.ui.part.PageBook;
+import org.eclipse.ui.part.ViewPart;
+import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetWidgetFactory;
+
+/**
+ * This is the abstract implementation of the JPA view. The selection is changed
+ * by receiving a <code>IJpaSelection</code>.
+ *
+ * @see JpaSelection
+ *
+ * @version 2.0
+ * @since 1.0
+ */
+public abstract class AbstractJpaView extends ViewPart
+{
+ /**
+ * The default page used when nothing can be shown.
+ */
+ private Composite defaultComposite;
+
+ /**
+ * The string to display when there is no view content
+ */
+ private String defaultLabel;
+
+ /**
+ * The container of the current page.
+ */
+ private PageBook pageBook;
+
+ private ScrolledForm scrolledForm;
+
+
+ /**
+ * The factory used to create the various widgets.
+ */
+ private WidgetFactory widgetFactory;
+
+ /**
+ * Creates a new <code>AbstractJpaView</code>.
+ *
+ * @param defaultLabel
+ */
+ public AbstractJpaView(String defaultLabel) {
+ super();
+ this.defaultLabel = defaultLabel;
+ this.initialize();
+ }
+
+ private Composite buildDefaultComposite() {
+ Composite composite = widgetFactory.createComposite(pageBook);
+ composite.setLayout(new FillLayout(SWT.VERTICAL));
+ getWidgetFactory().createLabel(composite, defaultLabel);
+ return composite;
+ }
+
+ @Override
+ public final void createPartControl(Composite parent) {
+ this.scrolledForm = getFormWidgetFactory().createScrolledForm(parent);
+ JptJpaUiPlugin.instance().controlAffectsJavaSource(this.scrolledForm);
+ this.scrolledForm.getBody().setLayout(new GridLayout());
+
+ this.pageBook = new PageBook(this.scrolledForm.getBody(), SWT.NONE);
+ GridData gridData = new GridData();
+ gridData.grabExcessHorizontalSpace = true;
+ gridData.horizontalAlignment = SWT.FILL;
+ this.pageBook.setLayoutData(gridData);
+ this.scrolledForm.setContent(this.pageBook);
+
+ this.defaultComposite = buildDefaultComposite();
+ this.pageBook.showPage(this.defaultComposite);
+
+ subcreatePartControl(parent);
+
+ JpaSelectionManager selectionManager =
+ SelectionManagerFactory.getSelectionManager(getViewSite().getWorkbenchWindow());
+
+ selectionManager.register(this);
+ select(selectionManager.getCurrentSelection());
+ }
+
+ protected final PageBook getPageBook() {
+ return this.pageBook;
+ }
+
+ public final WidgetFactory getWidgetFactory() {
+ return this.widgetFactory;
+ }
+
+ /**
+ * Initializes this JPA view.
+ */
+ protected void initialize() {
+ this.widgetFactory = new PropertySheetWidgetFactory(
+ new TabbedPropertySheetWidgetFactory()
+ );
+ }
+
+ private FormToolkit getFormWidgetFactory() {
+ return ((FormWidgetFactory) widgetFactory).getWidgetFactory();
+ }
+
+ /**
+ * The selection has changed, update the current page by using the given
+ * selection state.
+ *
+ * @param jpaSelection The new selection used to update this JPA view
+ */
+ public abstract void select(JpaSelection jpaSelection);
+
+ /*
+ * (non-Javadoc)
+ */
+ @Override
+ public void setFocus() {
+ pageBook.setFocus();
+ }
+
+ /**
+ * Changes the current page and show the default one.
+ */
+ protected void showDefaultPage() {
+ showPage(defaultComposite);
+ }
+
+ /**
+ * Changes the current page and show the given one.
+ *
+ * @param page The new page to show, <code>null</code> can't be passed
+ */
+ protected final void showPage(Control page) {
+ page.setParent(this.pageBook);
+ this.pageBook.showPage(page);
+ this.scrolledForm.reflow(true);
+ }
+
+ protected void subcreatePartControl(@SuppressWarnings("unused") Composite parent) {
+ // no op - for subclasses to override if wished
+ }
+
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/views/JpaDetailsView.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/views/JpaDetailsView.java
new file mode 100644
index 0000000000..2cd756e9e4
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/views/JpaDetailsView.java
@@ -0,0 +1,190 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2010 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.ui.internal.views;
+
+import java.util.HashMap;
+import java.util.Map;
+import org.eclipse.jpt.common.core.JptResourceType;
+import org.eclipse.jpt.jpa.core.JpaStructureNode;
+import org.eclipse.jpt.jpa.ui.JpaPlatformUi;
+import org.eclipse.jpt.jpa.ui.JptJpaUiPlugin;
+import org.eclipse.jpt.jpa.ui.details.JpaDetailsPage;
+import org.eclipse.jpt.jpa.ui.internal.JptUiMessages;
+import org.eclipse.jpt.jpa.ui.internal.platform.JpaPlatformUiRegistry;
+import org.eclipse.jpt.jpa.ui.internal.selection.JpaSelection;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.FillLayout;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * The JPA view that shows the details of a structure node
+ *
+ * @version 2.2
+ * @since 1.0
+ */
+public class JpaDetailsView extends AbstractJpaView
+{
+ /**
+ * The current <code>JpaDetailsPage</code> that was retrieve based on the
+ * current selection.
+ */
+ private JpaDetailsPage<JpaStructureNode> currentPage;
+
+ /**
+ * The current selection used to show the right <code>IJpaDetailsPage</code>.
+ */
+ private JpaSelection currentSelection;
+
+ //TODO this is crap, a Map of Maps of Maps. Needs to be done differently, the factory/platform should handle caching instead
+ // key1 platform id
+ // key2 JpaResourceType
+ // key3 structure node type
+ // value Composite page
+ private Map<String, Map<JptResourceType, Map<String, JpaDetailsPage<? extends JpaStructureNode>>>> detailsPages;
+
+ /**
+ * Creates a new <code>JpaDetailsView</code>.
+ */
+ public JpaDetailsView() {
+ super(JptUiMessages.JpaDetailsView_viewNotAvailable);
+ }
+
+ @Override
+ protected void initialize() {
+ super.initialize();
+
+ this.currentSelection = JpaSelection.NULL_SELECTION;
+ this.detailsPages = new HashMap<String, Map<JptResourceType, Map<String, JpaDetailsPage<? extends JpaStructureNode>>>>();
+ }
+
+ private JpaPlatformUi getJpaPlatformUi(JpaStructureNode structureNode) {
+ String platformId = structureNode.getJpaProject().getJpaPlatform().getId();
+ return JpaPlatformUiRegistry.instance().getJpaPlatformUi(platformId);
+ }
+
+ public JpaSelection getSelection() {
+ return this.currentSelection;
+ }
+
+ private JpaDetailsPage<? extends JpaStructureNode> getDetailsPage(JpaStructureNode structureNode) {
+ String platformId = structureNode.getJpaProject().getJpaPlatform().getId();
+ if (this.detailsPages.containsKey(platformId)) {
+ Map<JptResourceType, Map<String, JpaDetailsPage<? extends JpaStructureNode>>> platformDetailsPages = this.detailsPages.get(platformId);
+ Map<String, JpaDetailsPage<? extends JpaStructureNode>> contentTypeDetailsPages = platformDetailsPages.get(structureNode.getResourceType());
+ if (contentTypeDetailsPages != null) {
+ JpaDetailsPage<? extends JpaStructureNode> page = contentTypeDetailsPages.get(structureNode.getId());
+ if (page != null) {
+ if (page.getControl().isDisposed()) {
+ platformDetailsPages.remove(structureNode.getId());
+ } else {
+ return page;
+ }
+ }
+ }
+ }
+ return buildDetailsPage(structureNode);
+ }
+
+ private JpaDetailsPage<? extends JpaStructureNode> buildDetailsPage(JpaStructureNode structureNode) {
+ JpaPlatformUi jpaPlatformUi = getJpaPlatformUi(structureNode);
+
+ Composite container = getWidgetFactory().createComposite(getPageBook());
+ container.setLayout(new FillLayout(SWT.HORIZONTAL));
+
+ JpaDetailsPage<? extends JpaStructureNode> page = jpaPlatformUi.buildJpaDetailsPage(container, structureNode, getWidgetFactory());
+ if (page == null) {
+ return null;
+ }
+
+ String platformId = structureNode.getJpaProject().getJpaPlatform().getId();
+ Map<JptResourceType, Map<String, JpaDetailsPage<? extends JpaStructureNode>>> platformDetailsPages = this.detailsPages.get(platformId);
+ if (platformDetailsPages == null) {
+ platformDetailsPages = new HashMap<JptResourceType, Map<String, JpaDetailsPage<? extends JpaStructureNode>>>();
+ this.detailsPages.put(platformId, platformDetailsPages);
+ }
+ JptResourceType resourceType = structureNode.getResourceType();
+ Map<String, JpaDetailsPage<? extends JpaStructureNode>> contentTypeDetailsPages = platformDetailsPages.get(resourceType);
+ if (contentTypeDetailsPages == null) {
+ contentTypeDetailsPages = new HashMap<String, JpaDetailsPage<? extends JpaStructureNode>>();
+ platformDetailsPages.put(resourceType, contentTypeDetailsPages);
+ }
+ contentTypeDetailsPages.put(structureNode.getId(), page);
+
+ return page;
+ }
+
+ @Override
+ @SuppressWarnings("unchecked")
+ public void select(JpaSelection jpaSelection) {
+ if (jpaSelection.equals(this.currentSelection)) {
+ return;
+ }
+
+ this.currentSelection = jpaSelection;
+ if (jpaSelection == JpaSelection.NULL_SELECTION) {
+ if (this.currentPage != null) {
+ this.currentPage.setSubject(null);
+ this.setCurrentPage(null);
+ }
+ return;
+ }
+ JpaStructureNode newNode = jpaSelection.getSelectedNode();
+ JpaDetailsPage<JpaStructureNode> newPage = (JpaDetailsPage<JpaStructureNode>) getDetailsPage(newNode);
+ if (this.currentPage != null && this.currentPage != newPage){
+ try {
+ this.currentPage.setSubject(null);
+ } catch (Exception e) {
+ JptJpaUiPlugin.log(e);
+ }
+ }
+ if (newPage != null) {
+ try {
+ newPage.setSubject(newNode);
+ } catch (Exception e) {
+ newPage = null;// Show error page
+ JptJpaUiPlugin.log(e);
+ }
+ }
+ setCurrentPage(newPage);
+ }
+
+ /**
+ * Changes the current page and shows the given page.
+ *
+ * @param newPage The new page to display
+ */
+ private void setCurrentPage(JpaDetailsPage<JpaStructureNode> newPage) {
+ this.currentPage = newPage;
+
+ // Show new page
+ if (newPage == null) {
+ showDefaultPage();
+ }
+ else {
+ showPage(newPage.getControl());
+ }
+ }
+
+ @Override
+ public void dispose() {
+ for (Map<JptResourceType, Map<String, JpaDetailsPage<? extends JpaStructureNode>>> resourceTypeMap : this.detailsPages.values()) {
+ for (Map<String, JpaDetailsPage<? extends JpaStructureNode>> detailsPageMap : resourceTypeMap.values()) {
+ for (JpaDetailsPage<? extends JpaStructureNode> detailsPage : detailsPageMap.values()) {
+ detailsPage.dispose();
+ }
+ }
+ }
+ this.detailsPages.clear();
+
+ this.currentSelection = JpaSelection.NULL_SELECTION;
+ this.currentPage = null;
+
+ super.dispose();
+ }
+} \ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/views/structure/JpaStructurePage.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/views/structure/JpaStructurePage.java
new file mode 100644
index 0000000000..5e8b53edfe
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/views/structure/JpaStructurePage.java
@@ -0,0 +1,409 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2010 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.ui.internal.views.structure;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.runtime.ListenerList;
+import org.eclipse.core.runtime.SafeRunner;
+import org.eclipse.jface.action.IMenuListener;
+import org.eclipse.jface.action.IMenuManager;
+import org.eclipse.jface.action.IStatusLineManager;
+import org.eclipse.jface.action.MenuManager;
+import org.eclipse.jface.action.Separator;
+import org.eclipse.jface.util.SafeRunnable;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.ITreeSelection;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.jpt.common.ui.internal.jface.DelegatingTreeContentAndLabelProvider;
+import org.eclipse.jpt.common.ui.internal.util.SWTUtil;
+import org.eclipse.jpt.common.ui.jface.DelegatingContentAndLabelProvider;
+import org.eclipse.jpt.common.utility.model.event.CollectionAddEvent;
+import org.eclipse.jpt.common.utility.model.event.CollectionChangeEvent;
+import org.eclipse.jpt.common.utility.model.event.CollectionClearEvent;
+import org.eclipse.jpt.common.utility.model.event.CollectionRemoveEvent;
+import org.eclipse.jpt.common.utility.model.listener.CollectionChangeListener;
+import org.eclipse.jpt.jpa.core.JpaFile;
+import org.eclipse.jpt.jpa.core.JpaProject;
+import org.eclipse.jpt.jpa.core.JpaProjectManager;
+import org.eclipse.jpt.jpa.core.JpaStructureNode;
+import org.eclipse.jpt.jpa.core.JptJpaCorePlugin;
+import org.eclipse.jpt.jpa.ui.internal.JptUiMessages;
+import org.eclipse.jpt.jpa.ui.internal.selection.DefaultJpaSelection;
+import org.eclipse.jpt.jpa.ui.internal.selection.JpaSelection;
+import org.eclipse.jpt.jpa.ui.structure.JpaStructureProvider;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.FillLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Menu;
+import org.eclipse.ui.IWorkbenchActionConstants;
+import org.eclipse.ui.part.IPageSite;
+import org.eclipse.ui.part.Page;
+
+public class JpaStructurePage
+ extends Page
+ implements ISelectionProvider
+{
+ private final JpaStructureView jpaStructureView;
+
+ JpaFile jpaFile;
+
+ private final IFile file;
+
+ private JpaProject jpaProject;
+
+ private final JpaStructureProvider structureProvider;
+
+ private Composite control;
+
+ private DelegatingContentAndLabelProvider contentAndLabelProvider;
+
+ TreeViewer viewer;
+
+ private final ListenerList selectionChangedListenerList;
+
+ private final ISelectionChangedListener treeSelectionListener;
+
+ private final ISelectionChangedListener treePostSelectionListener;
+
+ private final CollectionChangeListener projectsListener;
+
+ private final CollectionChangeListener jpaFilesListener;
+
+
+ public JpaStructurePage(
+ JpaStructureView jpaStructureView, JpaFile jpaFile, JpaStructureProvider structureProvider) {
+
+ this.jpaStructureView = jpaStructureView;
+ this.jpaFile = jpaFile;
+ this.jpaProject = jpaFile.getJpaProject();
+ this.file = jpaFile.getFile();
+ this.structureProvider = structureProvider;
+ this.selectionChangedListenerList = new ListenerList();
+ this.treeSelectionListener = new TreeSelectionChangedListener();
+ this.treePostSelectionListener = new TreePostSelectionChangedListener();
+ this.projectsListener = buildProjectsListener();
+ this.jpaFilesListener = buildJpaFilesListener();
+ }
+
+
+ private CollectionChangeListener buildProjectsListener() {
+ return new CollectionChangeListener(){
+
+ public void itemsRemoved(CollectionRemoveEvent event) {
+ JpaStructurePage.this.projectsRemoved(event);
+ }
+
+ public void itemsAdded(CollectionAddEvent event) {
+ JpaStructurePage.this.projectsAdded(event);
+ }
+
+ public void collectionCleared(CollectionClearEvent event) {
+ JpaStructurePage.this.projectsCleared(event);
+ }
+
+ public void collectionChanged(CollectionChangeEvent event) {
+ JpaStructurePage.this.projectsChanged(event);
+ }
+ };
+ }
+
+ @SuppressWarnings("unchecked")
+ void projectsRemoved(CollectionRemoveEvent event) {
+ for (JpaProject item : (Iterable<JpaProject>) event.getItems()) {
+ if (item.getProject() == JpaStructurePage.this.file.getProject()) {
+ setJpaProject(null);
+ break;
+ }
+ }
+ }
+
+ @SuppressWarnings("unchecked")
+ void projectsAdded(CollectionAddEvent event) {
+ for (JpaProject item : (Iterable<JpaProject>) event.getItems()) {
+ if (item.getProject() == JpaStructurePage.this.file.getProject()) {
+ setJpaProject(item);
+ break;
+ }
+ }
+ }
+
+ void projectsCleared(@SuppressWarnings("unused") CollectionClearEvent event) {
+ setJpaProject(null);
+ }
+
+ void projectsChanged(@SuppressWarnings("unused") CollectionChangeEvent event) {
+ setJpaProject(JptJpaCorePlugin.getJpaProject(this.file.getProject()));
+ }
+
+ private CollectionChangeListener buildJpaFilesListener() {
+ return new CollectionChangeListener(){
+
+ public void itemsRemoved(CollectionRemoveEvent event) {
+ JpaStructurePage.this.jpaFilesRemoved(event);
+ }
+
+ public void itemsAdded(CollectionAddEvent event) {
+ JpaStructurePage.this.jpaFilesAdded(event);
+ }
+
+ public void collectionCleared(CollectionClearEvent event) {
+ JpaStructurePage.this.jpaFilesCleared(event);
+ }
+
+ public void collectionChanged(CollectionChangeEvent event) {
+ JpaStructurePage.this.jpaFilesChanged(event);
+ }
+ };
+ }
+
+ @SuppressWarnings("unchecked")
+ void jpaFilesRemoved(CollectionRemoveEvent event) {
+ for (JpaFile item : (Iterable<JpaFile>) event.getItems()) {
+ if (item == JpaStructurePage.this.jpaFile) {
+ setJpaFile(null);
+ break;
+ }
+ }
+ }
+
+ @SuppressWarnings("unchecked")
+ void jpaFilesAdded(CollectionAddEvent event) {
+ for (JpaFile item : (Iterable<JpaFile>) event.getItems()) {
+ if (item.getFile() != null && item.getFile().equals(JpaStructurePage.this.file)) {
+ setJpaFile(item);
+ break;
+ }
+ }
+ }
+
+ void jpaFilesCleared(@SuppressWarnings("unused") CollectionClearEvent event) {
+ setJpaFile(null);
+ }
+
+ void jpaFilesChanged(@SuppressWarnings("unused") CollectionChangeEvent event) {
+ setJpaFile(this.jpaProject.getJpaFile(this.file));
+ }
+
+ private void setJpaProject(JpaProject jpaProject) {
+ if (this.jpaProject == jpaProject) {
+ return;
+ }
+ if (this.jpaProject != null) {
+ this.jpaProject.removeCollectionChangeListener(JpaProject.JPA_FILES_COLLECTION, this.jpaFilesListener);
+ }
+ this.jpaProject = jpaProject;
+ if (this.jpaProject != null) {
+ this.jpaProject.addCollectionChangeListener(JpaProject.JPA_FILES_COLLECTION, this.jpaFilesListener);
+ setJpaFile(this.jpaProject.getJpaFile(JpaStructurePage.this.file));
+ }
+ else {
+ setJpaFile(null);
+ }
+ }
+
+ private void setJpaFile(JpaFile jpaFile) {
+ if (this.jpaFile == jpaFile) {
+ return;
+ }
+ this.jpaFile = jpaFile;
+ SWTUtil.asyncExec(new Runnable(){
+ public void run() {
+ JpaStructurePage.this.viewer.setInput(JpaStructurePage.this.jpaFile);
+ }
+ });
+ }
+
+ @Override
+ public void init(IPageSite pageSite) {
+ super.init(pageSite);
+ pageSite.setSelectionProvider(this);
+ }
+
+ @Override
+ public void createControl(Composite parent) {
+ control = new Composite(parent, SWT.NULL);
+ control.setLayout(new FillLayout());
+ viewer = new TreeViewer(control, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
+ viewer.setAutoExpandLevel(2);
+ DelegatingTreeContentAndLabelProvider provider
+ = new DelegatingTreeContentAndLabelProvider(
+ structureProvider.getTreeItemContentProviderFactory(),
+ structureProvider.getItemLabelProviderFactory());
+ this.contentAndLabelProvider = provider;
+ viewer.setContentProvider(provider);
+ // TODO Use problem decorator
+ viewer.setLabelProvider(provider);
+ this.viewer.setInput(this.jpaFile);
+ engageListeners();
+ initContextMenu();
+ }
+
+ protected void engageListeners() {
+ this.viewer.addSelectionChangedListener(this.treeSelectionListener);
+ this.viewer.addPostSelectionChangedListener(this.treePostSelectionListener);
+ this.jpaProject.addCollectionChangeListener(JpaProject.JPA_FILES_COLLECTION, this.jpaFilesListener);
+ JptJpaCorePlugin.getJpaProjectManager().addCollectionChangeListener(JpaProjectManager.JPA_PROJECTS_COLLECTION, this.projectsListener);
+ }
+
+ @Override
+ public void dispose() {
+ disengageListeners();
+ super.dispose();
+ }
+
+ protected void disengageListeners() {
+ JptJpaCorePlugin.getJpaProjectManager().removeCollectionChangeListener(JpaProjectManager.JPA_PROJECTS_COLLECTION, this.projectsListener);
+ if (this.jpaProject != null) {
+ this.jpaProject.removeCollectionChangeListener(JpaProject.JPA_FILES_COLLECTION, this.jpaFilesListener);
+ }
+ this.viewer.removePostSelectionChangedListener(this.treePostSelectionListener);
+ this.viewer.removeSelectionChangedListener(this.treeSelectionListener);
+ }
+
+ protected void initContextMenu() {
+ // Create dynamic menu mgr. Dynamic is currently required to
+ // support action contributions.
+ MenuManager mgr = new MenuManager();
+ mgr.setRemoveAllWhenShown(true);
+ mgr.addMenuListener(new IMenuListener() {
+ public void menuAboutToShow(IMenuManager menuManager) {
+ JpaStructurePage.this.fillContextMenu(menuManager);
+ }
+ });
+ Menu menu = mgr.createContextMenu(viewer.getControl());
+ viewer.getControl().setMenu(menu);
+ this.jpaStructureView.getSite().registerContextMenu(mgr, viewer);
+ }
+
+ /**
+ * Called when the context menu is about to open.
+ * Delegates to the action group using the viewer's selection as the action context.
+ * @since 2.0
+ */
+ protected void fillContextMenu(IMenuManager manager) {
+ manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
+ }
+
+ @Override
+ public Control getControl() {
+ return control;
+ }
+
+ @Override
+ public void setFocus() {
+ control.setFocus();
+ }
+
+
+
+ void select(JpaSelection selection) {
+ if (selection.isEmpty()) {
+ viewer.setSelection(StructuredSelection.EMPTY);
+ }
+ else {
+ viewer.setSelection(new StructuredSelection(selection.getSelectedNode()), true);
+ }
+ }
+
+
+ // **************** ISelectionProvider impl ********************************
+
+ public void addSelectionChangedListener(ISelectionChangedListener listener) {
+ selectionChangedListenerList.add(listener);
+ }
+
+ public void removeSelectionChangedListener(ISelectionChangedListener listener) {
+ selectionChangedListenerList.remove(listener);
+ }
+
+ public ITreeSelection getSelection() {
+ return (ITreeSelection) viewer.getSelection();
+ }
+
+ public JpaSelection getJpaSelection() {
+ ITreeSelection viewerSelection = getSelection();
+
+ if (viewerSelection.isEmpty() || viewerSelection.size() > 1) {
+ return JpaSelection.NULL_SELECTION;
+ }
+ return new DefaultJpaSelection((JpaStructureNode) viewerSelection.getFirstElement());
+ }
+
+
+ public void setSelection(ISelection selection) {
+ if (viewer != null) {
+ viewer.setSelection(selection);
+ }
+ }
+
+ /*
+ * relays tree selection event to listeners of this page
+ */
+ protected void fireSelectionChanged(ISelection selection) {
+ // create an event
+ final SelectionChangedEvent event =
+ new SelectionChangedEvent(this, selection);
+
+ // fire the event
+ Object[] listeners = selectionChangedListenerList.getListeners();
+ for (int i = 0; i < listeners.length; ++i) {
+ final ISelectionChangedListener l = (ISelectionChangedListener) listeners[i];
+ SafeRunner.run(
+ new SafeRunnable() {
+ public void run() {
+ l.selectionChanged(event);
+ }
+ });
+ }
+ }
+
+ protected void updateStatusBar(ISelection selection) {
+ IStatusLineManager statusLineManager = getSite().getActionBars().getStatusLineManager();
+ if (! (selection instanceof IStructuredSelection) || selection.isEmpty()) {
+ statusLineManager.setMessage(""); //$NON-NLS-1$
+ return;
+ }
+ IStructuredSelection sselection = (IStructuredSelection) selection;
+ if (sselection.size() > 1) {
+ statusLineManager.setMessage(NLS.bind(JptUiMessages.JpaStructureView_numItemsSelected, sselection.size()));
+ }
+ else {
+ Object selObj = sselection.getFirstElement();
+ statusLineManager.setMessage(
+ this.contentAndLabelProvider.getImage(selObj),
+ this.contentAndLabelProvider.getDescription(selObj));
+ }
+ }
+
+
+ class TreeSelectionChangedListener
+ implements ISelectionChangedListener
+ {
+ public void selectionChanged(SelectionChangedEvent event) {
+ JpaStructurePage.this.fireSelectionChanged(event.getSelection());
+ }
+ }
+
+
+ class TreePostSelectionChangedListener
+ implements ISelectionChangedListener
+ {
+ public void selectionChanged(SelectionChangedEvent event) {
+ JpaStructurePage.this.updateStatusBar(event.getSelection());
+ }
+ }
+} \ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/views/structure/JpaStructureView.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/views/structure/JpaStructureView.java
new file mode 100644
index 0000000000..4fbde058c2
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/views/structure/JpaStructureView.java
@@ -0,0 +1,134 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2009 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.ui.internal.views.structure;
+
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jpt.jpa.core.JpaFile;
+import org.eclipse.jpt.jpa.ui.JpaPlatformUi;
+import org.eclipse.jpt.jpa.ui.JptJpaUiPlugin;
+import org.eclipse.jpt.jpa.ui.internal.JptUiMessages;
+import org.eclipse.jpt.jpa.ui.internal.selection.JpaSelection;
+import org.eclipse.jpt.jpa.ui.internal.selection.JpaSelectionManager;
+import org.eclipse.jpt.jpa.ui.internal.selection.SelectionManagerFactory;
+import org.eclipse.jpt.jpa.ui.structure.JpaStructureProvider;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.part.IPage;
+import org.eclipse.ui.part.MessagePage;
+import org.eclipse.ui.part.PageBook;
+import org.eclipse.ui.part.PageBookView;
+
+public class JpaStructureView
+ extends PageBookView
+{
+ public JpaStructureView() {
+ super();
+ }
+
+ @Override
+ public void createPartControl(Composite parent) {
+ super.createPartControl(parent);
+
+ JpaSelectionManager selectionManager =
+ SelectionManagerFactory.getSelectionManager(this.getViewSite().getWorkbenchWindow());
+
+ selectionManager.register(this);
+ this.select(selectionManager.getCurrentSelection());
+ }
+
+ @Override
+ public void partBroughtToTop(IWorkbenchPart part) {
+ // do same thing as partActivated, which will check to see if the
+ // part is an editor, in which case, we want to show the right page
+ partActivated(part);
+ }
+
+ @Override
+ protected boolean isImportant(IWorkbenchPart part) {
+ return part instanceof IEditorPart;
+ }
+
+ @Override
+ protected IWorkbenchPart getBootstrapPart() {
+ IWorkbenchPage page = this.getSite().getPage();
+ return (page == null) ? null : page.getActiveEditor();
+ }
+
+ @Override
+ protected IPage createDefaultPage(PageBook book) {
+ MessagePage page = new MessagePage();
+ this.initPage(page);
+ page.createControl(book);
+ page.setMessage(JptUiMessages.JpaStructureView_structureNotAvailable);
+ return page;
+ }
+
+ @Override
+ protected PageRec doCreatePage(IWorkbenchPart part) {
+ // use the platform adapter service so the structure view can be
+ // associated with any IEditorPart that has an associated adapter
+ // factory that can give us the JPA file associated with the editor part
+ // @see org.eclipse.jpt.jpa.ui.internal.EditorPartAdapterFactory
+ JpaFile jpaFile = (JpaFile) part.getAdapter(JpaFile.class);
+ if (jpaFile == null) {
+ return null;
+ }
+
+ JpaStructureProvider structureProvider = this.getStructureProvider(jpaFile);
+ if (structureProvider == null) {
+ return null;
+ }
+
+ JpaStructurePage page = new JpaStructurePage(this, jpaFile, structureProvider);
+ this.initPage(page);
+ page.createControl(this.getPageBook());
+ return new PageRec(part, page);
+ }
+
+ private JpaStructureProvider getStructureProvider(JpaFile jpaFile) {
+ return this.getPlatformUi(jpaFile).getStructureProvider(jpaFile);
+ }
+
+ private JpaPlatformUi getPlatformUi(JpaFile jpaFile) {
+ return JptJpaUiPlugin.instance().getJpaPlatformUi(jpaFile.getJpaProject().getJpaPlatform());
+ }
+
+ @Override
+ protected void doDestroyPage(IWorkbenchPart part, PageRec pageRecord) {
+ JpaStructurePage page = (JpaStructurePage) pageRecord.page;
+ page.dispose();
+ pageRecord.dispose();
+ }
+
+ public JpaSelection getJpaSelection() {
+ if (this.getCurrentPage() != this.getDefaultPage()) {
+ return ((JpaStructurePage) this.getCurrentPage()).getJpaSelection();
+ }
+ return JpaSelection.NULL_SELECTION;
+ }
+
+ public void select(JpaSelection newSelection) {
+ // correct page should be shown
+ if (this.getCurrentPage() != this.getDefaultPage()) {
+ ((JpaStructurePage) this.getCurrentPage()).select(newSelection);
+ }
+ }
+
+ public void addSelectionChangedListener(ISelectionChangedListener listener) {
+ this.getSelectionProvider().addSelectionChangedListener(listener);
+ }
+
+ public void removeSelectionChangedListener(ISelectionChangedListener listener) {
+ this.getSelectionProvider().removeSelectionChangedListener(listener);
+ }
+
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/DatabaseSchemaWizardPage.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/DatabaseSchemaWizardPage.java
new file mode 100644
index 0000000000..3c2abe3ebb
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/DatabaseSchemaWizardPage.java
@@ -0,0 +1,445 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2009 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.ui.internal.wizards;
+
+import java.util.EventListener;
+
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.preference.PreferenceDialog;
+import org.eclipse.jface.wizard.WizardPage;
+import org.eclipse.jpt.common.utility.internal.ListenerList;
+import org.eclipse.jpt.common.utility.internal.iterables.EmptyIterable;
+import org.eclipse.jpt.jpa.core.JpaProject;
+import org.eclipse.jpt.jpa.db.ConnectionAdapter;
+import org.eclipse.jpt.jpa.db.ConnectionListener;
+import org.eclipse.jpt.jpa.db.ConnectionProfile;
+import org.eclipse.jpt.jpa.db.Schema;
+import org.eclipse.jpt.jpa.db.SchemaContainer;
+import org.eclipse.jpt.jpa.ui.internal.JpaHelpContextIds;
+import org.eclipse.jpt.jpa.ui.internal.JptUiMessages;
+import org.eclipse.jpt.jpa.ui.internal.properties.JpaProjectPropertiesPage;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Link;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.dialogs.PreferencesUtil;
+
+/**
+ * Most of the behavior is in DatabaseGroup....
+ *
+ * We open the wizard page with the JPA project's connection profile and
+ * default schema selected (if possible), but then the selections are driven
+ * by the user. If the user re-selects the JPA project's connection profile,
+ * we will pre-select the project's default schema if possible.
+ */
+public class DatabaseSchemaWizardPage extends WizardPage {
+
+ final JpaProject jpaProject;
+
+ private final ListenerList<Listener> listenerList = new ListenerList<Listener>(Listener.class);
+
+ private DatabaseGroup databaseGroup;
+
+
+ public DatabaseSchemaWizardPage(JpaProject jpaProject) {
+ super("Database Schema"); //$NON-NLS-1$
+ if (jpaProject == null) {
+ throw new NullPointerException();
+ }
+ this.jpaProject = jpaProject;
+ this.setTitle(JptUiMessages.DatabaseSchemaWizardPage_title);
+ this.setMessage(JptUiMessages.DatabaseSchemaWizardPage_desc);
+ }
+
+ public void createControl(Composite parent) {
+ this.setPageComplete(false);
+ this.setControl(this.buildTopLevelControl(parent));
+ }
+
+ private Control buildTopLevelControl(Composite parent) {
+ Composite composite = new Composite(parent, SWT.NULL);
+ composite.setLayout(new GridLayout());
+ this.databaseGroup = new DatabaseGroup(composite);
+ Dialog.applyDialogFont(parent);
+ PlatformUI.getWorkbench().getHelpSystem().setHelp(composite, JpaHelpContextIds.PROPERTIES_JAVA_PERSISTENCE_CONNECTION);
+ return composite;
+ }
+
+ public ConnectionProfile getJpaProjectConnectionProfile() {
+ return this.jpaProject.getConnectionProfile();
+ }
+
+ public Schema getSelectedSchema() {
+ return this.databaseGroup.getSelectedSchema();
+ }
+
+ @Override
+ public void dispose() {
+ this.databaseGroup.dispose();
+ super.dispose();
+ }
+
+
+ // ********** listeners **********
+
+ public void addListener(Listener listener) {
+ this.listenerList.add(listener);
+ }
+
+ public void removeListener(Listener listener) {
+ this.listenerList.remove(listener);
+ }
+
+ void fireSchemaChanged(Schema schema) {
+ this.setPageComplete(schema != null);
+ for (Listener listener : this.listenerList.getListeners()) {
+ listener.selectedSchemaChanged(schema);
+ }
+ }
+
+
+ // ********** listener interface **********
+
+ /**
+ * Allows clients to listen for changes to the selected connection profile
+ * and schema.
+ */
+ public interface Listener extends EventListener {
+ void selectedSchemaChanged(Schema schema);
+ }
+
+
+ // ********** database group **********
+
+ /**
+ * schema combo-box
+ * add project connection link
+ * reconnect link
+ */
+ class DatabaseGroup {
+
+ // these are kept in synch with the selection
+ private Schema selectedSchema;
+
+ private final Combo schemaComboBox;
+
+ private final Link reconnectLink;
+
+ private Link addJpaProjectConnectionLink;
+
+ private final ConnectionListener connectionListener;
+
+
+ // ********** construction **********
+
+ DatabaseGroup(Composite composite) {
+ super();
+
+ Group group = new Group(composite, SWT.NONE);
+ group.setLayout(new GridLayout(2, false)); // false = do not make columns equal width
+ group.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+ group.setText(JptUiMessages.DatabaseSchemaWizardPage_schemaSettings);
+ // TODO PlatformUI.getWorkbench().getHelpSystem().setHelp(this.group, JpaHelpContextIds.XXX);
+
+ // schema combo-box
+ this.buildLabel(group, 1, JptUiMessages.DatabaseSchemaWizardPage_schema);
+ this.schemaComboBox = this.buildComboBox(group, this.buildSchemaComboBoxSelectionListener());
+
+ String message = (this.projectHasAConnection()) ?
+ JptUiMessages.DatabaseSchemaWizardPage_schemaInfo :
+ JptUiMessages.DatabaseSchemaWizardPage_connectionInfo;
+
+ this.buildLabel(group, 2, message);
+
+ // add project's connection link
+ if( ! this.projectHasAConnection()) {
+ this.addJpaProjectConnectionLink = this.buildLink(group,
+ JptUiMessages.DatabaseSchemaWizardPage_addConnectionToProject,
+ this.buildAddJpaProjectConnectionLinkListener());
+ }
+
+ // reconnect link
+ this.reconnectLink = this.buildLink(group, JptUiMessages.DatabaseSchemaWizardPage_connectLink, this.buildReconnectLinkSelectionListener());
+ this.reconnectLink.setEnabled(true);
+
+ this.selectedSchema = this.getDefaultSchema();
+
+ if (this.selectedSchema != null) {
+ DatabaseSchemaWizardPage.this.fireSchemaChanged(this.selectedSchema);
+ }
+
+ this.connectionListener = this.buildConnectionListener();
+ this.addJpaProjectConnectionProfileListener(this.connectionListener);
+
+ this.updateSchemaComboBox();
+ this.updateReconnectLink();
+ }
+
+
+ // ********** intra-wizard methods **********
+
+ Schema getSelectedSchema() {
+ return this.selectedSchema;
+ }
+
+ void dispose() {
+ if(this.projectHasAConnection()) {
+ this.getJpaProjectConnectionProfile().removeConnectionListener(this.connectionListener);
+ }
+ }
+
+
+ // ********** internal methods **********
+
+ void addJpaProjectConnectionListener() {
+ this.addJpaProjectConnectionProfileListener(this.connectionListener);
+ }
+
+
+ private void addJpaProjectConnectionProfileListener(ConnectionListener listener) {
+ if(this.projectHasAConnection()) {
+ this.getJpaProjectConnectionProfile().addConnectionListener(listener);
+ }
+ }
+
+ private boolean projectHasAConnection() {
+ return this.getJpaProjectConnectionProfile() != null;
+ }
+
+ /**
+ * this can return null;
+ * called at start-up and when the selected connection profile changes
+ */
+ private ConnectionProfile getJpaProjectConnectionProfile() {
+ return DatabaseSchemaWizardPage.this.jpaProject.getConnectionProfile();
+ }
+
+ /**
+ * this can return null;
+ * called at start-up and when the selected connection profile changes
+ */
+ private Schema getDefaultSchema() {
+ return DatabaseSchemaWizardPage.this.jpaProject.getDefaultDbSchema();
+ }
+
+ private SchemaContainer getDefaultSchemaContainer() {
+ return DatabaseSchemaWizardPage.this.jpaProject.getDefaultDbSchemaContainer();
+ }
+
+ /**
+ * called at start-up and when the selected connection profile changes
+ */
+ private void updateReconnectLink() {
+ this.reconnectLink.setEnabled(this.reconnectLinkCanBeEnabled());
+ }
+
+ void updateAddJpaProjectConnectionLink() {
+ this.addJpaProjectConnectionLink.setEnabled(this.addJpaProjectConnectionLinkCanBeEnabled());
+ }
+
+ private boolean reconnectLinkCanBeEnabled() {
+ if(this.projectHasAConnection()) {
+ return this.getJpaProjectConnectionProfile().isInactive();
+ }
+ return false;
+ }
+
+ private boolean addJpaProjectConnectionLinkCanBeEnabled() {
+ return ! this.projectHasAConnection();
+ }
+
+ /**
+ * the schema combo-box is updated at start-up and
+ * when the selected connection profile changes
+ */
+ private void updateSchemaComboBox() {
+ this.schemaComboBox.removeAll();
+ for (String name : this.getSchemaNames()) {
+ this.schemaComboBox.add(name);
+ }
+ // the current schema *should* be in the current connection profile
+ if (this.selectedSchema != null) {
+ this.schemaComboBox.select(this.schemaComboBox.indexOf(this.selectedSchema.getName()));
+ }
+ }
+
+ private Iterable<String> getSchemaNames() {
+ SchemaContainer sc = this.getDefaultSchemaContainer();
+ // use schema *names* since the combo-box is read-only
+ return (sc != null) ? sc.getSortedSchemaNames() : EmptyIterable.<String>instance();
+ }
+
+ // ********** listener callbacks **********
+
+ void selectedSchemaChanged() {
+ Schema old = this.selectedSchema;
+ this.selectedSchema = this.getDefaultSchemaContainer().getSchemaNamed(this.schemaComboBox.getText());
+ if (this.selectedSchema != old) {
+ DatabaseSchemaWizardPage.this.fireSchemaChanged(this.selectedSchema);
+ }
+ }
+
+ void reconnect() {
+ this.getJpaProjectConnectionProfile().connect();
+ // everything should be synchronized when we get the resulting open event
+ }
+
+ /**
+ * called when
+ * - a connection is set to the Jpa project
+ * - the connection was opened
+ * - the connection was closed (never happens?)
+ * we need to update the schema stuff and the reconnect link
+ */
+ void connectionChanged() {
+ Schema old = this.selectedSchema;
+ this.selectedSchema = this.getDefaultSchema();
+ if (this.selectedSchema != old) {
+ DatabaseSchemaWizardPage.this.fireSchemaChanged(this.selectedSchema);
+ }
+ this.updateSchemaComboBox();
+ this.updateReconnectLink();
+ }
+
+
+ // ********** listeners **********
+
+ private SelectionListener buildSchemaComboBoxSelectionListener() {
+ return new SelectionListener() {
+ public void widgetDefaultSelected(SelectionEvent event) {
+ // nothing special for "default" (double-click?)
+ this.widgetSelected(event);
+ }
+ public void widgetSelected(SelectionEvent event) {
+ DatabaseGroup.this.selectedSchemaChanged();
+ }
+ @Override
+ public String toString() {
+ return "DatabaseSchemaWizardPage schema combo-box selection listener"; //$NON-NLS-1$
+ }
+ };
+ }
+
+ private SelectionListener buildReconnectLinkSelectionListener() {
+ return new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent event) {
+ DatabaseGroup.this.reconnect();
+ }
+ @Override
+ public String toString() {
+ return "DatabaseSchemaWizardPage reconnect link selection listener"; //$NON-NLS-1$
+ }
+ };
+ }
+
+ private ConnectionListener buildConnectionListener() {
+ return new ConnectionAdapter() {
+ @Override
+ public void opened(ConnectionProfile cp) {
+ this.connectionChanged();
+ }
+ @Override // this probably won't ever get called...
+ public void closed(ConnectionProfile cp) {
+ this.connectionChanged();
+ }
+ private void connectionChanged() {
+ Display.getDefault().asyncExec(
+ new Runnable() {
+ public void run() {
+ DatabaseGroup.this.connectionChanged();
+ }
+ }
+ );
+ }
+ @Override
+ public String toString() {
+ return "DatabaseSchemaWizardPage connection listener"; //$NON-NLS-1$
+ }
+ };
+ }
+
+ private SelectionListener buildAddJpaProjectConnectionLinkListener() {
+ return new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ DatabaseGroup.this.promptToConfigJpaProjectConnection();
+
+ DatabaseGroup.this.addJpaProjectConnectionListener();
+ DatabaseGroup.this.updateAddJpaProjectConnectionLink();
+ DatabaseGroup.this.connectionChanged();
+ }
+ @Override
+ public String toString() {
+ return "DatabaseSchemaWizardPage AddProjectConnection link selection listener"; //$NON-NLS-1$
+ }
+ };
+ }
+
+ void promptToConfigJpaProjectConnection() {
+ PreferenceDialog dialog =
+ PreferencesUtil.createPropertyDialogOn(
+ getShell(), DatabaseSchemaWizardPage.this.jpaProject.getProject(),
+ JpaProjectPropertiesPage.PROP_ID,
+ null,
+ null);
+ dialog.open();
+ }
+
+ // ********** UI components **********
+
+ /**
+ * build and return a label
+ */
+ private Label buildLabel(Composite parent, int span, String text) {
+ Label label = new Label(parent, SWT.NONE);
+ label.setText(text);
+ GridData gd = new GridData();
+ gd.horizontalSpan = span;
+ label.setLayoutData(gd);
+ return label;
+ }
+
+ /**
+ * build and return a combo-box
+ */
+ private Combo buildComboBox(Composite parent, SelectionListener listener) {
+ Combo combo = new Combo(parent, SWT.BORDER | SWT.READ_ONLY);
+ combo.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+ combo.addSelectionListener(listener);
+ return combo;
+ }
+
+ /**
+ * build and return a link
+ */
+ private Link buildLink(Composite parent, String text, SelectionListener listener) {
+ Link link = new Link(parent, SWT.NONE);
+ GridData data = new GridData(GridData.END, GridData.CENTER, false, false);
+ data.horizontalSpan = 2;
+ link.setLayoutData(data);
+ link.setText(text);
+ link.addSelectionListener(listener);
+ return link;
+ }
+
+ }
+
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/JpaFacetActionPage.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/JpaFacetActionPage.java
new file mode 100644
index 0000000000..118c02928a
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/JpaFacetActionPage.java
@@ -0,0 +1,203 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2010 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.ui.internal.wizards;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jpt.jpa.core.internal.facet.JpaFacetDataModelProperties;
+import org.eclipse.jpt.jpa.ui.JptJpaUiPlugin;
+import org.eclipse.jpt.jpa.ui.internal.JpaHelpContextIds;
+import org.eclipse.jpt.jpa.ui.internal.JptUiIcons;
+import org.eclipse.jpt.jpa.ui.internal.JptUiMessages;
+import org.eclipse.jst.common.project.facet.core.libprov.LibraryInstallDelegate;
+import org.eclipse.jst.common.project.facet.ui.libprov.LibraryProviderFrameworkUi;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.help.IWorkbenchHelpSystem;
+import org.eclipse.wst.common.project.facet.core.IFacetedProjectWorkingCopy;
+import org.eclipse.wst.common.project.facet.core.events.IFacetedProjectEvent;
+import org.eclipse.wst.common.project.facet.core.events.IFacetedProjectListener;
+import org.eclipse.wst.common.project.facet.ui.ModifyFacetedProjectWizard;
+import org.eclipse.wst.web.ui.internal.wizards.DataModelFacetInstallPage;
+
+public abstract class JpaFacetActionPage
+ extends DataModelFacetInstallPage
+ implements JpaFacetDataModelProperties
+{
+ protected JpaFacetActionPage(String pageName) {
+ super(pageName);
+ setTitle(JptUiMessages.JpaFacetWizardPage_title);
+ setDescription(JptUiMessages.JpaFacetWizardPage_description);
+ setImageDescriptor(JptJpaUiPlugin.getImageDescriptor(JptUiIcons.JPA_WIZ_BANNER));
+ }
+
+
+ @Override
+ protected Composite createTopLevelComposite(Composite parent) {
+ Composite composite = new Composite(parent, SWT.NULL);
+ GridLayout layout = new GridLayout();
+ composite.setLayout(layout);
+
+ addSubComposites(composite);
+
+ setUpRuntimeListener();
+
+ Dialog.applyDialogFont(parent);
+ PlatformUI.getWorkbench().getHelpSystem().setHelp(parent, JpaHelpContextIds.DIALOG_JPA_FACET);
+
+ return composite;
+ }
+
+ protected abstract void addSubComposites(Composite composite);
+
+ private void setUpRuntimeListener() {
+ final IFacetedProjectWorkingCopy wc = ( (ModifyFacetedProjectWizard) getWizard() ).getFacetedProjectWorkingCopy();
+ // must do it manually the first time
+ model.setProperty(RUNTIME, wc.getPrimaryRuntime());
+ wc.addListener(
+ new IFacetedProjectListener() {
+ public void handleEvent( final IFacetedProjectEvent event ) {
+ model.setProperty(RUNTIME, wc.getPrimaryRuntime());
+ }
+ },
+ IFacetedProjectEvent.Type.PRIMARY_RUNTIME_CHANGED
+ );
+ }
+
+ protected Button createButton(Composite container, int span, String text, int style) {
+ Button button = new Button(container, SWT.NONE | style);
+ button.setText(text);
+ GridData gd = new GridData();
+ gd.horizontalSpan = span;
+ button.setLayoutData(gd);
+ return button;
+ }
+
+ protected Combo createCombo(Composite container, int span, boolean fillHorizontal) {
+ Combo combo = new Combo(container, SWT.BORDER | SWT.SINGLE | SWT.READ_ONLY);
+ GridData gd;
+ if (fillHorizontal) {
+ gd = new GridData(GridData.FILL_HORIZONTAL);
+ }
+ else {
+ gd = new GridData();
+ }
+ gd.horizontalSpan = span;
+ combo.setLayoutData(gd);
+ return combo;
+ }
+
+ @Override
+ protected String[] getValidationPropertyNames() {
+ return new String[] {
+ PLATFORM,
+ CONNECTION,
+ USER_WANTS_TO_OVERRIDE_DEFAULT_CATALOG,
+ USER_OVERRIDE_DEFAULT_CATALOG,
+ USER_WANTS_TO_OVERRIDE_DEFAULT_SCHEMA,
+ USER_OVERRIDE_DEFAULT_SCHEMA,
+ DISCOVER_ANNOTATED_CLASSES,
+ LIBRARY_PROVIDER_DELEGATE
+ };
+ }
+
+ @Override
+ public boolean isPageComplete() {
+ if (! super.isPageComplete()) {
+ return false;
+ }
+ else {
+ IStatus status = model.validate();
+ if (status.getSeverity() == IStatus.ERROR) {
+ setErrorMessage(status.getMessage());
+ return false;
+ };
+ setErrorMessage(null);
+ return true;
+ }
+ }
+
+ @Override
+ public void setVisible(boolean visible) {
+ super.setVisible(visible);
+ if (visible) {
+ setErrorMessage();
+ }
+ }
+
+ protected final IWorkbenchHelpSystem getHelpSystem() {
+ return PlatformUI.getWorkbench().getHelpSystem();
+ }
+
+
+ protected final class PlatformGroup
+ {
+ private final Combo platformCombo;
+
+
+ public PlatformGroup(Composite composite) {
+ Group group = new Group(composite, SWT.NONE);
+ group.setText(JptUiMessages.JpaFacetWizardPage_platformLabel);
+ group.setLayout(new GridLayout());
+ group.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+ PlatformUI.getWorkbench().getHelpSystem().setHelp(group, JpaHelpContextIds.DIALOG_JPA_PLATFORM);
+
+ platformCombo = createCombo(group, 1, true);
+ synchHelper.synchCombo(platformCombo, PLATFORM, null);
+ }
+ }
+
+
+ protected final class ClasspathConfigGroup
+ {
+ public ClasspathConfigGroup(Composite composite) {
+
+ final LibraryInstallDelegate librariesInstallDelegate
+ = (LibraryInstallDelegate) getDataModel().getProperty(LIBRARY_PROVIDER_DELEGATE);
+
+ final Composite librariesComposite
+ = (Composite) LibraryProviderFrameworkUi.createInstallLibraryPanel(
+ composite, librariesInstallDelegate,
+ JptUiMessages.JpaFacetWizardPage_jpaImplementationLabel );
+ librariesComposite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+ PlatformUI.getWorkbench().getHelpSystem().setHelp(librariesComposite, JpaHelpContextIds.NEW_JPA_PROJECT_CONTENT_PAGE_CLASSPATH);
+ }
+ }
+
+
+ protected final class PersistentClassManagementGroup
+ {
+ private final Button discoverClassesButton;
+
+ private final Button listClassesButton;
+
+
+ public PersistentClassManagementGroup(Composite composite) {
+ Group group = new Group(composite, SWT.NONE);
+ group.setText(JptUiMessages.JpaFacetWizardPage_persistentClassManagementLabel);
+ group.setLayout(new GridLayout());
+ group.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+ PlatformUI.getWorkbench().getHelpSystem().setHelp(group, JpaHelpContextIds.NEW_JPA_PROJECT_CONTENT_PAGE_CLASSPATH);
+
+ discoverClassesButton = createButton(group, 1, JptUiMessages.JpaFacetWizardPage_discoverClassesButton, SWT.RADIO);
+ synchHelper.synchRadio(discoverClassesButton, DISCOVER_ANNOTATED_CLASSES, null);
+
+ listClassesButton = createButton(group, 1, JptUiMessages.JpaFacetWizardPage_listClassesButton, SWT.RADIO);
+ synchHelper.synchRadio(listClassesButton, LIST_ANNOTATED_CLASSES, null);
+ }
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/JpaFacetInstallPage.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/JpaFacetInstallPage.java
new file mode 100644
index 0000000000..e6f4b843ac
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/JpaFacetInstallPage.java
@@ -0,0 +1,248 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2010 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.ui.internal.wizards;
+
+import org.eclipse.jpt.common.ui.internal.util.SWTUtil;
+import org.eclipse.jpt.common.utility.internal.ArrayTools;
+import org.eclipse.jpt.jpa.core.internal.facet.JpaFacetInstallDataModelProperties;
+import org.eclipse.jpt.jpa.db.ConnectionProfile;
+import org.eclipse.jpt.jpa.db.JptJpaDbPlugin;
+import org.eclipse.jpt.jpa.db.ui.internal.DTPUiTools;
+import org.eclipse.jpt.jpa.ui.internal.JpaHelpContextIds;
+import org.eclipse.jpt.jpa.ui.internal.JptUiMessages;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Link;
+import org.eclipse.ui.PlatformUI;
+
+public class JpaFacetInstallPage
+ extends JpaFacetActionPage
+ implements JpaFacetInstallDataModelProperties
+{
+ public JpaFacetInstallPage() {
+ super("jpt.jpa.facet.install.page"); //$NON-NLS-1$
+ }
+
+
+ @Override
+ protected Composite createTopLevelComposite(Composite parent) {
+ Composite composite = super.createTopLevelComposite(parent);
+ this.getHelpSystem().setHelp(composite, JpaHelpContextIds.NEW_JPA_PROJECT_JPA_FACET);
+ return composite;
+ }
+
+ @Override
+ protected void addSubComposites(Composite composite) {
+ new PlatformGroup(composite);
+ new ClasspathConfigGroup(composite);
+ new ConnectionGroup(composite);
+ new PersistentClassManagementGroup(composite);
+ new OrmXmlGroup(composite);
+ }
+
+ @Override
+ protected String[] getValidationPropertyNames() {
+ String[] validationPropertyNames = super.getValidationPropertyNames();
+ return ArrayTools.addAll(
+ validationPropertyNames,
+ USER_WANTS_TO_ADD_DB_DRIVER_JARS_TO_CLASSPATH,
+ DB_DRIVER_NAME);
+ }
+
+
+ protected final class ConnectionGroup
+ {
+ private final Combo connectionCombo;
+
+ private Link connectionLink;
+
+ private Link connectLink;
+
+ private final Button addDriverLibraryButton;
+
+ private final Label driverLibraryLabel;
+
+ private final Combo driverLibraryCombo;
+
+ private final Button overrideDefaultCatalogButton;
+
+ private final Label defaultCatalogLabel;
+
+ private final Combo defaultCatalogCombo;
+
+ private final Button overrideDefaultSchemaButton;
+
+ private final Label defaultSchemaLabel;
+
+ private final Combo defaultSchemaCombo;
+
+
+ public ConnectionGroup(Composite composite) {
+ Group group = new Group(composite, SWT.NONE);
+ group.setText(JptUiMessages.JpaFacetWizardPage_connectionLabel);
+ group.setLayout(new GridLayout(3, false));
+ group.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+ PlatformUI.getWorkbench().getHelpSystem().setHelp(group, JpaHelpContextIds.NEW_JPA_PROJECT_CONTENT_PAGE_DATABASE);
+
+ connectionCombo = createCombo(group, 3, true);
+ synchHelper.synchCombo(connectionCombo, CONNECTION, null);
+ connectionCombo.addSelectionListener(
+ new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ updateConnectionStatus();
+ }
+ });
+
+ connectionLink = new Link(group, SWT.NONE);
+ GridData data = new GridData(GridData.END, GridData.CENTER, false, false);
+ data.horizontalSpan = 2;
+ connectionLink.setLayoutData(data);
+ connectionLink.setText(JptUiMessages.JpaFacetWizardPage_connectionLink);
+ connectionLink.addSelectionListener(
+ new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ openNewConnectionWizard();
+ }
+ }
+ );
+
+ connectLink = new Link(group, SWT.NONE);
+ data = new GridData(GridData.END, GridData.CENTER, false, false);
+ data.horizontalSpan = 2;
+ connectLink.setLayoutData(data);
+ connectLink.setText(JptUiMessages.JpaFacetWizardPage_connectLink);
+ connectLink.setEnabled(false);
+ connectLink.addSelectionListener(
+ new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ openConnectionProfile();
+ }
+ });
+
+ addDriverLibraryButton = createButton(group, 3, JptUiMessages.JpaFacetWizardPage_addDriverLibraryLabel, SWT.CHECK);
+ addDriverLibraryButton.setSelection(false);
+ synchHelper.synchCheckbox(addDriverLibraryButton, USER_WANTS_TO_ADD_DB_DRIVER_JARS_TO_CLASSPATH, null);
+
+ driverLibraryLabel = new Label(group, SWT.LEFT);
+ driverLibraryLabel.setText(JptUiMessages.JpaFacetWizardPage_driverLibraryLabel);
+ GridData gd = new GridData();
+ gd.horizontalSpan = 1;
+ driverLibraryLabel.setLayoutData(gd);
+
+ driverLibraryCombo = createCombo(group, 1, true);
+ synchHelper.synchCombo(
+ driverLibraryCombo, DB_DRIVER_NAME,
+ new Control[] {driverLibraryLabel});
+
+ overrideDefaultCatalogButton = createButton(group, 3, JptUiMessages.JpaFacetWizardPage_overrideDefaultCatalogLabel, SWT.CHECK);
+ overrideDefaultCatalogButton.setSelection(false);
+ synchHelper.synchCheckbox(overrideDefaultCatalogButton, USER_WANTS_TO_OVERRIDE_DEFAULT_CATALOG, null);
+
+ defaultCatalogLabel = new Label(group, SWT.LEFT);
+ defaultCatalogLabel.setText(JptUiMessages.JpaFacetWizardPage_defaultCatalogLabel);
+ gd = new GridData();
+ gd.horizontalSpan = 1;
+ defaultCatalogLabel.setLayoutData(gd);
+
+ defaultCatalogCombo = createCombo(group, 1, true);
+ synchHelper.synchCombo(
+ defaultCatalogCombo, USER_OVERRIDE_DEFAULT_CATALOG,
+ new Control[] {defaultCatalogLabel});
+
+ overrideDefaultSchemaButton = createButton(group, 3, JptUiMessages.JpaFacetWizardPage_overrideDefaultSchemaLabel, SWT.CHECK);
+ overrideDefaultSchemaButton.setSelection(false);
+ synchHelper.synchCheckbox(overrideDefaultSchemaButton, USER_WANTS_TO_OVERRIDE_DEFAULT_SCHEMA, null);
+
+ defaultSchemaLabel = new Label(group, SWT.LEFT);
+ defaultSchemaLabel.setText(JptUiMessages.JpaFacetWizardPage_defaultSchemaLabel);
+ gd = new GridData();
+ gd.horizontalSpan = 1;
+ defaultSchemaLabel.setLayoutData(gd);
+
+ defaultSchemaCombo = createCombo(group, 1, true);
+ synchHelper.synchCombo(
+ defaultSchemaCombo, USER_OVERRIDE_DEFAULT_SCHEMA,
+ new Control[] {defaultSchemaLabel});
+ }
+
+ private void openNewConnectionWizard() {
+ String connectionName = DTPUiTools.createNewConnectionProfile();
+ if (connectionName != null) {
+ model.setProperty(CONNECTION, connectionName);
+ updateConnectionStatus();
+ }
+ }
+
+ private void openConnectionProfile() {
+ ConnectionProfile cp = getConnectionProfile();
+ if (cp != null) {
+ cp.connect();
+ model.setBooleanProperty(CONNECTION_ACTIVE, cp.isActive());
+ updateConnectionStatus();
+ }
+ }
+
+ private void updateConnectionStatus() {
+ ConnectionProfile cp = this.getConnectionProfile();
+ updateConnectLink(cp);
+ addDriverLibraryButton.setEnabled(cp != null);
+ }
+
+ private ConnectionProfile getConnectionProfile() {
+ // we just use the connection profile to log in, so go to the the db plug-in
+ return JptJpaDbPlugin.getConnectionProfileFactory().buildConnectionProfile(model.getStringProperty(CONNECTION));
+ }
+
+ private void updateConnectLink(ConnectionProfile cp) {
+ connectLink.setEnabled((cp != null) && cp.isDisconnected());
+ if (cp != null && cp.isConnected()) {
+ updateConnectLinkText(JptUiMessages.JpaFacetWizardPage_connectedText);
+ }
+ else {
+ updateConnectLinkText(JptUiMessages.JpaFacetWizardPage_connectLink);
+ }
+ }
+
+ private void updateConnectLinkText(String text) {
+ connectLink.setText(text);
+ SWTUtil.reflow(connectLink.getParent());
+ }
+ }
+
+
+ protected final class OrmXmlGroup
+ {
+ private final Button createOrmXmlButton;
+
+
+ public OrmXmlGroup(Composite composite) {
+ Composite group = new Composite(composite, SWT.NONE);
+ group.setLayout(new GridLayout());
+ group.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+ PlatformUI.getWorkbench().getHelpSystem().setHelp(group, JpaHelpContextIds.DIALOG_CREATE_ORM);
+
+ createOrmXmlButton = new Button(group, SWT.CHECK);
+ createOrmXmlButton.setText(JptUiMessages.JpaFacetWizardPage_createOrmXmlButton);
+ synchHelper.synchCheckbox(createOrmXmlButton, CREATE_ORM_XML, null);
+ }
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/JpaFacetVersionChangePage.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/JpaFacetVersionChangePage.java
new file mode 100644
index 0000000000..e0c5e8d14a
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/JpaFacetVersionChangePage.java
@@ -0,0 +1,44 @@
+/*******************************************************************************
+ * Copyright (c) 2009 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.ui.internal.wizards;
+
+import org.eclipse.swt.widgets.Composite;
+
+public class JpaFacetVersionChangePage
+ extends JpaFacetActionPage
+{
+ public JpaFacetVersionChangePage() {
+ super("jpt.jpa.facet.version-change.page"); //$NON-NLS-1$
+ }
+
+
+ @Override
+ protected Composite createTopLevelComposite(Composite parent) {
+ Composite composite = super.createTopLevelComposite(parent);
+ // TODO
+ //this.getHelpSystem().setHelp(composite, JpaHelpContextIds.NEW_JPA_PROJECT_JPA_FACET);
+ return composite;
+ }
+
+ @Override
+ protected void addSubComposites(Composite composite) {
+ new PlatformGroup(composite);
+ new ClasspathConfigGroup(composite);
+ //new ConnectionGroup(composite);
+ //new PersistentClassManagementGroup(composite);
+ }
+
+ @Override
+ protected String[] getValidationPropertyNames() {
+ // nothing new here *just* yet
+ return super.getValidationPropertyNames();
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/JpaMakePersistentWizard.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/JpaMakePersistentWizard.java
new file mode 100644
index 0000000000..73c7c2d5e7
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/JpaMakePersistentWizard.java
@@ -0,0 +1,79 @@
+/*******************************************************************************
+ * Copyright (c) 2010 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.ui.internal.wizards;
+
+import java.util.List;
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.jface.resource.LocalResourceManager;
+import org.eclipse.jface.resource.ResourceManager;
+import org.eclipse.jface.wizard.Wizard;
+import org.eclipse.jpt.jpa.core.JpaProject;
+import org.eclipse.jpt.jpa.core.JptJpaCorePlugin;
+import org.eclipse.jpt.jpa.core.context.persistence.Persistence;
+import org.eclipse.jpt.jpa.core.context.persistence.PersistenceUnit;
+import org.eclipse.jpt.jpa.core.context.persistence.PersistenceXml;
+import org.eclipse.jpt.jpa.ui.JptJpaUiPlugin;
+import org.eclipse.jpt.jpa.ui.internal.JptUiIcons;
+import org.eclipse.jpt.jpa.ui.internal.JptUiMessages;
+
+public class JpaMakePersistentWizard extends Wizard {
+
+ public static final String HELP_CONTEXT_ID = JptJpaUiPlugin.PLUGIN_ID + ".GenerateEntitiesFromSchemaWizard"; //$NON-NLS-1$
+
+
+ final List<IType> selectedTypes;
+
+ private JpaMakePersistentWizardPage makePersistentWizardPage;
+
+ protected final ResourceManager resourceManager;
+
+ public JpaMakePersistentWizard(List<IType> selectedTypes) {
+ super();
+ this.selectedTypes = selectedTypes;
+ this.resourceManager = new LocalResourceManager(JFaceResources.getResources());
+ this.setWindowTitle(JptUiMessages.JpaMakePersistentWizardPage_title);
+ this.setDefaultPageImageDescriptor(JptJpaUiPlugin.getImageDescriptor(JptUiIcons.ENTITY_WIZ_BANNER));
+ }
+
+ @Override
+ public void addPages() {
+ setForcePreviousAndNextButtons(true);
+
+ JpaProject jpaProject = JptJpaCorePlugin.getJpaProject(this.selectedTypes.get(0).getResource().getProject());
+ this.makePersistentWizardPage = new JpaMakePersistentWizardPage(jpaProject, this.selectedTypes, HELP_CONTEXT_ID);
+ this.addPage(this.makePersistentWizardPage);
+ return;
+ }
+
+ @Override
+ public boolean performFinish() {
+ this.makePersistentWizardPage.performFinish();
+ return true;
+ }
+
+ protected PersistenceUnit getPersistenceUnit(JpaProject jpaProject) {
+ PersistenceXml persistenceXml = jpaProject.getRootContextNode().getPersistenceXml();
+ if (persistenceXml != null) {
+ Persistence persistence = persistenceXml.getPersistence();
+ if (persistence != null && persistence.persistenceUnitsSize() > 0) {
+ return persistence.persistenceUnits().next();
+ }
+ }
+ return null;
+ }
+
+ @Override
+ public void dispose() {
+ this.resourceManager.dispose();
+ super.dispose();
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/JpaMakePersistentWizardPage.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/JpaMakePersistentWizardPage.java
new file mode 100644
index 0000000000..10da49bc40
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/JpaMakePersistentWizardPage.java
@@ -0,0 +1,635 @@
+/*******************************************************************************
+ * Copyright (c) 2010 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.ui.internal.wizards;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Iterator;
+import java.util.List;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.ui.JavaElementComparator;
+import org.eclipse.jdt.ui.JavaElementLabelProvider;
+import org.eclipse.jface.viewers.CellEditor;
+import org.eclipse.jface.viewers.ColumnLabelProvider;
+import org.eclipse.jface.viewers.ComboBoxViewerCellEditor;
+import org.eclipse.jface.viewers.EditingSupport;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.IStructuredContentProvider;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.jface.viewers.TableViewerColumn;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerComparator;
+import org.eclipse.jface.viewers.ViewerFilter;
+import org.eclipse.jface.window.Window;
+import org.eclipse.jface.wizard.WizardPage;
+import org.eclipse.jpt.common.core.JptCommonCorePlugin;
+import org.eclipse.jpt.common.core.JptResourceType;
+import org.eclipse.jpt.common.ui.internal.utility.swt.SWTTools;
+import org.eclipse.jpt.common.utility.internal.CollectionTools;
+import org.eclipse.jpt.common.utility.internal.Tools;
+import org.eclipse.jpt.common.utility.internal.iterables.FilteringIterable;
+import org.eclipse.jpt.common.utility.internal.iterables.TransformationIterable;
+import org.eclipse.jpt.common.utility.internal.model.value.AspectPropertyValueModelAdapter;
+import org.eclipse.jpt.common.utility.internal.model.value.SimplePropertyValueModel;
+import org.eclipse.jpt.common.utility.model.event.PropertyChangeEvent;
+import org.eclipse.jpt.common.utility.model.listener.PropertyChangeListener;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.common.utility.model.value.WritablePropertyValueModel;
+import org.eclipse.jpt.jpa.core.JpaProject;
+import org.eclipse.jpt.jpa.core.JptJpaCorePlugin;
+import org.eclipse.jpt.jpa.core.MappingKeys;
+import org.eclipse.jpt.jpa.core.context.JpaRootContextNode;
+import org.eclipse.jpt.jpa.core.context.PersistentType;
+import org.eclipse.jpt.jpa.core.context.java.JavaTypeMappingDefinition;
+import org.eclipse.jpt.jpa.core.context.orm.EntityMappings;
+import org.eclipse.jpt.jpa.core.context.persistence.Persistence;
+import org.eclipse.jpt.jpa.core.context.persistence.PersistenceUnit;
+import org.eclipse.jpt.jpa.core.context.persistence.PersistenceXml;
+import org.eclipse.jpt.jpa.core.resource.java.JavaResourcePersistentType;
+import org.eclipse.jpt.jpa.core.resource.xml.JpaXmlResource;
+import org.eclipse.jpt.jpa.ui.JpaPlatformUi;
+import org.eclipse.jpt.jpa.ui.details.MappingUiDefinition;
+import org.eclipse.jpt.jpa.ui.internal.JptUiMessages;
+import org.eclipse.jpt.jpa.ui.internal.jface.XmlMappingFileViewerFilter;
+import org.eclipse.jpt.jpa.ui.internal.platform.JpaPlatformUiRegistry;
+import org.eclipse.jpt.jpa.ui.internal.wizards.entity.EntityWizardMsg;
+import org.eclipse.jpt.jpa.ui.internal.wizards.orm.MappingFileWizard;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Link;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.model.WorkbenchContentProvider;
+import org.eclipse.ui.model.WorkbenchLabelProvider;
+
+public class JpaMakePersistentWizardPage extends WizardPage {
+
+ // sizing constants
+ private final static int TABLE_HEIGHT = 250;
+ private final static int TABLE_WIDTH = 300;
+
+ private static String MAKE_PERSISTENT_PAGE_NAME = "MakePersistent"; //$NON-NLS-1$
+ private TableViewer classTableViewer;
+ private final String helpContextId;
+
+ private final Type[] selectedTypes;
+
+ private final JpaProject jpaProject;
+ private JptResourceType jptResourceType;
+
+ private final WritablePropertyValueModel<Boolean> annotateInJavaModel;
+
+ private boolean isFirstCheck = true;
+ private final WritablePropertyValueModel<String> mappingFileModel;
+
+ private final WritablePropertyValueModel<Boolean> listInPersistenceXmlModel;
+
+ protected JpaMakePersistentWizardPage(final JpaProject jpaProject, final List<IType> selectedTypes, final String helpContextId) {
+ super(MAKE_PERSISTENT_PAGE_NAME);
+ this.jpaProject = jpaProject;
+
+ this.selectedTypes = this.buildTypes(selectedTypes);
+ this.jptResourceType = JptCommonCorePlugin.JAVA_SOURCE_RESOURCE_TYPE;
+ this.helpContextId = helpContextId;
+ this.annotateInJavaModel = new SimplePropertyValueModel<Boolean>(Boolean.TRUE);
+ this.mappingFileModel = new SimplePropertyValueModel<String>();
+ this.listInPersistenceXmlModel = new SimplePropertyValueModel<Boolean>(Boolean.valueOf(!this.jpaProject.discoversAnnotatedClasses()));
+ this.setTitle(JptUiMessages.JpaMakePersistentWizardPage_title);
+ this.setMessage(JptUiMessages.JpaMakePersistentWizardPage_message);
+ }
+
+ protected Type[] buildTypes(final List<IType> selectedTypes) {
+ return CollectionTools.list(
+ new TransformationIterable<IType, Type>(nonPersistentTypes(selectedTypes)) {
+ @Override
+ protected Type transform(IType jdtType) {
+ return new Type(jdtType);
+ }
+ }).toArray(new Type[] {});
+ }
+
+ /**
+ * Return all ITypes that are not already persistent.
+ * Any root structure nodes means the type is already annotated,
+ * listed in persistence.xml, or listed in a mapping file
+ */
+ protected Iterable<IType> nonPersistentTypes(final List<IType> selectedTypes) {
+ return new FilteringIterable<IType>(selectedTypes) {
+ @Override
+ protected boolean accept(IType jdtType) {
+ return getJpaProject().getJpaFile((IFile) jdtType.getResource()).rootStructureNodesSize() == 0;
+ }
+ };
+ }
+
+ protected JpaProject getJpaProject() {
+ return this.jpaProject;
+ }
+
+ protected JpaPlatformUi getJpaPlatformUi() {
+ String platformId = this.getJpaProject().getJpaPlatform().getId();
+ return JpaPlatformUiRegistry.instance().getJpaPlatformUi(platformId);
+ }
+
+ public void createControl(Composite parent) {
+ Composite composite = new Composite(parent, SWT.NULL);
+ int nColumns= 1;
+ GridLayout layout = new GridLayout();
+ layout.numColumns = nColumns;
+ composite.setLayout(layout);
+ Button javaAnnotationButton = new Button(composite, SWT.RADIO);
+ javaAnnotationButton.setText(JptUiMessages.JpaMakePersistentWizardPage_annotateInJavaRadioButton);
+ javaAnnotationButton.addSelectionListener(new SelectionListener() {
+ public void widgetSelected(SelectionEvent e) {
+ JpaMakePersistentWizardPage.this.annotateInJavaModel.setValue(Boolean.TRUE);
+ JpaMakePersistentWizardPage.this.jptResourceType = JptCommonCorePlugin.JAVA_SOURCE_RESOURCE_TYPE;
+ }
+
+ public void widgetDefaultSelected(SelectionEvent e) {
+ this.widgetSelected(e);
+ }
+ });
+
+ Button mappingFileButton = new Button(composite, SWT.RADIO);
+ mappingFileButton.setText(JptUiMessages.JpaMakePersistentWizardPage_mappingFileRadioButton);
+ Composite mappingFileComposite = this.createMappingFileControl(composite);
+ GridData data = new GridData(GridData.FILL_HORIZONTAL);
+ data.grabExcessHorizontalSpace = true;
+ mappingFileComposite.setLayoutData(data);
+
+ mappingFileButton.addSelectionListener(new SelectionListener() {
+ public void widgetSelected(SelectionEvent e) {
+ JpaMakePersistentWizardPage.this.annotateInJavaModel.setValue(Boolean.FALSE);
+ if (JpaMakePersistentWizardPage.this.isFirstCheck) {
+ JpaMakePersistentWizardPage.this.mappingFileModel.setValue(JptJpaCorePlugin.DEFAULT_ORM_XML_RUNTIME_PATH.toString());
+ JpaMakePersistentWizardPage.this.isFirstCheck = false;
+ }
+ }
+
+ public void widgetDefaultSelected(SelectionEvent e) {
+ this.widgetSelected(e);
+ }
+ });
+
+
+ this.classTableViewer = new TableViewer(composite, SWT.BORDER | SWT.FULL_SELECTION | SWT.H_SCROLL | SWT.V_SCROLL);
+ this.classTableViewer.getTable().setLinesVisible(true);
+ this.classTableViewer.getTable().setHeaderVisible(true);
+ this.classTableViewer.setContentProvider(new TypeContentProvider());
+ this.classTableViewer.setComparator(new TypeComparator());
+ this.createTypeTableColumn();
+ this.createMappingTableColumn();
+ this.classTableViewer.setInput(this.selectedTypes);
+
+ data = new GridData(SWT.FILL, SWT.FILL, true, true);
+ data.heightHint = TABLE_HEIGHT;
+ data.widthHint = TABLE_WIDTH;
+ this.classTableViewer.getTable().setLayoutData(data);
+
+ final Button persistenceXmlCheckBox = new Button(composite, SWT.CHECK);
+ persistenceXmlCheckBox.setText(JptUiMessages.JpaMakePersistentWizardPage_listInPersistenceXmlCheckBox);
+ SWTTools.bind(this.listInPersistenceXmlModel, persistenceXmlCheckBox);
+ SWTTools.controlVisibleState(this.annotateInJavaModel, persistenceXmlCheckBox);
+
+ setControl(composite);
+
+ this.validate();
+ }
+
+ private Composite createMappingFileControl(Composite parent) {
+ Composite composite = new Composite(parent, SWT.NULL);
+ GridLayout layout = new GridLayout();
+ layout.numColumns = 3;
+ layout.marginLeft = 10;
+ composite.setLayout(layout);
+
+ Link mappingFileLink = new Link(composite, SWT.LEFT);
+ mappingFileLink.setText(JptUiMessages.JpaMakePersistentWizardPage_mappingFileLink);
+ mappingFileLink.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING));
+ mappingFileLink.addSelectionListener(
+ new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ openNewMappingFileWizard();
+ }
+ }
+ );
+
+ Text mappingFileText = this.createText(composite, 1);
+ SWTTools.bind(this.mappingFileModel, mappingFileText);
+ this.mappingFileModel.addPropertyChangeListener(PropertyValueModel.VALUE, new PropertyChangeListener() {
+ public void propertyChanged(PropertyChangeEvent event) {
+ JpaXmlResource ormXmlResource = getOrmXmlResource();
+ if (ormXmlResource == null) {
+ jptResourceType = JptJpaCorePlugin.ORM_XML_1_0_RESOURCE_TYPE; //just default to 1.0 orm resource type
+ }
+ else {
+ jptResourceType = ormXmlResource.getResourceType();
+ }
+ validate();
+ }
+ });
+
+ Button browseButton = new Button(composite, SWT.PUSH);
+ browseButton.setText(JptUiMessages.JpaMakePersistentWizardPage_mappingFileBrowseButton);
+ browseButton.addSelectionListener(new SelectionListener() {
+ public void widgetSelected(SelectionEvent e) {
+ mappingFileBrowseButtonPressed();
+ }
+
+ public void widgetDefaultSelected(SelectionEvent e) {
+ // Do nothing
+ }
+ });
+
+ SWTTools.controlEnabledState(new ListInOrmMappingFileModel(this.annotateInJavaModel), mappingFileLink, mappingFileText, browseButton);
+
+ return composite;
+ }
+
+ private Text createText(Composite container, int span) {
+ Text text = new Text(container, SWT.BORDER | SWT.SINGLE);
+ GridData gd = new GridData(GridData.FILL_HORIZONTAL);
+ gd.horizontalSpan = span;
+ gd.grabExcessHorizontalSpace = true;
+ text.setLayoutData(gd);
+ return text;
+ }
+
+ private void mappingFileBrowseButtonPressed() {
+ ViewerFilter filter = buildMappingFileDialogViewerFilter();
+ ITreeContentProvider contentProvider = new WorkbenchContentProvider();
+ ILabelProvider labelProvider = new WorkbenchLabelProvider();
+ SelectJpaOrmMappingFileDialog dialog = new SelectJpaOrmMappingFileDialog(getShell(), this.jpaProject.getProject(), labelProvider, contentProvider);
+ dialog.setTitle(EntityWizardMsg.MAPPING_XML_TITLE);
+ dialog.setMessage(EntityWizardMsg.CHOOSE_MAPPING_XML_MESSAGE);
+ dialog.addFilter(filter);
+
+ JpaXmlResource resource = this.jpaProject.getMappingFileXmlResource(new Path(getMappingFileLocation()));
+ IFile initialSelection = (resource != null) ? resource.getFile() : null;
+ dialog.setInput(this.jpaProject.getProject());
+
+ if (initialSelection != null) {
+ dialog.setInitialSelection(initialSelection);
+ }
+ if (dialog.open() == Window.OK) {
+ this.mappingFileModel.setValue(dialog.getChosenName());
+ //have to validate in case the file name did not actually change, but the xml file was created
+ validate();
+ }
+ }
+
+ /**
+ * This method create filter for the browse/add alternative mapping XML
+ * @return new instance of viewer filter for the SelectMappingXMLDialog
+ */
+ protected ViewerFilter buildMappingFileDialogViewerFilter() {
+ return new XmlMappingFileViewerFilter(this.jpaProject);
+ }
+
+ private void openNewMappingFileWizard() {
+ IPath path = MappingFileWizard.createNewMappingFile(
+ new StructuredSelection(this.jpaProject.getProject()),
+ getMappingFileName());
+ if (path != null) {
+ this.mappingFileModel.setValue(path.toString());
+ //have to validate in case the file name did not actually change, but the xml file was created
+ this.validate();
+ }
+ }
+
+ protected void createTypeTableColumn() {
+ TableViewerColumn column = new TableViewerColumn(this.classTableViewer, SWT.NONE);
+ column.getColumn().setWidth(200);
+ column.getColumn().setText(JptUiMessages.JpaMakePersistentWizardPage_typeTableColumn);
+ column.setLabelProvider(this.buildTypeColumnLabelProvider());
+ }
+
+ protected ColumnLabelProvider buildTypeColumnLabelProvider() {
+ return new TypeColumnLabelProvider();
+ }
+
+ protected void createMappingTableColumn() {
+ TableViewerColumn column;
+ column = new TableViewerColumn(this.classTableViewer, SWT.NONE);
+ column.getColumn().setWidth(200);
+ column.getColumn().setText(JptUiMessages.JpaMakePersistentWizardPage_mappingTableColumn);
+
+ column.setEditingSupport(new EditingSupport(this.classTableViewer) {
+ @Override
+ protected Object getValue(Object element) {
+ return getMappingUiDefinition(((Type) element).mappingKey);
+ }
+
+ @Override
+ protected void setValue(Object element, Object value) {
+ ((Type) element).setMappingKey(((MappingUiDefinition<?, ?>) value).getKey());
+ getViewer().update(element, null);
+ }
+
+ @Override
+ protected CellEditor getCellEditor(Object element) {
+ final ComboBoxViewerCellEditor comboCellEditor =
+ new ComboBoxViewerCellEditor((Composite) JpaMakePersistentWizardPage.this.classTableViewer.getControl());
+
+ comboCellEditor.setLabelProvider(buildMappingComboCellEditorLabelProvider());
+ comboCellEditor.setContentProvider(buildMappingComboCellEditorContentProvider());
+ comboCellEditor.setInput(element);
+ return comboCellEditor;
+ }
+
+ @Override
+ protected boolean canEdit(Object element) {
+ return true;
+ }
+ });
+
+ column.setLabelProvider(buildMappingColumnLabelProvider());
+ }
+
+ //The ComboBoxViewerCellEditor does not support the image, so no reason to implement getImage(Object)
+ protected ColumnLabelProvider buildMappingComboCellEditorLabelProvider() {
+ return new ColumnLabelProvider() {
+ @Override
+ public String getText(Object element) {
+ return ((MappingUiDefinition<?, ?>) element).getLabel();
+ }
+ };
+ }
+
+ protected IStructuredContentProvider buildMappingComboCellEditorContentProvider() {
+ return new IStructuredContentProvider() {
+ public Object[] getElements(Object inputElement) {
+ return CollectionTools.collection(((Type) inputElement).typeMappingUiDefinitions()).toArray();
+ }
+
+ public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+ //do nothing
+ }
+
+ public void dispose() {
+ //do nothing
+ }
+ };
+ }
+
+ protected ColumnLabelProvider buildMappingColumnLabelProvider() {
+ return new ColumnLabelProvider() {
+ @Override
+ public String getText(Object element) {
+ MappingUiDefinition<? extends PersistentType, ?> mappingUiDefinition = getMappingUiDefinition(((Type) element).mappingKey);
+ return mappingUiDefinition.getLabel();
+ }
+
+ @Override
+ public Image getImage(Object element) {
+ MappingUiDefinition<? extends PersistentType, ?> mappingUiDefinition = getMappingUiDefinition(((Type) element).mappingKey);
+ return mappingUiDefinition.getImage();
+ }
+ };
+ }
+
+ protected MappingUiDefinition<? extends PersistentType, ?> getMappingUiDefinition(String mappingKey) {
+ for (MappingUiDefinition<? extends PersistentType, ?> provider : typeMappingUiDefinitions(this.jptResourceType)) {
+ if (provider.getKey() == mappingKey) {
+ return provider;
+ }
+ }
+ throw new IllegalArgumentException();
+ }
+
+ protected Iterable<String> typeMappingKeys(Iterable<? extends MappingUiDefinition<? extends PersistentType, ?>> mappingUiDefinitions) {
+ return new TransformationIterable<MappingUiDefinition<? extends PersistentType, ?>, String>(mappingUiDefinitions) {
+ @Override
+ protected String transform(MappingUiDefinition<? extends PersistentType, ?> next) {
+ return next.getKey();
+ }
+ };
+ }
+
+ protected Iterable<? extends MappingUiDefinition<? extends PersistentType, ?>> typeMappingUiDefinitions(JptResourceType jpaResourceType) {
+ return CollectionTools.iterable(getJpaPlatformUi().typeMappingUiDefinitions(jpaResourceType));
+ }
+
+ protected void validate() {
+ String errorMessage = null;
+ if (this.selectedTypes.length == 0) {
+ errorMessage = JptUiMessages.JpaMakePersistentWizardPage_selectedTypesPersistentError;
+ }
+ else if (this.isAddToOrmMappingFile()) {
+ JpaXmlResource ormXmlResource = getOrmXmlResource();
+ if (ormXmlResource == null) {
+ errorMessage = JptUiMessages.JpaMakePersistentWizardPage_mappingFileDoesNotExistError;
+ }
+ else if (getJpaProject().getJpaFile(ormXmlResource.getFile()).rootStructureNodesSize() == 0) {
+ errorMessage = JptUiMessages.JpaMakePersistentWizardPage_mappingFileNotListedInPersistenceXmlError;
+ }
+ }
+ setErrorMessage(errorMessage);
+ setPageComplete(errorMessage == null);
+ }
+
+ @Override
+ public final void performHelp() {
+ PlatformUI.getWorkbench().getHelpSystem().displayHelp( this.helpContextId );
+ }
+
+ protected void performFinish() {
+ boolean modifiedPersistenceXml = false;
+ for (Type type : this.selectedTypes) {
+ modifiedPersistenceXml |= type.makePersistent();
+ }
+ if (modifiedPersistenceXml) {
+ try {
+ this.getJpaProject().getPersistenceXmlResource().save(null);
+ }
+ catch (IOException e) {
+ //ignore, file just won't get saved
+ }
+ }
+ }
+
+ protected JpaXmlResource getOrmXmlResource() {
+ return getJpaProject().getMappingFileXmlResource(new Path(getMappingFileLocation()));
+ }
+
+ protected EntityMappings getEntityMappings() {
+ JpaXmlResource xmlResource = getOrmXmlResource();
+ return (EntityMappings) getJpaProject().getJpaFile(xmlResource.getFile()).rootStructureNodes().next();
+ }
+
+ protected boolean isListInPersistenceXml() {
+ return this.listInPersistenceXmlModel.getValue().booleanValue();
+ }
+
+ protected boolean isAnnotateInJavaModel() {
+ return this.annotateInJavaModel.getValue().booleanValue();
+ }
+
+ protected boolean isAddToOrmMappingFile() {
+ return !isAnnotateInJavaModel();
+ }
+
+ protected String getMappingFileLocation() {
+ return this.mappingFileModel.getValue();
+ }
+
+ protected String getMappingFileName() {
+ return new File(getMappingFileLocation()).getName();
+ }
+
+ private class Type {
+
+ private final IType jdtType;
+
+ private String mappingKey;
+
+ protected Type(IType jdtType) {
+ super();
+ this.jdtType = jdtType;
+ this.mappingKey = MappingKeys.ENTITY_TYPE_MAPPING_KEY;
+ }
+
+ protected void setMappingKey(String mappingKey) {
+ this.mappingKey = mappingKey;
+ }
+
+ protected boolean makePersistent() {
+ if (JpaMakePersistentWizardPage.this.isAnnotateInJavaModel()) {
+ PersistenceUnit persistenceUnit = this.getPersistenceUnit();
+ JavaResourcePersistentType persistentType = getJavaResourcePersistentType();
+ persistentType.addAnnotation(getJavaTypeMappingDefinition(this.mappingKey).getAnnotationName());
+ if (JpaMakePersistentWizardPage.this.isListInPersistenceXml()) {
+ if (persistenceUnit != null) {
+ persistenceUnit.addSpecifiedClassRef(persistentType.getQualifiedName());
+ return true;
+ }
+ }
+ }
+ else {
+ JpaXmlResource ormXmlResource = getOrmXmlResource();
+ final EntityMappings entityMappings = getEntityMappings();
+ ormXmlResource.modify(new Runnable() {
+ public void run() {
+ entityMappings.addPersistentType(Type.this.mappingKey, Type.this.jdtType.getFullyQualifiedName());
+ }
+ });
+ }
+ return false;
+ }
+
+ protected Iterable<? extends MappingUiDefinition<? extends PersistentType, ?>> typeMappingUiDefinitions() {
+ return CollectionTools.iterable(getJpaPlatformUi().typeMappingUiDefinitions(jptResourceType));
+ }
+
+ protected JavaTypeMappingDefinition getJavaTypeMappingDefinition(String key) {
+ for (JavaTypeMappingDefinition definition : getJpaProject().getJpaPlatform().getJavaTypeMappingDefinitions()) {
+ if (Tools.valuesAreEqual(definition.getKey(), key)) {
+ return definition;
+ }
+ }
+ throw new IllegalArgumentException("Illegal type mapping key: " + key); //$NON-NLS-1$
+ }
+
+ protected JavaResourcePersistentType getJavaResourcePersistentType() {
+ return getJpaProject().getJavaResourcePersistentType(this.jdtType.getFullyQualifiedName());
+ }
+
+
+ protected PersistenceUnit getPersistenceUnit() {
+ Persistence p = this.getPersistence();
+ if (p == null) {
+ return null;
+ }
+ Iterator<PersistenceUnit> units = p.persistenceUnits();
+ return units.hasNext() ? units.next() : null;
+ }
+
+ protected Persistence getPersistence() {
+ PersistenceXml pxml = this.getPersistenceXml();
+ return (pxml == null) ? null : pxml.getPersistence();
+ }
+
+ protected PersistenceXml getPersistenceXml() {
+ JpaRootContextNode rcn = getJpaProject().getRootContextNode();
+ return (rcn == null) ? null : rcn.getPersistenceXml();
+ }
+ }
+
+ private final class TypeContentProvider implements IStructuredContentProvider
+ {
+ public Object[] getElements(Object inputElement){
+ return (Type[]) inputElement;
+ }
+
+ public void dispose(){}
+
+ public void inputChanged(Viewer viewer, Object oldInput, Object newInput){}
+
+ }
+
+ private final class TypeColumnLabelProvider extends ColumnLabelProvider
+ {
+ private final JavaElementLabelProvider javaElementLabelProvider =
+ new JavaElementLabelProvider(JavaElementLabelProvider.SHOW_POST_QUALIFIED
+ | JavaElementLabelProvider.SHOW_SMALL_ICONS
+ | JavaElementLabelProvider.SHOW_OVERLAY_ICONS);
+
+ @Override
+ public String getText(Object element) {
+ return this.javaElementLabelProvider.getText(((Type) element).jdtType);
+ }
+
+ @Override
+ public Image getImage(Object element) {
+ return this.javaElementLabelProvider.getImage(((Type) element).jdtType);
+ }
+ }
+
+ private final class TypeComparator extends ViewerComparator {
+ private final JavaElementComparator javaElementComparator = new JavaElementComparator();
+
+ @Override
+ public int compare(Viewer viewer, Object e1, Object e2) {
+ return this.javaElementComparator.compare(viewer, ((Type) e1).jdtType, ((Type) e2).jdtType);
+ }
+ }
+
+ static class ListInOrmMappingFileModel
+ extends AspectPropertyValueModelAdapter<Boolean, Boolean>
+ {
+ ListInOrmMappingFileModel(PropertyValueModel<Boolean> annotateInJavaModel) {
+ super(annotateInJavaModel);
+ }
+
+ @Override
+ protected Boolean buildValue_() {
+ return Boolean.valueOf(!this.subject.booleanValue());
+ }
+
+ @Override
+ protected void engageSubject_() {/*nothing*/}
+ @Override
+ protected void disengageSubject_() {/*nothing*/}
+ }
+
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/NewEntityDropDownAction.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/NewEntityDropDownAction.java
new file mode 100644
index 0000000000..dc5484761d
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/NewEntityDropDownAction.java
@@ -0,0 +1,261 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2010 IBM Corporation and others.
+ * 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:
+ * IBM Corporation - initial API and implementation
+ * Oracle - copied and modified from NewJavaEEDropDownAction and NewTypeDropDownAction
+ *******************************************************************************/
+package org.eclipse.jpt.jpa.ui.internal.wizards;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IExtensionPoint;
+import org.eclipse.core.runtime.Platform;
+
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Menu;
+import org.eclipse.swt.widgets.Shell;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.ActionContributionItem;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.action.IMenuCreator;
+import org.eclipse.jface.layout.PixelConverter;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.window.Window;
+import org.eclipse.jface.wizard.WizardDialog;
+import org.eclipse.jpt.jpa.ui.JptJpaUiPlugin;
+import org.eclipse.ui.INewWizard;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.IWorkbenchWindowPulldownDelegate2;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+
+import org.eclipse.jdt.ui.actions.AbstractOpenWizardAction;
+import org.eclipse.jdt.internal.ui.util.CoreUtility;
+
+
+/**
+ * A type wizard is added to the type drop down if it has a paramater 'javatype':
+ * <wizard
+ * name="My JPT Wizard"
+ * icon="icons/wiz.gif"
+ * category="mycategory"
+ * id="xx.MyWizard">
+ * <class class="org.xx.MyWizard">
+ * <parameter name="jptartifact" value="true"/>
+ * </class>
+ * <description>
+ * My JPT Wizard
+ * </description>
+ * </wizard>
+ */
+public class NewEntityDropDownAction extends Action implements IMenuCreator, IWorkbenchWindowPulldownDelegate2 {
+
+ public static class OpenJptWizardAction extends AbstractOpenWizardAction implements Comparable<Object> {
+
+ private final static String ATT_NAME = "name";//$NON-NLS-1$
+ private final static String ATT_CLASS = "class";//$NON-NLS-1$
+ private final static String ATT_ICON = "icon";//$NON-NLS-1$
+ private static final String TAG_DESCRIPTION = "description"; //$NON-NLS-1$
+
+ private IConfigurationElement fConfigurationElement;
+ private int menuIndex;
+
+ public OpenJptWizardAction(IConfigurationElement element) {
+ this.fConfigurationElement= element;
+ setText(element.getAttribute(ATT_NAME));
+
+ String description= getDescriptionFromConfig(this.fConfigurationElement);
+ setDescription(description);
+ setToolTipText(description);
+ setImageDescriptor(getIconFromConfig(this.fConfigurationElement));
+ setMenuIndex(getMenuIndexFromConfig(this.fConfigurationElement));
+ }
+
+ private String getDescriptionFromConfig(IConfigurationElement config) {
+ IConfigurationElement [] children = config.getChildren(TAG_DESCRIPTION);
+ if (children.length>=1) {
+ return children[0].getValue();
+ }
+ return ""; //$NON-NLS-1$
+ }
+
+ private ImageDescriptor getIconFromConfig(IConfigurationElement config) {
+ String iconName = config.getAttribute(ATT_ICON);
+ if (iconName != null) {
+ return AbstractUIPlugin.imageDescriptorFromPlugin(config.getContributor().getName(), iconName);
+ }
+ return null;
+ }
+
+ private int getMenuIndexFromConfig(IConfigurationElement config) {
+ IConfigurationElement[] classElements = config.getChildren(TAG_CLASS);
+ if (classElements.length > 0) {
+ for (IConfigurationElement classElement : classElements) {
+ IConfigurationElement[] paramElements = classElement.getChildren(TAG_PARAMETER);
+ for (IConfigurationElement paramElement : paramElements) {
+ if (ATT_MENUINDEX.equals(paramElement.getAttribute(TAG_NAME))) {
+ return Integer.parseInt(paramElement.getAttribute(TAG_VALUE));
+ }
+ }
+ }
+ }
+ return Integer.MAX_VALUE;
+ }
+
+ @Override
+ public void run() {
+ Shell shell = getShell();
+ try {
+ INewWizard wizard = createWizard();
+ wizard.init(PlatformUI.getWorkbench(), getSelection());
+
+ WizardDialog dialog = new WizardDialog(shell, wizard);
+ PixelConverter converter = new PixelConverter(JFaceResources.getDialogFont());
+ dialog.setMinimumPageSize(converter.convertWidthInCharsToPixels(70), converter.convertHeightInCharsToPixels(20));
+ dialog.create();
+ int res = dialog.open();
+
+ notifyResult(res == Window.OK);
+ } catch (CoreException e) {
+ JptJpaUiPlugin.log(e);
+ }
+ }
+
+ @Override
+ protected INewWizard createWizard() throws CoreException {
+ return (INewWizard) CoreUtility.createExtension(fConfigurationElement, ATT_CLASS);
+ }
+
+ public int getMenuIndex() {
+ return this.menuIndex;
+ }
+
+ public void setMenuIndex(int menuIndex) {
+ this.menuIndex = menuIndex;
+ }
+
+ public int compareTo(Object o) {
+ OpenJptWizardAction action = (OpenJptWizardAction) o;
+ return getMenuIndex() - action.getMenuIndex();
+ }
+
+ }
+
+
+
+ private final static String TAG_WIZARD = "wizard";//$NON-NLS-1$
+ private final static String ATT_JPTARTIFACT = "jptartifact";//$NON-NLS-1$
+
+ private final static String TAG_PARAMETER = "parameter";//$NON-NLS-1$
+ private final static String TAG_NAME = "name";//$NON-NLS-1$
+ private final static String TAG_VALUE = "value";//$NON-NLS-1$
+ protected final static String ATT_MENUINDEX = "menuIndex";//$NON-NLS-1$
+
+ private static final String PL_NEW = "newWizards"; //$NON-NLS-1$
+ private static final String TAG_CLASS = "class"; //$NON-NLS-1$
+
+ private Menu fMenu;
+
+ private Shell fWizardShell;
+
+ public NewEntityDropDownAction() {
+ this.fMenu= null;
+ setMenuCreator(this);
+ //PlatformUI.getWorkbench().getHelpSystem().setHelp(this, IJavaHelpContextIds.OPEN_CLASS_WIZARD_ACTION);
+ }
+
+ public void dispose() {
+ if (this.fMenu != null) {
+ this.fMenu.dispose();
+ this.fMenu= null;
+ }
+ }
+
+ public Menu getMenu(Menu parent) {
+ return null;
+ }
+
+ public Menu getMenu(Control parent) {
+ if (this.fMenu == null) {
+ this.fMenu = new Menu(parent);
+ OpenJptWizardAction[] actions = getActionFromDescriptors();
+ for (int i = 0; i < actions.length; i++) {
+ OpenJptWizardAction curr = actions[i];
+ curr.setShell(this.fWizardShell);
+ ActionContributionItem item = new ActionContributionItem(curr);
+ item.fill(this.fMenu, -1);
+ }
+
+ }
+ return this.fMenu;
+ }
+
+ @Override
+ public void run() {
+ getDefaultAction().run();
+ }
+
+ public Action getDefaultAction() {
+ Action[] actions = getActionFromDescriptors();
+ if (actions.length > 0)
+ return actions[0];
+ return null;
+ }
+
+ public static OpenJptWizardAction[] getActionFromDescriptors() {
+ ArrayList<OpenJptWizardAction> containers= new ArrayList<OpenJptWizardAction>();
+
+ IExtensionPoint extensionPoint = Platform.getExtensionRegistry().getExtensionPoint(PlatformUI.PLUGIN_ID, PL_NEW);
+ if (extensionPoint != null) {
+ IConfigurationElement[] elements = extensionPoint.getConfigurationElements();
+ for (int i = 0; i < elements.length; i++) {
+ IConfigurationElement element= elements[i];
+ if (element.getName().equals(TAG_WIZARD) && isJptArtifactWizard(element)) {
+ containers.add(new OpenJptWizardAction(element));
+ }
+ }
+ }
+ OpenJptWizardAction[] actions = containers.toArray(new OpenJptWizardAction[containers.size()]);
+ Arrays.sort(actions);
+ return actions;
+ }
+
+ private static boolean isJptArtifactWizard(IConfigurationElement element) {
+ IConfigurationElement[] classElements= element.getChildren(TAG_CLASS);
+ if (classElements.length > 0) {
+ for (int i= 0; i < classElements.length; i++) {
+ IConfigurationElement[] paramElements= classElements[i].getChildren(TAG_PARAMETER);
+ for (int k = 0; k < paramElements.length; k++) {
+ IConfigurationElement curr= paramElements[k];
+ if (ATT_JPTARTIFACT.equals(curr.getAttribute(TAG_NAME))) {
+ return Boolean.valueOf(curr.getAttribute(TAG_VALUE)).booleanValue();
+ }
+ }
+ }
+ }
+ return false;
+ }
+
+ public void init(IWorkbenchWindow window) {
+ fWizardShell= window.getShell();
+ }
+
+ public void run(IAction action) {
+ run();
+ }
+
+ public void selectionChanged(IAction action, ISelection selection) {
+ }
+
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/SelectJpaOrmMappingFileDialog.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/SelectJpaOrmMappingFileDialog.java
new file mode 100644
index 0000000000..244078cbb5
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/SelectJpaOrmMappingFileDialog.java
@@ -0,0 +1,146 @@
+/*******************************************************************************
+ * Copyright (c) 2010 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.ui.internal.wizards;
+
+import java.io.File;
+import org.eclipse.core.resources.IContainer;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.viewers.TreeSelection;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.jpt.common.core.JptCommonCorePlugin;
+import org.eclipse.jpt.jpa.ui.JptJpaUiPlugin;
+import org.eclipse.jpt.jpa.ui.internal.JptUiMessages;
+import org.eclipse.jpt.jpa.ui.internal.wizards.orm.MappingFileWizard;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Tree;
+import org.eclipse.ui.dialogs.ElementTreeSelectionDialog;
+
+public class SelectJpaOrmMappingFileDialog extends ElementTreeSelectionDialog
+{
+ private static final String META_INF = "META-INF";//$NON-NLS-1$
+ private static final String EMPTY = "";//$NON-NLS-1$
+ private static final char SLASH = '/';
+
+ private String xmlName = EMPTY;
+
+ private final IProject project;
+
+ private Label messageLabel;
+ private Tree treeWidget;
+
+ public SelectJpaOrmMappingFileDialog(Shell parent, IProject project, ILabelProvider labelProvider, ITreeContentProvider contentProvider) {
+ super(parent, labelProvider, contentProvider);
+ setAllowMultiple(false);
+ this.project = project;
+ }
+
+ @Override
+ protected Control createDialogArea(Composite parent) {
+ Composite composite = (Composite) super.createDialogArea(parent);
+ Button newButton = new Button(composite, SWT.PUSH);
+ newButton.setText(JptUiMessages.SelectJpaOrmMappingFileDialog_newButton);
+ GridData browseButtonData = new GridData(GridData.HORIZONTAL_ALIGN_END);
+ newButton.setLayoutData(browseButtonData);
+ newButton.addSelectionListener(new SelectionListener() {
+ public void widgetSelected(SelectionEvent e) {
+ openNewMappingFileWizard();
+ }
+
+ public void widgetDefaultSelected(SelectionEvent e) {
+ widgetSelected(e);
+ }
+ });
+ return composite;
+ }
+
+ @Override
+ protected Label createMessageArea(Composite composite) {
+ this.messageLabel = super.createMessageArea(composite);
+ return this.messageLabel;
+ }
+
+ @Override
+ protected TreeViewer createTreeViewer(Composite parent) {
+ TreeViewer treeViewer = super.createTreeViewer(parent);
+ this.treeWidget = treeViewer.getTree();
+ return treeViewer;
+ }
+ /**
+ * @return the name of the alternative mapping XML
+ */
+ public String getChosenName() {
+ String result = EMPTY;
+ Object element = getFirstResult();
+ if (element instanceof IContainer) {
+ IContainer container = (IContainer) element;
+ result = container.getFullPath().toString() + File.separatorChar + this.xmlName;
+ } else {
+ IFile f = (IFile) element;
+ result = f.getFullPath().toOSString();
+ }
+ result = removeRedundantSegmentFromName(result);
+ return result;
+ }
+
+ @Override
+ /*
+ * @see ElementTreeSelectionDialog#updateOKStatus(Composite)
+ */
+ protected void updateOKStatus() {
+ super.updateOKStatus();
+ TreeSelection selection = (TreeSelection)getTreeViewer().getSelection();
+ IResource selectedResource = (IResource) selection.getFirstElement();
+ if (selectedResource instanceof IFile) {
+ updateStatus(new Status(IStatus.OK, JptJpaUiPlugin.PLUGIN_ID, ""));
+ }
+ else {
+ updateStatus(new Status(IStatus.ERROR, JptJpaUiPlugin.PLUGIN_ID, ""));
+ }
+ }
+
+ /**
+ * This method is for internal purposes only
+ * @param input non formated path to the mapping XML
+ * @return the formated path to the mapping XML
+ */
+ private String removeRedundantSegmentFromName(String input) {
+ String output = input.substring(input.indexOf(META_INF));
+ output = output.replace(File.separatorChar, SLASH);
+ return output;
+ }
+
+
+ private void openNewMappingFileWizard() {
+ IPath path = MappingFileWizard.createNewMappingFile(new StructuredSelection(this.project), null);
+ if (path != null) {
+ //these are disabled if the tree is empty when the dialog is created.
+ this.messageLabel.setEnabled(true);
+ this.treeWidget.setEnabled(true);
+ IFile file = JptCommonCorePlugin.getPlatformFile(this.project, path);
+ getTreeViewer().setSelection(new StructuredSelection(file), true);
+ }
+ }
+} \ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/entity/AnnotatedEntityTemplate.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/entity/AnnotatedEntityTemplate.java
new file mode 100644
index 0000000000..a0c819c4af
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/entity/AnnotatedEntityTemplate.java
@@ -0,0 +1,166 @@
+package org.eclipse.jpt.jpa.ui.internal.wizards.entity;
+
+import org.eclipse.jpt.jpa.ui.internal.wizards.entity.data.model.*;
+import java.util.*;
+
+public class AnnotatedEntityTemplate
+{
+ protected static String nl;
+ public static synchronized AnnotatedEntityTemplate create(String lineSeparator)
+ {
+ nl = lineSeparator;
+ AnnotatedEntityTemplate result = new AnnotatedEntityTemplate();
+ nl = null;
+ return result;
+ }
+
+ public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+ protected final String TEXT_1 = "package ";
+ protected final String TEXT_2 = ";";
+ protected final String TEXT_3 = NL;
+ protected final String TEXT_4 = NL + "import ";
+ protected final String TEXT_5 = ";";
+ protected final String TEXT_6 = NL + NL + "/**" + NL + " * Entity implementation class for Entity: ";
+ protected final String TEXT_7 = NL + " *" + NL + " */";
+ protected final String TEXT_8 = NL;
+ protected final String TEXT_9 = "(name=\"";
+ protected final String TEXT_10 = "\")";
+ protected final String TEXT_11 = NL + "@Table(name=\"";
+ protected final String TEXT_12 = "\")";
+ protected final String TEXT_13 = NL;
+ protected final String TEXT_14 = NL + "@IdClass(";
+ protected final String TEXT_15 = ".class)";
+ protected final String TEXT_16 = NL + "public class ";
+ protected final String TEXT_17 = " extends ";
+ protected final String TEXT_18 = " implements ";
+ protected final String TEXT_19 = ", ";
+ protected final String TEXT_20 = " {" + NL + "" + NL + "\t";
+ protected final String TEXT_21 = " " + NL + "\t@Id";
+ protected final String TEXT_22 = NL + "\tprivate ";
+ protected final String TEXT_23 = " ";
+ protected final String TEXT_24 = ";";
+ protected final String TEXT_25 = NL + "\tprivate static final long serialVersionUID = 1L;" + NL + "" + NL + "\tpublic ";
+ protected final String TEXT_26 = "() {" + NL + "\t\tsuper();" + NL + "\t}";
+ protected final String TEXT_27 = " " + NL + "\t@Id ";
+ protected final String TEXT_28 = " " + NL + "\tpublic ";
+ protected final String TEXT_29 = " get";
+ protected final String TEXT_30 = "() {" + NL + "\t\treturn this.";
+ protected final String TEXT_31 = ";" + NL + "\t}" + NL + "" + NL + "\tpublic void set";
+ protected final String TEXT_32 = "(";
+ protected final String TEXT_33 = " ";
+ protected final String TEXT_34 = ") {" + NL + "\t\tthis.";
+ protected final String TEXT_35 = " = ";
+ protected final String TEXT_36 = ";" + NL + "\t}";
+ protected final String TEXT_37 = NL + " " + NL + "}";
+ protected final String TEXT_38 = NL;
+
+ public String generate(Object argument)
+ {
+ final StringBuffer stringBuffer = new StringBuffer();
+ CreateEntityTemplateModel model = (CreateEntityTemplateModel) argument;
+if (model.getJavaPackageName()!=null && model.getJavaPackageName()!="") {
+ stringBuffer.append(TEXT_1);
+ stringBuffer.append(model.getJavaPackageName());
+ stringBuffer.append(TEXT_2);
+ }
+ stringBuffer.append(TEXT_3);
+ Collection<String> imports = model.getImports(false);
+for (String anImport : imports) {
+ stringBuffer.append(TEXT_4);
+ stringBuffer.append(anImport);
+ stringBuffer.append(TEXT_5);
+ }
+ stringBuffer.append(TEXT_6);
+ stringBuffer.append(model.getEntityName());
+ stringBuffer.append(TEXT_7);
+ stringBuffer.append(TEXT_8);
+ stringBuffer.append(model.getArtifactType());
+ String ENTITY_NAME = model.getEntityName();
+if (model.isEntityNameSet()) {
+ stringBuffer.append(TEXT_9);
+ stringBuffer.append(ENTITY_NAME);
+ stringBuffer.append(TEXT_10);
+ }
+ if (model.isTableNameSet()) {
+ stringBuffer.append(TEXT_11);
+ stringBuffer.append(model.getTableName());
+ stringBuffer.append(TEXT_12);
+ }
+ stringBuffer.append(TEXT_13);
+ stringBuffer.append(model.getInheritanceStrategy());
+ if (model.isCompositePK()) {
+ stringBuffer.append(TEXT_14);
+ stringBuffer.append(model.getIdClassName());
+ stringBuffer.append(TEXT_15);
+ }
+ stringBuffer.append(TEXT_16);
+ stringBuffer.append(model.getClassName());
+ String superClass = model.getSuperclassName();
+ if (! "".equals(superClass)) {
+ stringBuffer.append(TEXT_17);
+ stringBuffer.append(superClass);
+ }
+
+ List<String> interfaces = model.getInterfaces();
+ if (interfaces.size()>0) {
+ stringBuffer.append(TEXT_18);
+ }
+ for (int i=0; i<interfaces.size(); i++) {
+ String INTERFACE = (String) interfaces.get(i);
+ if (i>0) {
+ stringBuffer.append(TEXT_19);
+ }
+ stringBuffer.append(INTERFACE);
+ }
+ stringBuffer.append(TEXT_20);
+ List<EntityRow> fields = model.getEntityFields();
+ List<String> pkFields = model.getPKFields();
+ for (EntityRow entity : fields) {
+ String NAME = entity.getName();
+ if (pkFields.contains(NAME) && model.isFieldAccess()) {
+
+ stringBuffer.append(TEXT_21);
+ }
+ stringBuffer.append(TEXT_22);
+ stringBuffer.append(entity.getType());
+ stringBuffer.append(TEXT_23);
+ stringBuffer.append(entity.getName());
+ stringBuffer.append(TEXT_24);
+ }
+ stringBuffer.append(TEXT_25);
+ stringBuffer.append(model.getClassName());
+ stringBuffer.append(TEXT_26);
+
+ fields = model.getEntityFields();
+ if (fields != null) for (int i=0; i<fields.size(); i++) {
+ EntityRow field = (EntityRow) fields.get(i);
+ String TYPE = field.getType();
+ String NAME = field.getName();
+ String METHOD = NAME.substring(0,1).toUpperCase() + NAME.substring(1);
+ if (pkFields.contains(NAME) && !model.isFieldAccess()) {
+
+ stringBuffer.append(TEXT_27);
+ }
+ stringBuffer.append(TEXT_28);
+ stringBuffer.append(TYPE);
+ stringBuffer.append(TEXT_29);
+ stringBuffer.append(METHOD);
+ stringBuffer.append(TEXT_30);
+ stringBuffer.append(NAME);
+ stringBuffer.append(TEXT_31);
+ stringBuffer.append(METHOD);
+ stringBuffer.append(TEXT_32);
+ stringBuffer.append(TYPE);
+ stringBuffer.append(TEXT_33);
+ stringBuffer.append(NAME);
+ stringBuffer.append(TEXT_34);
+ stringBuffer.append(NAME);
+ stringBuffer.append(TEXT_35);
+ stringBuffer.append(NAME);
+ stringBuffer.append(TEXT_36);
+ }
+ stringBuffer.append(TEXT_37);
+ stringBuffer.append(TEXT_38);
+ return stringBuffer.toString();
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/entity/EntityClassWizardPage.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/entity/EntityClassWizardPage.java
new file mode 100644
index 0000000000..2e1b9e5407
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/entity/EntityClassWizardPage.java
@@ -0,0 +1,408 @@
+/***********************************************************************
+ * Copyright (c) 2008, 2010 by SAP AG, Walldorf.
+ * 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:
+ * SAP AG - initial API and implementation
+ * Dimiter Dimitrov, d.dimitrov@sap.com - initial API and implementation
+ ***********************************************************************/
+package org.eclipse.jpt.jpa.ui.internal.wizards.entity;
+
+import java.io.File;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IFolder;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.IPackageFragmentRoot;
+import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.jem.util.emf.workbench.ProjectUtilities;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerFilter;
+import org.eclipse.jface.window.Window;
+import org.eclipse.jpt.common.core.internal.utility.jdt.JDTTools;
+import org.eclipse.jpt.common.utility.internal.ArrayTools;
+import org.eclipse.jpt.jpa.core.JpaFacet;
+import org.eclipse.jpt.jpa.core.JpaProject;
+import org.eclipse.jpt.jpa.core.JptJpaCorePlugin;
+import org.eclipse.jpt.jpa.core.resource.xml.JpaXmlResource;
+import org.eclipse.jpt.jpa.ui.internal.JpaHelpContextIds;
+import org.eclipse.jpt.jpa.ui.internal.jface.XmlMappingFileViewerFilter;
+import org.eclipse.jpt.jpa.ui.internal.wizards.SelectJpaOrmMappingFileDialog;
+import org.eclipse.jpt.jpa.ui.internal.wizards.entity.data.model.IEntityDataModelProperties;
+import org.eclipse.jpt.jpa.ui.internal.wizards.orm.MappingFileWizard;
+import org.eclipse.jst.j2ee.internal.common.operations.INewJavaClassDataModelProperties;
+import org.eclipse.jst.j2ee.internal.plugin.J2EEUIMessages;
+import org.eclipse.jst.j2ee.internal.wizard.NewJavaClassWizardPage;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.swt.widgets.Link;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.dialogs.ISelectionStatusValidator;
+import org.eclipse.ui.help.IWorkbenchHelpSystem;
+import org.eclipse.ui.model.WorkbenchContentProvider;
+import org.eclipse.ui.model.WorkbenchLabelProvider;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wst.common.frameworks.internal.plugin.WTPCommonPlugin;
+
+public class EntityClassWizardPage
+ extends NewJavaClassWizardPage {
+
+ private static final String EMPTY = "";//$NON-NLS-1$
+
+ private static final String SINGLE_TABLE = "SINGLE_TABLE";//$NON-NLS-1$
+ private static final String TABLE_PER_CLASS = "TABLE_PER_CLASS";//$NON-NLS-1$
+ private static final String JOINED = "JOINED";//$NON-NLS-1$
+ private static final String[] INHERITANCE_STRATEGIES =
+ new String[] {EMPTY, SINGLE_TABLE, TABLE_PER_CLASS, JOINED };
+ private Combo inheritanceStrategyCombo;
+ private Button entityButton;
+ private Button mapedAsSuperclassButton;
+ private Button inheritanceButton;
+ private Link displayNameLink;
+ private Button xmlSupportButton;
+ private boolean isFirstCheck = true;
+ private Text ormXmlName;
+ private Button browseButton;
+
+
+ public EntityClassWizardPage(
+ IDataModel model, String pageName, String pageDesc, String pageTitle) {
+
+ super(model, pageName, pageDesc, pageTitle, null);
+ }
+
+
+ @Override
+ protected String[] getValidationPropertyNames() {
+ return ArrayTools.addAll(
+ super.getValidationPropertyNames(),
+ new String[] {IEntityDataModelProperties.XML_NAME, IEntityDataModelProperties.XML_SUPPORT});
+ }
+
+ private IProject getProject() {
+ return (IProject) getDataModel().getProperty(INewJavaClassDataModelProperties.PROJECT);
+ }
+
+ /* Create top level composite (class properties) and add the entity's specific inheritance group
+ * @see org.eclipse.jst.j2ee.internal.wizard.NewJavaClassWizardPage#createTopLevelComposite(org.eclipse.swt.widgets.Composite)
+ */
+ @Override
+ protected Composite createTopLevelComposite(Composite parent) {
+ Composite composite = super.createTopLevelComposite(parent);
+ this.getHelpSystem().setHelp(composite, JpaHelpContextIds.NEW_JPA_ENTITY_ENTITY_CLASS);
+
+ createInheritanceControl(composite);
+ this.inheritanceButton.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ boolean isChecked = inheritanceButton.getSelection();
+ if (isChecked) {
+ entityButton.setSelection(true);
+ mapedAsSuperclassButton.setSelection(false);
+ }
+ inheritanceStrategyCombo.setEnabled(isChecked);
+ model.setBooleanProperty(IEntityDataModelProperties.ENTITY, true);
+ model.setBooleanProperty(IEntityDataModelProperties.MAPPED_AS_SUPERCLASS, false);
+ entityButton.setEnabled(!isChecked);
+ mapedAsSuperclassButton.setEnabled(!isChecked);
+ }
+ });
+ createXMLstorageControl(composite);
+ this.xmlSupportButton.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ boolean isChecked = xmlSupportButton.getSelection();
+ enableMappingXMLChooseGroup(isChecked);
+ if (isFirstCheck) {
+ ormXmlName.setText(JptJpaCorePlugin.DEFAULT_ORM_XML_RUNTIME_PATH.toString());
+ isFirstCheck = false;
+ }
+ }
+ });
+ return composite;
+ }
+
+ @Override
+ protected ISelectionStatusValidator getContainerDialogSelectionValidator() {
+ return new ISelectionStatusValidator() {
+ public IStatus validate(Object[] selection) {
+ if (selection != null && selection[0] != null) {
+ if (selection[0] instanceof IProject) {
+ IProject project = (IProject) selection[0];
+ IJavaProject javaProject = JavaCore.create(project);
+ for (IPackageFragmentRoot root : JDTTools.getJavaSourceFolders(javaProject)) {
+ if (project.equals(root.getResource())) {
+ return WTPCommonPlugin.OK_STATUS;
+ }
+ }
+ }
+ else {
+ return WTPCommonPlugin.OK_STATUS;
+ }
+ }
+ return WTPCommonPlugin.createErrorStatus(J2EEUIMessages.CONTAINER_SELECTION_DIALOG_VALIDATOR_MESG);
+ }
+ };
+ }
+
+ @Override
+ protected ViewerFilter getContainerDialogViewerFilter() {
+ return new ViewerFilter() {
+ @Override
+ public boolean select(Viewer viewer, Object parent, Object element) {
+ String projectName = (String) model.getProperty(IEntityDataModelProperties.PROJECT_NAME);
+ if (element instanceof IProject) {
+ IProject project = (IProject) element;
+ return project.getName().equals(projectName);
+ }
+ else if (element instanceof IFolder) {
+ IFolder folder = (IFolder) element;
+ // only show source folders
+ IProject project = ProjectUtilities.getProject(projectName);
+ IJavaProject javaProject = JavaCore.create(project);
+ for (IPackageFragmentRoot root : JDTTools.getJavaSourceFolders(javaProject)) {
+ if (folder.equals(root.getResource()))
+ return true;
+ }
+ }
+ return false;
+ }
+ };
+ }
+
+ /**
+ * Create the inheritance group
+ * @param parent the main composite
+ */
+ private void createInheritanceControl(Composite parent) {
+ Group group = createGroup(parent, EntityWizardMsg.INHERITANCE_GROUP);
+ this.entityButton = createRadioButton(group, EntityWizardMsg.ENTITY, IEntityDataModelProperties.ENTITY);
+ this.mapedAsSuperclassButton = createRadioButton(group, EntityWizardMsg.MAPPED_AS_SUPERCLASS, IEntityDataModelProperties.MAPPED_AS_SUPERCLASS);
+ this.inheritanceButton = createCheckButton(group, GridData.HORIZONTAL_ALIGN_FILL, 1/*horizontal span*/, EntityWizardMsg.INHERITANCE_CHECK_BOX, IEntityDataModelProperties.INHERITANCE);
+ createComboBox(group, IEntityDataModelProperties.INHERITANCE_STRATEGY);
+ }
+
+ /**
+ * Create the group, which manage entity mapping registration
+ * @param parent the main composite
+ */
+ private void createXMLstorageControl(Composite parent) {
+ Group group = createGroup(parent, EntityWizardMsg.XML_STORAGE_GROUP);
+ this.xmlSupportButton = createCheckButton(group, GridData.FILL_HORIZONTAL, 3/*horizontal span*/, EntityWizardMsg.XML_SUPPORT, IEntityDataModelProperties.XML_SUPPORT);
+ createBrowseGroup(group, EntityWizardMsg.CHOOSE_XML, IEntityDataModelProperties.XML_NAME);
+ this.ormXmlName.setEnabled(false);
+ this.browseButton.setEnabled(false);
+ }
+
+ /**
+ * @param parent the main composite
+ * @param text the name/title of the group
+ * @return the created group
+ */
+ private Group createGroup(Composite parent, String text) {
+ Group group = new Group(parent, SWT.NONE);
+ GridData groupGridData = new GridData(GridData.FILL_HORIZONTAL);
+ groupGridData.horizontalSpan = 3;
+ group.setLayoutData(groupGridData);
+ group.setLayout(new GridLayout(3, false));
+ group.setText(text);
+ return group;
+ }
+
+ /**
+ * Create radio button
+ * @param parent the main composite - inheritance group
+ * @param text the label of the button
+ * @param property the related property to which this button will be synchronized
+ * @return the created button
+ */
+ private Button createRadioButton(Composite parent, String text, String property) {
+ Button button = new Button(parent, SWT.RADIO);
+ GridData groupGridData = new GridData(GridData.FILL_HORIZONTAL);
+ groupGridData.horizontalSpan = 3;
+ button.setLayoutData(groupGridData);
+ button.setText(text);
+ this.synchHelper.synchRadio(button, property, /*dependentControls*/ null);
+ return button;
+ }
+
+ /**
+ * Create check button
+ * @param parent the main composite - inheritance group
+ * @param text the label of the button
+ * @param property the related property to which this button will be synchronized
+ * @return the created button
+ */
+ private Button createCheckButton(Composite parent, int fillStrategy, int horizontalSpan, String text, String property) {
+ final Button button = new Button(parent, SWT.CHECK);
+ GridData groupGridData = new GridData(fillStrategy);
+ groupGridData.horizontalSpan = horizontalSpan;
+ button.setLayoutData(groupGridData);
+ button.setText(text);
+ this.synchHelper.synchCheckbox(button, property, /*dependentControls*/ null);
+ return button;
+ }
+
+ /**
+ * Create combo box, which presents the set of possible inheritance strategies
+ * @param parent the main composite - inheritance group
+ * @param property the related property to which this button will be synchronized
+ * @return
+ */
+ private Combo createComboBox(Composite parent, String property) {
+ this.inheritanceStrategyCombo = new Combo(parent, SWT.BORDER | SWT.READ_ONLY);
+ GridData groupGridData = new GridData(GridData.FILL_HORIZONTAL);
+ groupGridData.horizontalSpan = 2;
+ this.inheritanceStrategyCombo.setLayoutData(groupGridData);
+ this.inheritanceStrategyCombo.setItems(INHERITANCE_STRATEGIES);
+ this.synchHelper.synchCombo(this.inheritanceStrategyCombo, property, /*dependentControls*/ null);
+ this.inheritanceStrategyCombo.setEnabled(false);
+ return this.inheritanceStrategyCombo;
+
+ }
+
+ /**
+ * Create XML group
+ * @param parent the main composite
+ * @param label the name of the group
+ * @param property the related property to which this group will be synchronized
+ * @return the created group
+ */
+ private void createBrowseGroup(Composite parent, String label, String property) {
+ Composite composite = new Composite(parent, SWT.NULL);
+ composite.setLayout(new GridLayout(3, false));
+ composite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+ this.displayNameLink = new Link(composite, SWT.LEFT);
+ this.displayNameLink.setText(label);
+ this.displayNameLink.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING));
+ this.displayNameLink.addSelectionListener(
+ new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ openNewMappingFileWizard();
+ }
+ }
+ );
+
+ this.ormXmlName = new Text(composite, SWT.SINGLE | SWT.BORDER);
+ this.ormXmlName.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+ this.browseButton = new Button(composite, SWT.PUSH);
+ this.browseButton.setText(EntityWizardMsg.BROWSE_BUTTON_LABEL);
+ GridData browseButtonData = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
+ browseButtonData.horizontalSpan = 1;
+ this.browseButton.setLayoutData(browseButtonData);
+ this.browseButton.addSelectionListener(new SelectionListener() {
+ public void widgetSelected(SelectionEvent e) {
+ handleChooseXmlButtonPressed();
+ }
+
+ public void widgetDefaultSelected(SelectionEvent e) {
+ widgetSelected(e);
+ }
+ });
+ this.synchHelper.synchText(this.ormXmlName, property, /*dependentControls*/null);
+
+ enableMappingXMLChooseGroup(false);
+ }
+
+ private void openNewMappingFileWizard() {
+ IProject project = getProject();
+ IPath path = MappingFileWizard.createNewMappingFile(new StructuredSelection(project), getMappingFileName());
+ if (path != null) {
+ this.model.setProperty(IEntityDataModelProperties.XML_NAME, path.toString());
+ //have to validate in case the file name did not actually change, but the xml file was created
+ validatePage();
+ }
+ }
+
+ protected String getMappingFileName() {
+ String mappingFileLocation = this.model.getStringProperty(IEntityDataModelProperties.XML_NAME);
+ return new File(mappingFileLocation).getName();
+ }
+
+ /**
+ * Process browsing when the Browse... button have been pressed. Allow choosing of
+ * XML for entity mapping registration
+ *
+ */
+ private void handleChooseXmlButtonPressed() {
+ IProject project = getProject();
+ if (project == null) {
+ return;
+ }
+ JpaProject jpaProject = JptJpaCorePlugin.getJpaProject(project);
+ ViewerFilter filter = getDialogViewerFilter(jpaProject);
+ ITreeContentProvider contentProvider = new WorkbenchContentProvider();
+ ILabelProvider labelProvider = new WorkbenchLabelProvider();
+ SelectJpaOrmMappingFileDialog dialog = new SelectJpaOrmMappingFileDialog(getShell(), project, labelProvider, contentProvider);
+ dialog.setTitle(EntityWizardMsg.MAPPING_XML_TITLE);
+ dialog.setMessage(EntityWizardMsg.CHOOSE_MAPPING_XML_MESSAGE);
+ dialog.addFilter(filter);
+
+ String ormFileName = this.ormXmlName.getText();
+ JpaXmlResource resource = jpaProject.getMappingFileXmlResource(new Path(ormFileName));
+ IFile initialSelection = (resource != null) ? resource.getFile() : null;
+ dialog.setInput(project);
+
+ if (initialSelection != null) {
+ dialog.setInitialSelection(initialSelection);
+ }
+ if (dialog.open() == Window.OK) {
+ this.model.setProperty(IEntityDataModelProperties.XML_NAME, dialog.getChosenName());
+ }
+ }
+
+ /**
+ * This method create filter for the browse/add alternative mapping XML
+ * @return new instance of viewer filter for the SelectMappingXMLDialog
+ */
+ protected ViewerFilter getDialogViewerFilter(JpaProject jpaProject) {
+ return new XmlMappingFileViewerFilter(jpaProject);
+ }
+
+ private void enableMappingXMLChooseGroup(boolean enabled) {
+ this.displayNameLink.setEnabled(enabled);
+ this.ormXmlName.setEnabled(enabled);
+ this.browseButton.setEnabled(enabled);
+ }
+
+ /**
+ * This method is used by the project list initializer. The method checks
+ * if the specified project is valid to include it in the project list.
+ *
+ * <p>Subclasses of this wizard page should override this method to
+ * adjust filtering of the projects to their needs. </p>
+ *
+ * @param project reference to the project to be checked
+ *
+ * @return <code>true</code> if the project is valid to be included in
+ * the project list, <code>false</code> - otherwise.
+ */
+ @Override
+ protected boolean isProjectValid(IProject project) {
+ return (project.isAccessible() && JpaFacet.isInstalled(project));
+ }
+
+ protected final IWorkbenchHelpSystem getHelpSystem() {
+ return PlatformUI.getWorkbench().getHelpSystem();
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/entity/EntityFieldsWizardPage.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/entity/EntityFieldsWizardPage.java
new file mode 100644
index 0000000000..e36c8d0891
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/entity/EntityFieldsWizardPage.java
@@ -0,0 +1,234 @@
+/***********************************************************************
+ * Copyright (c) 2008, 2010 by SAP AG, Walldorf.
+ * 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:
+ * SAP AG - initial API and implementation
+ * Dimiter Dimitrov, d.dimitrov@sap.com - initial API and implementation
+ ***********************************************************************/
+package org.eclipse.jpt.jpa.ui.internal.wizards.entity;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jpt.jpa.ui.internal.JpaHelpContextIds;
+import org.eclipse.jpt.jpa.ui.internal.wizards.entity.data.model.IEntityDataModelProperties;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.help.IWorkbenchHelpSystem;
+import org.eclipse.wst.common.componentcore.internal.operation.IArtifactEditOperationDataModelProperties;
+import org.eclipse.wst.common.frameworks.datamodel.DataModelEvent;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wst.common.frameworks.internal.datamodel.ui.DataModelWizardPage;
+import org.eclipse.wst.common.frameworks.internal.plugin.WTPCommonPlugin;
+
+public class EntityFieldsWizardPage extends DataModelWizardPage {
+
+ private Text entityNameText;
+ private Text tableNameText;
+ private Button tableNameCheckButton;
+ private Button fieldAccessButton;
+ private Button propertyAccessButton;
+ private boolean isNonEntity = true;
+ private boolean isButtonsCreated = false;
+
+ public EntityFieldsWizardPage(IDataModel model, String pageName) {
+ super(model, pageName);
+ this.setTitle(EntityWizardMsg.ENTITY_PROPERTIES_TITLE);
+ this.setDescription(EntityWizardMsg.ENTITY_PROPERTIES_DESCRIPTION);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.jem.util.ui.wizard.WTPWizardPage#getValidationPropertyNames()
+ */
+ @Override
+ protected String[] getValidationPropertyNames() {
+ return new String[]{IEntityDataModelProperties.ENTITY_FIELDS,
+ IEntityDataModelProperties.PK_FIELDS};
+ }
+
+ /* Create the main composite and add to it the entity properties
+ * @see org.eclipse.wst.common.frameworks.internal.datamodel.ui.DataModelWizardPage#createTopLevelComposite(org.eclipse.swt.widgets.Composite)
+ */
+ @Override
+ protected Composite createTopLevelComposite(Composite parent) {
+ Composite composite = new Composite(parent, SWT.NULL);
+ composite.setLayout(new GridLayout());
+ this.getHelpSystem().setHelp(composite, JpaHelpContextIds.NEW_JPA_ENTITY_ENTITY_PROPERTIES);
+
+ GridData data = new GridData(GridData.FILL_BOTH);
+ data.widthHint = 300;
+ data.heightHint = 450;
+ composite.setLayoutData(data);
+ composite.pack();
+
+ entityNameText = createNameGroup(composite, EntityWizardMsg.ENTITY_NAME, IEntityDataModelProperties.ENTITY_NAME);
+ Group group = createGroup(composite, EntityWizardMsg.TABLE_NAME_GROUP);
+ tableNameCheckButton= createCheckButton(group, EntityWizardMsg.USE_DEFAULT, IEntityDataModelProperties.TABLE_NAME_DEFAULT);
+ tableNameText = createNameGroup(group, EntityWizardMsg.TABLE_NAME, IEntityDataModelProperties.TABLE_NAME);
+ tableNameText.setEnabled(!tableNameCheckButton.getSelection());
+ isButtonsCreated = true;
+ initNameGroup();
+ createEntityFieldsGroup(composite);
+
+ Group accessTypeGroup = createGroup(composite, EntityWizardMsg.ACCESS_TYPE);
+ fieldAccessButton = createRadioButton(accessTypeGroup, EntityWizardMsg.FIELD_BASED, IEntityDataModelProperties.FIELD_ACCESS_TYPE);
+ propertyAccessButton = createRadioButton(accessTypeGroup, EntityWizardMsg.PROPERTY_BASED, IEntityDataModelProperties.PROPERTY_ACCESS_TYPE);
+
+
+ IStatus projectStatus = validateProjectName();
+ if (!projectStatus.isOK()) {
+ setErrorMessage(projectStatus.getMessage());
+ composite.setEnabled(false);
+ }
+ Dialog.applyDialogFont(parent);
+ return composite;
+ }
+
+ /**
+ * @return the status of the project name correctness
+ */
+ protected IStatus validateProjectName() {
+ // check for empty
+ if (model.getStringProperty(IArtifactEditOperationDataModelProperties.PROJECT_NAME) == null || model.getStringProperty(IArtifactEditOperationDataModelProperties.PROJECT_NAME).trim().length() == 0) {
+ return WTPCommonPlugin.createErrorStatus(EntityWizardMsg.NO_JPA_PROJECTS);
+ }
+ return WTPCommonPlugin.OK_STATUS;
+ }
+
+ protected void createEntityFieldsGroup(Composite parent) {
+ Group group = new Group(parent, SWT.NONE);
+ GridData groupGridData = new GridData(GridData.FILL_BOTH);
+ groupGridData.horizontalSpan = 3;
+ group.setLayoutData(groupGridData);
+ group.setLayout(new GridLayout(3, false));
+ group.setText(EntityWizardMsg.ENTITY_FIELDS_GROUP);
+ new EntityRowTableWizardSection(group, model, IEntityDataModelProperties.ENTITY_FIELDS);
+ }
+
+ /**
+ * Create named group
+ * @param parent the main composite
+ * @param label the name of the group
+ * @param property the related property to which this group will be synchronized
+ * @return the created group
+ */
+ protected Text createNameGroup(Composite parent, String label, String property) {
+ Composite composite = new Composite(parent, SWT.NULL);
+ composite.setLayout(new GridLayout(3, false));
+ composite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+ Label displayNameLabel = new Label(composite, SWT.LEFT);
+ displayNameLabel.setText(label);
+ displayNameLabel.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING));
+ Text nameText = new Text(composite, SWT.SINGLE | SWT.BORDER);
+ nameText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+ synchHelper.synchText(nameText, property, /*dependentControls*/null);
+ return nameText;
+ }
+
+ /**
+ * Create group
+ * @param parent the main composite
+ * @param text the name of the group
+ * @return the created group
+ */
+ private Group createGroup(Composite parent, String text) {
+ Group group = new Group(parent, SWT.NONE);
+ GridData groupGridData = new GridData(GridData.FILL_HORIZONTAL);
+ groupGridData.horizontalSpan = 3;
+ group.setLayoutData(groupGridData);
+ group.setLayout(new GridLayout(3, false));
+ group.setText(text);
+ return group;
+ }
+
+ /**
+ * Create check button
+ * @param parent the main composite - inheritance group
+ * @param text the label of the button
+ * @param property the related property to which this button will be synchronized
+ * @return the created button
+ */
+ private Button createCheckButton(Composite parent, String text, String property) {
+ final Button button = new Button(parent, SWT.CHECK);
+ GridData groupGridData = new GridData(GridData.FILL_HORIZONTAL);
+ groupGridData.horizontalSpan = 3;
+ button.setLayoutData(groupGridData);
+ button.setText(text);
+ button.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ boolean isChecked = button.getSelection();
+ if (tableNameText != null) {
+ tableNameText.setEnabled(!isChecked);
+ }
+ }
+ });
+ synchHelper.synchCheckbox(button, property, /*dependentControls*/ null);
+ return button;
+ }
+
+ /**
+ * Create radio button
+ * @param parent the main composite - inheritance group
+ * @param text the label of the button
+ * @param property the related property to which this button will be synchronized
+ * @return the created button
+ */
+ private Button createRadioButton(Composite parent, String text, String property) {
+ Button button = new Button(parent, SWT.RADIO);
+ GridData groupGridData = new GridData(GridData.FILL_HORIZONTAL);
+ groupGridData.horizontalSpan = 3;
+ button.setLayoutData(groupGridData);
+ button.setText(text);
+ synchHelper.synchRadio(button, property, /*dependentControls*/ null);
+ return button;
+ }
+
+ /*
+ * If a property changes that we want to validate, force validation on this page.
+ *
+ * @see org.eclipse.wst.common.frameworks.internal.operation.WTPOperationDataModelListener#propertyChanged(java.lang.String,
+ * java.lang.Object, java.lang.Object)
+ */
+ @Override
+ public void propertyChanged(DataModelEvent event) {
+ String propertyName = event.getPropertyName();
+ if (IEntityDataModelProperties.MAPPED_AS_SUPERCLASS.equals(propertyName)) {
+ initNameGroup();
+ }
+ super.propertyChanged(event);
+ }
+
+ /**
+ * The methods is for the internal use only. It will set the entity and table name
+ * group to be disabled if the created artifact is not entity
+ */
+ private void initNameGroup() {
+ isNonEntity = model.getBooleanProperty(IEntityDataModelProperties.MAPPED_AS_SUPERCLASS);
+ if (isButtonsCreated) {
+ entityNameText.setEnabled(!isNonEntity);
+ tableNameCheckButton.setEnabled(!isNonEntity);
+ tableNameText.setEnabled(!tableNameCheckButton.getSelection());
+ }
+ }
+
+ protected final IWorkbenchHelpSystem getHelpSystem() {
+ return PlatformUI.getWorkbench().getHelpSystem();
+ }
+}
+
+
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/entity/EntityRowTableWizardSection.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/entity/EntityRowTableWizardSection.java
new file mode 100644
index 0000000000..af03ced040
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/entity/EntityRowTableWizardSection.java
@@ -0,0 +1,822 @@
+/***********************************************************************
+ * Copyright (c) 2008, 2009 by SAP AG, Walldorf.
+ * 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:
+ * SAP AG - initial API and implementation
+ * Dimiter Dimitrov, d.dimitrov@sap.com - initial API and implementation
+ ***********************************************************************/
+package org.eclipse.jpt.jpa.ui.internal.wizards.entity;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+import org.eclipse.jdt.ui.IJavaElementSearchConstants;
+import org.eclipse.jdt.ui.JavaUI;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.jdt.core.IPackageFragmentRoot;
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.core.JavaConventions;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.jdt.core.search.IJavaSearchScope;
+import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.jface.bindings.keys.KeyStroke;
+import org.eclipse.jface.bindings.keys.ParseException;
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.jface.fieldassist.ContentProposalAdapter;
+import org.eclipse.jface.fieldassist.IContentProposalProvider;
+import org.eclipse.jface.fieldassist.SimpleContentProposalProvider;
+import org.eclipse.jface.fieldassist.TextContentAdapter;
+import org.eclipse.jface.viewers.CheckStateChangedEvent;
+import org.eclipse.jface.viewers.CheckboxTableViewer;
+import org.eclipse.jface.viewers.DoubleClickEvent;
+import org.eclipse.jface.viewers.ICheckStateListener;
+import org.eclipse.jface.viewers.IDoubleClickListener;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.IStructuredContentProvider;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.ITableLabelProvider;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.window.Window;
+import org.eclipse.jpt.jpa.ui.JptJpaUiPlugin;
+import org.eclipse.jpt.jpa.ui.internal.wizards.entity.data.model.EntityRow;
+import org.eclipse.jpt.jpa.ui.internal.wizards.entity.data.model.IEntityDataModelProperties;
+import org.eclipse.jst.j2ee.internal.common.operations.INewJavaClassDataModelProperties;
+import org.eclipse.jst.j2ee.internal.dialogs.TypeSearchEngine;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.ControlAdapter;
+import org.eclipse.swt.events.ControlEvent;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.graphics.Rectangle;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.TableColumn;
+import org.eclipse.swt.widgets.TableItem;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.dialogs.SelectionDialog;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+
+/**
+ * The class presents the table with entity fields. In the java file are included also content
+ * and label provider, add and edit entity dialogs as well as help internal objects - listener
+ * and callback from the dialog to the main composite (table).
+ *
+ */
+public class EntityRowTableWizardSection extends Composite {
+
+ /**
+ * The possible entity types, mentioned in the specification (Chapter 2.1.1 Persistent Fields and Properties p.20)
+ */
+ protected final static String[] VALID_TYPES = {"int",
+ "long",
+ "short",
+ "char",
+ "boolean",
+ "byte",
+ "double",
+ "float",
+ "java.lang.String",
+ "java.lang.Integer",
+ "java.lang.Long",
+ "java.lang.Short",
+ "java.lang.Character",
+ "java.lang.Boolean",
+ "java.lang.Byte",
+ "java.lang.Double",
+ "java.lang.Float",
+ "java.math.BigDecimal",
+ "java.math.BigInteger",
+ "java.util.Date",
+ "java.util.Calendar",
+ "java.sql.Date",
+ "java.sql.Time",
+ "java.sql.Timestamp",
+ "String",
+ "Integer",
+ "Long",
+ "Short",
+ "Character",
+ "Boolean",
+ "Byte",
+ "Double",
+ "Float" };
+
+ private CheckboxTableViewer mTableViewer = null;
+ private Table mTableWidget = null;
+ private final int NAME_COLUMN = 1;
+ private final int TYPE_COLUMN = 2;
+
+
+
+
+ private Button addButton;
+ private Button editButton;
+ private Button removeButton;
+ private String title = EntityWizardMsg.ENTITY_FIELDS_DIALOG_TITLE;
+ private String[] typeProposals = VALID_TYPES;
+ private String[] labelsForText = new String[]{EntityWizardMsg.TYPE_TEXT_FIELD, EntityWizardMsg.NAME_TEXT_FIELD};
+ private IDataModel model;
+ private String propertyName;
+ private Image labelProviderImage = null;
+ private DialogCallback callback;
+ private static KeyStroke ks = null;
+ static {
+ try {
+ ks = KeyStroke.getInstance("Ctrl+Space");
+ } catch (ParseException e1) {
+ JptJpaUiPlugin.log(e1);
+ }
+ }
+
+
+ /**
+ * @param parent the main composite - Entity fields page
+ * @param model the data model representation
+ * @param propertyName data property name
+ */
+ public EntityRowTableWizardSection(Composite parent, IDataModel model, String propertyName) {
+ super(parent, SWT.NONE);
+ this.model = model;
+ this.propertyName = propertyName;
+
+ GridLayout layout = new GridLayout(2, false);
+ layout.marginHeight = 4;
+ layout.marginWidth = 0;
+ this.setLayout(layout);
+ this.setLayoutData(new GridData(GridData.FILL_BOTH));
+
+ mTableWidget = new Table(this, SWT.CHECK | SWT.FULL_SELECTION | SWT.BORDER);
+ mTableWidget.setHeaderVisible(true);
+ mTableWidget.setLinesVisible(true);
+
+ mTableViewer = new CheckboxTableViewer(mTableWidget);
+ GridData data = new GridData(GridData.FILL_BOTH);
+ data.verticalSpan = 2;
+ mTableWidget.setLayoutData(data);
+ mTableViewer.setContentProvider(new EntityRowContentProvider());
+ mTableViewer.setLabelProvider(new EntityRowLabelProvider());
+
+ final Composite buttonComposition = new Composite(this, SWT.NULL);
+ layout = new GridLayout();
+ layout.marginHeight = 0;
+ buttonComposition.setLayout(layout);
+ buttonComposition.setLayoutData(new GridData(GridData.FILL_VERTICAL | GridData.VERTICAL_ALIGN_BEGINNING));
+
+ addButton = new Button(buttonComposition, SWT.PUSH);
+ addButton.setText(EntityWizardMsg.ADD_BUTTON_LABEL);
+ addButton.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_BEGINNING | GridData.HORIZONTAL_ALIGN_FILL));
+ addButton.addSelectionListener(new SelectionListener() {
+ public void widgetSelected(SelectionEvent event) {
+ handleAddButtonSelected();
+ }
+ public void widgetDefaultSelected(SelectionEvent event) {
+ //Do nothing
+ }
+ });
+
+ editButton = new Button(buttonComposition, SWT.PUSH);
+ editButton.setText(EntityWizardMsg.EDIT_BUTTON_LABEL);
+ editButton.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_BEGINNING | GridData.HORIZONTAL_ALIGN_FILL));
+ editButton.addSelectionListener(new SelectionListener() {
+ public void widgetSelected(SelectionEvent event) {
+ handleEditButtonSelected();
+ }
+ public void widgetDefaultSelected(SelectionEvent event) {
+ //Do nothing
+ }
+ });
+ editButton.setEnabled(false);
+ mTableViewer.addDoubleClickListener(new IDoubleClickListener() {
+ public void doubleClick(DoubleClickEvent event) {
+ handleEditButtonSelected();
+ }
+ });
+
+ removeButton = new Button(buttonComposition, SWT.PUSH);
+ removeButton.setText(EntityWizardMsg.REMOVE_BUTTON_LABEL);
+ removeButton.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_BEGINNING | GridData.HORIZONTAL_ALIGN_FILL));
+ removeButton.addSelectionListener(new SelectionListener() {
+ public void widgetSelected(SelectionEvent event) {
+ handleRemoveButtonSelected();
+ }
+ public void widgetDefaultSelected(SelectionEvent event) {
+ //Do nothing
+ }
+ });
+ removeButton.setEnabled(false);
+
+ mTableViewer.addSelectionChangedListener(new ISelectionChangedListener() {
+ public void selectionChanged(SelectionChangedEvent event) {
+ ISelection selection = event.getSelection();
+ if (editButton != null) {
+ boolean enabled = ((IStructuredSelection) selection).size() == 1;
+ editButton.setEnabled(enabled);
+ }
+ removeButton.setEnabled(!selection.isEmpty());
+ }
+ });
+
+
+ final TableColumn pkColumn = new TableColumn(mTableWidget, SWT.CHECK);
+ pkColumn.setText(EntityWizardMsg.KEY);
+ pkColumn.pack();
+ pkColumn.setResizable(false);
+
+ TableColumn nameColumn = new TableColumn(mTableWidget, SWT.NONE);
+ nameColumn.setText(EntityWizardMsg.NAME_COLUMN);
+
+ TableColumn typeColumn = new TableColumn(mTableWidget, SWT.NONE);
+ typeColumn.setText(EntityWizardMsg.TYPE_COLUMN);
+
+ this.addControlListener(new ControlAdapter() {
+ @Override
+ public void controlResized(ControlEvent e) {
+ Table table = mTableViewer.getTable();
+ TableColumn[] columns = table.getColumns();
+ Point buttonArea = buttonComposition.computeSize(SWT.DEFAULT, SWT.DEFAULT);
+ Rectangle area = table.getParent().getClientArea();
+ Point preferredSize = mTableViewer.getTable().computeSize(SWT.DEFAULT, SWT.DEFAULT);
+ int width = area.width - 2 * table.getBorderWidth()- buttonArea.x - columns.length * 2 - pkColumn.getWidth();
+ if (preferredSize.y > area.height + table.getHeaderHeight()) {
+ // Subtract the scrollbar width from the total column width
+ // if a vertical scrollbar will be required
+ Point vBarSize = table.getVerticalBar().getSize();
+ width -= vBarSize.x;
+ }
+ Point oldSize = table.getSize();
+ int consumeWidth = 0;
+ int col = columns.length - 1;
+ for (int i = 1; i < columns.length; i++) {
+ if (oldSize.x > area.width) {
+ // table is getting smaller so make the columns
+ // smaller first and then resize the table to
+ // match the client area width
+ consumeWidth = setColumntWidth(width, columns, consumeWidth, i);
+ table.setSize(area.width - buttonArea.x - (col * 2 + pkColumn.getWidth()), area.height);
+ } else {
+ // table is getting bigger so make the table
+ // bigger first and then make the columns wider
+ // to match the client area width
+ consumeWidth = setColumntWidth(width, columns, consumeWidth, i);
+ table.setSize(area.width - buttonArea.x - (col * 2 + pkColumn.getWidth()), area.height);
+ }
+ }
+ }
+
+ private int setColumntWidth(int width, TableColumn[] columns,
+ int consumeWidth, int i) {
+ if (i < columns.length - 1) {
+ columns[i].setWidth(width / (columns.length - 1));
+ consumeWidth += columns[i].getWidth();
+ } else {
+ columns[i].setWidth(width - consumeWidth);
+ }
+ return consumeWidth;
+ }
+ });
+
+ mTableViewer.addCheckStateListener(new PKFieldCheckStateListener());
+ callback = new FieldDialogCallback();
+ }
+
+ /**
+ * This method process the Add... button pressed event. It opens dialog to
+ * add new entity field
+ */
+ private void handleAddButtonSelected() {
+ AddFieldDialog dialog = new AddFieldDialog(getShell(), title, typeProposals, labelsForText);
+ int result = dialog.open();
+ if (result == Window.CANCEL) {
+ return;
+ }
+ EntityRow entityRow = dialog.getEntityRow();
+ addEntityRow(entityRow);
+ }
+
+ /**
+ * Add new entity to the table input
+ *
+ * @param entity
+ * the entity which have to be added to the table
+ */
+ private void addEntityRow(EntityRow entity) {
+ if (entity == null)
+ return;
+ List<EntityRow> valueList = (ArrayList<EntityRow>) mTableViewer.getInput();
+ if (valueList == null)
+ valueList = new ArrayList<EntityRow>();
+ valueList.add(entity);
+ setInput(valueList);
+ }
+
+ /**
+ * This method process the Edit... button pressed event. It opens dialog to edit chosen entity field
+ */
+ private void handleEditButtonSelected() {
+ ISelection s = mTableViewer.getSelection();
+ if (!(s instanceof IStructuredSelection))
+ return;
+ IStructuredSelection selection = (IStructuredSelection) s;
+ if (selection.size() != 1)
+ return;
+
+ Object selectedObj = selection.getFirstElement();
+ EntityRow entityForEdit = (EntityRow) selectedObj;
+ int index = mTableWidget.getSelectionIndex();
+ boolean isChecked = mTableViewer.getChecked(entityForEdit);
+
+ EditFieldDialog dialog = new EditFieldDialog(getShell(), title, typeProposals, labelsForText, entityForEdit);
+ dialog.open();
+ EntityRow entityRow = dialog.getEntityRow();
+ if (entityRow != null) {
+ editEntityRow(index, entityRow);
+ mTableViewer.setChecked(entityRow, isChecked);
+ mTableViewer.setGrayed(entityRow, false);
+ }
+ }
+
+ /**
+ * Edit chosen entity from the table
+ * @param index the index of the entity in the table
+ * @param newEntity the edited entity field
+ */
+ private void editEntityRow(int index, EntityRow newEntity) {
+ if (newEntity == null)
+ return;
+
+ List<EntityRow> valueList = (ArrayList<EntityRow>) mTableViewer.getInput();
+ if (valueList == null) {
+ valueList = new ArrayList();
+ }
+
+ if (index == -1) {
+ valueList.add(newEntity);
+ } else {
+ valueList.set(index, newEntity);
+ }
+
+ setInput(valueList);
+ }
+
+ /**
+ * This method process the Remove button pressed event.
+ */
+ private void handleRemoveButtonSelected() {
+ ISelection selection = mTableViewer.getSelection();
+ if (selection.isEmpty() || !(selection instanceof IStructuredSelection))
+ return;
+ List selectedObject = ((IStructuredSelection) selection).toList();
+ removeEntityRow(selectedObject);
+ }
+
+ /**
+ * Removes the selected entities from the table
+ * @param entities list with entities, which should be removed
+ */
+ private void removeEntityRow(Collection entities) {
+ List<EntityRow> valueList = (ArrayList<EntityRow>) mTableViewer.getInput();
+ valueList.removeAll(entities);
+ setInput(valueList);
+ }
+
+ /**
+ * Set the input of the table
+ * @param input the list with entities which have to be presented in the table
+ */
+ private void setInput(List input) {
+ mTableViewer.setInput(input);
+ // Create a new list to trigger property change
+ ArrayList<EntityRow> newInput = new ArrayList<EntityRow>();
+ newInput.addAll(input);
+ model.setProperty(propertyName, newInput);
+ }
+
+ /**
+ * @return the TableViewer of the table
+ */
+ public TableViewer getTableViewer() {
+ return mTableViewer;
+ }
+
+ // PROVIDERS FOR THE FIELD TABLE
+
+ /**
+ * The content provider for the table items
+ */
+ protected class EntityRowContentProvider implements IStructuredContentProvider {
+ public boolean isDeleted(Object element) {
+ return false;
+ }
+ public Object[] getElements(Object element) {
+ if (element instanceof List) {
+ return ((List) element).toArray();
+ }
+ return new Object[0];
+ }
+ public void inputChanged(Viewer aViewer, Object oldInput, Object newInput) {
+ //Default nothing
+ }
+ public void dispose() {
+ //Default nothing
+ }
+ }
+
+ /**
+ * The label provider for the table items
+ */
+ protected class EntityRowLabelProvider extends LabelProvider implements ITableLabelProvider {
+ public Image getColumnImage(Object element, int columnIndex) {
+ if (columnIndex == 0) {
+ return labelProviderImage;
+ }
+ return null;
+ }
+
+ public String getColumnText(Object element, int columnIndex) {
+ EntityRow entity = (EntityRow) element;
+ if (columnIndex == NAME_COLUMN) {
+ return entity.getName();
+ }
+ if (columnIndex == TYPE_COLUMN) {
+ return entity.getFqnTypeName();
+ }
+ mTableViewer.setChecked(entity, entity.isKey());
+ return "";
+ }
+
+ @Override
+ public Image getImage(Object element) {
+ return labelProviderImage;
+ }
+
+ @Override
+ public String getText(Object element) {
+ String[] array = (String[]) element;
+ if (array.length > 0) {
+ return array[0];
+ } else {
+ return super.getText(element);
+ }
+ }
+ }
+ // END - PROVIDERS FOR THE FIELD TABLE
+
+ /**
+ * Listener for the Primary Key check box in the table item
+ */
+ private class PKFieldCheckStateListener implements ICheckStateListener {
+
+ public void checkStateChanged(CheckStateChangedEvent event) {
+ List<String> pkFields = new ArrayList<String>();
+ TableItem[] children = mTableViewer.getTable().getItems();
+ for (int i = 0; i < children.length; i++) {
+ TableItem item = children[i];
+ EntityRow entityRow = (EntityRow)item.getData();
+ entityRow.setKey(item.getChecked());
+ if (item.getChecked())
+ pkFields.add(entityRow.getName());
+ }
+ model.setProperty(IEntityDataModelProperties.PK_FIELDS, pkFields);
+ }
+
+ }
+
+ // CALLBACK MECHANISM
+ /**
+ * Callback interface used by the Add/Edit-FieldDialog classes.
+ */
+ public interface DialogCallback {
+
+ /**
+ * Validates the text fields.
+ * <p>Used to decide whether to enable the OK button of the dialog.
+ * If the method returns <code>true</code> the OK button is enabled,
+ * otherwise the OK button is disabled.</p>
+ * @param combo contains the predefined types
+ * @param texts the name of the entity field
+ * @return <code>true</code> if the values in the text fields are
+ * valid, <code>false</code> otherwise.
+ */
+ public boolean validate(Text type, Text[] texts);
+
+ /**
+ * Retrieves the entity presentation object from the fields of the dialog.
+ * <p>Implementers of the callback can use these method to do some
+ * preprocessing (like trimming) of the data in the text fields before
+ * using it. The returned values will be the actual data that will be
+ * put in the table viewer.</p>
+ * @param combo contains the predefined types
+ * @param texts the name of the entity field
+ * @return the entity presentation object retrieved from the dialog
+ */
+ public EntityRow retrieveResultStrings(Text type, Text[] texts);
+
+ }
+
+ /**
+ * Implementation of the <code>FieldDialogCallback</code> interface for
+ * both "Name" and "Types" table columns.
+ */
+ public class FieldDialogCallback implements DialogCallback {
+
+ /**
+ * The first text field should not be empty.
+ */
+ public boolean validate(Text type, Text[] texts) {
+ if (texts.length > 0) {
+ IStatus validateFieldNameStatus = JavaConventions
+ .validateFieldName(texts[0].getText(),
+ JavaCore.VERSION_1_5,
+ JavaCore.VERSION_1_5);
+ if (!validateFieldNameStatus.isOK()) {
+ return false;
+ }
+ }
+ if (type.getText().equals("")) {
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * Just retrieves the unmodified values of the text fields as a
+ * entity field presentation
+ * @see org.eclipse.jpt.jpa.ui.internal.wizards.entity.data.model.EntityRow
+ */
+ public EntityRow retrieveResultStrings(Text type, Text[] texts) {
+ EntityRow entity = new EntityRow();
+ entity.setFqnTypeName(type.getText());
+ entity.setName(texts[0].getText());
+ return entity;
+ }
+ }
+
+ // THE DIALOGS USED FOR ADD/EDIT OF ENTITY FIELDS - BEGIN
+
+ /**
+ * The dialog which collect the information (name and type) for the new entity field
+ */
+ private class AddFieldDialog extends Dialog implements ModifyListener, SelectionListener {
+ protected String windowTitle;
+ protected String[] typeProposals;
+ protected String[] labelsForText;
+ protected Text[] texts;
+ protected EntityRow entityRow;
+ protected Text attributeType;
+ protected ContentProposalAdapter contentProposalAdapter;
+
+ /**
+ * Constructs AddFieldDialog
+ * @param shell
+ * @param windowTitle dialog label
+ * @param typeProposals the elements for the combo
+ * @param labelsForText name text
+ */
+ public AddFieldDialog(Shell shell, String windowTitle, String[] typeProposals, String[] labelsForText) {
+ super(shell);
+ this.windowTitle = windowTitle;
+ this.typeProposals = typeProposals;
+ this.labelsForText = labelsForText;
+ }
+
+ /* Create the area of dialog
+ * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
+ */
+ @Override
+ public Control createDialogArea(Composite parent) {
+
+ Composite composite = (Composite) super.createDialogArea(parent);
+ getShell().setText(windowTitle);
+
+ GridLayout layout = new GridLayout();
+ layout.numColumns = 4;
+ composite.setLayout(layout);
+ GridData data = new GridData();
+ data.verticalAlignment = GridData.FILL;
+ data.horizontalAlignment = GridData.FILL;
+ data.widthHint = 300;
+ composite.setLayoutData(data);
+
+ Label label = new Label(composite, SWT.LEFT);
+ label.setText(labelsForText[0]);
+ label.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING));
+
+
+ attributeType = new Text(composite, SWT.SINGLE | SWT.BORDER);// | SWT.READ_ONLY);
+ //combo.setItems(labelsForCombo);
+ data = new GridData(GridData.FILL_HORIZONTAL);
+ data.horizontalSpan = 2;
+ attributeType.setLayoutData(data);
+
+ Button browseButton = new Button(composite, SWT.PUSH);
+ browseButton.setText(EntityWizardMsg.BROWSE_BUTTON_LABEL);
+ GridData browseButtonData = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
+ browseButtonData.horizontalSpan = 1;
+ browseButton.setLayoutData(browseButtonData);
+ browseButton.addSelectionListener(new SelectionListener() {
+ public void widgetSelected(SelectionEvent e) {
+ handleChooseEntityTypeButtonPressed();
+ }
+
+ public void widgetDefaultSelected(SelectionEvent e) {
+ // Do nothing
+ }
+ });
+
+ int n = labelsForText.length;
+ texts = new Text[n-1];
+ for (int i = 1; i < n; i++) {
+ Label labelI = new Label(composite, SWT.LEFT);
+ labelI.setText(labelsForText[i]);
+ labelI.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING));
+ texts[i-1] = new Text(composite, SWT.SINGLE | SWT.BORDER);
+ data = new GridData(GridData.FILL_HORIZONTAL);
+ data.horizontalSpan = 2;
+ texts[i-1].setLayoutData(data);
+ }
+
+ attributeType.setFocus();
+ Dialog.applyDialogFont(parent);
+ createContentProposalProvider();
+ return composite;
+ }
+
+ private IContentProposalProvider createContentProposalProvider() {
+ SimpleContentProposalProvider contProvider = new SimpleContentProposalProvider(typeProposals);
+ contProvider.setFiltering(true);
+
+ contentProposalAdapter = new ContentProposalAdapter(
+ attributeType,
+ new TextContentAdapter(),
+ contProvider,
+ ks,
+ new char[] {'b', 'c', 'd', 'i', 'f', 'l', 's', 'j', 'B', 'C', 'D', 'F', 'S', 'L', 'I'});
+ contentProposalAdapter.setEnabled(true);
+ contentProposalAdapter.setProposalAcceptanceStyle(ContentProposalAdapter.PROPOSAL_REPLACE);
+ return contProvider;
+ }
+
+
+ /**
+ * Process browsing when the Browse... button have been pressed. Allow adding of entity field
+ * with arbitrary type.
+ */
+ private void handleChooseEntityTypeButtonPressed() {
+ //getControl().setCursor(new Cursor(getShell().getDisplay(), SWT.CURSOR_WAIT));
+ IPackageFragmentRoot packRoot = (IPackageFragmentRoot) model.getProperty(INewJavaClassDataModelProperties.JAVA_PACKAGE_FRAGMENT_ROOT);
+ if (packRoot == null) {
+ return;
+ }
+
+ // this eliminates the non-exported classpath entries
+ final IJavaSearchScope scope = TypeSearchEngine.createJavaSearchScopeForAProject(packRoot.getJavaProject(), true, true);
+
+ // This includes all entries on the classpath.
+ SelectionDialog dialog=null;
+ try{
+ dialog = JavaUI
+ .createTypeDialog(
+ getShell(),
+ null,
+ scope,
+ IJavaElementSearchConstants.CONSIDER_ALL_TYPES,
+ false);
+ } catch (JavaModelException e) {
+ JptJpaUiPlugin.instance().getLog().log(e.getStatus());
+ return;
+ }
+
+ dialog.setTitle(EntityWizardMsg.TYPE_DIALOG_TITLE);
+ dialog.setMessage(EntityWizardMsg.TYPE_DIALOG_DESCRIPTION);
+
+ if (dialog.open() == Window.OK) {
+ IType type;
+ Object[] result = dialog.getResult();
+ if (result == null || result.length == 0) {
+ type = null;
+ }
+ else type = (IType) result[0];
+ String superclassFullPath = IEntityDataModelProperties.EMPTY_STRING;
+ if (type != null) {
+ superclassFullPath = type.getFullyQualifiedName();
+ }
+ attributeType.setText(superclassFullPath);
+ //getControl().setCursor(null);
+ return;
+ }
+ //getControl().setCursor(null);
+ }
+
+
+ /* Create the content of the dialog
+ * @see org.eclipse.jface.dialogs.Dialog#createContents(org.eclipse.swt.widgets.Composite)
+ */
+ @Override
+ protected Control createContents(Composite parent) {
+ Composite composite = (Composite) super.createContents(parent);
+
+ attributeType.addSelectionListener(this);
+ attributeType.addModifyListener(this);
+ for (int i = 0; i < texts.length; i++) {
+ texts[i].addModifyListener(this);
+ }
+
+ updateOKButton();
+
+ return composite;
+ }
+
+ /* Processes OK button pressed event.
+ * @see org.eclipse.jface.dialogs.Dialog#okPressed()
+ */
+ @Override
+ protected void okPressed() {
+ entityRow = callback.retrieveResultStrings(attributeType, texts);
+ super.okPressed();
+ }
+
+ /**
+ * @return the entity representation with the information collected from the dialog
+ */
+ public EntityRow getEntityRow() {
+ return entityRow;
+ }
+
+ /* Processes text modifying event
+ * @see org.eclipse.swt.events.ModifyListener#modifyText(org.eclipse.swt.events.ModifyEvent)
+ */
+ public void modifyText(ModifyEvent e) {
+ updateOKButton();
+ }
+
+ /**
+ * Sets state of the OK button in accordance with validate method of the callback object
+ * @see DialogCallback
+ */
+ private void updateOKButton() {
+ getButton(IDialogConstants.OK_ID).setEnabled(callback.validate(attributeType, texts));
+ }
+ /* (non-Javadoc)
+ * @see org.eclipse.swt.events.SelectionListener#widgetDefaultSelected(org.eclipse.swt.events.SelectionEvent)
+ */
+ public void widgetDefaultSelected(SelectionEvent e) {
+ // TODO Auto-generated method stub
+
+ }
+ /* Update OK button when the appropriate event occurs
+ * @see org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt.events.SelectionEvent)
+ */
+ public void widgetSelected(SelectionEvent e) {
+ updateOKButton();
+ }
+ }
+
+ /**
+ * Constructs EditFieldDialog
+ */
+ private class EditFieldDialog extends AddFieldDialog {
+ protected EntityRow entityRow;
+ /**
+ * EditFieldDialog constructor comment.
+ */
+ public EditFieldDialog(Shell shell, String windowTitle, String[] labelsForCombo, String[] labelsForText, EntityRow entity) {
+ super(shell, windowTitle, labelsForCombo, labelsForText);
+ this.entityRow = entity;
+ }
+
+ /* Create the area of the dialog
+ * @see org.eclipse.jpt.jpa.ui.internal.wizards.entity.EntityRowTableWizardSection.AddFieldDialog#createDialogArea(org.eclipse.swt.widgets.Composite)
+ */
+ @Override
+ public Control createDialogArea(Composite parent) {
+
+ Composite composite = (Composite) super.createDialogArea(parent);
+
+ attributeType.setText(entityRow.getFqnTypeName());
+ texts[0].setText(entityRow.getName());
+
+ return composite;
+ }
+ }
+
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/entity/EntityTemplate.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/entity/EntityTemplate.java
new file mode 100644
index 0000000000..42f6853d0a
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/entity/EntityTemplate.java
@@ -0,0 +1,126 @@
+package org.eclipse.jpt.jpa.ui.internal.wizards.entity;
+
+import org.eclipse.jpt.jpa.ui.internal.wizards.entity.data.model.*;
+import java.util.*;
+
+public class EntityTemplate
+{
+ protected static String nl;
+ public static synchronized EntityTemplate create(String lineSeparator)
+ {
+ nl = lineSeparator;
+ EntityTemplate result = new EntityTemplate();
+ nl = null;
+ return result;
+ }
+
+ public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+ protected final String TEXT_1 = "package ";
+ protected final String TEXT_2 = ";";
+ protected final String TEXT_3 = NL;
+ protected final String TEXT_4 = NL + "import ";
+ protected final String TEXT_5 = ";";
+ protected final String TEXT_6 = NL + NL + "/**" + NL + " * Entity implementation class for Entity: ";
+ protected final String TEXT_7 = NL + " *" + NL + " */" + NL + "public class ";
+ protected final String TEXT_8 = " extends ";
+ protected final String TEXT_9 = " implements ";
+ protected final String TEXT_10 = ", ";
+ protected final String TEXT_11 = " {" + NL + "" + NL + "\t";
+ protected final String TEXT_12 = " " + NL + "\tprivate ";
+ protected final String TEXT_13 = " ";
+ protected final String TEXT_14 = ";";
+ protected final String TEXT_15 = NL + "\tprivate static final long serialVersionUID = 1L;\t" + NL + "\tpublic ";
+ protected final String TEXT_16 = "() {" + NL + "\t\tsuper();" + NL + "\t} " + NL + "\t";
+ protected final String TEXT_17 = " " + NL + "\tpublic ";
+ protected final String TEXT_18 = " get";
+ protected final String TEXT_19 = "() {" + NL + " \t\treturn this.";
+ protected final String TEXT_20 = ";" + NL + "\t}" + NL + "" + NL + "\tpublic void set";
+ protected final String TEXT_21 = "(";
+ protected final String TEXT_22 = " ";
+ protected final String TEXT_23 = ") {" + NL + "\t\tthis.";
+ protected final String TEXT_24 = " = ";
+ protected final String TEXT_25 = ";" + NL + "\t}" + NL + "\t";
+ protected final String TEXT_26 = NL + " " + NL + "}";
+ protected final String TEXT_27 = NL;
+
+ public String generate(Object argument)
+ {
+ final StringBuffer stringBuffer = new StringBuffer();
+ CreateEntityTemplateModel model = (CreateEntityTemplateModel) argument;
+if (model.getJavaPackageName()!=null && model.getJavaPackageName()!="") {
+ stringBuffer.append(TEXT_1);
+ stringBuffer.append(model.getJavaPackageName());
+ stringBuffer.append(TEXT_2);
+ }
+ stringBuffer.append(TEXT_3);
+ Collection<String> imports = model.getImports(false);
+for (String anImport : imports) {
+ stringBuffer.append(TEXT_4);
+ stringBuffer.append(anImport);
+ stringBuffer.append(TEXT_5);
+ }
+ stringBuffer.append(TEXT_6);
+ stringBuffer.append(model.getEntityName());
+ stringBuffer.append(TEXT_7);
+ stringBuffer.append(model.getClassName());
+ String superClass = model.getSuperclassName();
+ if (! "".equals(superClass)) {
+ stringBuffer.append(TEXT_8);
+ stringBuffer.append(superClass);
+ }
+
+ List<String> interfaces = model.getInterfaces();
+ if (interfaces.size()>0) {
+ stringBuffer.append(TEXT_9);
+ }
+ for (int i=0; i<interfaces.size(); i++) {
+ String INTERFACE = (String) interfaces.get(i);
+ if (i>0) {
+ stringBuffer.append(TEXT_10);
+ }
+ stringBuffer.append(INTERFACE);
+ }
+ stringBuffer.append(TEXT_11);
+ List<EntityRow> fields = model.getEntityFields();
+ for (EntityRow entity : fields) {
+
+ stringBuffer.append(TEXT_12);
+ stringBuffer.append(entity.getType());
+ stringBuffer.append(TEXT_13);
+ stringBuffer.append(entity.getName());
+ stringBuffer.append(TEXT_14);
+ }
+ stringBuffer.append(TEXT_15);
+ stringBuffer.append(model.getClassName());
+ stringBuffer.append(TEXT_16);
+
+ fields = model.getEntityFields();
+ if (fields != null) for (int i=0; i<fields.size(); i++) {
+ EntityRow field = (EntityRow) fields.get(i);
+ String TYPE = field.getType();
+ String NAME = field.getName();
+ String METHOD = NAME.substring(0,1).toUpperCase() + NAME.substring(1);
+
+ stringBuffer.append(TEXT_17);
+ stringBuffer.append(TYPE);
+ stringBuffer.append(TEXT_18);
+ stringBuffer.append(METHOD);
+ stringBuffer.append(TEXT_19);
+ stringBuffer.append(NAME);
+ stringBuffer.append(TEXT_20);
+ stringBuffer.append(METHOD);
+ stringBuffer.append(TEXT_21);
+ stringBuffer.append(TYPE);
+ stringBuffer.append(TEXT_22);
+ stringBuffer.append(NAME);
+ stringBuffer.append(TEXT_23);
+ stringBuffer.append(NAME);
+ stringBuffer.append(TEXT_24);
+ stringBuffer.append(NAME);
+ stringBuffer.append(TEXT_25);
+ }
+ stringBuffer.append(TEXT_26);
+ stringBuffer.append(TEXT_27);
+ return stringBuffer.toString();
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/entity/EntityWizard.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/entity/EntityWizard.java
new file mode 100644
index 0000000000..9f302520ec
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/entity/EntityWizard.java
@@ -0,0 +1,176 @@
+/***********************************************************************
+ * Copyright (c) 2008, 2010 by SAP AG, Walldorf.
+ * 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:
+ * SAP AG - initial API and implementation
+ * Dimiter Dimitrov, d.dimitrov@sap.com - initial API and implementation
+ ***********************************************************************/
+package org.eclipse.jpt.jpa.ui.internal.wizards.entity;
+
+import static org.eclipse.jst.j2ee.internal.common.operations.INewJavaClassDataModelProperties.*;
+import java.lang.reflect.InvocationTargetException;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.jdt.core.IJavaElement;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jpt.jpa.core.context.JpaContextNode;
+import org.eclipse.jpt.jpa.ui.JptJpaUiPlugin;
+import org.eclipse.jpt.jpa.ui.internal.JptUiIcons;
+import org.eclipse.jpt.jpa.ui.internal.wizards.entity.data.model.EntityDataModelProvider;
+import org.eclipse.jst.j2ee.internal.plugin.J2EEEditorUtility;
+import org.eclipse.ui.INewWizard;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.ide.IDE;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModelProvider;
+import org.eclipse.wst.common.frameworks.internal.datamodel.ui.DataModelWizard;
+
+public class EntityWizard
+ extends DataModelWizard
+ implements INewWizard {
+
+ protected String initialProjectName;
+
+ protected IStructuredSelection selection;
+
+ /**
+ * Constructs the Entity wizard
+ * @param model the data model
+ */
+ public EntityWizard(IDataModel model) {
+ super(model);
+ setWindowTitle(EntityWizardMsg.ENTITY_WIZARD_TITLE);
+ setDefaultPageImageDescriptor(JptJpaUiPlugin.getImageDescriptor(JptUiIcons.ENTITY_WIZ_BANNER));
+ }
+
+ /**
+ * Empty constructor
+ */
+ public EntityWizard(){
+ this(null);
+ }
+
+ /* Adds the two pages of the entity wizard
+ * @see org.eclipse.wst.common.frameworks.internal.datamodel.ui.DataModelWizard#doAddPages()
+ */
+ @Override
+ protected void doAddPages() {
+ EntityClassWizardPage page1 = new EntityClassWizardPage(
+ getDataModel(),
+ "pageOne",
+ EntityWizardMsg.ENTITY_WIZARD_PAGE_DESCRIPTION,
+ EntityWizardMsg.ENTITY_WIZARD_PAGE_TITLE);
+ page1.setProjectName(this.initialProjectName);
+ addPage(page1);
+ EntityFieldsWizardPage page2 = new EntityFieldsWizardPage(getDataModel(), "pageTwo");
+ addPage(page2);
+ }
+
+ public IStructuredSelection getSelection() {
+ return this.selection;
+ }
+
+ /* Return the default data model provider (EntityDataModelProvider in our case)
+ * @see org.eclipse.wst.common.frameworks.internal.datamodel.ui.DataModelWizard#getDefaultProvider()
+ */
+ @Override
+ protected IDataModelProvider getDefaultProvider() {
+ return new EntityDataModelProvider();
+ }
+
+ /* Check whether the mandatory information is set and wizard could finish
+ * @see org.eclipse.wst.common.frameworks.internal.datamodel.ui.DataModelWizard#canFinish()
+ */
+ @Override
+ public boolean canFinish() {
+ return getDataModel().isValid();
+ }
+
+ /*
+ * Override the parent method in order to open the generated entity class in java editor
+ * @see org.eclipse.wst.common.frameworks.internal.datamodel.ui.DataModelWizard#postPerformFinish()
+ */
+ @Override
+ protected void postPerformFinish() throws InvocationTargetException {
+ try {
+ String className = getDataModel().getStringProperty(QUALIFIED_CLASS_NAME);
+ IProject p = (IProject) getDataModel().getProperty(PROJECT);
+ IJavaProject javaProject = J2EEEditorUtility.getJavaProject(p);
+ IFile file = (IFile) javaProject.findType(className).getResource();
+ openEditor(file);
+ } catch (Exception cantOpen) {
+ JptJpaUiPlugin.log(cantOpen);
+ }
+ }
+
+ /**
+ * This method is intended for internal use only. It will open the file, sent as parameter
+ * in its own java editor
+ * @param file who should be opened
+ */
+ private void openEditor(final IFile file) {
+ if (getDataModel().getBooleanProperty(OPEN_IN_EDITOR)) {
+ if (file != null) {
+ getShell().getDisplay().asyncExec(new Runnable() {
+ public void run() {
+ try {
+ IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
+ IDE.openEditor(page, file, true);
+ }
+ catch (PartInitException e) {
+ JptJpaUiPlugin.log(e);
+ }
+ }
+ });
+ }
+ }
+ }
+
+ /* Implement the abstract method from IWorkbenchWizard
+ * @see org.eclipse.ui.IWorkbenchWizard#init(org.eclipse.ui.IWorkbench, org.eclipse.jface.viewers.IStructuredSelection)
+ */
+ public void init(IWorkbench workbench, IStructuredSelection selection) {
+ this.selection = selection;
+ this.initialProjectName = extractProjectName(selection);
+ getDataModel();
+ }
+
+ protected String extractProjectName(IStructuredSelection selection) {
+ Object selectedObj = selection.getFirstElement();
+ if (selectedObj instanceof IResource) {
+ return ((IResource) selectedObj).getProject().getName();
+ }
+ if (selectedObj instanceof IJavaElement) {
+ return ((IJavaElement) selectedObj).getJavaProject().getProject().getName();
+ }
+ if (selectedObj instanceof JpaContextNode) {
+ return ((JpaContextNode) selectedObj).getJpaProject().getProject().getName();
+ }
+
+ if (selectedObj instanceof IAdaptable) {
+ IResource resource = (IResource) ((IAdaptable) selectedObj).getAdapter(IResource.class);
+ if (resource != null) {
+ return resource.getProject().getName();
+ }
+ IJavaElement javaElement = (IJavaElement) ((IAdaptable) selectedObj).getAdapter(IJavaElement.class);
+ if (javaElement != null) {
+ return javaElement.getJavaProject().getProject().getName();
+ }
+ JpaContextNode node = (JpaContextNode) ((IAdaptable) selectedObj).getAdapter(JpaContextNode.class);
+ if (node != null) {
+ return node.getJpaProject().getProject().getName();
+ }
+ }
+ return null;
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/entity/EntityWizardMsg.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/entity/EntityWizardMsg.java
new file mode 100644
index 0000000000..39acda138a
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/entity/EntityWizardMsg.java
@@ -0,0 +1,127 @@
+/***********************************************************************
+ * Copyright (c) 2008, 2010 by SAP AG, Walldorf.
+ * 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:
+ * SAP AG - initial API and implementation
+ * Dimiter Dimitrov, d.dimitrov@sap.com - initial API and implementation
+ ***********************************************************************/
+package org.eclipse.jpt.jpa.ui.internal.wizards.entity;
+
+import com.ibm.icu.text.MessageFormat;
+import java.util.MissingResourceException;
+import java.util.ResourceBundle;
+import org.eclipse.osgi.util.NLS;
+
+public class EntityWizardMsg extends NLS {
+
+ private static final String BUNDLE_NAME = "jpt_ui_entity_wizard";//$NON-NLS-1$
+ private static ResourceBundle resourceBundle;
+
+ public static String ENTITY_WIZARD_TITLE;
+ public static String ENTITY_WIZARD_PAGE_TITLE;
+ public static String ENTITY_WIZARD_PAGE_DESCRIPTION;
+ public static String DEFAULT_PACKAGE_WARNING;
+ public static String ENTITY_PROPERTIES_TITLE;
+ public static String ENTITY_PROPERTIES_DESCRIPTION;
+ public static String ENTITY;
+ public static String MAPPED_AS_SUPERCLASS;
+ public static String INHERITANCE_GROUP;
+ public static String INHERITANCE_CHECK_BOX;
+ public static String XML_STORAGE_GROUP;
+ public static String XML_SUPPORT;
+ public static String CHOOSE_XML;
+ public static String MAPPING_XML_TITLE;
+ public static String XML_NAME_TITLE;
+ public static String INVALID_XML_NAME;
+ public static String MAPPING_FILE_NOT_LISTED_ERROR;
+ public static String CHOOSE_MAPPING_XML_MESSAGE;
+ public static String TYPE_DIALOG_TITLE;
+ public static String TYPE_DIALOG_DESCRIPTION;
+ public static String ENTITY_NAME;
+ public static String TABLE_NAME;
+ public static String TABLE_NAME_GROUP;
+ public static String USE_DEFAULT;
+ public static String ENTITY_FIELDS_DIALOG_TITLE;
+ public static String ENTITY_FIELDS_GROUP;
+ public static String KEY;
+ public static String NAME_COLUMN;
+ public static String TYPE_COLUMN;
+ public static String NAME_TEXT_FIELD;
+ public static String TYPE_TEXT_FIELD;
+ public static String BROWSE_BUTTON_LABEL;
+ public static String ADD_BUTTON_LABEL;
+ public static String EDIT_BUTTON_LABEL;
+ public static String EntityDataModelProvider_typeNotInProjectClasspath;
+ public static String EntityDataModelProvider_invalidPKType;
+ public static String EntityDataModelProvider_invalidArgument;
+ public static String REMOVE_BUTTON_LABEL;
+ public static String DUPLICATED_ENTITY_NAMES_MESSAGE;
+ public static String ACCESS_TYPE;
+ public static String FIELD_BASED;
+ public static String PROPERTY_BASED;
+ public static String NO_JPA_PROJECTS;
+ public static String APPLY_CHANGES_TO_PERSISTENCE_XML;
+ public static String ADD_MAPPED_SUPERCLASS_TO_XML;
+ public static String ADD_ENTITY_TO_XML;
+ private EntityWizardMsg() {
+ // prevent instantiation of class
+ }
+
+ static {
+ NLS.initializeMessages(BUNDLE_NAME, EntityWizardMsg.class);
+ }
+
+ /**
+ * Returns the resource bundle used by all classes in this Project
+ */
+ public static ResourceBundle getResourceBundle() {
+ try {
+ return ResourceBundle.getBundle(BUNDLE_NAME);//$NON-NLS-1$
+ } catch (MissingResourceException e) {
+ // does nothing - this method will return null and getString(String) will return
+ // the key it was called with
+ }
+ return null;
+ }
+
+ /**
+ * Returns the externalized string, mapped to this key
+ * @param key
+ * @return the text mapped to the key parameter
+ */
+ public static String getString(String key) {
+ if (resourceBundle == null) {
+ resourceBundle = getResourceBundle();
+ }
+
+ if (resourceBundle != null) {
+ try {
+ return resourceBundle.getString(key);
+ } catch (MissingResourceException e) {
+ //exception during string obtaining
+ return "-" + key + "-";//$NON-NLS-2$//$NON-NLS-1$
+ }
+ }
+ //return key, because the relevant string missing in the bundle
+ return "+" + key + "+";//$NON-NLS-2$//$NON-NLS-1$
+ }
+
+ /**
+ * Returns the formated string, mapped to this key
+ * @param key
+ * @param arguments
+ * @return the formated text, mapped to this key, with substituted arguments
+ */
+ public static String getString(String key, Object[] arguments) {
+ try {
+ return MessageFormat.format(getString(key), arguments);
+ } catch (IllegalArgumentException e) {
+ return getString(key);
+ }
+ }
+
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/entity/IdClassTemplate.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/entity/IdClassTemplate.java
new file mode 100644
index 0000000000..8c5f1b244c
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/entity/IdClassTemplate.java
@@ -0,0 +1,255 @@
+package org.eclipse.jpt.jpa.ui.internal.wizards.entity;
+
+import org.eclipse.jpt.jpa.ui.internal.wizards.entity.data.model.*;
+import java.util.*;
+
+public class IdClassTemplate
+{
+ protected static String nl;
+ public static synchronized IdClassTemplate create(String lineSeparator)
+ {
+ nl = lineSeparator;
+ IdClassTemplate result = new IdClassTemplate();
+ nl = null;
+ return result;
+ }
+
+ public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+ protected final String TEXT_1 = "package ";
+ protected final String TEXT_2 = ";";
+ protected final String TEXT_3 = NL;
+ protected final String TEXT_4 = NL + "import ";
+ protected final String TEXT_5 = ";";
+ protected final String TEXT_6 = NL + NL + "/**" + NL + " * ID class for entity: ";
+ protected final String TEXT_7 = NL + " *" + NL + " */ " + NL + "public class ";
+ protected final String TEXT_8 = " ";
+ protected final String TEXT_9 = " implements ";
+ protected final String TEXT_10 = ", ";
+ protected final String TEXT_11 = " { " + NL + " " + NL + "\t";
+ protected final String TEXT_12 = " " + NL + "\tprivate ";
+ protected final String TEXT_13 = " ";
+ protected final String TEXT_14 = ";";
+ protected final String TEXT_15 = NL + "\tprivate static final long serialVersionUID = 1L;" + NL + "" + NL + "\tpublic ";
+ protected final String TEXT_16 = "() {}" + NL + "" + NL + "\t";
+ protected final String TEXT_17 = NL + NL + "\tpublic ";
+ protected final String TEXT_18 = " get";
+ protected final String TEXT_19 = "() {" + NL + "\t\treturn this.";
+ protected final String TEXT_20 = ";" + NL + "\t}" + NL + "" + NL + "\tpublic void set";
+ protected final String TEXT_21 = "(";
+ protected final String TEXT_22 = " ";
+ protected final String TEXT_23 = ") {" + NL + "\t\tthis.";
+ protected final String TEXT_24 = " = ";
+ protected final String TEXT_25 = ";" + NL + "\t}" + NL + "\t";
+ protected final String TEXT_26 = NL + " " + NL + "\t/*" + NL + "\t * @see java.lang.Object#equals(Object)" + NL + "\t */\t" + NL + "\tpublic boolean equals(Object o) {" + NL + "\t\tif (o == this) {" + NL + "\t\t\treturn true;" + NL + "\t\t}" + NL + "\t\tif (!(o instanceof ";
+ protected final String TEXT_27 = ")) {" + NL + "\t\t\treturn false;" + NL + "\t\t}" + NL + "\t\t";
+ protected final String TEXT_28 = " other = (";
+ protected final String TEXT_29 = ") o;" + NL + "\t\treturn true";
+ protected final String TEXT_30 = NL + "\t\t\t&& ";
+ protected final String TEXT_31 = "() == other.";
+ protected final String TEXT_32 = "()";
+ protected final String TEXT_33 = NL + "\t\t\t&& (Double.doubleToLongBits(";
+ protected final String TEXT_34 = "()) == Double.doubleToLongBits(other.";
+ protected final String TEXT_35 = "()))";
+ protected final String TEXT_36 = NL + "\t\t\t&& (Float.floatToIntBits(";
+ protected final String TEXT_37 = "()) == Float.floatToIntBits(other.";
+ protected final String TEXT_38 = "()))";
+ protected final String TEXT_39 = NL + "\t\t\t&& (";
+ protected final String TEXT_40 = "() == null ? other.";
+ protected final String TEXT_41 = "() == null : ";
+ protected final String TEXT_42 = "().equals(other.";
+ protected final String TEXT_43 = "()))";
+ protected final String TEXT_44 = ";" + NL + "\t}" + NL + "\t" + NL + "\t/*\t " + NL + "\t * @see java.lang.Object#hashCode()" + NL + "\t */\t" + NL + "\tpublic int hashCode() {" + NL + "\t\tfinal int prime = 31;" + NL + "\t\tint result = 1;";
+ protected final String TEXT_45 = NL + "\t\tresult = prime * result + (";
+ protected final String TEXT_46 = "() ? 1 : 0);";
+ protected final String TEXT_47 = NL + "\t\tresult = prime * result + ";
+ protected final String TEXT_48 = "();";
+ protected final String TEXT_49 = NL + "\t\tresult = prime * result + ((int) ";
+ protected final String TEXT_50 = "());";
+ protected final String TEXT_51 = NL + "\t\tresult = prime * result + ((int) (";
+ protected final String TEXT_52 = "() ^ (";
+ protected final String TEXT_53 = "() >>> 32)));";
+ protected final String TEXT_54 = NL + "\t\tresult = prime * result + ((int) (Double.doubleToLongBits(";
+ protected final String TEXT_55 = "() ) ^ (Double.doubleToLongBits(";
+ protected final String TEXT_56 = "()) >>> 32)));";
+ protected final String TEXT_57 = NL + "\t\tresult = prime * result + Float.floatToIntBits(";
+ protected final String TEXT_58 = "());";
+ protected final String TEXT_59 = NL + "\t\tresult = prime * result + (";
+ protected final String TEXT_60 = "() == null ? 0 : ";
+ protected final String TEXT_61 = "().hashCode());";
+ protected final String TEXT_62 = NL + "\t\treturn result;" + NL + "\t}" + NL + " " + NL + " " + NL + "}";
+ protected final String TEXT_63 = NL;
+
+ public String generate(Object argument)
+ {
+ final StringBuffer stringBuffer = new StringBuffer();
+ CreateEntityTemplateModel model = (CreateEntityTemplateModel) argument;
+if (model.getJavaPackageName()!=null && model.getJavaPackageName()!="") {
+ stringBuffer.append(TEXT_1);
+ stringBuffer.append(model.getJavaPackageName());
+ stringBuffer.append(TEXT_2);
+ }
+ stringBuffer.append(TEXT_3);
+ Collection<String> imports = model.getImports(true);
+for (String anImport : imports) {
+ stringBuffer.append(TEXT_4);
+ stringBuffer.append(anImport);
+ stringBuffer.append(TEXT_5);
+ }
+ stringBuffer.append(TEXT_6);
+ stringBuffer.append(model.getClassName());
+ stringBuffer.append(TEXT_7);
+ stringBuffer.append(model.getIdClassName());
+ stringBuffer.append(TEXT_8);
+ List<String> interfaces = model.getInterfaces();
+ if (interfaces.size()>0) {
+ stringBuffer.append(TEXT_9);
+ }
+ for (int i=0; i<interfaces.size(); i++) {
+ String INTERFACE = (String) interfaces.get(i);
+ if (i>0) {
+ stringBuffer.append(TEXT_10);
+ }
+ stringBuffer.append(INTERFACE);
+ }
+ stringBuffer.append(TEXT_11);
+ List<EntityRow> fields = model.getEntityFields();
+ List<String> pkFields = model.getPKFields();
+ for (int i=0; i<fields.size(); i++) {
+ EntityRow entity = (EntityRow) fields.get(i);
+ if (!pkFields.contains(entity.getName())) {
+ continue;
+ }
+
+ stringBuffer.append(TEXT_12);
+ stringBuffer.append(entity.getType());
+ stringBuffer.append(TEXT_13);
+ stringBuffer.append(entity.getName());
+ stringBuffer.append(TEXT_14);
+ }
+ stringBuffer.append(TEXT_15);
+ stringBuffer.append(model.getIdClassName());
+ stringBuffer.append(TEXT_16);
+
+ fields = model.getEntityFields();
+ if (fields != null) for (int i=0; i<fields.size(); i++) {
+ EntityRow field = (EntityRow) fields.get(i);
+ String TYPE = field.getType();
+ String NAME = field.getName();
+ if (!pkFields.contains(NAME)) {
+ continue;
+ }
+ String METHOD = NAME.substring(0,1).toUpperCase() + NAME.substring(1);
+
+ stringBuffer.append(TEXT_17);
+ stringBuffer.append(TYPE);
+ stringBuffer.append(TEXT_18);
+ stringBuffer.append(METHOD);
+ stringBuffer.append(TEXT_19);
+ stringBuffer.append(NAME);
+ stringBuffer.append(TEXT_20);
+ stringBuffer.append(METHOD);
+ stringBuffer.append(TEXT_21);
+ stringBuffer.append(TYPE);
+ stringBuffer.append(TEXT_22);
+ stringBuffer.append(NAME);
+ stringBuffer.append(TEXT_23);
+ stringBuffer.append(NAME);
+ stringBuffer.append(TEXT_24);
+ stringBuffer.append(NAME);
+ stringBuffer.append(TEXT_25);
+ }
+ stringBuffer.append(TEXT_26);
+ stringBuffer.append(model.getIdClassName());
+ stringBuffer.append(TEXT_27);
+ stringBuffer.append(model.getIdClassName());
+ stringBuffer.append(TEXT_28);
+ stringBuffer.append(model.getIdClassName());
+ stringBuffer.append(TEXT_29);
+ if (fields != null) for (int i=0; i<fields.size(); i++) {
+ EntityRow field = (EntityRow) fields.get(i);
+ String NAME = field.getName();
+ if (!pkFields.contains(NAME)) {
+ continue;
+ }
+ String TYPE = field.getType();
+ String GET_METHOD = "get" + NAME.substring(0,1).toUpperCase() + NAME.substring(1);
+ if (TYPE.equals("boolean") || TYPE.equals("byte") || TYPE.equals("char") || TYPE.equals("short") || TYPE.equals("int") || TYPE.equals("long")) {
+ stringBuffer.append(TEXT_30);
+ stringBuffer.append(GET_METHOD);
+ stringBuffer.append(TEXT_31);
+ stringBuffer.append(GET_METHOD);
+ stringBuffer.append(TEXT_32);
+ } else if (TYPE.equals("double")) {
+ stringBuffer.append(TEXT_33);
+ stringBuffer.append(GET_METHOD);
+ stringBuffer.append(TEXT_34);
+ stringBuffer.append(GET_METHOD);
+ stringBuffer.append(TEXT_35);
+ } else if (TYPE.equals("float")) {
+ stringBuffer.append(TEXT_36);
+ stringBuffer.append(GET_METHOD);
+ stringBuffer.append(TEXT_37);
+ stringBuffer.append(GET_METHOD);
+ stringBuffer.append(TEXT_38);
+ } else {
+ stringBuffer.append(TEXT_39);
+ stringBuffer.append(GET_METHOD);
+ stringBuffer.append(TEXT_40);
+ stringBuffer.append(GET_METHOD);
+ stringBuffer.append(TEXT_41);
+ stringBuffer.append(GET_METHOD);
+ stringBuffer.append(TEXT_42);
+ stringBuffer.append(GET_METHOD);
+ stringBuffer.append(TEXT_43);
+ }
+ }
+ stringBuffer.append(TEXT_44);
+ if (fields != null) for (int i=0; i<fields.size(); i++) {
+ EntityRow field = (EntityRow) fields.get(i);
+ String NAME = field.getName();
+ if (!pkFields.contains(NAME)) {
+ continue;
+ }
+ String TYPE = field.getType();
+ String GET_METHOD = "get" + NAME.substring(0,1).toUpperCase() + NAME.substring(1);
+ if (TYPE.equals("boolean")) {
+ stringBuffer.append(TEXT_45);
+ stringBuffer.append(GET_METHOD);
+ stringBuffer.append(TEXT_46);
+ } else if (TYPE.equals("int")) {
+ stringBuffer.append(TEXT_47);
+ stringBuffer.append(GET_METHOD);
+ stringBuffer.append(TEXT_48);
+ } else if (TYPE.equals("byte") || TYPE.equals("char") || TYPE.equals("short")) {
+ stringBuffer.append(TEXT_49);
+ stringBuffer.append(GET_METHOD);
+ stringBuffer.append(TEXT_50);
+ } else if (TYPE.equals("long")) {
+ stringBuffer.append(TEXT_51);
+ stringBuffer.append(GET_METHOD);
+ stringBuffer.append(TEXT_52);
+ stringBuffer.append(GET_METHOD);
+ stringBuffer.append(TEXT_53);
+ } else if (TYPE.equals("double")) {
+ stringBuffer.append(TEXT_54);
+ stringBuffer.append(GET_METHOD);
+ stringBuffer.append(TEXT_55);
+ stringBuffer.append(GET_METHOD);
+ stringBuffer.append(TEXT_56);
+ } else if (TYPE.equals("float")) {
+ stringBuffer.append(TEXT_57);
+ stringBuffer.append(GET_METHOD);
+ stringBuffer.append(TEXT_58);
+ } else {
+ stringBuffer.append(TEXT_59);
+ stringBuffer.append(GET_METHOD);
+ stringBuffer.append(TEXT_60);
+ stringBuffer.append(GET_METHOD);
+ stringBuffer.append(TEXT_61);
+ }
+ }
+ stringBuffer.append(TEXT_62);
+ stringBuffer.append(TEXT_63);
+ return stringBuffer.toString();
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/entity/data/model/CreateEntityTemplateModel.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/entity/data/model/CreateEntityTemplateModel.java
new file mode 100644
index 0000000000..2f180bfae3
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/entity/data/model/CreateEntityTemplateModel.java
@@ -0,0 +1,384 @@
+/***********************************************************************
+ * Copyright (c) 2008, 2010 by SAP AG, Walldorf.
+ * 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:
+ * SAP AG - initial API and implementation
+ * Dimiter Dimitrov, d.dimitrov@sap.com - initial API and implementation
+ ***********************************************************************/
+package org.eclipse.jpt.jpa.ui.internal.wizards.entity.data.model;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.List;
+import java.util.TreeSet;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.jdt.core.IPackageFragmentRoot;
+import org.eclipse.jdt.core.Signature;
+import org.eclipse.jem.util.emf.workbench.ProjectUtilities;
+import org.eclipse.jpt.jpa.core.JptJpaCorePlugin;
+import org.eclipse.jst.j2ee.internal.common.operations.INewJavaClassDataModelProperties;
+import org.eclipse.jst.j2ee.internal.project.J2EEProjectUtilities;
+import org.eclipse.wst.common.componentcore.internal.operation.IArtifactEditOperationDataModelProperties;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+
+public class CreateEntityTemplateModel {
+
+ protected IDataModel dataModel;
+
+ private static final String DOT = "."; //$NON-NLS-1$
+ private static final String BRACKET = "["; //$NON-NLS-1$
+ private static final String PK_SUFFIX = "PK"; //$NON-NLS-1$
+ private static final String QUALIFIED_SERIALIZABLE = "java.io.Serializable"; //$NON-NLS-1$
+ private static final String PERSISTENCE_PACKAGE = "javax.persistence.*"; //$NON-NLS-1$
+ private static final String ENTITY_ANNOTATION = "@Entity"; //$NON-NLS-1$
+ private static final String MAPPED_AS_SUPERCLASS_TYPE = "@MappedSuperclass"; //$NON-NLS-1$
+ private static final String INHERITANCE_TYPE = "@Inheritance"; //$NON-NLS-1$
+
+ /**
+ * Constructs entity model as expansion of the data model
+ * @param dataModel
+ */
+ public CreateEntityTemplateModel(IDataModel dataModel) {
+ this.dataModel = dataModel;
+ }
+
+ /**
+ * Returns the necessary imports on depends of entity (primary keys) fields. It is used from
+ * JET emmiter when it generates entity (IdClass)
+ * @param isIdClass flag, which indicates the case. When it is false, the result is
+ * the import list for the entity class, in other case the results is the set for the IdClass
+ * generation
+ * @return the imports collection with the imports for the generated java class
+ */
+ public Collection<String> getImports(boolean isIdClass) {
+ Collection<String> collection = new TreeSet<String>();
+
+ String className = getClassName();
+ String superclassName = getQualifiedSuperclassName();
+
+ if (superclassName != null && superclassName.length() > 0 &&
+ !equalSimpleNames(className, superclassName)) {
+ collection.add(superclassName);
+ }
+
+ List interfaces = getQualifiedInterfaces();
+ if (interfaces != null) {
+ Iterator iterator = interfaces.iterator();
+ while (iterator.hasNext()) {
+ String iface = (String) iterator.next();
+ if (!equalSimpleNames(getClassName(), iface)) {
+ collection.add(iface);
+ }
+ }
+ }
+ if (isIdClass) {
+ collection.addAll(getIdClassImportList());
+ } else {
+ collection.add(PERSISTENCE_PACKAGE);
+ collection.addAll(getFieldImportList());
+
+ }
+ return collection;
+ }
+
+ /**
+ * @return class name of the entity
+ */
+ public String getClassName() {
+ return getProperty(INewJavaClassDataModelProperties.CLASS_NAME).trim();
+ }
+
+ /**
+ * @return package name when the entity will be generated
+ */
+ public String getJavaPackageName() {
+ return getProperty(INewJavaClassDataModelProperties.JAVA_PACKAGE).trim();
+ }
+
+ /**
+ * @return fully qualified java class name
+ */
+ public String getQualifiedJavaClassName() {
+ if (!getJavaPackageName().equals(IEntityDataModelProperties.EMPTY_STRING)) {
+ return getJavaPackageName() + DOT + getClassName();
+ }
+ return getClassName();
+ }
+
+ /**
+ * @return the name
+ */
+ public String getSuperclassName() {
+ String qualified = getQualifiedSuperclassName();
+ if (equalSimpleNames(getClassName(), qualified)) {
+ return qualified;
+ } else {
+ return Signature.getSimpleName(qualified);
+ }
+ }
+
+ /**
+ * @return fully qualified name of the entity's super class
+ */
+ public String getQualifiedSuperclassName() {
+ return getProperty(INewJavaClassDataModelProperties.SUPERCLASS).trim();
+ }
+
+ /**
+ * @return list with the interfaces implemented from entity class
+ */
+ public List<String> getInterfaces() {
+ List qualifiedInterfaces = getQualifiedInterfaces();
+ List<String> interfaces = new ArrayList<String>(qualifiedInterfaces.size());
+
+ Iterator iter = qualifiedInterfaces.iterator();
+ while (iter.hasNext()) {
+ String qualified = (String) iter.next();
+ if (equalSimpleNames(getClassName(), qualified)) {
+ interfaces.add(qualified);
+ } else {
+ interfaces.add(Signature.getSimpleName(qualified));
+ }
+ }
+
+ return interfaces;
+ }
+
+ /**
+ * @return list with the interfaces (fully qualified named) implemented from entity class
+ */
+ public List getQualifiedInterfaces() {
+ List interfaces = (List) this.dataModel.getProperty(INewJavaClassDataModelProperties.INTERFACES);
+ if (interfaces == null){
+ interfaces = new ArrayList();
+ }
+ interfaces.add(QUALIFIED_SERIALIZABLE);
+ return interfaces;
+ }
+
+ /**
+ * Returns the value of the specified string property
+ * @param propertyName
+ * @return string value of teh specified propert
+ */
+ protected String getProperty(String propertyName) {
+ return dataModel.getStringProperty(propertyName);
+ }
+
+ /**
+ * This methods is used for the comparison of fully qualified types
+ * @param name1 first type name
+ * @param name2 second type name
+ * @return whether the simple names of the types are equal
+ */
+ protected boolean equalSimpleNames(String name1, String name2) {
+ String simpleName1 = Signature.getSimpleName(name1);
+ String simpleName2 = Signature.getSimpleName(name2);
+ return simpleName1.equals(simpleName2);
+ }
+
+ /**
+ * @return the type of the artifact - Entity or Mapped superclass
+ */
+ public String getArtifactType() {
+ if(dataModel.getBooleanProperty(IEntityDataModelProperties.MAPPED_AS_SUPERCLASS)) {
+ return MAPPED_AS_SUPERCLASS_TYPE;
+ }
+ return ENTITY_ANNOTATION;
+ }
+
+ /**
+ * @return whether entity set inheritance strategy
+ */
+ public boolean isInheritanceSet() {
+ return dataModel.getBooleanProperty(IEntityDataModelProperties.INHERITANCE);
+ }
+
+ /**
+ * @return the name of the inheritance strategy, as it is defined in the specification
+ */
+ public String getInheritanceStrategyName() {
+ return getProperty(IEntityDataModelProperties.INHERITANCE_STRATEGY);
+ }
+
+ /**
+ * @return the constructed @Inheritance annotation with the relevant strategy
+ * if it is chosen
+ */
+ public String getInheritanceStrategy() {
+ String result = IEntityDataModelProperties.EMPTY_STRING;
+ if (isInheritanceSet()) {
+ result = INHERITANCE_TYPE;
+ if (!getProperty(IEntityDataModelProperties.INHERITANCE_STRATEGY).equals(IEntityDataModelProperties.EMPTY_STRING)) { //$NON-NLS-1$
+ result += "(strategy=InheritanceType." + getProperty(IEntityDataModelProperties.INHERITANCE_STRATEGY) + ")"; //$NON-NLS-1$ $NON-NLS-2$
+
+ }
+ }
+ return result;
+ }
+
+ /**
+ * @return whether the generated artifact is not entity
+ */
+ public boolean isNonEntitySuperclass() {
+ return !dataModel.getBooleanProperty(IEntityDataModelProperties.ENTITY);
+ }
+
+ /**
+ * @return true the created artifact will be annotated
+ * @return false the entity mappings will be registered in XML
+ */
+ public boolean isArtifactsAnnotated() {
+ return !dataModel.getBooleanProperty(IEntityDataModelProperties.XML_SUPPORT);
+ }
+
+ public boolean isMappingXMLDefault() {
+ if (getMappingXMLName().equals(IEntityDataModelProperties.EMPTY_STRING)) {
+ return true;
+ }
+ return getMappingXMLName().equals(JptJpaCorePlugin.DEFAULT_ORM_XML_RUNTIME_PATH.toString());
+ }
+
+ public String getMappingXMLName() {
+ return dataModel.getStringProperty(IEntityDataModelProperties.XML_NAME).trim();
+ }
+
+ public IFile getMappingXmlFile() {
+ IFile ormFile = null;
+ IProject project = getProject();
+ IPackageFragmentRoot[] sourceFragments = J2EEProjectUtilities.getSourceContainers(project);
+ for (IPackageFragmentRoot packageFragmentRoot : sourceFragments) {
+ ormFile = project.getFile(packageFragmentRoot.getResource().getName() + File.separator + getMappingXMLName());
+ if (ormFile.exists()) {
+ break;
+ }
+ }
+ return ormFile;
+ }
+
+ /**
+ * @return the entity name (could be different from the class name)
+ * See <code>isEntityNameSet()<code>
+ */
+ public String getEntityName() {
+ return getProperty(IEntityDataModelProperties.ENTITY_NAME).trim();
+ }
+
+ /**
+ * @return whether the entity name is different than class name
+ */
+ public boolean isEntityNameSet() {
+ boolean result = false;
+ if (!getClassName().equals(getEntityName())) {
+ result = true;
+ }
+ return result;
+ }
+
+ /**
+ * @return whether the table name is specified explicitly
+ */
+ public boolean isTableNameSet() {
+ return !dataModel.getBooleanProperty(IEntityDataModelProperties.TABLE_NAME_DEFAULT);
+ }
+
+ /**
+ * @return the table name (if it is specified)
+ * See <code>isTableNameSet()<code>
+ */
+ public String getTableName() {
+ return getProperty(IEntityDataModelProperties.TABLE_NAME).trim();
+ }
+
+ /**
+ * @return list with the entity fields
+ */
+ public List<EntityRow> getEntityFields() {
+ ArrayList<EntityRow> fields = (ArrayList<EntityRow>) dataModel.getProperty(IEntityDataModelProperties.ENTITY_FIELDS);
+ if (fields == null){
+ return new ArrayList<EntityRow>();
+ } else
+ return fields;
+ }
+
+ /**
+ * @return list with the imports necessary for the entity (based on its fields)
+ */
+ public List<String> getFieldImportList() {
+ List<String> imports = new ArrayList<String>();
+ List<EntityRow> entities = getEntityFields();
+ for (EntityRow entityRow : entities) {
+ if (!imports.contains(entityRow.getFqnTypeName()) && !entityRow.getType().equals(entityRow.getFqnTypeName())) {
+ String fqnTypeName = entityRow.getFqnTypeName();
+ //remove the array brackets [] for the java.lang.Byte[] & java.lang.Character[]
+ if (fqnTypeName.indexOf(BRACKET) != -1) {
+ fqnTypeName = fqnTypeName.substring(0, fqnTypeName.indexOf("["));
+ }
+ imports.add(fqnTypeName);
+ }
+ }
+ return imports;
+ }
+ /**
+ * @return list with the imports necessary for the id class (based on its fields - primary keys of the entity)
+ */
+ public List<String> getIdClassImportList() {
+ List<String> imports = new ArrayList<String>();
+ List<EntityRow> entities = getEntityFields();
+ List<String> pkFields = getPKFields();
+ for (EntityRow entityRow : entities) {
+ String name = entityRow.getName();
+ if (pkFields.contains(name)) {
+ if (!imports.contains(entityRow.getFqnTypeName()) && !entityRow.getType().equals(entityRow.getFqnTypeName())) {
+ imports.add(entityRow.getFqnTypeName());
+ }
+ }
+ }
+ return imports;
+ }
+
+ /**
+ * @return whether the access type is field based
+ */
+ public boolean isFieldAccess() {
+ return dataModel.getBooleanProperty(IEntityDataModelProperties.FIELD_ACCESS_TYPE);
+ }
+
+ /**
+ * @return the primary key is composite (more than one annotated as primary key field)
+ */
+ public boolean isCompositePK() {
+ return getPKFields().size() > 1;
+ }
+
+ /**
+ * @return list with primary key name(s)
+ */
+ public List<String> getPKFields() {
+ return (ArrayList<String>)dataModel.getProperty(IEntityDataModelProperties.PK_FIELDS);
+ }
+
+ /**
+ * @return constructed name of the id class (entity name + PK as suffix)
+ */
+ public String getIdClassName() {
+ return getClassName() + PK_SUFFIX;
+ }
+
+ /**
+ * @return IProject presentation of JPA project
+ */
+ public IProject getProject() {
+ String projectName = dataModel.getStringProperty(IArtifactEditOperationDataModelProperties.PROJECT_NAME);
+ return ProjectUtilities.getProject(projectName);
+ }
+
+
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/entity/data/model/EntityDataModelProvider.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/entity/data/model/EntityDataModelProvider.java
new file mode 100644
index 0000000000..dab8489d17
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/entity/data/model/EntityDataModelProvider.java
@@ -0,0 +1,504 @@
+/***********************************************************************
+ * Copyright (c) 2008, 2010 by SAP AG, Walldorf.
+ * 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:
+ * SAP AG - initial API and implementation
+ * Dimiter Dimitrov, d.dimitrov@sap.com - initial API and implementation
+ ***********************************************************************/
+package org.eclipse.jpt.jpa.ui.internal.wizards.entity.data.model;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Set;
+import org.eclipse.core.resources.IContainer;
+import org.eclipse.core.resources.IFolder;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.IPackageFragmentRoot;
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.core.JavaConventions;
+import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.jdt.core.Signature;
+import org.eclipse.jem.util.emf.workbench.ProjectUtilities;
+import org.eclipse.jpt.common.utility.internal.StringTools;
+import org.eclipse.jpt.jpa.core.JpaFacet;
+import org.eclipse.jpt.jpa.core.JpaProject;
+import org.eclipse.jpt.jpa.core.JptJpaCorePlugin;
+import org.eclipse.jpt.jpa.core.resource.xml.JpaXmlResource;
+import org.eclipse.jpt.jpa.ui.JptJpaUiPlugin;
+import org.eclipse.jpt.jpa.ui.internal.wizards.entity.EntityWizardMsg;
+import org.eclipse.jpt.jpa.ui.internal.wizards.entity.data.operation.NewEntityClassOperation;
+import org.eclipse.jst.j2ee.internal.common.J2EECommonMessages;
+import org.eclipse.jst.j2ee.internal.common.operations.INewJavaClassDataModelProperties;
+import org.eclipse.jst.j2ee.internal.common.operations.NewJavaClassDataModelProvider;
+import org.eclipse.jst.j2ee.internal.plugin.J2EEPlugin;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModelOperation;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModelProvider;
+import org.eclipse.wst.common.frameworks.internal.plugin.WTPCommonPlugin;
+import com.ibm.icu.text.MessageFormat;
+
+public class EntityDataModelProvider extends NewJavaClassDataModelProvider implements IEntityDataModelProperties{
+
+ @Override
+ public IDataModelOperation getDefaultOperation() {
+ return new NewEntityClassOperation(getDataModel());
+ }
+
+ /**
+ * Extends: <code>IDataModelProvider#getPropertyNames()</code>
+ * and add own data model's properties specific for the entity model
+ *
+ * @see org.eclipse.wst.common.frameworks.datamodel.IDataModelProvider#getPropertyNames()
+ */
+ @Override
+ public Set getPropertyNames() {
+ Set propertyNames = super.getPropertyNames();
+ propertyNames.add(INHERITANCE);
+ propertyNames.add(ENTITY);
+ propertyNames.add(MAPPED_AS_SUPERCLASS);
+ propertyNames.add(INHERITANCE_STRATEGY);
+ propertyNames.add(XML_SUPPORT);
+ propertyNames.add(XML_NAME);
+ propertyNames.add(ENTITY_NAME);
+ propertyNames.add(TABLE_NAME_DEFAULT);
+ propertyNames.add(TABLE_NAME);
+ propertyNames.add(ENTITY_FIELDS);
+ propertyNames.add(PK_FIELDS);
+ propertyNames.add(FIELD_ACCESS_TYPE);
+ propertyNames.add(PROPERTY_ACCESS_TYPE);
+ return propertyNames;
+ }
+
+ /**
+ * Returns the default value of the parameter (which should present a valid data model property).
+ * This method does not accept a null parameter. It may return null.
+ *
+ * @see NewJavaClassDataModelProvider#getDefaultProperty(String)
+ * @see IDataModelProvider#getDefaultProperty(String)
+ *
+ * @param propertyName
+ * @return Object default value of property
+ */
+ @Override
+ public Object getDefaultProperty(String propertyName) {
+ // overridden
+ if (propertyName.equals(SOURCE_FOLDER)) {
+ IContainer container = getDefaultJavaSourceContainer();
+ return (container == null) ? null : container.getFullPath().toString();
+ }
+
+ else if (propertyName.equals(INHERITANCE)) {
+ return Boolean.FALSE;
+ } else if (propertyName.equals(ENTITY)) {
+ return Boolean.TRUE;
+ } else if (propertyName.equals(MAPPED_AS_SUPERCLASS)) {
+ return Boolean.FALSE;
+ } else if (propertyName.equals(XML_SUPPORT)) {
+ return Boolean.FALSE;
+ } else if (propertyName.equals(XML_NAME)) {
+ return EMPTY_STRING;
+ } else if (propertyName.equals(ENTITY_NAME)) {
+ return getStringProperty(CLASS_NAME);
+ } else if (propertyName.equals(TABLE_NAME_DEFAULT)) {
+ return Boolean.TRUE;
+ } else if (propertyName.equals(TABLE_NAME)) {
+ return getStringProperty(CLASS_NAME);
+ } else if (propertyName.equals(INHERITANCE_STRATEGY)) {
+ return EMPTY_STRING;
+ } else if (propertyName.equals(SUPERCLASS)) {
+ return EMPTY_STRING;
+ } else if (propertyName.equals(ENTITY_FIELDS)) {
+ return new ArrayList<EntityRow>();
+ } else if (propertyName.equals(PK_FIELDS)) {
+ return new ArrayList<String>();
+ } else if (propertyName.equals(FIELD_ACCESS_TYPE)) {
+ return Boolean.TRUE;
+ } else if (propertyName.equals(PROPERTY_ACCESS_TYPE)) {
+ return Boolean.FALSE;
+ }
+ // Otherwise check super for default value for property
+ return super.getDefaultProperty(propertyName);
+ }
+
+ @Override
+ protected IFolder getDefaultJavaSourceFolder() {
+ return null;
+ }
+
+ protected IContainer getDefaultJavaSourceContainer() {
+ JpaProject jpaProject = getTargetJpaProject();
+ if (jpaProject == null) {
+ return null;
+ }
+ IJavaProject javaProject = jpaProject.getJavaProject();
+ try {
+ for (IPackageFragmentRoot pfr : javaProject.getPackageFragmentRoots()) {
+ if (pfr.getKind() == IPackageFragmentRoot.K_SOURCE) {
+ return (IContainer) pfr.getUnderlyingResource();
+ }
+ }
+ }
+ catch (JavaModelException jme) {
+ // fall through
+ JptJpaUiPlugin.log(jme);
+ }
+ return null;
+ }
+
+ @Override
+ public boolean propertySet(String propertyName, Object propertyValue) {
+ boolean ok = super.propertySet(propertyName, propertyValue);
+ if (ok) {
+ if (COMPONENT_NAME.equals(propertyName) || PROJECT_NAME.equals(propertyName)) {
+ this.model.notifyPropertyChange(SOURCE_FOLDER, IDataModel.DEFAULT_CHG);
+ }
+ if (PROJECT_NAME.equals(propertyName) || XML_SUPPORT.equals(propertyName)) {
+ this.model.notifyPropertyChange(XML_NAME, IDataModel.VALID_VALUES_CHG);
+ }
+ }
+ return ok;
+ }
+
+ /* Adds additional check to the model validation
+ * @see org.eclipse.jst.j2ee.internal.common.operations.NewJavaClassDataModelProvider#validate(java.lang.String)
+ */
+ @Override
+ public IStatus validate(String propertyName) {
+ IStatus result = super.validate(propertyName);
+ if (propertyName.equals(JAVA_PACKAGE)) {
+ return validateJavaPackage(getStringProperty(propertyName));
+ }
+ if (propertyName.equals(SUPERCLASS) && EMPTY_STRING.equals(getStringProperty(propertyName))) {
+ return WTPCommonPlugin.OK_STATUS;
+ }
+ if (propertyName.equals(XML_NAME)) {
+ return validateXmlName(getStringProperty(propertyName));
+ }
+ if (propertyName.equals(ENTITY_FIELDS)) {
+ return validateFieldsList((ArrayList<EntityRow>) getProperty(propertyName));
+ }
+ return result;
+ }
+
+ @Override
+ protected IStatus validateJavaSourceFolder(String containerFullPath) {
+ // Ensure that the source folder path is not empty
+ if (containerFullPath == null || containerFullPath.length() == 0) {
+ String msg = J2EECommonMessages.ERR_JAVA_CLASS_FOLDER_NAME_EMPTY;
+ return WTPCommonPlugin.createErrorStatus(msg);
+ }
+ // Ensure that the source folder path is absolute
+ else if (!new Path(containerFullPath).isAbsolute()) {
+ String msg = J2EECommonMessages.ERR_JAVA_CLASS_FOLDER_NOT_ABSOLUTE;
+ return WTPCommonPlugin.createErrorStatus(msg);
+ }
+ IProject project = getTargetProject();
+ // Ensure project is not closed
+ if (project == null) {
+ String msg = J2EECommonMessages.ERR_JAVA_CLASS_FOLDER_NOT_EXIST;
+ return WTPCommonPlugin.createErrorStatus(msg);
+ }
+ // Ensure project is accessible.
+ if (!project.isAccessible()) {
+ String msg = J2EECommonMessages.ERR_JAVA_CLASS_FOLDER_NOT_EXIST;
+ return WTPCommonPlugin.createErrorStatus(msg);
+ }
+ // Ensure the project is a java project.
+ try {
+ if (!project.hasNature(JavaCore.NATURE_ID)) {
+ String msg = J2EECommonMessages.ERR_JAVA_CLASS_NOT_JAVA_PROJECT;
+ return WTPCommonPlugin.createErrorStatus(msg);
+ }
+ } catch (CoreException e) {
+ J2EEPlugin.logError(e);
+ }
+ // Ensure the selected folder is a valid java source folder for the component
+ IContainer container = getJavaSourceContainer();
+ if (container == null || (! container.getFullPath().equals(new Path(containerFullPath)))) {
+ String msg = J2EECommonMessages.getResourceString(J2EECommonMessages.ERR_JAVA_CLASS_FOLDER_NOT_SOURCE, new String[]{containerFullPath});
+ return WTPCommonPlugin.createErrorStatus(msg);
+ }
+ // Valid source is selected
+ return WTPCommonPlugin.OK_STATUS;
+ }
+
+ /**
+ * This method is intended for internal use only. It will be used to validate the correctness of entity package
+ * in accordance with Java convention requirements. This method will accept a null parameter.
+ *
+ * @see NewFilterClassDataModelProvider#validate(String)
+ *
+ * @param packName
+ * @return IStatus is the package name satisfies Java convention requirements
+ */
+
+ private IStatus validateJavaPackage(String packName) {
+ if (packName == null || packName.equals(EMPTY_STRING)) {
+ return WTPCommonPlugin.createWarningStatus(EntityWizardMsg.DEFAULT_PACKAGE_WARNING);
+ }
+ // Use standard java conventions to validate the package name
+ IStatus javaStatus = JavaConventions.validatePackageName(packName, JavaCore.VERSION_1_5, JavaCore.VERSION_1_5);
+ if (javaStatus.getSeverity() == IStatus.ERROR) {
+ String msg = J2EECommonMessages.ERR_JAVA_PACAKGE_NAME_INVALID + javaStatus.getMessage();
+ return WTPCommonPlugin.createErrorStatus(msg);
+ } else if (javaStatus.getSeverity() == IStatus.WARNING) {
+ String msg = J2EECommonMessages.ERR_JAVA_PACKAGE_NAME_WARNING + javaStatus.getMessage();
+ return WTPCommonPlugin.createWarningStatus(msg);
+ }
+ // java package name is valid
+ return WTPCommonPlugin.OK_STATUS;
+ }
+
+ /**
+ * This method is intended for internal use only. It will be used to validate
+ * the correctness of xml file location.
+ * This method will accept a null parameter.
+ *
+ * @see NewFilterClassDataModelProvider#validate(String)
+ *
+ * @param xmlName
+ * @return IStatus is the package name satisfies Java convention requirements
+ */
+ private IStatus validateXmlName(String xmlName) {
+ if (getBooleanProperty(XML_SUPPORT)) {
+ String projectName = this.model.getStringProperty(PROJECT_NAME);
+ IProject project = ProjectUtilities.getProject(projectName);
+ if (project != null && ! StringTools.stringIsEmpty(xmlName)) {
+ JpaXmlResource ormXmlResource = getOrmXmlResource(xmlName);
+ if (ormXmlResource == null) {
+ return new Status(
+ IStatus.ERROR, JptJpaUiPlugin.PLUGIN_ID,
+ EntityWizardMsg.INVALID_XML_NAME);
+ }
+ else if (getTargetJpaProject().getJpaFile(ormXmlResource.getFile()).rootStructureNodesSize() == 0) {
+ return new Status(
+ IStatus.ERROR, JptJpaUiPlugin.PLUGIN_ID,
+ EntityWizardMsg.MAPPING_FILE_NOT_LISTED_ERROR);
+ }
+ }
+ }
+ return Status.OK_STATUS;
+ }
+
+ protected JpaXmlResource getOrmXmlResource(String xmlName) {
+ return getTargetJpaProject().getMappingFileXmlResource(new Path(xmlName));
+ }
+
+ /**
+ * This method is intended for internal use only. It will be used to validate the entity fields
+ * list to ensure there are not any duplicates. This method will accept a null parameter.
+ *
+ * @see NewFilterClassDataModelProvider#validate(String)
+ *
+ * @param entities
+ * @return IStatus is the fields names are unique
+ */
+ private IStatus validateFieldsList(ArrayList<EntityRow> entities) {
+ if (entities != null && !entities.isEmpty()) {
+ // Ensure there are not duplicate entries in the list
+ boolean dup = hasDuplicatesInEntityFields(entities);
+ if (dup) {
+ String msg = EntityWizardMsg.DUPLICATED_ENTITY_NAMES_MESSAGE;
+ return WTPCommonPlugin.createErrorStatus(msg);
+ }
+ // Ensure that the entries in the list are valid
+ String errorMsg = checkInputElementsTypeValidation(entities);
+ if (errorMsg != null) {
+ return WTPCommonPlugin.createErrorStatus(errorMsg);
+ }
+ String warningMsg = checkInputElementsTypeExistence(entities);
+ if (warningMsg != null) {
+ return WTPCommonPlugin.createWarningStatus(warningMsg);
+ }
+ }
+ return WTPCommonPlugin.OK_STATUS;
+ }
+
+ private String checkInputElementsTypeValidation(List<EntityRow> inputElements) {
+ IStatus validateFieldTypeStatus = Status.OK_STATUS;
+ for (EntityRow entityRow: inputElements) {
+ if (entityRow.isKey() && !entityRow.couldBeKey()) {
+ String message = MessageFormat.format(
+ EntityWizardMsg.EntityDataModelProvider_invalidPKType, new Object[]{entityRow.getFqnTypeName()});
+ validateFieldTypeStatus = new Status(IStatus.ERROR,
+ JptJpaUiPlugin.PLUGIN_ID, message);
+ break;
+ }
+ String sig = null;
+ try {
+ sig = Signature.createTypeSignature(entityRow.getFqnTypeName(), true);
+ } catch (IllegalArgumentException e) {
+ String message = MessageFormat.format(EntityWizardMsg.EntityDataModelProvider_invalidArgument, new Object[]{e.getLocalizedMessage()});
+ validateFieldTypeStatus = new Status(IStatus.ERROR, JptJpaUiPlugin.PLUGIN_ID, message);
+ break;
+ }
+ if (sig == null){
+ validateFieldTypeStatus = JavaConventions.validateJavaTypeName(entityRow.getType(), JavaCore.VERSION_1_5, JavaCore.VERSION_1_5);
+ break;
+ }
+ int sigType = Signature.getTypeSignatureKind(sig);
+ if (sigType == Signature.BASE_TYPE_SIGNATURE) {
+ continue;
+ }
+ else if (sigType == Signature.ARRAY_TYPE_SIGNATURE) {
+ String elementSignature = Signature.getElementType(sig);
+ if (Signature.getTypeSignatureKind(elementSignature) == Signature.BASE_TYPE_SIGNATURE) {
+ continue;
+ }
+ }
+ }
+ if (!validateFieldTypeStatus.isOK()) {
+ return validateFieldTypeStatus.getMessage();
+ }
+ return null;
+ }
+
+ private String checkInputElementsTypeExistence(List<EntityRow> inputElements) {
+ IStatus validateFieldTypeStatus=Status.OK_STATUS;
+ for (EntityRow entityRow: inputElements) {
+ String sig = Signature.createTypeSignature(entityRow.getFqnTypeName() ,true);
+ if (sig == null) {
+ String message = MessageFormat.format(
+ EntityWizardMsg.EntityDataModelProvider_typeNotInProjectClasspath, new Object[]{entityRow.getFqnTypeName()});
+ validateFieldTypeStatus = new Status(IStatus.ERROR,
+ JptJpaUiPlugin.PLUGIN_ID, message);
+ break;
+ }
+ int sigType = Signature.getTypeSignatureKind(sig);
+ if (sigType == Signature.BASE_TYPE_SIGNATURE){
+ continue;
+ }
+ else if (sigType == Signature.ARRAY_TYPE_SIGNATURE) {
+ String elementSignature = Signature.getElementType(sig);
+ if(Signature.getTypeSignatureKind(elementSignature) == Signature.BASE_TYPE_SIGNATURE){
+ continue;
+ }
+ String qualifiedName = Signature.toString(elementSignature);
+ IProject project = (IProject) getProperty(INewJavaClassDataModelProperties.PROJECT);
+ IJavaProject javaProject = JavaCore.create(project);
+ IType type = null;
+ try {
+ type = javaProject.findType(qualifiedName);
+ } catch (JavaModelException e) {
+ validateFieldTypeStatus = e.getStatus();
+ break;
+ }
+ if (type == null) {
+ String message = MessageFormat.format(
+ EntityWizardMsg.EntityDataModelProvider_typeNotInProjectClasspath, new Object[]{entityRow.getFqnTypeName()});
+ validateFieldTypeStatus = new Status(IStatus.ERROR,
+ JptJpaUiPlugin.PLUGIN_ID, message);
+ break;
+ }
+ }
+ else {
+ IProject project = (IProject) getProperty(INewJavaClassDataModelProperties.PROJECT);
+ IJavaProject javaProject = JavaCore.create(project);
+ IType type = null;
+ try {
+ type = javaProject.findType(entityRow.getFqnTypeName());
+ } catch (JavaModelException e) {
+ validateFieldTypeStatus = e.getStatus();
+ break;
+ }
+ if (type == null) {
+ String message = MessageFormat.format(
+ EntityWizardMsg.EntityDataModelProvider_typeNotInProjectClasspath, new Object[]{entityRow.getFqnTypeName()});
+ validateFieldTypeStatus = new Status(IStatus.ERROR,
+ JptJpaUiPlugin.PLUGIN_ID, message);
+ break;
+ }
+ }
+ }
+ if(!validateFieldTypeStatus.isOK()) {
+ return validateFieldTypeStatus.getMessage();
+ }
+ return null;
+ }
+
+
+
+ /**
+ * This method is intended for internal use only. It provides a simple algorithm for detecting
+ * if there are duplicate entries in a list. It will accept a null parameter. It will return
+ * boolean.
+ *
+ * @param input
+ * @return boolean are there duplications in the list
+ */
+ private boolean hasDuplicatesInEntityFields(ArrayList<EntityRow> input) {
+ if (input == null) {
+ return false;
+ }
+ int n = input.size();
+ // nested for loops to check each element to see if other elements are the same
+ for (int i = 0; i < n; i++) {
+ EntityRow entity = input.get(i);
+ for (int j = i + 1; j < n; j++) {
+ EntityRow intEntity = input.get(j);
+ if (intEntity.getName().equals(entity.getName())) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ protected JpaProject getTargetJpaProject() {
+ IProject project = getTargetProject();
+ if (project != null && JpaFacet.isInstalled(project)) {
+ return JptJpaCorePlugin.getJpaProject(project);
+ }
+ return null;
+ }
+
+ protected IContainer getJavaSourceContainer() {
+ String containerFullPath = getStringProperty(SOURCE_FOLDER);
+ JpaProject jpaProject = getTargetJpaProject();
+ if (jpaProject == null) {
+ return null;
+ }
+ IJavaProject javaProject = jpaProject.getJavaProject();
+ try {
+ for (IPackageFragmentRoot pfr : javaProject.getPackageFragmentRoots()) {
+ if (pfr.getKind() == IPackageFragmentRoot.K_SOURCE) {
+ IContainer container = (IContainer) pfr.getUnderlyingResource();
+ if (container.getFullPath().equals(new Path(containerFullPath))) {
+ return container;
+ }
+ }
+ }
+ }
+ catch (JavaModelException jme) {
+ // fall through
+ JptJpaUiPlugin.log(jme);
+ }
+ return null;
+ }
+
+ @Override
+ protected IPackageFragmentRoot getJavaPackageFragmentRoot() {
+ JpaProject jpaProject = getTargetJpaProject();
+ if (jpaProject != null) {
+ IJavaProject javaProject = jpaProject.getJavaProject();
+ // Return the source folder for the java project of the selected project
+ if (javaProject != null) {
+ IContainer sourceContainer = getJavaSourceContainer();
+ if (sourceContainer != null) {
+ return javaProject.getPackageFragmentRoot(sourceContainer);
+ }
+ }
+ }
+ return null;
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/entity/data/model/EntityRow.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/entity/data/model/EntityRow.java
new file mode 100644
index 0000000000..5c029894e4
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/entity/data/model/EntityRow.java
@@ -0,0 +1,206 @@
+/***********************************************************************
+ * Copyright (c) 2008, 2009 by SAP AG, Walldorf.
+ * 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:
+ * SAP AG - initial API and implementation
+ * Dimiter Dimitrov, d.dimitrov@sap.com - initial API and implementation
+ ***********************************************************************/
+package org.eclipse.jpt.jpa.ui.internal.wizards.entity.data.model;
+
+import java.util.Arrays;
+import java.util.List;
+
+public class EntityRow {
+
+ private static final String DOT = ".";
+ private static final char BRACKET_SQUARE = '[';
+ private static final char BRACKET_ANGULAR = '<';
+ private static final String PACKAGE_JAVA_LANG = "java.lang.";
+ private boolean key = false;
+ private String name = "";
+ private String type = "";
+ private String fqnTypeName = "";
+
+ private final static String[] PK_TYPES = {"int", "long", "short", "char", "boolean", "byte", "double", "float",
+ "java.lang.String", "java.sql.Date", "java.util.Date", "java.lang.Integer", "java.lang.Long", "java.lang.Short",
+ "java.lang.Character", "java.lang.Boolean", "java.lang.Byte", "java.lang.Double", "java.lang.Float"};
+
+ private final static String[] PK_TYPES_SHORT = { "String", "Integer", "Long", "Short", "Character", "Boolean",
+ "Byte", "Double", "Float" };
+
+ private final static List<String> VALID_PK_TYPES = Arrays.asList(PK_TYPES);
+ private final static List<String> VALID_PK_TYPES_SHORT = Arrays.asList(PK_TYPES_SHORT);
+
+ /**
+ * @return whether the presented entity field is primary key or part of composite primary key
+ */
+ public boolean isKey() {
+ return key;
+ }
+
+ /**
+ * Sets the presented entity field to be primary key (or part of composite primari key)
+ *
+ * @param key
+ */
+ public void setKey(boolean key) {
+ this.key = key;
+ }
+
+ /**
+ * Check whether the type of the entity is allowed to be primary key.
+ * The limitation in the current implementation is that Embedded PK are not checked
+ * @return whether the type of field could be used as primary key
+ */
+ public boolean couldBeKey() {
+ boolean result = false;
+ result = VALID_PK_TYPES.contains(getFqnTypeName());
+ return result;
+ }
+
+ /**
+ * @return the name of the entity field
+ */
+ public String getName() {
+ return name;
+ }
+
+ /**
+ * Sets the name of the presented entity field
+ * @param name
+ */
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ /**
+ * @return the type (as a simple name) of the entity field
+ */
+ public String getType() {
+ return type;
+ }
+
+ /**
+ * Sets the type (as a simple name) of the entity field
+ *
+ * @param type
+ */
+ public void setType(String type) {
+ this.type = type;
+ }
+
+ /**
+ * @return the type (as fully qualified name) of the entity field
+ */
+ public String getFqnTypeName() {
+ return fqnTypeName;
+ }
+
+ private String removeSpaces(String str) {
+ str = str.trim();
+ StringBuffer sb = new StringBuffer();
+ for (int i = 0; i < str.length(); i++) {
+ char c = str.charAt(i);
+ if (!Character.isWhitespace(c))
+ sb.append(c);
+ }
+ return sb.toString();
+ }
+
+ private String getBasicFQN(String fqn) {
+ String res;
+ int bsIndex = fqn.indexOf(BRACKET_SQUARE);
+ int baIndex = fqn.indexOf(BRACKET_ANGULAR);
+ if (bsIndex == -1) {
+ if (baIndex == -1) res = fqn;
+ else res = fqn.substring(0, baIndex);
+ } else {
+ if (baIndex == -1) res = fqn.substring(0, bsIndex);
+ else res = fqn.substring(0, Math.max(bsIndex, baIndex));
+ }
+ return res;
+ }
+
+ /**
+ * Sets the fully qualified type name of the entity field
+ *
+ * @param fqnTypeName
+ */
+ public void setFqnTypeName(String fqnTypeName) {
+ fqnTypeName = removeSpaces(fqnTypeName);
+ String fqnBasicTypeName = getBasicFQN(fqnTypeName);
+ if (fqnBasicTypeName.indexOf(DOT) == -1) {
+ if (VALID_PK_TYPES_SHORT.contains(fqnBasicTypeName)) {
+ this.fqnTypeName = PACKAGE_JAVA_LANG + fqnTypeName;
+ setType(fqnTypeName);
+ } else {
+ this.fqnTypeName = fqnTypeName;
+ setType(fqnTypeName);
+ }
+ } else {
+ this.fqnTypeName = fqnTypeName;
+ setType(getSimpleName(fqnTypeName));
+ }
+ }
+
+ /**
+ * @return whether the type of the entity field is boolean. The information could be used
+ * when the name of getter should be constructed
+ */
+ public boolean isBoolean() {
+ return "boolean".equals(getType());
+ }
+
+ /**
+ * For internal purpose only
+ * Convert fully qualified name to the simple one
+ * @param fullyName
+ * @return the simple name form the fully qualified name parameter(last segment)
+ */
+ private String getSimpleName(String fullyName) {
+ return fullyName.substring(fullyName.lastIndexOf(DOT) + 1);
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result
+ + ((fqnTypeName == null) ? 0 : fqnTypeName.hashCode());
+ result = prime * result + ((name == null) ? 0 : name.hashCode());
+ return result;
+ }
+
+ /*
+ * Implement equals, depending from name of the entity field and its type.
+ * The type is presented from the fully qualified name
+ * @see java.lang.Object#equals(java.lang.Object)
+ */
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ final EntityRow other = (EntityRow) obj;
+ if (fqnTypeName == null) {
+ if (other.fqnTypeName != null)
+ return false;
+ } else if (!fqnTypeName.equals(other.fqnTypeName))
+ return false;
+ if (name == null) {
+ if (other.name != null)
+ return false;
+ } else if (!name.equals(other.name))
+ return false;
+ return true;
+ }
+
+
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/entity/data/model/IEntityDataModelProperties.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/entity/data/model/IEntityDataModelProperties.java
new file mode 100644
index 0000000000..62ea483a2e
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/entity/data/model/IEntityDataModelProperties.java
@@ -0,0 +1,33 @@
+/***********************************************************************
+ * Copyright (c) 2008 by SAP AG, Walldorf.
+ * 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:
+ * SAP AG - initial API and implementation
+ * Dimiter Dimitrov, d.dimitrov@sap.com - initial API and implementation
+ ***********************************************************************/
+package org.eclipse.jpt.jpa.ui.internal.wizards.entity.data.model;
+
+import org.eclipse.jst.j2ee.application.internal.operations.IAnnotationsDataModel;
+import org.eclipse.jst.j2ee.internal.common.operations.INewJavaClassDataModelProperties;
+
+public interface IEntityDataModelProperties extends INewJavaClassDataModelProperties, IAnnotationsDataModel {
+
+ public static final String ENTITY = "IEntityDataModelProperties.ENTITY"; //$NON-NLS-1$
+ public static final String MAPPED_AS_SUPERCLASS = "IEntityDataModelProperties.MAPPED_AS_SUPERCLASS"; //$NON-NLS-1$
+ public static final String INHERITANCE = "IEntityDataModelProperties.INHERITANCE"; //$NON-NLS-1$
+ public static final String INHERITANCE_STRATEGY = "IEntityDataModelProperties.INHERITANCE_STRATEGY"; //$NON-NLS-1$
+ public static final String XML_SUPPORT = "IEntityDataModelProperties.XML_SUPPORT"; //$NON-NLS-1$XML_SUPPORT
+ public static final String XML_NAME = "IEntityDataModelProperties.XML_NAME"; //$NON-NLS-1$XML_SUPPORT
+ public static final String ENTITY_NAME = "IEntityDataModelProperties.ENTITY_NAME"; //$NON-NLS-1$
+ public static final String TABLE_NAME_DEFAULT = "IEntityDataModelProperties.TABLE_NAME_DEFAULT"; //$NON-NLS-1$
+ public static final String TABLE_NAME = "IEntityDataModelProperties.TABLE_NAME"; //$NON-NLS-1$
+ public static final String ENTITY_FIELDS = "IEntityDataModelProperties.ENTITY_FIELDS"; //$NON-NLS-1$
+ public static final String PK_FIELDS = "IEntityDataModelProperties.PK_FIELDS"; //$NON-NLS-1$
+ public static final String FIELD_ACCESS_TYPE = "IEntityDataModelProperties.FIELD_ACCESS_TYPE"; //$NON-NLS-1$
+ public static final String PROPERTY_ACCESS_TYPE = "IEntityDataModelProperties.PROPERTY_ACCESS_TYPE"; //$NON-NLS-1$
+ public static final String EMPTY_STRING = ""; //$NON-NLS-1$
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/entity/data/operation/NewEntityClassOperation.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/entity/data/operation/NewEntityClassOperation.java
new file mode 100644
index 0000000000..1e612dbc85
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/entity/data/operation/NewEntityClassOperation.java
@@ -0,0 +1,537 @@
+/***********************************************************************
+ * Copyright (c) 2008, 2010 by SAP AG, Walldorf.
+ * 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:
+ * SAP AG - initial API and implementation
+ * Dimiter Dimitrov, d.dimitrov@sap.com - initial API and implementation
+ ***********************************************************************/
+package org.eclipse.jpt.jpa.ui.internal.wizards.entity.data.operation;
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.net.URL;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.resources.IContainer;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IFolder;
+import org.eclipse.core.resources.IMarker;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IWorkspaceRoot;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.FileLocator;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.Preferences;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.emf.codegen.jet.JETEmitter;
+import org.eclipse.emf.codegen.jet.JETException;
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.jdt.core.ICompilationUnit;
+import org.eclipse.jdt.core.IJavaModelMarker;
+import org.eclipse.jdt.core.IPackageFragment;
+import org.eclipse.jdt.core.IPackageFragmentRoot;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.jem.util.emf.workbench.ProjectUtilities;
+import org.eclipse.jpt.common.core.internal.utility.PlatformTools;
+import org.eclipse.jpt.jpa.core.JpaProject;
+import org.eclipse.jpt.jpa.core.JptJpaCorePlugin;
+import org.eclipse.jpt.jpa.core.MappingKeys;
+import org.eclipse.jpt.jpa.core.context.AccessType;
+import org.eclipse.jpt.jpa.core.context.Entity;
+import org.eclipse.jpt.jpa.core.context.InheritanceType;
+import org.eclipse.jpt.jpa.core.context.MappedSuperclass;
+import org.eclipse.jpt.jpa.core.context.orm.EntityMappings;
+import org.eclipse.jpt.jpa.core.context.orm.OrmPersistentType;
+import org.eclipse.jpt.jpa.core.context.orm.OrmReadOnlyPersistentAttribute;
+import org.eclipse.jpt.jpa.core.resource.orm.OrmFactory;
+import org.eclipse.jpt.jpa.core.resource.persistence.PersistenceFactory;
+import org.eclipse.jpt.jpa.core.resource.persistence.XmlJavaClassRef;
+import org.eclipse.jpt.jpa.core.resource.persistence.XmlPersistence;
+import org.eclipse.jpt.jpa.core.resource.persistence.XmlPersistenceUnit;
+import org.eclipse.jpt.jpa.core.resource.xml.JpaXmlResource;
+import org.eclipse.jpt.jpa.ui.JptJpaUiPlugin;
+import org.eclipse.jpt.jpa.ui.internal.wizards.entity.AnnotatedEntityTemplate;
+import org.eclipse.jpt.jpa.ui.internal.wizards.entity.EntityTemplate;
+import org.eclipse.jpt.jpa.ui.internal.wizards.entity.EntityWizardMsg;
+import org.eclipse.jpt.jpa.ui.internal.wizards.entity.IdClassTemplate;
+import org.eclipse.jpt.jpa.ui.internal.wizards.entity.data.model.CreateEntityTemplateModel;
+import org.eclipse.jst.common.internal.annotations.controller.AnnotationsController;
+import org.eclipse.jst.common.internal.annotations.controller.AnnotationsControllerManager;
+import org.eclipse.jst.j2ee.internal.common.operations.INewJavaClassDataModelProperties;
+import org.eclipse.jst.j2ee.internal.plugin.J2EEPlugin;
+import org.eclipse.jst.j2ee.internal.project.WTPJETEmitter;
+import org.eclipse.wst.common.componentcore.internal.operation.ArtifactEditProviderOperation;
+import org.eclipse.wst.common.componentcore.internal.operation.IArtifactEditOperationDataModelProperties;
+import org.eclipse.wst.common.frameworks.datamodel.AbstractDataModelOperation;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wst.common.frameworks.internal.enablement.nonui.WFTWrappedException;
+import org.eclipse.wst.common.frameworks.internal.plugin.WTPCommonPlugin;
+
+/**
+ * The NewEntityClassOperation is IDataModelOperation following the
+ * IDataModel wizard and operation framework.
+ *
+ * @see org.eclipse.wst.common.frameworks.datamodel.IDataModelOperation
+ * @see org.eclipse.wst.common.frameworks.datamodel.IDataModelProvider
+ *
+ * This operation is used to generate java classes for the new JPA entity. It uses
+ * EntityDataModelProvider to store the appropriate properties required to generate the new entity.
+ * @see org.eclipse.jpt.jpa.ui.internal.wizards.entity.data.modelEntityDataModelProvider
+ *
+ * A WTPJetEmitter entity template is used to create the class with the entity template.
+ * @see org.eclipse.jst.j2ee.internal.project.WTPJETEmitter
+ * @see org.eclipse.jpt.jpa.ui.internal.wizards.entity.data.model.CreateEntityTemplateModel
+ *
+ * The use of this class is EXPERIMENTAL and is subject to substantial changes.
+ */
+public class NewEntityClassOperation extends AbstractDataModelOperation {
+
+ private static final String DOT_JAVA = ".java"; //$NON-NLS-1$
+ private static final String SEPARATOR = "/";//$NON-NLS-1$
+ private static final String VERSION_STRING = "1.0";//$NON-NLS-1$
+ private static final String FIELD = "FIELD";//$NON-NLS-1$
+ private static final String PROPERTY = "PROPERTY";//$NON-NLS-1$
+ protected static final String WTP_CUSTOMIZATION_PLUGIN = "WTP_CUSTOMIZATION_PLUGIN"; //$NON-NLS-1$
+ protected static final String ANNOTATED_ENTITY_TEMPLATE_FILE = "/templates/annotated_entity.javajet"; //$NON-NLS-1$
+ protected static final String ENTITY_TEMPLATE_FILE = "/templates/entity.javajet"; //$NON-NLS-1$
+ protected static final String IDCLASS_TEMPLATE_FILE = "/templates/idClass.javajet"; //$NON-NLS-1$
+ protected static final String BUILDER_ID = "builderId"; //$NON-NLS-1$
+ private static final String EMPTY_STRING = "";//$NON-NLS-1$
+ private static final String SINGLE_TABLE = "SINGLE_TABLE";//$NON-NLS-1$
+
+ /**
+ * Method name of template implementation classes.
+ */
+ protected static final String GENERATE_METHOD = "generate"; //$NON-NLS-1$
+
+ /**
+ * This is the constructor which should be used when creating a NewEntityClassOperation.
+ * An instance of the CreateEntityTemplateModel should be passed in. This does not accept
+ * null parameter. It will not return null.
+ *
+ * @see ArtifactEditProviderOperation#ArtifactEditProviderOperation(IDataModel)
+ * @see CreateEntityTemplateModel
+ *
+ * @param dataModel
+ * @return NewFilterClassOperation
+ */
+ public NewEntityClassOperation(IDataModel dataModel) {
+ super(dataModel);
+ }
+
+ /**
+ * The implementation of the execute method drives the running of the operation.
+ * This implementation will create the java source folder, create the java package, and then
+ * the entity (or mapped as superclass) and ID class files will be created using templates.
+ *
+ * @see org.eclipse.wst.common.frameworks.internal.operation.WTPOperation#execute(org.eclipse.core.runtime.IProgressMonitor)
+ * @see NewEntityClassOperation#generateUsingTemplates(IProgressMonitor,
+ * IPackageFragment)
+ *
+ * @param monitor
+ * @throws CoreException
+ * @throws InterruptedException
+ * @throws InvocationTargetException
+ */
+ public IStatus doExecute(IProgressMonitor monitor, IAdaptable info) throws ExecutionException {
+ // Create source folder if it does not exist
+ createJavaSourceContainer();
+ // Create java package if it does not exist
+ IPackageFragment pack = createJavaPackage();
+ // Generate filter class using templates
+ try {
+ generateUsingTemplates(monitor, pack);
+ } catch (Exception e) {
+ return WTPCommonPlugin.createErrorStatus(e.toString());
+ }
+ return OK_STATUS;
+ }
+
+ /**
+ * This method will return the java package as specified by the new java
+ * class data model. If the package does not exist, it will create the
+ * package. This method should not return null.
+ *
+ * @see INewJavaClassDataModelProperties#JAVA_PACKAGE
+ * @see IPackageFragmentRoot#createPackageFragment(java.lang.String,
+ * boolean, org.eclipse.core.runtime.IProgressMonitor)
+ *
+ * @return IPackageFragment the java package
+ */
+ protected final IPackageFragment createJavaPackage() {
+ // Retrieve the package name from the java class data model
+ String packageName = model.getStringProperty(INewJavaClassDataModelProperties.JAVA_PACKAGE);
+ IPackageFragmentRoot packRoot = (IPackageFragmentRoot) model
+ .getProperty(INewJavaClassDataModelProperties.JAVA_PACKAGE_FRAGMENT_ROOT);
+ IPackageFragment pack = packRoot.getPackageFragment(packageName);
+ // Handle default package
+ if (pack == null) {
+ pack = packRoot.getPackageFragment(""); //$NON-NLS-1$
+ }
+
+ // Create the package fragment if it does not exist
+ if (!pack.exists()) {
+ String packName = pack.getElementName();
+ try {
+ pack = packRoot.createPackageFragment(packName, true, null);
+ } catch (JavaModelException e) {
+ JptJpaUiPlugin.log(e);
+ }
+ }
+ // Return the package
+ return pack;
+ }
+
+ /**
+ * This implementation uses the creation of a CreateEntityTemplateModel and the WTPJETEmitter
+ * to create the java class with the annotated tags. This method accepts null for monitor, it does not accept null
+ * for fragment. If annotations are not being used the tags will be omitted from the class.
+ *
+ * @see CreateEntityTemplateModel
+ * @see NewEntityClassOperation#generateTemplateSource(CreateEntityTemplateModel,
+ * IProgressMonitor)
+ *
+ * @param monitor
+ * @param fragment
+ * @throws CoreException
+ * @throws WFTWrappedException
+ */
+ protected void generateUsingTemplates(IProgressMonitor monitor, IPackageFragment fragment) throws WFTWrappedException, CoreException {
+ // Create the entity template model
+ CreateEntityTemplateModel tempModel = createTemplateModel();
+ IProject project = getTargetProject();
+ String entityClassSource = null;
+ String idClassSource = null;
+ // Generate the java source based on the entity template models
+ try {
+ if (tempModel.isArtifactsAnnotated()) {
+ AnnotatedEntityTemplate tempImpl = AnnotatedEntityTemplate.create(null);
+ entityClassSource = generateTemplateSource(tempModel, ANNOTATED_ENTITY_TEMPLATE_FILE, tempImpl, monitor);
+ } else {
+ EntityTemplate tempImpl = EntityTemplate.create(null);
+ entityClassSource = generateTemplateSource(tempModel, ENTITY_TEMPLATE_FILE, tempImpl, monitor);
+ }
+ if (tempModel.isCompositePK()) {
+ IdClassTemplate tempImpl = IdClassTemplate.create(null);
+ idClassSource = generateTemplateSource(tempModel, IDCLASS_TEMPLATE_FILE, tempImpl, monitor);
+ }
+ } catch (Exception e) {
+ throw new WFTWrappedException(e);
+ }
+ if (fragment != null) {
+ // Create the java file
+ String javaFileName = tempModel.getClassName() + DOT_JAVA;
+ ICompilationUnit cu = fragment.getCompilationUnit(javaFileName);
+ // Add the compilation unit to the java file
+ if (cu == null || !cu.exists()) {
+ cu = fragment.createCompilationUnit(javaFileName, entityClassSource, true, monitor);
+ }
+ IFile aFile = (IFile) cu.getResource();
+ // Let the annotations controller process the annotated resource
+ if (tempModel.isArtifactsAnnotated()) {
+ AnnotationsController controller = AnnotationsControllerManager.INSTANCE.getAnnotationsController(project);
+ if (controller != null) {
+ controller.process(aFile);
+ }
+ }
+ //Create IdClass if the primary key is complex
+ if (idClassSource != null) {
+ String entityPKName = tempModel.getIdClassName() + DOT_JAVA;
+ ICompilationUnit cu1 = fragment.getCompilationUnit(entityPKName);
+ // Add the compilation unit to the java file
+ if (cu1 == null || !cu1.exists()) {
+ cu1 = fragment.createCompilationUnit(entityPKName, idClassSource, true, monitor);
+ }
+ }
+ }
+
+ if (!tempModel.isArtifactsAnnotated()) {
+ if (tempModel.isNonEntitySuperclass()) {
+ addMappedSuperclassToXML(tempModel, project).schedule();
+ } else {
+ addEntityToXML(tempModel, project).schedule();
+ }
+ }
+ if (tempModel.isArtifactsAnnotated() && !JptJpaCorePlugin.discoverAnnotatedClasses(project)) {
+ registerClassInPersistenceXml(tempModel, project).schedule();
+ }
+ }
+
+ /**
+ * This method is intended for internal use only. This method will create an
+ * instance of the CreateEntityTemplateModel model to be used in conjunction
+ * with the WTPJETEmitter. This method will not return null.
+ *
+ * @see CreateEntityTemplateModel
+ * @see NewEntityClassOperation#generateUsingTemplates(IProgressMonitor,
+ * IPackageFragment)
+ *
+ * @return CreateFilterTemplateModel
+ */
+ private CreateEntityTemplateModel createTemplateModel() {
+ CreateEntityTemplateModel templateModel = new CreateEntityTemplateModel(model);
+ return templateModel;
+ }
+
+ /**
+ * This method is intended for internal use only. This will use the
+ * WTPJETEmitter to create an annotated java file based on the passed template model.
+ * This method does not accept null parameters. It will not return null.
+ * If annotations are not used, it will use the non annotated template to omit the annotated tags.
+ *
+ * @see NewEntityClassOperation#generateUsingTemplates(IProgressMonitor,
+ * IPackageFragment)
+ * @see JETEmitter#generate(org.eclipse.core.runtime.IProgressMonitor,
+ * java.lang.Object[])
+ * @see CreateEntityTemplateModel
+ *
+ * @param templateModel
+ * @param monitor
+ * @param template_file
+ * @return String the source for the java file
+ * @throws JETException
+ * @throws NoSuchMethodException
+ * @throws SecurityException
+ * @throws InvocationTargetException
+ * @throws IllegalAccessException
+ */
+ private String generateTemplateSource(CreateEntityTemplateModel templateModel, String templateFile, Object templateImpl, IProgressMonitor monitor)
+ throws JETException, SecurityException, NoSuchMethodException, IllegalAccessException, InvocationTargetException {
+ Preferences preferences = J2EEPlugin.getDefault().getPluginPreferences();
+ boolean dynamicTranslation = preferences.getBoolean(J2EEPlugin.DYNAMIC_TRANSLATION_OF_JET_TEMPLATES_PREF_KEY);
+ if (dynamicTranslation) {
+ URL templateURL = FileLocator.find(JptJpaUiPlugin.instance().getBundle(), new Path(templateFile), null);
+ cleanUpOldEmitterProject();
+ WTPJETEmitter emitter = new WTPJETEmitter(templateURL.toString(), this.getClass().getClassLoader());
+ emitter.setIntelligentLinkingEnabled(true);
+ emitter.addVariable(WTP_CUSTOMIZATION_PLUGIN, JptJpaUiPlugin.PLUGIN_ID);
+ return emitter.generate(monitor, new Object[] { templateModel });
+ } else {
+ Method method = templateImpl.getClass().getMethod(GENERATE_METHOD, new Class[] { Object.class });
+ return (String) method.invoke(templateImpl, templateModel);
+ }
+ }
+
+ /**
+ * This method is intended for internal use only. It will clean up the old emmiter project
+ * in order to prevent generation issues
+ */
+ private void cleanUpOldEmitterProject() {
+ IProject project = ProjectUtilities.getProject(WTPJETEmitter.PROJECT_NAME);
+ if (project == null || !project.exists())
+ return;
+ try {
+ IMarker[] markers = project.findMarkers(IJavaModelMarker.BUILDPATH_PROBLEM_MARKER, false, IResource.DEPTH_ZERO);
+ for (int i = 0, l = markers.length; i < l; i++) {
+ if (((Integer) markers[i].getAttribute(IMarker.SEVERITY)).intValue() == IMarker.SEVERITY_ERROR) {
+ project.delete(true, new NullProgressMonitor());
+ break;
+ }
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ /**
+ * This method will return the java source container as specified in the java
+ * class data model. It will create the java source folder if it does not
+ * exist. This method may return null.
+ *
+ * @see INewJavaClassDataModelProperties#SOURCE_FOLDER
+ * @see IFolder#create(boolean, boolean,
+ * org.eclipse.core.runtime.IProgressMonitor)
+ *
+ * @return IFolder the java source folder
+ */
+ protected final IContainer createJavaSourceContainer() {
+ // Get the source folder name from the data model
+ String containerFullPath = model.getStringProperty(INewJavaClassDataModelProperties.SOURCE_FOLDER);
+ IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
+ IContainer container = PlatformTools.getContainer(new Path(containerFullPath));
+ // If container does not exist, create the folder with the specified path
+ if (! container.exists()) {
+ try {
+ ((IFolder) container).create(true, true, null);
+ } catch (CoreException e) {
+ JptJpaUiPlugin.log(e);
+ }
+ }
+ // Return the source folder
+ return container;
+ }
+
+ @Override
+ public IStatus execute(IProgressMonitor monitor, IAdaptable info) throws ExecutionException {
+ return doExecute(monitor, info);
+ }
+
+ public IProject getTargetProject() {
+ String projectName = model.getStringProperty(IArtifactEditOperationDataModelProperties.PROJECT_NAME);
+ return ProjectUtilities.getProject(projectName);
+ }
+
+ /**
+ * Adds entity to ORM XML in separate job
+ * @param model entity data model
+ * @param project JPA project in which the entity will be created
+ * @return
+ */
+ private Job addEntityToXML(final CreateEntityTemplateModel model, final IProject project) {
+ Job job = new Job(EntityWizardMsg.ADD_ENTITY_TO_XML) {
+ @Override
+ protected IStatus run(IProgressMonitor monitor) {
+ final JpaXmlResource xmlResource = getOrmXmlResource(model, project);
+ EntityMappings entityMappings = (EntityMappings) JptJpaCorePlugin.getJpaProject(project).getJpaFile(xmlResource.getFile()).rootStructureNodes().next();
+ OrmPersistentType persistentType = entityMappings.addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, model.getQualifiedJavaClassName());
+ Entity entity = (Entity) persistentType.getMapping();
+ if (model.isInheritanceSet()) {
+ entity.setSpecifiedInheritanceStrategy(getModelInheritanceType(model));
+ }
+
+ if (model.isEntityNameSet()) {
+ entity.setSpecifiedName(model.getEntityName());
+ }
+ if (model.isTableNameSet()) {
+ entity.getTable().setSpecifiedName(model.getTableName());
+ }
+ if (model.isCompositePK()) {
+ entity.getIdClassReference().setSpecifiedIdClassName(model.getIdClassName());
+ }
+ for (String fieldName : model.getPKFields()) {
+ persistentType.getAttributeNamed(fieldName).convertToSpecified(MappingKeys.ID_ATTRIBUTE_MAPPING_KEY);
+ }
+
+ persistentType.setSpecifiedAccess(getModelAccessType(model));
+
+ try {
+ xmlResource.saveIfNecessary();
+ }
+ catch (Exception e) {
+ JptJpaUiPlugin.log(e);
+ }
+ return Status.OK_STATUS;
+ }
+ };
+ return job;
+ }
+
+ protected JpaXmlResource getOrmXmlResource(CreateEntityTemplateModel model, IProject project) {
+ if (model.isMappingXMLDefault()) {
+ return JptJpaCorePlugin.getJpaProject(project).getDefaultOrmXmlResource();
+ }
+ return JptJpaCorePlugin.getJpaProject(project).getMappingFileXmlResource(new Path(model.getMappingXMLName()));
+ }
+
+ /**
+ * Adds mapped superclass to ORM XML in separate job
+ *
+ * @param model entity data model
+ * @param project JPA project in which the entity will be created
+ * @return the created job
+ */
+ private Job addMappedSuperclassToXML(final CreateEntityTemplateModel model, final IProject project) {
+ Job job = new Job(EntityWizardMsg.ADD_MAPPED_SUPERCLASS_TO_XML) {
+ @Override
+ protected IStatus run(IProgressMonitor monitor) {
+ final JpaXmlResource xmlResource = getOrmXmlResource(model, project);
+ EntityMappings entityMappings = (EntityMappings) JptJpaCorePlugin.getJpaProject(project).getJpaFile(xmlResource.getFile()).rootStructureNodes().next();
+ OrmPersistentType persistentType = entityMappings.addPersistentType(MappingKeys.MAPPED_SUPERCLASS_TYPE_MAPPING_KEY, model.getQualifiedJavaClassName());
+ MappedSuperclass mappedSuperclass = (MappedSuperclass) persistentType.getMapping();
+
+ if (model.isCompositePK()) {
+ mappedSuperclass.getIdClassReference().setSpecifiedIdClassName(model.getIdClassName());
+ }
+
+ for (String fieldName : model.getPKFields()) {
+ persistentType.getAttributeNamed(fieldName).convertToSpecified(MappingKeys.ID_ATTRIBUTE_MAPPING_KEY);
+ }
+
+ persistentType.setSpecifiedAccess(getModelAccessType(model));
+
+ try {
+ xmlResource.saveIfNecessary();
+ }
+ catch (Exception e) {
+ JptJpaUiPlugin.log(e);
+ }
+ return Status.OK_STATUS;
+ }
+ };
+ return job;
+ }
+
+ protected AccessType getModelAccessType(CreateEntityTemplateModel model) {
+ String accessTypeString = FIELD;
+ if (!model.isFieldAccess()) {
+ accessTypeString = PROPERTY;
+ }
+ return AccessType.fromOrmResourceModel(OrmFactory.eINSTANCE.createAccessTypeFromString(null, accessTypeString));// TODO
+ }
+
+ protected InheritanceType getModelInheritanceType(CreateEntityTemplateModel model) {
+ String inheritanceStrategy = model.getInheritanceStrategyName();
+ if (inheritanceStrategy.equals(EMPTY_STRING)) {
+ inheritanceStrategy = SINGLE_TABLE;
+ }
+ return InheritanceType.fromOrmResourceModel(OrmFactory.eINSTANCE.createInheritanceTypeFromString(null, inheritanceStrategy));//TODO
+ }
+
+ /**
+ * Regist the class in the persistence.xml
+ *
+ * @param model entity data model
+ * @param project JPA project in which the entity will be created
+ * @return the created job
+ */
+ private Job registerClassInPersistenceXml(final CreateEntityTemplateModel model, final IProject project) {
+ Job job = new Job(EntityWizardMsg.APPLY_CHANGES_TO_PERSISTENCE_XML) {
+ @Override
+ protected IStatus run(IProgressMonitor monitor) {
+ final JpaProject jpaProject = JptJpaCorePlugin.getJpaProject(project);
+ final JpaXmlResource resource = jpaProject.getPersistenceXmlResource();
+ resource.modify(new Runnable() {
+ public void run() {
+ XmlPersistence xmlPersistence = (XmlPersistence) resource.getRootObject();
+ EList<XmlPersistenceUnit> persistenceUnits = xmlPersistence.getPersistenceUnits();
+ XmlPersistenceUnit persistenceUnit = persistenceUnits.get(0);// Multiply persistence unit support
+
+ if (!model.isNonEntitySuperclass()) {
+ XmlJavaClassRef classRef = PersistenceFactory.eINSTANCE.createXmlJavaClassRef();
+ classRef.setJavaClass(model.getQualifiedJavaClassName());
+ persistenceUnit.getClasses().add(classRef);
+ }
+ }
+ });
+
+ return Status.OK_STATUS;
+ }
+ };
+ return job;
+
+ }
+
+ /**
+ * @param input the name of mapping XML from the class wizard page. It is relative path from the source folder
+ * and includes META-INF folder
+ * @return the simple name of the mapping XML
+ */
+ private String getLastSegment(String input) {
+ String output = input;
+ if (input.indexOf(SEPARATOR) != -1) {
+ output = input.substring(input.lastIndexOf(SEPARATOR) + 1);
+ }
+ return output;
+ }
+
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/gen/AssociationFigure.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/gen/AssociationFigure.java
new file mode 100644
index 0000000000..ccc474a7a6
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/gen/AssociationFigure.java
@@ -0,0 +1,227 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2010 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.ui.internal.wizards.gen;
+
+import org.eclipse.draw2d.Button;
+import org.eclipse.draw2d.ChopboxAnchor;
+import org.eclipse.draw2d.ColorConstants;
+import org.eclipse.draw2d.ConnectionEndpointLocator;
+import org.eclipse.draw2d.Graphics;
+import org.eclipse.draw2d.Label;
+import org.eclipse.draw2d.LineBorder;
+import org.eclipse.draw2d.PolygonDecoration;
+import org.eclipse.draw2d.PolylineConnection;
+import org.eclipse.draw2d.XYLayout;
+import org.eclipse.draw2d.geometry.Rectangle;
+import org.eclipse.jface.resource.ResourceManager;
+import org.eclipse.jpt.jpa.gen.internal.Association;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.Font;
+
+
+class AssociationFigure extends Button {
+
+ Color enabledColor = new Color( null, 14,66,115);
+ Color disabledLineColor = new Color( null, 192,215,231);
+ Color selectedColor = new Color( null, 232,232,232 );
+
+ Color selectedBorderColor = new Color( null, 14,66,115 );
+ LineBorder selectedBorder = new LineBorder( selectedBorderColor, 2 );
+ LineBorder unselectedBorder = new LineBorder( ColorConstants.lightGray, 1 );
+ Font descriptionFont = new Font(null, "Arial", 8, SWT.NONE);
+
+ /**
+ * The model behind the the view object
+ */
+ Association association;
+ TableFigure tableFig1;
+ TableFigure tableFig2;
+ PolylineConnection connection ;
+
+ PolygonDecoration referrerDecoration ;
+ PolygonDecoration referencedDecoration ;
+
+ Label referencedLabel ;
+ Label referrerLabel ;
+ Label descriptionLabel ;
+
+ AssociationFigure(Association association, ResourceManager resourceManager) {
+ this.association = association;
+
+ XYLayout contentsLayout = new XYLayout();
+ setLayoutManager(contentsLayout);
+ setBorder( unselectedBorder );
+
+ //Create the figures for referrer table and referenced table
+ tableFig1 = new TableFigure( association.getReferrerTable().getName(), resourceManager);
+ tableFig2 = new TableFigure( association.getReferencedTable().getName(), resourceManager);
+
+ contentsLayout.setConstraint(tableFig1, new Rectangle(10,10,150,20));
+ contentsLayout.setConstraint(tableFig2, new Rectangle(280, 10, 150, 20));
+
+ connection = drawConnection(tableFig1, tableFig2);
+
+ add(tableFig1);
+ add(tableFig2);
+ add(connection);
+
+
+ descriptionLabel = new Label("");
+ contentsLayout.setConstraint(descriptionLabel, new Rectangle(10,30,-1,-1));
+ descriptionLabel.setFont( descriptionFont );
+ add(descriptionLabel);
+
+ //set white background
+ this.setBackgroundColor(ColorConstants.white);
+
+ update();
+
+ }
+
+ private PolylineConnection drawConnection(TableFigure tableFig1,
+ TableFigure tableFig2) {
+ /* Creating the connection */
+ PolylineConnection connection = new PolylineConnection();
+ ChopboxAnchor sourceAnchor = new ChopboxAnchor(tableFig1);
+ ChopboxAnchor targetAnchor = new ChopboxAnchor(tableFig2);
+ connection.setSourceAnchor(sourceAnchor);
+ connection.setTargetAnchor(targetAnchor);
+
+ /* Creating the decoration */
+ referrerDecoration = new SmoothPolygonDecoration();
+ connection.setSourceDecoration(referrerDecoration);
+
+ referencedDecoration = new SmoothPolygonDecoration();
+ connection.setTargetDecoration(referencedDecoration);
+
+
+ /* Adding labels to the connection */
+ ConnectionEndpointLocator sourceEndpointLocator =
+ new ConnectionEndpointLocator(connection, false);
+ sourceEndpointLocator.setVDistance(-5);
+ referrerLabel = new Label("");
+ connection.add(referrerLabel, sourceEndpointLocator);
+
+ ConnectionEndpointLocator targetEndpointLocator =
+ new ConnectionEndpointLocator(connection, true);
+ targetEndpointLocator.setVDistance(-5);
+ referencedLabel = new Label("");
+ connection.add(referencedLabel, targetEndpointLocator);
+
+ ConnectionEndpointLocator relationshipLocator =
+ new ConnectionEndpointLocator(connection,true);
+ relationshipLocator.setUDistance(10);
+ relationshipLocator.setVDistance(-20);
+ Label relationshipLabel = new Label("contains");
+ connection.add(relationshipLabel,relationshipLocator);
+ return connection;
+ }
+
+ public Association getAssociation() {
+ return this.association;
+ }
+
+ @Override
+ public void setSelected ( boolean isSelected ){
+ this.setBackgroundColor( isSelected ? selectedColor : ColorConstants.white );
+ this.setBorder(isSelected? selectedBorder : unselectedBorder);
+ }
+
+ /**
+ * Update the view with the changes user made on the model
+ */
+ public void update(){
+ boolean isGenerated = association.isGenerated();
+
+ connection.setForegroundColor( isGenerated? enabledColor: disabledLineColor );
+
+ tableFig1.setEnabled(isGenerated);
+ tableFig2.setEnabled(isGenerated);
+ descriptionLabel.setForegroundColor(isGenerated? enabledColor: disabledLineColor);
+
+ //paintDirectionalityAndCardinality
+ String cardinalityStr;
+ String directionality = association.getDirectionality();
+ String cardinality = association.getCardinality();
+ //Draw referrerRole
+ if (cardinality.equals(Association.MANY_TO_ONE) || cardinality.equals(Association.MANY_TO_MANY)) {
+ cardinalityStr = "*";
+ } else {
+ cardinalityStr = "1";
+ }
+ if (directionality.equals(Association.BI_DI) || directionality.equals(Association.OPPOSITE_DI)) {
+ connection.setSourceDecoration(this.referrerDecoration);
+ }else{
+ connection.setSourceDecoration(null);
+ }
+
+ this.referrerLabel.setText( cardinalityStr );
+
+ //Draw referencedRole
+ if (cardinality.equals(Association.MANY_TO_ONE) || cardinality.equals(Association.ONE_TO_ONE)) {
+ cardinalityStr = "1";
+ } else {
+ cardinalityStr = "*";
+ }
+ if (directionality.equals(Association.BI_DI) || directionality.equals(Association.NORMAL_DI)) {
+ connection.setTargetDecoration(this.referencedDecoration);
+ }else{
+ connection.setTargetDecoration(null);
+ }
+ this.referencedLabel.setText(cardinalityStr);
+
+ String text = "";
+ String referrerTableName = association.getReferrerTableName();
+ String referencedTable = association.getReferencedTableName();
+ if( cardinality.equals(Association.MANY_TO_ONE ) ){
+ text = String.format( JptUiEntityGenMessages.manyToOneDesc, referencedTable , referrerTableName );
+ }else if( cardinality.equals(Association.ONE_TO_ONE ) ){
+ text = String.format( JptUiEntityGenMessages.oneToOneDesc, referrerTableName, referencedTable );
+ }else if( cardinality.equals(Association.MANY_TO_MANY) ){
+ text = String.format( JptUiEntityGenMessages.manyToManyDesc, referrerTableName, referencedTable, referencedTable, referrerTableName );
+ }
+
+ if( association.isCustom() ){
+ connection.setLineStyle( SWT.LINE_DOT);
+ }
+
+ this.descriptionLabel.setText(text);
+
+ }
+
+ public void dispose() {
+ this.descriptionFont.dispose();
+ this.selectedBorderColor.dispose();
+ this.selectedColor.dispose();
+ this.disabledLineColor.dispose();
+ this.enabledColor.dispose();
+ this.tableFig1.dispose();
+ this.tableFig2.dispose();
+ }
+
+ public class SmoothPolygonDecoration extends PolygonDecoration
+ {
+ public SmoothPolygonDecoration()
+ {
+ super();
+ }
+
+ @Override
+ public void paintFigure(Graphics graphics)
+ {
+ int savedAntialias = graphics.getAntialias();
+ graphics.setAntialias(SWT.ON);
+ super.paintFigure(graphics);
+ graphics.setAntialias(savedAntialias);
+ }
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/gen/AssociationTablesPage.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/gen/AssociationTablesPage.java
new file mode 100644
index 0000000000..e7fdbedacc
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/gen/AssociationTablesPage.java
@@ -0,0 +1,194 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2010 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.ui.internal.wizards.gen;
+
+import static org.eclipse.jpt.jpa.ui.internal.wizards.gen.SWTUtil.createButton;
+import static org.eclipse.jpt.jpa.ui.internal.wizards.gen.SWTUtil.createLabel;
+import static org.eclipse.jpt.jpa.ui.internal.wizards.gen.SWTUtil.createText;
+
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.resource.ResourceManager;
+import org.eclipse.jpt.jpa.gen.internal.Association;
+import org.eclipse.jpt.jpa.gen.internal.ORMGenCustomizer;
+import org.eclipse.jpt.jpa.ui.internal.ImageRepository;
+import org.eclipse.jpt.jpa.ui.internal.JpaHelpContextIds;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.swt.widgets.Text;
+
+
+
+public class AssociationTablesPage extends NewAssociationWizardPage {
+
+ private Button simpleAssoBtn;
+ private Button mtmAssoBtn;
+ private Text table1TextField ;
+ private Text table2TextField ;
+ private Text joinTableTextField;
+ private Button joinTableBrowse;
+
+ protected final ResourceManager resourceManager;
+
+ public AssociationTablesPage(ORMGenCustomizer customizer, ResourceManager resourceManager) {
+ super(customizer, "AssociationTablesPage");
+ this.resourceManager = resourceManager;
+ setTitle( JptUiEntityGenMessages.GenerateEntitiesWizard_newAssoc_tablesPage_title);
+ setDescription(JptUiEntityGenMessages.GenerateEntitiesWizard_newAssoc_tablesPage_desc);
+ }
+
+ public void createControl(Composite composite) {
+ initializeDialogUnits(composite);
+ Composite parent = new Composite(composite, SWT.NONE);
+ parent.setLayout(new GridLayout(1, true));
+
+ Group assocKindGroup = new Group(parent, SWT.NULL);
+ int nColumns= 3 ;
+ GridLayout layout = new GridLayout();
+ layout.numColumns = nColumns;
+ assocKindGroup.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+ assocKindGroup.setLayout(layout);
+ this.getHelpSystem().setHelp(composite, JpaHelpContextIds.GENERATE_ENTITIES_WIZARD_ASSOCIATION_TABLES);
+ assocKindGroup.setText( JptUiEntityGenMessages.GenerateEntitiesWizard_newAssoc_tablesPage_assocKind);
+
+ simpleAssoBtn = createButton(assocKindGroup, 3, JptUiEntityGenMessages.GenerateEntitiesWizard_newAssoc_tablesPage_simpleAssoc, SWT.RADIO);
+ mtmAssoBtn = createButton(assocKindGroup, 3, JptUiEntityGenMessages.GenerateEntitiesWizard_newAssoc_tablesPage_m2mAssoc, SWT.RADIO);
+
+
+ Group assocTablesGroup = new Group(parent, SWT.NULL);
+ nColumns= 3 ;
+ layout = new GridLayout();
+ layout.numColumns = nColumns;
+ assocTablesGroup.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+ assocTablesGroup.setLayout(layout);
+
+
+ assocTablesGroup.setText( JptUiEntityGenMessages.GenerateEntitiesWizard_newAssoc_tablesPage_assocTables );
+
+ createLabel(assocTablesGroup, 1, JptUiEntityGenMessages.GenerateEntitiesWizard_newAssoc_tablesPage_table1);
+ table1TextField = createText(assocTablesGroup, 1);
+
+ Button browser1 = createButton(assocTablesGroup, 1, "", SWT.NONE);
+ browser1.setImage( ImageRepository.getBrowseButtonImage(this.resourceManager));
+
+ browser1.addSelectionListener(new SelectionListener(){
+ public void widgetDefaultSelected(SelectionEvent e) {}
+ public void widgetSelected(SelectionEvent e) {
+ SelectTableDialog dlg = new SelectTableDialog(Display.getDefault().getActiveShell(), resourceManager, customizer.getTableNames());
+ if( dlg.open() ==Dialog.OK ){
+ table1TextField.setText( dlg.getSelectedTable() );
+ getWizardDataModel().put( NewAssociationWizard.ASSOCIATION_REFERRER_TABLE, table1TextField.getText());
+ getWizard().getContainer().updateButtons();
+ ((NewAssociationWizard)getWizard()).updateTableNames();
+ }
+ }
+ });
+
+ createLabel(assocTablesGroup, 1, JptUiEntityGenMessages.GenerateEntitiesWizard_newAssoc_tablesPage_table2);
+ table2TextField = createText(assocTablesGroup, 1);
+
+ Button browser2 = createButton(assocTablesGroup, 1, "", SWT.NONE);
+ browser2.setImage( ImageRepository.getBrowseButtonImage(this.resourceManager));
+
+ browser2.addSelectionListener(new SelectionListener(){
+ public void widgetDefaultSelected(SelectionEvent e) {}
+ public void widgetSelected(SelectionEvent e) {
+ SelectTableDialog dlg = new SelectTableDialog( Display.getDefault().getActiveShell(), resourceManager, customizer.getSchema() );
+ if( dlg.open() == Dialog.OK){
+ table2TextField.setText( dlg.getSelectedTable() );
+ getWizardDataModel().put( NewAssociationWizard.ASSOCIATION_REFERENCED_TABLE, table2TextField.getText());
+ ((NewAssociationWizard)getWizard()).updateTableNames();
+ }
+ updatePageComplete();
+ }
+ });
+
+ createLabel(assocTablesGroup, 1, JptUiEntityGenMessages.GenerateEntitiesWizard_newAssoc_tablesPage_intermediateTable );
+ joinTableTextField = createText(assocTablesGroup, 1);
+ joinTableTextField.setEnabled(false);
+
+ joinTableBrowse = createButton(assocTablesGroup, 1, "", SWT.NONE);
+ joinTableBrowse.setImage( ImageRepository.getBrowseButtonImage(this.resourceManager));
+ joinTableBrowse.setEnabled(false);
+
+ joinTableBrowse.addSelectionListener(new SelectionListener(){
+ public void widgetDefaultSelected(SelectionEvent e) {}
+
+ public void widgetSelected(SelectionEvent e) {
+ SelectTableDialog dlg = new SelectTableDialog( Display.getDefault().getActiveShell(), resourceManager, customizer.getSchema() );
+ if( dlg.open() == Dialog.OK){
+ joinTableTextField.setText( dlg.getSelectedTable() );
+ getWizardDataModel().put( NewAssociationWizard.ASSOCIATION_JOIN_TABLE, joinTableTextField.getText() );
+ ((NewAssociationWizard)getWizard()).updateTableNames();
+ getWizard().getContainer().updateButtons();
+ }
+ updatePageComplete();
+ }
+ });
+
+ setControl(parent);
+
+ simpleAssoBtn.addSelectionListener(new SelectionListener(){
+ public void widgetDefaultSelected(SelectionEvent e) {}
+ public void widgetSelected(SelectionEvent e) {
+ joinTableTextField.setEnabled(false);
+ joinTableTextField.clearSelection();
+ joinTableTextField.setText("");
+ joinTableBrowse.setEnabled(false);
+ getWizardDataModel().put( NewAssociationWizard.ASSOCIATION_CADINALITY, Association.MANY_TO_ONE);
+ getWizardDataModel().remove( NewAssociationWizard.ASSOCIATION_JOIN_TABLE );
+ ((NewAssociationWizard)getWizard()).updateTableNames();
+ updatePageComplete();
+ }
+
+ });
+
+ mtmAssoBtn.addSelectionListener(new SelectionListener(){
+ public void widgetDefaultSelected(SelectionEvent e) {}
+ public void widgetSelected(SelectionEvent e) {
+ joinTableTextField.setEnabled(true);
+ joinTableBrowse.setEnabled(true);
+ getWizardDataModel().put( NewAssociationWizard.ASSOCIATION_CADINALITY, Association.MANY_TO_MANY);
+ ((NewAssociationWizard)getWizard()).updateTableNames();
+ updatePageComplete();
+ }
+ });
+
+ this.setPageComplete( false);
+ table1TextField.setFocus();
+ }
+
+ @Override
+ public boolean canFlipToNextPage() {
+ return isPageComplete();
+ }
+
+ public void updatePageComplete() {
+ if( this.table1TextField.getText().length() <= 0){
+ setPageComplete(false);
+ return;
+ }
+ if( mtmAssoBtn.getSelection() ){
+ if( this.joinTableTextField.getText().length() <= 0 ){
+ setPageComplete(false);
+ return;
+ }
+ }
+ setPageComplete(true);
+ }
+
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/gen/AssociationsListComposite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/gen/AssociationsListComposite.java
new file mode 100644
index 0000000000..65e1978e48
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/gen/AssociationsListComposite.java
@@ -0,0 +1,137 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2010 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.ui.internal.wizards.gen;
+
+import java.util.List;
+
+import org.eclipse.draw2d.ActionEvent;
+import org.eclipse.draw2d.ActionListener;
+import org.eclipse.draw2d.Figure;
+import org.eclipse.draw2d.FigureCanvas;
+import org.eclipse.draw2d.LineBorder;
+import org.eclipse.draw2d.ToolbarLayout;
+import org.eclipse.jface.resource.ResourceManager;
+import org.eclipse.jpt.jpa.gen.internal.Association;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+
+/**
+ * A Draw2d figure representing list of associations between two database tables
+ *
+ */
+public class AssociationsListComposite extends FigureCanvas {
+
+ List<Association> associations;
+ AssociationToggleSelectionListener listener ;
+ TableAssociationsWizardPage tableAssociationsWizardPage; //the parent wizard page
+ AssociationFigure selectedAssociationFigure ;
+
+ protected final ResourceManager resourceManager;
+
+ public AssociationsListComposite(Composite parent, TableAssociationsWizardPage tableAssociationsWizardPage, ResourceManager resourceManager){
+ super(parent);
+ this.tableAssociationsWizardPage = tableAssociationsWizardPage;
+ this.resourceManager = resourceManager;
+
+ setBounds(10, 10 , 500, 200);
+ Color backgroundColor = new Color(Display.getDefault(), 255,255,255);
+ setBackground(backgroundColor);
+ backgroundColor.dispose();
+
+ Figure figure = new Figure();
+ figure.setLayoutManager(new ToolbarLayout());
+ figure.setBorder(new LineBorder(1));
+ this.listener = new AssociationToggleSelectionListener();
+
+ this.setContents(figure);
+ }
+
+ public void updateAssociations(List<Association> associations){
+ Figure figure = (Figure)this.getContents();
+ this.disposeFigure(figure);
+
+ this.associations = associations;
+ if( associations != null ){
+ for( int i = 0; i <associations.size(); i ++ ){
+ Association association = associations.get(i);
+ AssociationFigure assocFigure = new AssociationFigure(association, this.resourceManager);
+ assocFigure.addActionListener( listener );
+ figure.add(assocFigure);
+ }
+ }
+ }
+
+ public Association getSelectedAssociation(){
+ return this.selectedAssociationFigure.getAssociation();
+ }
+
+ @SuppressWarnings("unchecked")
+ public void updateSelectedAssociation(){
+ Figure figure = (Figure)this.getContents();
+ List<AssociationFigure> associationFigures = figure.getChildren();
+ for(AssociationFigure assocFig : associationFigures){
+ if( assocFig == this.selectedAssociationFigure){
+ assocFig.update();
+ }
+ }
+ }
+
+ /**
+ * Get the association just before the selected one in UI
+ * @return
+ */
+ @SuppressWarnings("unchecked")
+ public Association getPreviousAssociation(){
+ Figure figure = (Figure)this.getContents();
+ List<AssociationFigure> associationFigures = figure.getChildren();
+ AssociationFigure ret = null;
+ for(AssociationFigure assocFig : associationFigures){
+ if( assocFig.isSelected() ){
+ break;
+ }
+ ret = assocFig;
+ }
+ return ret==null?null:ret.getAssociation();
+ }
+
+ @Override
+ public void dispose() {
+ this.disposeFigure((Figure) getContents());
+ super.dispose();
+ }
+
+ @SuppressWarnings("unchecked")
+ protected void disposeFigure(Figure figure) {
+ for (AssociationFigure associationFigure : (List<AssociationFigure>) figure.getChildren()) {
+ associationFigure.removeActionListener(this.listener);
+ associationFigure.dispose();
+ }
+ figure.removeAll();
+ this.selectedAssociationFigure = null;
+ }
+
+ class AssociationToggleSelectionListener implements ActionListener {
+ public void actionPerformed(ActionEvent event) {
+ AssociationFigure figure = (AssociationFigure )event.getSource() ;
+ figure.setSelected(true);
+ Association association = figure.getAssociation();
+ tableAssociationsWizardPage.updateAssociationEditPanel(association);
+ //un-select the previous selected
+ if( selectedAssociationFigure != null && selectedAssociationFigure!= figure ){
+ selectedAssociationFigure.setSelected( false );
+ }
+ //Highlight new selection
+ selectedAssociationFigure = figure;
+ selectedAssociationFigure.setSelected( true );
+ }
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/gen/CardinalityPage.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/gen/CardinalityPage.java
new file mode 100644
index 0000000000..fca73e4df8
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/gen/CardinalityPage.java
@@ -0,0 +1,161 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 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.ui.internal.wizards.gen;
+
+import org.eclipse.jpt.jpa.gen.internal.Association;
+import org.eclipse.jpt.jpa.gen.internal.ORMGenCustomizer;
+import org.eclipse.jpt.jpa.ui.internal.JpaHelpContextIds;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+
+
+public class CardinalityPage extends NewAssociationWizardPage {
+
+ private Label mtoDescLabel;
+ private Label otmDescLabel;
+ private Label otoDescLabel;
+ private Label mtmDescLabel;
+
+ private Button[] cardinalityButtons = new Button[4];
+
+ protected CardinalityPage(ORMGenCustomizer customizer) {
+ super( customizer , "CardinalityPage" );
+ setTitle(JptUiEntityGenMessages.GenerateEntitiesWizard_newAssoc_cardinalityPage_title);
+ setDescription( JptUiEntityGenMessages.GenerateEntitiesWizard_newAssoc_cardinalityPage_desc);
+ }
+
+ public void createControl(Composite parent) {
+ initializeDialogUnits(parent);
+
+ Composite composite = new Composite(parent, SWT.NULL);
+ int nColumns= 1 ;
+ GridLayout layout = new GridLayout();
+ layout.numColumns = nColumns;
+ composite.setLayout(layout);
+ this.getHelpSystem().setHelp(composite, JpaHelpContextIds.GENERATE_ENTITIES_WIZARD_ASSOCIATION_CARDINALITY);
+
+ CardinalitySelectionListener selectionListener = new CardinalitySelectionListener();
+ cardinalityButtons[0] = createRadioButton( composite, 1, JptUiEntityGenMessages.manyToOne);
+ cardinalityButtons[0].addSelectionListener( selectionListener );
+ //Default cardinality is MTO
+ cardinalityButtons[0].setSelection(true);
+ getWizardDataModel().put(NewAssociationWizard.ASSOCIATION_CADINALITY, Association.MANY_TO_ONE);
+
+ mtoDescLabel = createLabel(composite,1, JptUiEntityGenMessages.manyToOneDesc);
+
+ cardinalityButtons[1] = createRadioButton( composite, 1, JptUiEntityGenMessages.oneToMany);
+ cardinalityButtons[1].addSelectionListener( selectionListener );
+
+ otmDescLabel = createLabel(composite,1, JptUiEntityGenMessages.manyToOneDesc);
+
+ cardinalityButtons[2] = createRadioButton( composite, 1, JptUiEntityGenMessages.oneToOne);
+ cardinalityButtons[2].addSelectionListener( selectionListener );
+
+ otoDescLabel = createLabel(composite,1, JptUiEntityGenMessages.oneToOneDesc);
+
+ cardinalityButtons[3] = createRadioButton( composite, 1, JptUiEntityGenMessages.manyToMany);
+ mtmDescLabel= createLabel(composite,1, JptUiEntityGenMessages.manyToManyDesc);
+
+ setControl(composite);
+ this.setPageComplete( true );
+
+ cardinalityButtons[0].setFocus();
+
+ }
+
+ public void updateWithNewTables() {
+ String s1 = getReferrerTableName() ;
+ String s2 = getReferencedTableName() ;
+ String joinTableName = getJoinTableName();
+ if( s1 == null || s2 == null )
+ return ;
+
+ updateDescriptionText(s1, s2);
+ if( joinTableName == null ){
+ cardinalityButtons[0].setEnabled(true);
+ cardinalityButtons[1].setEnabled(true);
+ cardinalityButtons[2].setEnabled(true);
+ cardinalityButtons[3].setEnabled(false);
+ mtmDescLabel.setEnabled(false);
+ }else{
+ cardinalityButtons[0].setEnabled(false);
+ cardinalityButtons[1].setEnabled(false);
+ cardinalityButtons[2].setEnabled(false);
+ cardinalityButtons[3].setEnabled(true);
+ cardinalityButtons[3].setSelection(true);
+ mtmDescLabel.setEnabled(true);
+ }
+ ((Composite)this.getControl()).layout() ;
+ }
+
+ private void updateDescriptionText(String s1, String s2) {
+ //MTO
+ String msg = String.format(JptUiEntityGenMessages.manyToOneDesc, s2, s1);
+ mtoDescLabel.setText( msg );
+ //OTM
+ msg = String.format(JptUiEntityGenMessages.manyToOneDesc, s1, s2);
+ otmDescLabel.setText( msg );
+ msg = String.format(JptUiEntityGenMessages.oneToOneDesc, s1, s2);
+ otoDescLabel.setText( msg );
+ msg = String.format(JptUiEntityGenMessages.manyToManyDesc, s1, s2, s2, s1);
+ mtmDescLabel.setText( msg );
+ }
+
+ public boolean canFlipToNextPage() {
+ return false;
+ }
+
+ private Label createLabel(Composite container, int span, String text) {
+ Label label = new Label(container, SWT.NONE);
+ label.setText(text);
+ GridData gd = new GridData();
+ gd.horizontalSpan = span;
+ gd.horizontalIndent = 30;
+ label.setLayoutData(gd);
+ return label;
+ }
+
+
+ private Button createRadioButton(Composite container, int span, String text ) {
+ Button btn = new Button(container, SWT.RADIO );
+ btn.setText(text);
+ GridData gd = new GridData();
+ gd.horizontalSpan = span;
+ btn.setLayoutData(gd);
+ return btn;
+ }
+
+
+ private class CardinalitySelectionListener implements SelectionListener {
+ public void widgetDefaultSelected(SelectionEvent e) {}
+
+ public void widgetSelected(SelectionEvent e) {
+ if( e.getSource() == cardinalityButtons[0]){
+ getWizardDataModel().put(NewAssociationWizard.ASSOCIATION_CADINALITY, Association.MANY_TO_ONE);
+ }else if( e.getSource() == cardinalityButtons[1]){
+ getWizardDataModel().put(NewAssociationWizard.ASSOCIATION_CADINALITY, Association.ONE_TO_MANY );
+ }else if( e.getSource() == cardinalityButtons[2]){
+ getWizardDataModel().put(NewAssociationWizard.ASSOCIATION_CADINALITY, Association.ONE_TO_ONE);
+ }else{
+ getWizardDataModel().put(NewAssociationWizard.ASSOCIATION_CADINALITY, Association.MANY_TO_MANY);
+ }
+ CardinalityPage.this.setPageComplete(true);
+
+ }
+ }
+
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/gen/CascadeDialog.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/gen/CascadeDialog.java
new file mode 100644
index 0000000000..d95ca10b56
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/gen/CascadeDialog.java
@@ -0,0 +1,191 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 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.ui.internal.wizards.gen;
+
+import java.util.Collections;
+import java.util.List;
+
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.jface.dialogs.TrayDialog;
+import org.eclipse.jpt.jpa.gen.internal.AssociationRole;
+import org.eclipse.jpt.jpa.gen.internal.util.StringUtil;
+import org.eclipse.jpt.jpa.ui.internal.JpaHelpContextIds;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.help.IWorkbenchHelpSystem;
+
+/**
+ * Simple dialog allows user to set the cascade property of an associationRole.
+ * The value of cascade can be "all", or any combination of other selections.
+ *
+ */
+public class CascadeDialog extends TrayDialog {
+
+ private static String[] ALL_CASCADES = new String[] {TagNames.ALL_CASCADE, TagNames.PERSIST_CASCADE, TagNames.MERGE_CASCADE
+ , TagNames.REMOVE_CASCADE, TagNames.REFRESH_CASCADE};
+
+ private static String[] ALL_CASCADES_LABELS
+ = new String[] { "&all", //$NON-NLS-1$
+ "&persist", //$NON-NLS-1$
+ "&merge", //$NON-NLS-1$
+ "&remove", //$NON-NLS-1$
+ "r&efresh"}; //$NON-NLS-1$
+
+
+ private Button[] allButtons = new Button[ALL_CASCADES.length];
+
+ private AssociationRole associationRole;
+ private List<String> cascades;
+
+ protected CascadeDialog(Shell parentShell) {
+ super(parentShell);
+ }
+
+ public static CascadeDialog create(AssociationRole role) {
+ CascadeDialog dlg = new CascadeDialog(Display.getDefault().getActiveShell() );
+ dlg.setAssociationRole(role);
+ return dlg;
+ }
+
+ /*
+ * (non-Javadoc) Method declared on Window.
+ */
+ protected void configureShell(Shell newShell) {
+ super.configureShell(newShell);
+ newShell.setText(JptUiEntityGenMessages.selectCascadeDlgTitle);
+ this.getHelpSystem().setHelp(newShell, JpaHelpContextIds.GENERATE_ENTITIES_WIZARD_SELECT_CASCADE);
+ }
+
+ private void setAssociationRole(AssociationRole role) {
+ this.associationRole = role;
+ List<String> list = StringUtil.strToList(associationRole.getCascade(), ',', true/*trim*/); //role.getCascade() contains the comma separed cascades (see below)
+ if (list == null) {
+ list = Collections.emptyList();
+ }
+ cascades = list;
+
+ }
+
+ protected void createButtonsForButtonBar(Composite parent) {
+ createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, true);
+ createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false);
+ }
+
+ protected Control createDialogArea(Composite parent) {
+ Composite container = (Composite) super.createDialogArea(parent);
+ createCascadeTypesGroup(container);
+ Dialog.applyDialogFont(container);
+ return container;
+ }
+
+ private void createCascadeTypesGroup(Composite parent) {
+ Group group = new Group(parent, SWT.NONE);
+ group.setLayout(new GridLayout());
+ GridData gd = new GridData(GridData.FILL_HORIZONTAL);
+ gd.widthHint = 275;
+ group.setLayoutData(gd);
+ group.setText(JptUiEntityGenMessages.cascade);
+
+ for( int i=0; i< ALL_CASCADES.length; i ++ ){
+ Button checkbox = new Button(group, SWT.CHECK);
+ checkbox.setText( ALL_CASCADES_LABELS[i] );
+ checkbox.setSelection( isInList(ALL_CASCADES[i]) ); //$NON-NLS-1$
+ checkbox.setData(ALL_CASCADES[i]);
+ allButtons[i] = checkbox;
+ /*if <code>all</code> is selected then deselect all others*/
+ checkbox.addSelectionListener( new SelectionListener(){
+ public void widgetDefaultSelected(SelectionEvent e) {}
+ public void widgetSelected(SelectionEvent e) {
+ Button b = (Button)e.getSource();
+ if( b.getSelection() ){
+ if( b == allButtons[0] ){
+ for( Button btn : allButtons ){
+ if( btn != e.getSource() ) btn.setSelection(false);
+ }
+ }else{
+ allButtons[0].setSelection(false);
+ }
+ }
+ }
+ });
+ }
+ }
+
+ protected void okPressed() {
+ StringBuilder builder = new StringBuilder();
+ for( Button b : allButtons ){
+ if( b.getSelection() ){
+ if( builder.length()>0 ){
+ builder.append( ',');
+ }
+ builder.append( b.getData() );
+ }
+ }
+ this.associationRole.setCascade( builder.toString() );
+ super.okPressed();
+ }
+
+ private boolean isInList(String cascade) {
+ for( String s : cascades ){
+ if( s.equals(cascade )){
+ return true;
+ }
+ }
+ return false;
+ }
+
+ protected final IWorkbenchHelpSystem getHelpSystem() {
+ return PlatformUI.getWorkbench().getHelpSystem();
+ }
+
+}
+
+class TagNames
+{
+ public static final String BASIC_TAG = "basic";
+ public static final String CASCADE_TAG = "cascade";
+ public static final String COLUMN_TAG = "column";
+ public static final String EMBEDDED_TAG = "embedded";
+ public static final String EMBEDDED_ID_TAG = "embedded-id";
+ public static final String GENERATED_VALUE_TAG = "generated-value";
+ public static final String ID_TAG = "id";
+ public static final String ID_CLASS_TAG = "id";
+ public static final String JOIN_COLUMN_TAG = "join-column";
+ public static final String INVERSE_JOIN_COLUMN_TAG = "inverse-join-column";
+ public static final String LOB_TAG = "lob";
+ public static final String MANY_TO_MANY_TAG = "many-to-many";
+ public static final String MANY_TO_ONE_TAG = "many-to-one";
+ public static final String MAPPED_BY_TAG = "mapped-by";
+ public static final String ONE_TO_MANY_TAG = "one-to-many";
+ public static final String ONE_TO_ONE_TAG = "one-to-one";
+ public static final String PK_JOIN_COLUMN_TAG = "primary-key-join-column";
+ public static final String TABLE_TAG = "table";
+ public static final String VERSION_TAG = "version";
+ public static final String JOIN_TABLE_TAG = "join-table";
+
+ /*cascade tags*/
+ public static final String ALL_CASCADE = "all";
+ public static final String PERSIST_CASCADE = "persist";
+ public static final String MERGE_CASCADE = "merge";
+ public static final String REMOVE_CASCADE = "remove";
+ public static final String REFRESH_CASCADE = "refresh";
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/gen/ColumnGenPanel.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/gen/ColumnGenPanel.java
new file mode 100644
index 0000000000..93c19cd872
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/gen/ColumnGenPanel.java
@@ -0,0 +1,360 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2010 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.ui.internal.wizards.gen;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.jdt.core.JavaConventions;
+import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.jface.wizard.WizardPage;
+import org.eclipse.jpt.jpa.gen.internal.ORMGenColumn;
+import org.eclipse.jpt.jpa.gen.internal.ORMGenCustomizer;
+import org.eclipse.jpt.jpa.ui.JptJpaUiPlugin;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.swt.widgets.Text;
+
+/**
+ * The panel used in the <code>TablesAndColumnsPage</code> wizard page
+ * to edit the column generation properties.
+ * An instance of this class is created by the <code>ORMGenWizard</code>
+ * implementation.
+
+ */
+public class ColumnGenPanel
+{
+ WizardPage wizardPage ;
+ Composite parent; //parent control with grid layout
+ int columns; //total columns in the parent composite
+
+ ORMGenCustomizer customizer;
+
+ private ORMGenColumn mColumn;
+ private boolean mPanelInited;
+ private boolean mIsUpdatingControls;
+
+ private Group columnMappingGroup;
+ private Button mGeneratedCheckbox;
+ private Text mPropNameField;
+ private Combo mMappingKindCombo;
+ private Combo mPropTypeCombo;
+ private Button mUpdateableCheckBox;
+ private Button mInsertableCheckBox;
+
+ private Group domainClassGroup ;
+ private ScopePanel mPropGetScopePanel;
+ private ScopePanel mPropSetScopePanel;
+
+ public ColumnGenPanel(Composite parent, int columns, ORMGenCustomizer customizer, WizardPage wizardPage ) {
+ this.wizardPage = wizardPage;
+ this.customizer = customizer;
+ this.parent =parent;
+ this.columns = columns;
+
+ initPanel();
+ }
+ /**
+ * Changes the table edited by the panel.
+ * This is supposed to update the panel editing controls
+ * using the column values.
+ */
+ public void setColumn(ORMGenColumn column) {
+ mColumn = column;
+
+ /*lazy init panel because it uses mColumn*/
+ if (!mPanelInited) {
+ initPanel();
+ mPanelInited = true;
+ }
+
+ updateControls();
+ }
+ private void updateControls() {
+ if (mIsUpdatingControls) {
+ return;
+ }
+
+ mIsUpdatingControls = true;
+ boolean isGenerated = mColumn.isGenerated();
+ mGeneratedCheckbox.setSelection( isGenerated);
+ mGeneratedCheckbox.setEnabled(true);
+ enableControls(isGenerated);
+ try {
+ mPropNameField.setText(mColumn.getPropertyName());
+
+ mPropTypeCombo.setText( mColumn.getPropertyType());
+
+ mMappingKindCombo.setText( mColumn.getMappingKind());
+
+ mUpdateableCheckBox.setSelection( mColumn.isUpdateable());
+
+ mInsertableCheckBox.setSelection(mColumn.isInsertable());
+
+ mPropGetScopePanel.enableComponents(isGenerated);
+ mPropGetScopePanel.setScope(mColumn.getPropertyGetScope());
+
+ mPropSetScopePanel.enableComponents( isGenerated );
+ mPropSetScopePanel.setScope(mColumn.getPropertySetScope());
+
+ if( mColumn.isPartOfCompositePrimaryKey()){
+ enableControls(false);
+ mPropNameField.setEnabled(true);
+ mGeneratedCheckbox.setEnabled(false);
+ }
+
+ } catch (Exception e) {
+ JptJpaUiPlugin.log(e);
+ }
+
+ mIsUpdatingControls = false;
+ }
+ private void enableControls(boolean isGenerated) {
+ Control[] controls = this.domainClassGroup.getChildren();
+ for( Control c: controls){
+ c.setEnabled( isGenerated );
+ }
+
+ controls = this.columnMappingGroup.getChildren();
+ for( Control c: controls){
+ c.setEnabled( isGenerated );
+ }
+ }
+ /**
+ * Initializes the panel by adding the editing controls.
+ * @param columns
+ * @param parent
+ */
+ protected void initPanel() {
+ createControls(parent, columns);
+ this.mPanelInited = true;
+ }
+
+ //-------------------------------------------
+ //----- ScopePanel class --------------------
+ //-------------------------------------------
+ /**
+ * A panel containing 3 radios (public, protected, private)
+ */
+ private class ScopePanel
+ {
+ private Button mPublicRadio;
+ private Button mProtectedRadio;
+ private Button mPrivateRadio;
+
+ public ScopePanel(Composite comp, SelectionListener listener) {
+ //super(3, 20/*hspacing*/, 0/*vspacing*/);
+
+ Composite radioGroup = new Composite( comp, SWT.NONE);
+ radioGroup.setLayout(new GridLayout(3, true));
+ GridData gd = new GridData();
+ gd.horizontalSpan = 3;
+ radioGroup.setLayoutData(gd);
+
+ /*string not localized intentionally, they are used as the actual
+ * scope value (see getText() usage)*/
+ mPublicRadio = new Button( radioGroup, SWT.RADIO );
+ mPublicRadio.setText( "public");
+ mPublicRadio.setLayoutData(new GridData());
+ mProtectedRadio = new Button( radioGroup, SWT.RADIO );
+ mProtectedRadio.setText("protected");
+ mProtectedRadio.setLayoutData(new GridData());
+ mPrivateRadio = new Button(radioGroup, SWT.RADIO );
+ mPrivateRadio.setText( "private");
+ mPrivateRadio.setLayoutData(new GridData());
+
+ mPublicRadio.addSelectionListener(listener);
+ mProtectedRadio.addSelectionListener(listener);
+ mPrivateRadio.addSelectionListener(listener);
+
+ }
+ public void enableComponents(boolean b) {
+ mPublicRadio.setEnabled(b);
+ mProtectedRadio.setEnabled(b);
+ mPrivateRadio.setEnabled(b);
+ }
+ /**
+ * Returns the currently selected scope.
+ */
+ public String getScope() {
+ Button radio = null;
+ if (mPublicRadio.getSelection()) {
+ radio = mPublicRadio;
+ } else if (mProtectedRadio.getSelection() ) {
+ radio = mProtectedRadio;
+ } else if (mPrivateRadio.getSelection() ) {
+ radio = mPrivateRadio;
+ }
+ return radio != null ? radio.getText() : null;
+ }
+ public void setScope(String scope) {
+ mPublicRadio.setSelection(false);
+ mProtectedRadio.setSelection(false);
+ mPrivateRadio.setSelection(false);
+ if( scope == null )
+ return;
+ if (scope.equals(ORMGenColumn.PUBLIC_SCOPE)) {
+ mPublicRadio.setSelection(true);
+ } else if (scope.equals(ORMGenColumn.PROTECTED_SCOPE)) {
+ mProtectedRadio.setSelection(true);
+ } else if (scope.equals(ORMGenColumn.PRIVATE_SCOPE)) {
+ mPrivateRadio.setSelection(true);
+ }
+ }
+ }
+
+ //-------------------------------------------
+ //----- private methods ---------------------
+ //-------------------------------------------
+ private void createControls(Composite composite, int columns) {
+ mGeneratedCheckbox = new Button(composite, SWT.CHECK);
+ mGeneratedCheckbox.setText( JptUiEntityGenMessages.GenerateEntitiesWizard_colPanel_genProp);
+ mGeneratedCheckbox.addSelectionListener(new SelectionListener() {
+ public void widgetDefaultSelected(SelectionEvent e) {}
+ public void widgetSelected(SelectionEvent e) {
+ if (!mIsUpdatingControls) {
+ mColumn.setGenerated(mGeneratedCheckbox.getSelection() );
+ updateControls();
+ }
+ }});
+ SWTUtil.fillColumns(mGeneratedCheckbox, columns);
+
+ columnMappingGroup = new Group( composite, SWT.NONE);
+ columnMappingGroup.setText( JptUiEntityGenMessages.GenerateEntitiesWizard_colPanel_colMapping);
+ columnMappingGroup.setLayout(new GridLayout(columns, false));
+ GridData layoutData = new GridData();
+ layoutData.horizontalSpan = columns;
+ layoutData.verticalAlignment = SWT.FILL;
+ layoutData.horizontalAlignment = SWT.FILL;
+ layoutData.grabExcessHorizontalSpace = true;
+ layoutData.grabExcessVerticalSpace = false;
+ layoutData.horizontalIndent = 20 ;
+ columnMappingGroup.setLayoutData(layoutData);
+
+ SWTUtil.createLabel(columnMappingGroup, 1, JptUiEntityGenMessages.GenerateEntitiesWizard_colPanel_propName );
+ mPropNameField = new Text(columnMappingGroup, SWT.BORDER | SWT.SINGLE );
+ mPropNameField.addModifyListener(new ModifyListener(){
+ @SuppressWarnings("restriction")
+ public void modifyText(ModifyEvent e) {
+ if (!mIsUpdatingControls) {
+ String fldName = mPropNameField.getText();
+ IStatus status = JavaConventions.validateIdentifier( fldName,
+ JavaCore.VERSION_1_3, JavaCore.VERSION_1_3 );
+ if( !status.matches(IStatus.ERROR)){
+ mColumn.setPropertyName(fldName);
+ wizardPage.setErrorMessage(null);
+ }else{
+ wizardPage.setErrorMessage(status.getMessage());
+ }
+ }
+ }
+ });
+ SWTUtil.fillColumns(mPropNameField ,3);
+
+ SWTUtil.createLabel(columnMappingGroup, 1, JptUiEntityGenMessages.GenerateEntitiesWizard_colPanel_propType );
+ mPropTypeCombo = new Combo(columnMappingGroup, SWT.SINGLE | SWT.READ_ONLY);
+ mPropTypeCombo.setItems( this.customizer.getAllPropertyTypes());
+ mPropTypeCombo.addModifyListener( new ModifyListener(){
+ public void modifyText(ModifyEvent e) {
+ if (!mIsUpdatingControls) {
+ mColumn.setPropertyType(mPropTypeCombo.getText());
+ }
+ }
+ });
+ SWTUtil.fillColumns(mPropTypeCombo,3);
+
+ SWTUtil.createLabel(columnMappingGroup, 1, JptUiEntityGenMessages.GenerateEntitiesWizard_colPanel_mapKind );
+ mMappingKindCombo = new Combo(columnMappingGroup, SWT.SINGLE | SWT.READ_ONLY);
+ mMappingKindCombo.setItems( this.customizer.getAllMappingKinds());
+ mMappingKindCombo.addSelectionListener(new SelectionListener() {
+ public void widgetDefaultSelected(SelectionEvent e) {}
+ public void widgetSelected(SelectionEvent e) {
+ if (!mIsUpdatingControls) {
+ mColumn.setMappingKind((String)mMappingKindCombo.getText());
+ }
+
+ }});
+ SWTUtil.fillColumns(mMappingKindCombo ,3);
+
+ mUpdateableCheckBox = new Button(columnMappingGroup, SWT.CHECK);
+ mUpdateableCheckBox.setText( JptUiEntityGenMessages.GenerateEntitiesWizard_colPanel_colUpdateable);
+ mUpdateableCheckBox.addSelectionListener(new SelectionListener() {
+ public void widgetDefaultSelected(SelectionEvent e) {}
+ public void widgetSelected(SelectionEvent e) {
+ if (!mIsUpdatingControls) {
+ mColumn.setUpdateable(mUpdateableCheckBox.getSelection() );
+ }
+ }});
+ SWTUtil.fillColumns(mUpdateableCheckBox ,4);
+
+ mInsertableCheckBox = new Button(columnMappingGroup, SWT.CHECK);
+ mInsertableCheckBox.setText( JptUiEntityGenMessages.GenerateEntitiesWizard_colPanel_colInsertable);
+ mInsertableCheckBox.addSelectionListener(new SelectionListener() {
+ public void widgetDefaultSelected(SelectionEvent e) {}
+ public void widgetSelected(SelectionEvent e) {
+ if (!mIsUpdatingControls) {
+ mColumn.setInsertable(mInsertableCheckBox.getSelection());
+ }
+ }});
+ SWTUtil.fillColumns(mInsertableCheckBox ,4);
+
+ SWTUtil.createLabel(composite, 4,"");
+
+ createJavaBeanPropertyControls(composite, columns);
+ }
+
+ void createJavaBeanPropertyControls(Composite composite, int columns){
+ //Java class generation properties
+ domainClassGroup = new Group(composite, SWT.NONE);
+ domainClassGroup.setText( JptUiEntityGenMessages.GenerateEntitiesWizard_colPanel_beanProp );
+ domainClassGroup.setLayout(new GridLayout(columns, false));
+ GridData layoutData = new GridData();
+ layoutData.horizontalSpan = columns;
+ layoutData.verticalAlignment = SWT.FILL;
+ layoutData.horizontalAlignment = SWT.FILL;
+ layoutData.grabExcessHorizontalSpace = true;
+ layoutData.grabExcessVerticalSpace = false;
+ layoutData.horizontalIndent = 20;
+ domainClassGroup.setLayoutData(layoutData);
+
+ SWTUtil.createLabel(domainClassGroup, 1, JptUiEntityGenMessages.GenerateEntitiesWizard_colPanel_getterScope );
+ mPropGetScopePanel = new ScopePanel(domainClassGroup, new SelectionListener() {
+ public void widgetDefaultSelected(SelectionEvent e) {}
+
+ public void widgetSelected(SelectionEvent e) {
+ if (!mIsUpdatingControls) {
+ if( ((Button)e.getSource()).getSelection() )
+ mColumn.setPropertyGetScope(mPropGetScopePanel.getScope());
+ }
+
+ }});
+
+ SWTUtil.createLabel(domainClassGroup, 1, JptUiEntityGenMessages.GenerateEntitiesWizard_colPanel_setterScope );
+ mPropSetScopePanel = new ScopePanel(domainClassGroup, new SelectionListener() {
+ public void widgetDefaultSelected(SelectionEvent e) {}
+
+ public void widgetSelected(SelectionEvent e) {
+ if (!mIsUpdatingControls) {
+ if( ((Button)e.getSource()).getSelection() )
+ mColumn.setPropertySetScope(mPropSetScopePanel.getScope());
+ }
+ }});
+
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/gen/DatabaseGroup.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/gen/DatabaseGroup.java
new file mode 100644
index 0000000000..8be4218b9b
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/gen/DatabaseGroup.java
@@ -0,0 +1,526 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2010 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.ui.internal.wizards.gen;
+
+import java.lang.reflect.InvocationTargetException;
+import java.util.Collections;
+import java.util.EventListener;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Set;
+import java.util.SortedSet;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.jface.operation.IRunnableWithProgress;
+import org.eclipse.jface.resource.ResourceManager;
+import org.eclipse.jface.wizard.IWizardContainer;
+import org.eclipse.jpt.common.utility.internal.CollectionTools;
+import org.eclipse.jpt.common.utility.internal.SynchronizedBoolean;
+import org.eclipse.jpt.common.utility.internal.iterables.EmptyIterable;
+import org.eclipse.jpt.common.utility.internal.iterators.CloneIterator;
+import org.eclipse.jpt.jpa.core.JpaProject;
+import org.eclipse.jpt.jpa.db.ConnectionAdapter;
+import org.eclipse.jpt.jpa.db.ConnectionListener;
+import org.eclipse.jpt.jpa.db.ConnectionProfile;
+import org.eclipse.jpt.jpa.db.JptJpaDbPlugin;
+import org.eclipse.jpt.jpa.db.Schema;
+import org.eclipse.jpt.jpa.db.SchemaContainer;
+import org.eclipse.jpt.jpa.db.ui.internal.DTPUiTools;
+import org.eclipse.jpt.jpa.ui.JptJpaUiPlugin;
+import org.eclipse.jpt.jpa.ui.internal.ImageRepository;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Label;
+
+/**
+ * A composite used to connect to database, includes following UI controls:
+ * - connection combo-box
+ * - schema combo-box
+ * - add connection button
+ * - reconnect button
+ */
+public class DatabaseGroup
+{
+ private final JpaProject jpaProject;
+ private final Set<Listener> listeners = Collections.synchronizedSet(new HashSet<Listener>());
+
+ // these are kept in synch with the selection
+ ConnectionProfile selectedConnectionProfile;
+ private Schema selectedSchema;
+
+ private final Combo connectionComboBox;
+
+ private final Combo schemaComboBox;
+
+ private final Button reconnectButton;
+
+ private final ConnectionListener connectionListener;
+
+ private IWizardContainer wizardContainer;
+
+ protected final ResourceManager resourceManager;
+
+ // ********** construction **********
+
+ DatabaseGroup(IWizardContainer wizardContainer, JpaProject jpaProject, Composite parent, ResourceManager resourceManager, int widthHint) {
+ super();
+ this.wizardContainer = wizardContainer;
+ this.jpaProject = jpaProject;
+ this.resourceManager = resourceManager;
+
+ // connection combo-box
+ this.buildLabel(parent, 1, JptUiEntityGenMessages.connection);
+ this.connectionComboBox = this.buildComboBox(parent, widthHint, this.buildConnectionComboBoxSelectionListener());
+
+ // add connection button
+ Button addConnectionButton = this.buildButton(parent, JptUiEntityGenMessages.addConnectionLink, ImageRepository.getAddConnectionButtonImage(this.resourceManager), this.buildAddConnectionLinkSelectionListener());
+ GridData data = new GridData();
+ addConnectionButton.setLayoutData(data);
+
+
+ // A composite holds the reconnect button & text
+ this.buildLabel(parent, 1, ""); //$NON-NLS-1$
+ Composite comp = new Composite( parent , SWT.NONE );
+ GridData gd = new GridData();
+ gd.grabExcessHorizontalSpace = true ;
+ gd.horizontalSpan = 2;
+ comp.setLayoutData( gd );
+ GridLayout gl = new GridLayout(2, false);
+ // Make the reconnect button to be closer to the connection combo.
+ gl.marginTop = -5;
+ comp.setLayout(gl);
+ this.reconnectButton = this.buildButton(comp, JptUiEntityGenMessages.connectLink, ImageRepository.getReconnectButtonImage(this.resourceManager), this.buildReconnectLinkSelectionListener());
+ this.buildLabel(comp, 1, JptUiEntityGenMessages.schemaInfo);
+
+ // schema combo-box
+ this.buildLabel(parent, 1, JptUiEntityGenMessages.schema);
+ this.schemaComboBox = new Combo(parent, SWT.BORDER | SWT.READ_ONLY);
+ data = new GridData(SWT.BEGINNING, SWT.CENTER, true, false);
+ data.horizontalAlignment = SWT.FILL;
+ data.horizontalSpan = 1;
+ data.grabExcessHorizontalSpace = true ;
+ this.schemaComboBox.setLayoutData(data);
+ this.schemaComboBox.addSelectionListener(this.buildSchemaComboBoxSelectionListener());
+ // filler
+ new Label(parent, SWT.NULL);
+
+ this.connectionListener = this.buildConnectionListener();
+ }
+
+
+ public void init()
+ {
+ // initialize state, based on JPA project
+ this.selectedConnectionProfile = this.getJpaProjectConnectionProfile();
+ this.selectedSchema = this.getDefaultSchema();
+
+ if (this.selectedSchema != null) {
+ this.fireSchemaChanged(this.selectedSchema);
+ }
+ if (this.selectedConnectionProfile != null) {
+ this.selectedConnectionProfile.addConnectionListener(this.connectionListener);
+ this.fireConnectionProfileChanged(this.selectedConnectionProfile);
+ }
+
+ this.updateConnectionComboBox();
+ this.updateSchemaComboBox();
+ this.updateReconnectLink();
+
+ }
+ // ********** intra-wizard methods **********
+
+ Schema getSelectedSchema() {
+ return this.selectedSchema;
+ }
+
+ void dispose() {
+ if (this.selectedConnectionProfile != null) {
+ this.selectedConnectionProfile.removeConnectionListener(this.connectionListener);
+ }
+ }
+
+
+ // ********** internal methods **********
+
+ /**
+ * this can return null;
+ * called at start-up and when the selected connection profile changes
+ */
+ private ConnectionProfile getJpaProjectConnectionProfile() {
+ return this.jpaProject.getConnectionProfile();
+ }
+
+ /**
+ * this can return null;
+ * called at start-up and when the selected connection profile changes
+ */
+ private Schema getDefaultSchema() {
+ return (this.selectedConnectionProfile == this.getJpaProjectConnectionProfile()) ?
+ jpaProject.getDefaultDbSchema() : null;
+ }
+
+ /**
+ * the connection combo-box is updated at start-up and when the user
+ * adds a connection profile
+ */
+ private void updateConnectionComboBox() {
+ this.connectionComboBox.removeAll();
+ for (String cpName : this.buildSortedConnectionProfileNames()) {
+ this.connectionComboBox.add(cpName);
+ }
+ if (this.selectedConnectionProfile != null) {
+ this.connectionComboBox.select(this.connectionComboBox.indexOf(this.selectedConnectionProfile.getName()));
+ }
+ }
+
+ private SortedSet<String> buildSortedConnectionProfileNames() {
+ return CollectionTools.sortedSet(JptJpaDbPlugin.getConnectionProfileFactory().getConnectionProfileNames());
+ }
+
+ /**
+ * called at start-up and when the selected connection profile changes
+ */
+ private void updateReconnectLink() {
+ this.reconnectButton.setEnabled(this.reconnectLinkCanBeEnabled());
+ }
+
+ private boolean reconnectLinkCanBeEnabled() {
+ return (this.selectedConnectionProfile != null) && !(this.selectedConnectionProfile.isActive());
+ }
+
+ /**
+ * the schema combo-box is updated at start-up and
+ * when the selected connection profile changes
+ */
+ private void updateSchemaComboBox() {
+ this.schemaComboBox.removeAll();
+ for (String name : this.getSchemaNames()) {
+ this.schemaComboBox.add(name);
+ }
+ // the current schema *should* be in the current connection profile
+ if (this.selectedSchema != null) {
+ this.schemaComboBox.select(this.schemaComboBox.indexOf(this.selectedSchema.getName()));
+ }
+ }
+
+ private Iterable<String> getSchemaNames() {
+ SchemaContainer sc = this.jpaProject.getDefaultDbSchemaContainer();
+ // use schema *names* since the combo-box is read-only
+ return (sc != null) ? sc.getSortedSchemaNames() : EmptyIterable.<String>instance();
+ }
+
+ /**
+ * If the specified name matches the name of the JPA project's
+ * connection profile, return it; otherwise, build a new connection
+ * profile.
+ */
+ private ConnectionProfile checkJpaProjectConnectionProfile(String cpName) {
+ ConnectionProfile cp = this.getJpaProjectConnectionProfile();
+ if ((cp != null) && cp.getName().equals(cpName)) {
+ return cp;
+ }
+ return this.buildConnectionProfile(cpName);
+ }
+
+ private ConnectionProfile buildConnectionProfile(String name) {
+ return JptJpaDbPlugin.getConnectionProfileFactory().buildConnectionProfile(name);
+ }
+
+
+ // ********** listener callbacks **********
+
+ void selectedConnectionChanged() {
+ String text = this.connectionComboBox.getText();
+ if (text.length() == 0) {
+ if (this.selectedConnectionProfile == null) {
+ return; // no change
+ }
+ this.selectedConnectionProfile.removeConnectionListener(this.connectionListener);
+ this.selectedConnectionProfile = null;
+ } else {
+ if (this.selectedConnectionProfile == null) {
+ this.selectedConnectionProfile = this.checkJpaProjectConnectionProfile(text);
+ } else {
+ if (text.equals(this.selectedConnectionProfile.getName())) {
+ return; // no change
+ }
+ this.selectedConnectionProfile.removeConnectionListener(this.connectionListener);
+ this.selectedConnectionProfile = this.checkJpaProjectConnectionProfile(text);
+ }
+ this.selectedConnectionProfile.addConnectionListener(this.connectionListener);
+ }
+ this.fireConnectionProfileChanged(this.selectedConnectionProfile);
+ this.connectionChanged();
+ }
+
+ void selectedSchemaChanged() {
+ Schema old = this.selectedSchema;
+ this.selectedSchema = this.jpaProject.getDefaultDbSchemaContainer().getSchemaNamed(this.schemaComboBox.getText());
+ if (this.selectedSchema != old) {
+ fireSchemaChanged(this.selectedSchema);
+ }
+ }
+
+ /**
+ * Open the DTP New Connection Profile wizard.
+ * If the user creates a new connection profile, start using it and
+ * connect it
+ */
+ void addConnection() {
+ String addedProfileName = DTPUiTools.createNewConnectionProfile();
+ if (addedProfileName == null) {
+ return; // user pressed "Cancel"
+ }
+ if (this.selectedConnectionProfile != null) {
+ this.selectedConnectionProfile.removeConnectionListener(this.connectionListener);
+ }
+ this.selectedConnectionProfile = this.buildConnectionProfile(addedProfileName);
+ this.selectedConnectionProfile.addConnectionListener(this.connectionListener);
+ this.updateConnectionComboBox();
+ this.selectedConnectionProfile.connect();
+ // everything else should be synchronized when we get the resulting open event
+ this.fireConnectionProfileChanged(this.selectedConnectionProfile);
+ this.updateSchemaComboBox();
+ }
+
+ void reconnect() {
+ try {
+ wizardContainer.run(true, true, new IRunnableWithProgress(){
+ public void run( final IProgressMonitor monitor )
+ throws InvocationTargetException, InterruptedException
+ {
+ monitor.beginTask(JptUiEntityGenMessages.connectingToDatabase, 10);
+ final SynchronizedBoolean finished = new SynchronizedBoolean(false);
+ Thread t = new Thread(){
+ @Override
+ public void run() {
+ try {
+ DatabaseGroup.this.selectedConnectionProfile.connect();
+ } catch (Exception ex) {
+ JptJpaUiPlugin.log(ex);
+ } finally {
+ finished.setTrue();
+ }
+ }
+ };
+ t.start();
+ while (finished.isFalse()){
+ Thread.sleep(1000);
+ monitor.worked(1);
+ }
+ // everything should be synchronized when we get the resulting open event
+ monitor.done();
+ }
+ });
+ } catch (Exception e) {
+ JptJpaUiPlugin.log(e);
+ }
+ wizardContainer.updateButtons();
+ }
+
+ /**
+ * called when
+ * - the user selects a new connection
+ * - the connection was opened
+ * - the connection was closed (never happens?)
+ * we need to update the schema stuff and the reconnect link
+ */
+ void connectionChanged() {
+ Schema old = this.selectedSchema;
+ this.selectedSchema = this.getDefaultSchema();
+ if (this.selectedSchema != old) {
+ this.fireSchemaChanged(this.selectedSchema);
+ }
+ this.updateSchemaComboBox();
+ this.updateReconnectLink();
+ }
+
+
+ // ********** listeners **********
+
+ private SelectionListener buildConnectionComboBoxSelectionListener() {
+ return new SelectionListener() {
+ public void widgetDefaultSelected(SelectionEvent event) {
+ // nothing special for "default" (double-click?)
+ this.widgetSelected(event);
+ }
+ public void widgetSelected(SelectionEvent event) {
+ DatabaseGroup.this.selectedConnectionChanged();
+ }
+ @Override
+ public String toString() {
+ return "DatabaseConnectionWizardPage connection combo-box selection listener"; //$NON-NLS-1$
+ }
+ };
+ }
+
+ private SelectionListener buildSchemaComboBoxSelectionListener() {
+ return new SelectionListener() {
+ public void widgetDefaultSelected(SelectionEvent event) {
+ // nothing special for "default" (double-click?)
+ this.widgetSelected(event);
+ }
+ public void widgetSelected(SelectionEvent event) {
+ DatabaseGroup.this.selectedSchemaChanged();
+ }
+ @Override
+ public String toString() {
+ return "DatabaseConnectionWizardPage schema combo-box selection listener"; //$NON-NLS-1$
+ }
+ };
+ }
+
+ private SelectionListener buildAddConnectionLinkSelectionListener() {
+ return new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent event) {
+ DatabaseGroup.this.addConnection();
+ }
+ @Override
+ public String toString() {
+ return "DatabaseConnectionWizardPage add connection link selection listener"; //$NON-NLS-1$
+ }
+ };
+ }
+
+ private SelectionListener buildReconnectLinkSelectionListener() {
+ return new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent event) {
+ DatabaseGroup.this.reconnect();
+ }
+ @Override
+ public String toString() {
+ return "DatabaseConnectionWizardPage reconnect link selection listener"; //$NON-NLS-1$
+ }
+ };
+ }
+
+ private ConnectionListener buildConnectionListener() {
+ return new ConnectionAdapter() {
+ @Override
+ public void opened(ConnectionProfile cp) {
+ this.connectionChanged();
+ }
+ @Override // this probably won't ever get called...
+ public void closed(ConnectionProfile cp) {
+ this.connectionChanged();
+ }
+ private void connectionChanged() {
+ Display.getDefault().asyncExec(
+ new Runnable() {
+ public void run() {
+ DatabaseGroup.this.connectionChanged();
+ }
+ }
+ );
+ }
+ @Override
+ public String toString() {
+ return "DatabaseConnectionWizardPage connection listener"; //$NON-NLS-1$
+ }
+ };
+ }
+
+
+ // ********** listeners **********
+
+ public void addListener(Listener listener) {
+ if ( ! this.listeners.add(listener)) {
+ throw new IllegalArgumentException("duplicate listener: " + listener); //$NON-NLS-1$
+ }
+ }
+
+ public void removeListener(Listener listener) {
+ if ( ! this.listeners.remove(listener)) {
+ throw new IllegalArgumentException("missing listener: " + listener); //$NON-NLS-1$
+ }
+ }
+
+ private Iterator<Listener> listeners() {
+ return new CloneIterator<Listener>(this.listeners);
+ }
+
+ void fireConnectionProfileChanged(ConnectionProfile connectionProfile) {
+ for (Iterator<Listener> stream = this.listeners(); stream.hasNext(); ) {
+ stream.next().selectedConnectionProfileChanged(connectionProfile);
+ }
+ }
+
+ void fireSchemaChanged(Schema schema) {
+ for (Iterator<Listener> stream = this.listeners(); stream.hasNext(); ) {
+ stream.next().selectedSchemaChanged(schema);
+ }
+ }
+
+ // ********** UI components **********
+
+ /**
+ * build and return a label
+ */
+ private Label buildLabel(Composite parent, int span, String text) {
+ Label label = new Label(parent, SWT.NONE);
+ label.setText(text);
+ GridData gd = new GridData();
+ gd.horizontalSpan = span;
+ label.setLayoutData(gd);
+ return label;
+ }
+
+ /**
+ * build and return a combo-box
+ */
+ private Combo buildComboBox(Composite parent, int widthHint, SelectionListener listener) {
+ Combo combo = new Combo(parent, SWT.BORDER | SWT.READ_ONLY);
+ combo.addSelectionListener(listener);
+ GridData data = new GridData(SWT.FILL, SWT.CENTER, true, false);
+ //data.grabExcessHorizontalSpace = true ;
+ data.widthHint = widthHint;
+ combo.setLayoutData(data);
+ return combo;
+ }
+
+ /**
+ * build and return a link
+ */
+ private Button buildButton(Composite parent, String toolTipText, Image image, SelectionListener listener) {
+ Button button = new Button(parent, SWT.NONE);
+ GridData data = new GridData(GridData.END, GridData.CENTER, false, false);
+ data.horizontalSpan = 1;
+ button.setLayoutData(data);
+ button.setImage( image );
+ button.setToolTipText( toolTipText);
+ button.addSelectionListener(listener);
+ return button;
+ }
+
+ // ********** listener interface **********
+
+ /**
+ * Allows clients to listen for changes to the selected connection profile
+ * and schema.
+ */
+ public interface Listener extends EventListener
+ {
+ void selectedConnectionProfileChanged(ConnectionProfile connectionProfile);
+ void selectedSchemaChanged(Schema schema);
+ }
+
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/gen/DefaultTableGenerationWizardPage.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/gen/DefaultTableGenerationWizardPage.java
new file mode 100644
index 0000000000..65d529b782
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/gen/DefaultTableGenerationWizardPage.java
@@ -0,0 +1,327 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2010 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.ui.internal.wizards.gen;
+
+import java.util.List;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jdt.core.IJavaElement;
+import org.eclipse.jdt.core.IJavaModel;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.IPackageFragment;
+import org.eclipse.jdt.core.IPackageFragmentRoot;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.jdt.internal.ui.wizards.NewWizardMessages;
+import org.eclipse.jdt.internal.ui.wizards.TypedElementSelectionValidator;
+import org.eclipse.jdt.internal.ui.wizards.TypedViewerFilter;
+import org.eclipse.jdt.ui.JavaElementComparator;
+import org.eclipse.jdt.ui.JavaElementLabelProvider;
+import org.eclipse.jdt.ui.StandardJavaElementContentProvider;
+import org.eclipse.jdt.ui.wizards.NewTypeWizardPage;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerFilter;
+import org.eclipse.jface.window.Window;
+import org.eclipse.jpt.common.core.internal.utility.jdt.JDTTools;
+import org.eclipse.jpt.jpa.core.JpaProject;
+import org.eclipse.jpt.jpa.gen.internal.ORMGenCustomizer;
+import org.eclipse.jpt.jpa.gen.internal.ORMGenTable;
+import org.eclipse.jpt.jpa.ui.JptJpaUiPlugin;
+import org.eclipse.jpt.jpa.ui.internal.JpaHelpContextIds;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.dialogs.ElementTreeSelectionDialog;
+import org.eclipse.ui.help.IWorkbenchHelpSystem;
+
+/**
+ * A wizard page allowing the entry of the default table generation
+ * properties (Java classes package, base class, etc).
+ * These properties apply to all tables unless explicitly overridden (in the table generation page).
+ *
+ * @author Danny Ju
+ */
+@SuppressWarnings("restriction")
+public class DefaultTableGenerationWizardPage extends NewTypeWizardPage {
+
+ private JpaProject jpaProject;
+
+ /*the instance used to get/set the default properties.*/
+ private ORMGenTable defaultsTable;
+
+ private ORMGenCustomizer customizer;
+
+ private TableGenPanel defaultTableGenPanel ;
+
+ protected DefaultTableGenerationWizardPage(JpaProject jpaProject) {
+ super(true, "DefaultTableGenerationWizardPage"); //$NON-NLS-1$
+ this.jpaProject = jpaProject;
+ setTitle(JptUiEntityGenMessages.GenerateEntitiesWizard_defaultTablePage_title);
+ setDescription( JptUiEntityGenMessages.GenerateEntitiesWizard_defaultTablePage_desc);
+ }
+
+
+ // -------- Initialization ---------
+ /**
+ * The wizard owning this page is responsible for calling this method with the
+ * current selection. The selection is used to initialize the fields of the wizard
+ * page.
+ *
+ * @param selection used to initialize the fields
+ */
+ void init(IStructuredSelection selection) {
+ IJavaElement jelem = null;
+ if ( selection!=null && selection.getFirstElement() instanceof IJavaElement ) {
+ jelem = (IJavaElement) selection.getFirstElement();
+ }else{
+ jelem = this.jpaProject.getJavaProject();
+ }
+ if( jelem !=null ){
+ initContainerPage(jelem);
+ initTypePage(jelem);
+ }
+
+ }
+
+ public void createControl(Composite parent) {
+ initializeDialogUnits(parent);
+ Composite composite = new Composite(parent, SWT.NULL);
+ int nColumns= 4 ;
+ GridLayout layout = new GridLayout();
+ layout.numColumns = nColumns;
+ composite.setLayout(layout);
+ this.getHelpSystem().setHelp(composite, JpaHelpContextIds.GENERATE_ENTITIES_WIZARD_CUSTOMIZE_DEFAULT_ENTITY_GENERATION);
+
+ //Create entity access, collection type, etc
+ defaultTableGenPanel = new TableGenPanel(composite, 4, true, this);
+
+ createDomainJavaClassesPropertiesGroup(composite, 4);
+ setControl(composite);
+
+
+ this.setPageComplete( true );
+ }
+
+ @Override
+ public void setVisible(boolean visible) {
+ super.setVisible(visible);
+ if (visible) {
+ ORMGenCustomizer customizer = getCustomizer();
+ //If user changed the connection or schema
+ if ( this.customizer != customizer ) {
+ this.customizer = customizer;
+ defaultsTable=customizer.createGenTable(null);
+ defaultTableGenPanel.setORMGenTable(defaultsTable);
+ //set the super class and implemented interfaces value
+ String baseClass = defaultsTable.getExtends() == null ?"" : defaultsTable.getExtends();
+ setSuperClass(baseClass, true);
+ setSuperInterfaces(defaultsTable.getImplements(), true);
+ IPackageFragmentRoot root = getSourceFolder( defaultsTable.getSourceFolder());
+ String initPackageName = this.getPackageText();
+ if( initPackageName.length()==0 ){
+ setPackageName( root, defaultsTable.getPackage() );
+ }
+ setPackageFragmentRoot(root, true/*canBeModified*/);
+ }
+ }
+ }
+
+ //search for the source folder with the given name or return the first
+ //source folder if not found.
+ private IPackageFragmentRoot getSourceFolder(String srcFolder) {
+ IPackageFragmentRoot packageFragmentRoot = null;
+ srcFolder = '/' + srcFolder;
+ IJavaProject javaProject = this.jpaProject.getJavaProject();
+
+ for (IPackageFragmentRoot root : JDTTools.getJavaSourceFolders(javaProject)) {
+ //Save the first source root in case we don't find one that matches the saved value
+ if (packageFragmentRoot == null) {
+ packageFragmentRoot = root;
+ }
+ //check for alternative source root that matches the saved value
+ if (root.getPath().toString().equals(srcFolder)){
+ packageFragmentRoot = root;
+ break;
+ }
+ }
+ return packageFragmentRoot;
+ }
+
+ private void setPackageName(IPackageFragmentRoot packageFragmentRoot, String packageName) {
+ if( packageName == null || packageName.length() == 0 || packageFragmentRoot==null) {
+ return;
+ }
+ IPackageFragment packageFragment = packageFragmentRoot.getPackageFragment(packageName);
+ setPackageFragment(packageFragment, true/*canBeModified*/);
+ }
+
+
+ protected void createDomainJavaClassesPropertiesGroup(Composite composite, int columns) {
+ Group parent = new Group( composite, SWT.NONE);
+ parent.setText( JptUiEntityGenMessages.GenerateEntitiesWizard_defaultTablePage_domainJavaClass);
+ parent.setLayout(new GridLayout( columns, false));
+ GridData layoutData = new GridData();
+ layoutData.horizontalSpan = columns;
+ layoutData.verticalAlignment = SWT.FILL;
+ layoutData.horizontalAlignment = SWT.FILL;
+ layoutData.grabExcessHorizontalSpace = true;
+ layoutData.grabExcessVerticalSpace = true;
+ parent.setLayoutData(layoutData);
+
+ //default Java package name only available for default table generation
+ createContainerControls(parent, columns);
+ createPackageControls(parent, columns);
+ createSuperClassControls(parent, columns);
+ createSuperInterfacesControls(parent, columns);
+ }
+
+ @Override
+ protected IStatus packageChanged() {
+ IStatus status = super.packageChanged();
+ IPackageFragment packageFragment = getPackageFragment();
+ //String srcFolder = packageFragment.getPath().toPortableString();
+ if (defaultsTable != null && !status.matches(IStatus.ERROR)) {
+ defaultsTable.setPackage(packageFragment.getElementName());
+ }
+ return status;
+ }
+
+ @Override
+ protected IStatus superClassChanged() {
+ IStatus status = super.superClassChanged();
+ String baseClass = getSuperClass();
+ if (baseClass != null && defaultsTable != null && !status.matches(IStatus.ERROR)) {
+ String oldBaseClass = defaultsTable.getExtends();
+ if ( !baseClass.equals(oldBaseClass)) {
+ defaultsTable.setExtends(baseClass);
+ }
+ }
+ return status;
+ }
+ @Override
+ protected IStatus containerChanged() {
+ IStatus status = super.containerChanged();
+ String srcFolder = getPackageFragmentRootText();
+ if( !status.matches(IStatus.ERROR) ){
+ if (defaultsTable != null ) {
+ defaultsTable.setSourceFolder( srcFolder );
+ }
+ }
+ return status;
+ }
+
+ /** Override to allow select source folder in current project only
+ * @see org.eclipse.jdt.ui.wizards.NewContainerWizardPage#chooseContainer()
+ */
+ @Override
+ protected IPackageFragmentRoot chooseContainer() {
+ Class<?>[] acceptedClasses = new Class[] { IPackageFragmentRoot.class, IJavaProject.class };
+ TypedElementSelectionValidator validator= new TypedElementSelectionValidator(acceptedClasses, false) {
+ @Override
+ public boolean isSelectedValid(Object element) {
+ try {
+ if (element instanceof IJavaProject) {
+ IJavaProject jproject= (IJavaProject)element;
+ IPath path= jproject.getProject().getFullPath();
+ return (jproject.findPackageFragmentRoot(path) != null);
+ } else if (element instanceof IPackageFragmentRoot) {
+ return JDTTools.packageFragmentRootIsSourceFolder((IPackageFragmentRoot) element);
+ }
+ return true;
+ } catch (JavaModelException e) {
+ JptJpaUiPlugin.log(e); // just log, no UI in validation
+ }
+ return false;
+ }
+ };
+
+ acceptedClasses= new Class[] { IJavaModel.class, IPackageFragmentRoot.class, IJavaProject.class };
+ ViewerFilter filter= new TypedViewerFilter(acceptedClasses) {
+ @Override
+ public boolean select(Viewer viewer, Object parent, Object element) {
+ if (element instanceof IPackageFragmentRoot) {
+ return JDTTools.packageFragmentRootIsSourceFolder((IPackageFragmentRoot) element);
+ }
+ return super.select(viewer, parent, element);
+ }
+ };
+
+ StandardJavaElementContentProvider provider= new StandardJavaElementContentProvider();
+ ILabelProvider labelProvider= new JavaElementLabelProvider(JavaElementLabelProvider.SHOW_DEFAULT);
+ ElementTreeSelectionDialog dialog= new ElementTreeSelectionDialog(getShell(), labelProvider, provider);
+ dialog.setValidator(validator);
+ dialog.setComparator(new JavaElementComparator());
+ dialog.setTitle(NewWizardMessages.NewContainerWizardPage_ChooseSourceContainerDialog_title);
+ dialog.setMessage(NewWizardMessages.NewContainerWizardPage_ChooseSourceContainerDialog_description);
+ dialog.addFilter(filter);
+ dialog.setInput(jpaProject.getJavaProject());
+ dialog.setInitialSelection(getPackageFragmentRoot());
+ dialog.setHelpAvailable(false);
+
+ if (dialog.open() == Window.OK) {
+ Object element= dialog.getFirstResult();
+ if (element instanceof IJavaProject) {
+ IJavaProject jproject= (IJavaProject)element;
+ return jproject.getPackageFragmentRoot(jproject.getProject());
+ } else if (element instanceof IPackageFragmentRoot) {
+ return (IPackageFragmentRoot)element;
+ }
+ return null;
+ }
+ return null;
+ }
+
+ @Override
+ protected void handleFieldChanged(String fieldName) {
+ super.handleFieldChanged(fieldName);
+ if (this.fContainerStatus.matches(IStatus.ERROR)) {
+ updateStatus(fContainerStatus);
+ }else if( ! this.fPackageStatus.matches(IStatus.OK) ) {
+ updateStatus(fPackageStatus);
+ } else if (this.fSuperClassStatus.matches(IStatus.ERROR)) {
+ updateStatus(fSuperClassStatus);
+ } else {
+ updateStatus(Status.OK_STATUS);
+ }
+ }
+
+ @Override
+ @SuppressWarnings({ "unchecked", "rawtypes" })
+ protected IStatus superInterfacesChanged() {
+ IStatus ret = super.superInterfacesChanged();
+ if ( ret.isOK() ) {
+ List interfaces = getSuperInterfaces();
+ if(defaultsTable!=null)
+ defaultsTable.setImplements(interfaces);
+ }
+ return ret;
+ }
+
+ private ORMGenCustomizer getCustomizer() {
+ GenerateEntitiesFromSchemaWizard wizard = (GenerateEntitiesFromSchemaWizard) this.getWizard();
+ return wizard.getCustomizer();
+ }
+
+ @Override
+ public final void performHelp() {
+ this.getHelpSystem().displayHelp( GenerateEntitiesFromSchemaWizard.HELP_CONTEXT_ID );
+ }
+
+ protected final IWorkbenchHelpSystem getHelpSystem() {
+ return PlatformUI.getWorkbench().getHelpSystem();
+ }
+}
+
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/gen/GenerateEntitiesFromSchemaWizard.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/gen/GenerateEntitiesFromSchemaWizard.java
new file mode 100644
index 0000000000..f74dcfb7f1
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/gen/GenerateEntitiesFromSchemaWizard.java
@@ -0,0 +1,541 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2010 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.ui.internal.wizards.gen;
+
+import java.io.File;
+import java.io.IOException;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IResourceRuleFactory;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.resources.WorkspaceJob;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.preferences.IEclipsePreferences;
+import org.eclipse.core.runtime.preferences.InstanceScope;
+import org.eclipse.jdt.core.IPackageFragment;
+import org.eclipse.jdt.core.IPackageFragmentRoot;
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.jface.resource.LocalResourceManager;
+import org.eclipse.jface.resource.ResourceManager;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.window.Window;
+import org.eclipse.jface.wizard.IWizardPage;
+import org.eclipse.jface.wizard.Wizard;
+import org.eclipse.jpt.common.core.internal.utility.jdt.JDTTools;
+import org.eclipse.jpt.jpa.core.EntityGeneratorDatabaseAnnotationNameBuilder;
+import org.eclipse.jpt.jpa.core.JpaPlatform;
+import org.eclipse.jpt.jpa.core.JpaProject;
+import org.eclipse.jpt.jpa.core.JptJpaCorePlugin;
+import org.eclipse.jpt.jpa.db.Column;
+import org.eclipse.jpt.jpa.db.ConnectionProfile;
+import org.eclipse.jpt.jpa.db.ForeignKey;
+import org.eclipse.jpt.jpa.db.Schema;
+import org.eclipse.jpt.jpa.db.Table;
+import org.eclipse.jpt.jpa.gen.internal.BaseEntityGenCustomizer;
+import org.eclipse.jpt.jpa.gen.internal.DatabaseAnnotationNameBuilder;
+import org.eclipse.jpt.jpa.gen.internal.ORMGenCustomizer;
+import org.eclipse.jpt.jpa.gen.internal.ORMGenTable;
+import org.eclipse.jpt.jpa.gen.internal.PackageGenerator;
+import org.eclipse.jpt.jpa.ui.JptJpaUiPlugin;
+import org.eclipse.jpt.jpa.ui.internal.JptUiIcons;
+import org.eclipse.jpt.jpa.ui.internal.JptUiMessages;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.INewWizard;
+import org.eclipse.ui.IWorkbench;
+
+public class GenerateEntitiesFromSchemaWizard extends Wizard
+ implements INewWizard {
+
+ public static final String HELP_CONTEXT_ID = JptJpaUiPlugin.PLUGIN_ID + ".GenerateEntitiesFromSchemaWizard"; //$NON-NLS-1$
+
+ private static final String DONT_SHOW_OVERWRITE_WARNING_DIALOG = "DONT_SHOW_OVERWRITE_WARNING_DIALOG"; //$NON-NLS-1$
+
+ private JpaProject jpaProject;
+
+ private IStructuredSelection selection;
+
+ private ORMGenCustomizer customizer = null;
+
+ private PromptJPAProjectWizardPage projectPage;
+
+ private TablesSelectorWizardPage tablesSelectorPage;
+
+ private TableAssociationsWizardPage tableAssociationsPage;
+
+ private DefaultTableGenerationWizardPage defaultTableGenerationPage;
+
+ private TablesAndColumnsCustomizationWizardPage tablesAndColumnsCustomizationPage;
+
+ protected final ResourceManager resourceManager;
+
+ public GenerateEntitiesFromSchemaWizard() {
+ this.resourceManager = new LocalResourceManager(JFaceResources.getResources());
+ this.setWindowTitle( JptUiEntityGenMessages.GenerateEntitiesWizard_generateEntities);
+ }
+
+ public GenerateEntitiesFromSchemaWizard( JpaProject jpaProject, IStructuredSelection selection) {
+ super();
+ this.jpaProject = jpaProject;
+ this.selection = selection;
+ this.resourceManager = new LocalResourceManager(JFaceResources.getResources());
+ this.setWindowTitle( JptUiEntityGenMessages.GenerateEntitiesWizard_generateEntities);
+ this.setDefaultPageImageDescriptor(JptJpaUiPlugin.getImageDescriptor(JptUiIcons.ENTITY_WIZ_BANNER));
+ }
+
+ @Override
+ public void addPages() {
+ setForcePreviousAndNextButtons(true);
+
+ //If this.jpaProject is not initialized because user didn't select a JPA project
+ if( this.jpaProject == null ){
+ this.projectPage = new PromptJPAProjectWizardPage(HELP_CONTEXT_ID);
+ this.addPage(this.projectPage);
+ return;
+ }
+ addMainPages();
+ }
+
+ private void addMainPages() {
+ this.tablesSelectorPage = new TablesSelectorWizardPage(this.jpaProject, this.resourceManager);
+ this.addPage(this.tablesSelectorPage);
+
+ this.tableAssociationsPage = new TableAssociationsWizardPage(this.jpaProject, this.resourceManager);
+ this.addPage(this.tableAssociationsPage);
+
+ this.defaultTableGenerationPage = new DefaultTableGenerationWizardPage(this.jpaProject);
+ this.addPage(this.defaultTableGenerationPage);
+ this.defaultTableGenerationPage.init(this.selection);
+
+ this.tablesAndColumnsCustomizationPage = new TablesAndColumnsCustomizationWizardPage(this.jpaProject, this.resourceManager);
+ this.addPage(this.tablesAndColumnsCustomizationPage);
+ this.tablesAndColumnsCustomizationPage.init(this.selection);
+ }
+
+ public ORMGenCustomizer getORMGenCustomizer(){
+ return this.customizer;
+ }
+
+ /**
+ * Create the ORMGenCustomizer when user selects a new connection profile and schema
+ *
+ * JpaPlatform implementor can provide a custom ORMGenCustomizer specific to a platform
+ * with AdapterFactory through Eclipse org.eclipse.core.runtime.adapters extension point:
+ * <pre>
+ *
+ *<extension
+ * point="org.eclipse.core.runtime.adapters">
+ * <factory
+ * adaptableType="org.eclipse.jpt.jpa.eclipselink.core.internal.EclipseLinkPlatform"
+ * class="oracle.eclipse.tools.orm.internal.EclipseLinkORMGenCustomizerAdapterFactory">
+ * <adapter
+ * type="oracle.eclipse.tools.orm.internal.ORMGenCustomizer">
+ * </adapter>
+ * </factory>
+ *</extension>
+ *</pre>
+ *
+ * @param schema
+ */
+ public ORMGenCustomizer createORMGenCustomizer(Schema schema){
+ JpaPlatform jpaPlatform = this.jpaProject.getJpaPlatform();
+ Object obj = Platform.getAdapterManager().getAdapter( jpaPlatform, ORMGenCustomizer.class );
+ if (obj != null && obj instanceof ORMGenCustomizer) {
+ this.customizer = (ORMGenCustomizer) obj;
+ this.customizer.init(getCustomizationFile(), schema);
+ } else{
+ this.customizer = new BaseEntityGenCustomizer( );
+ this.customizer.init(getCustomizationFile(), schema);
+ }
+
+ ORMGenTable newDefaultTable = getCustomizer().createGenTable(null);
+ if ( selection!=null && selection.getFirstElement() instanceof IPackageFragment ) {
+ IPackageFragment packageFrag = (IPackageFragment)selection.getFirstElement();
+ newDefaultTable.setPackage( packageFrag.getElementName() );
+ for (IPackageFragmentRoot root : JDTTools.getJavaSourceFolders(this.jpaProject.getJavaProject())) {
+ String srcFolder = root.getPath().toPortableString();
+ if( packageFrag.getPath().toPortableString().startsWith( srcFolder +'/' )){
+ newDefaultTable.setSourceFolder(srcFolder.substring(1));
+ }
+ }
+ }
+ return this.customizer;
+ }
+
+ protected String getCustomizationFileName() {
+ ConnectionProfile profile = getProjectConnectionProfile();
+ String connection = profile == null ? "" : profile.getName();
+ String name = "org.eclipse.jpt.entitygen." + (connection == null ? "" :connection.replace(' ', '-')); //$NON-NLS-1$
+ Schema schema = getDefaultSchema();
+ if ( schema!= null ) {
+ name += "." + schema.getName();//$NON-NLS-1$
+ }
+ return name.toLowerCase();
+ }
+
+ /**
+ * Returns the nodes state file.
+ */
+ private File getCustomizationFile() {
+ String projectPath = this.jpaProject.getProject().getLocation().toPortableString();
+ File genDir = new File(projectPath + "/.settings");//$NON-NLS-1$
+ genDir.mkdirs();
+ return new File(genDir, getCustomizationFileName());
+ }
+
+ @Override
+ public boolean performFinish() {
+ if (this.jpaProject == null) {
+ return true;
+ }
+ try {
+ this.customizer.setDatabaseAnnotationNameBuilder( buildDatabaseAnnotationNameBuilder() );
+ this.customizer.save();
+ } catch (IOException e) {
+ JptJpaUiPlugin.log(e);
+ }
+ OverwriteConfirmer overwriteConfirmer = null;
+ if (showOverwriteWarning()) {
+ overwriteConfirmer = new OverwriteConfirmer();
+ }
+
+ WorkspaceJob genEntitiesJob = new GenerateEntitiesJob(this.jpaProject, getCustomizer(), overwriteConfirmer);
+ genEntitiesJob.schedule();
+ return true;
+ }
+
+ // ********** generate entities job **********
+
+ static class GenerateEntitiesJob extends WorkspaceJob {
+ final JpaProject jpaProject;
+ final ORMGenCustomizer customizer;
+ final OverwriteConfirmer confirmer;
+ GenerateEntitiesJob(JpaProject jpaProject, ORMGenCustomizer customizer, OverwriteConfirmer confirmer) {
+ super(JptUiMessages.EntitiesGenerator_jobName);
+ this.customizer = customizer;
+ this.jpaProject = jpaProject;
+ this.confirmer = confirmer;
+ IResourceRuleFactory ruleFactory = ResourcesPlugin.getWorkspace().getRuleFactory();
+ this.setRule(ruleFactory.modifyRule(jpaProject.getProject()));
+ }
+
+ @Override
+ public IStatus runInWorkspace(IProgressMonitor monitor) throws CoreException {
+ PackageGenerator.generate(this.jpaProject,this.customizer, this.confirmer, monitor);
+ return Status.OK_STATUS;
+ }
+ }
+
+ public static boolean showOverwriteWarning(){
+ IEclipsePreferences pref = new InstanceScope().getNode(JptJpaUiPlugin.PLUGIN_ID);
+ boolean ret = ! pref.getBoolean( DONT_SHOW_OVERWRITE_WARNING_DIALOG, false) ;
+ return ret;
+ }
+
+ // ********** overwrite confirmer **********
+
+ static class OverwriteConfirmer implements org.eclipse.jpt.jpa.gen.internal.OverwriteConfirmer {
+ private boolean overwriteAll = false;
+ private boolean skipAll = false;
+
+ OverwriteConfirmer() {
+ }
+
+ public boolean overwrite(final String className) {
+ if (this.overwriteAll) {
+ return true;
+ }
+ if (this.skipAll) {
+ return false;
+ }
+ return this.promptUser(className);
+ }
+
+ private boolean promptUser(final String className) {
+ // get on the UI thread synchronously, need feedback before continuing
+ final boolean ret[]=new boolean[1];
+ Display.getDefault().syncExec(new Runnable() {
+ public void run() {
+ final OverwriteConfirmerDialog dialog = new OverwriteConfirmerDialog(Display.getCurrent().getActiveShell(), className);
+ dialog.open();
+ if (dialog.getReturnCode() == Window.CANCEL) {
+ //throw new OperationCanceledException();
+ skipAll = true;
+ ret[0] = false;
+ return;
+ }
+ if (dialog.yes()) {
+ ret[0] = true;
+ }
+ if (dialog.yesToAll()) {
+ overwriteAll = true;
+ ret[0] = true;
+ }
+ if (dialog.no()) {
+ ret[0] = false;
+ }
+ if (dialog.noToAll()) {
+ skipAll = true;
+ ret[0] = false;
+ }
+ }
+ });
+ return ret[0];
+ }
+
+ }
+
+
+ // ********** overwrite dialog **********
+
+ static class OverwriteConfirmerDialog extends Dialog {
+ private final String className;
+ private boolean yes = false;
+ private boolean yesToAll = false;
+ private boolean no = false;
+ private boolean noToAll = false;
+
+ OverwriteConfirmerDialog(Shell parent, String className) {
+ super(parent);
+ this.className = className;
+ }
+
+ @Override
+ protected void configureShell(Shell shell) {
+ super.configureShell(shell);
+ shell.setText(JptUiMessages.OverwriteConfirmerDialog_title);
+ }
+
+ @Override
+ protected Control createDialogArea(Composite parent) {
+ Composite composite = (Composite) super.createDialogArea(parent);
+ GridLayout gridLayout = (GridLayout) composite.getLayout();
+ gridLayout.numColumns = 1;
+
+ Label text = new Label(composite, SWT.LEFT);
+ text.setText(NLS.bind(JptUiMessages.OverwriteConfirmerDialog_text, this.className));
+ text.setLayoutData(new GridData());
+
+ createDontShowControl(composite);
+
+ return composite;
+ }
+
+ protected Control createDontShowControl(Composite composite) {
+ final Button checkbox = new Button( composite, SWT.CHECK );
+ checkbox.setText( JptUiEntityGenMessages.GenerateEntitiesWizard_doNotShowWarning );
+ checkbox.setSelection(false);
+ final IEclipsePreferences pref = new InstanceScope().getNode( JptJpaUiPlugin.PLUGIN_ID);
+ checkbox.setLayoutData( new GridData(GridData.FILL_BOTH) );
+ checkbox.addSelectionListener(new SelectionListener (){
+ public void widgetDefaultSelected(SelectionEvent e) {}
+ public void widgetSelected(SelectionEvent e) {
+ boolean b = checkbox.getSelection();
+ pref.putBoolean( DONT_SHOW_OVERWRITE_WARNING_DIALOG, b);
+ }
+ });
+ return checkbox;
+ }
+
+ @Override
+ protected void createButtonsForButtonBar(Composite parent) {
+ this.createButton(parent, IDialogConstants.YES_ID, IDialogConstants.YES_LABEL, false);
+ this.createButton(parent, IDialogConstants.YES_TO_ALL_ID, IDialogConstants.YES_TO_ALL_LABEL, false);
+ this.createButton(parent, IDialogConstants.NO_ID, IDialogConstants.NO_LABEL, true);
+ this.createButton(parent, IDialogConstants.NO_TO_ALL_ID, IDialogConstants.NO_TO_ALL_LABEL, false);
+ this.createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false);
+ }
+
+ @Override
+ protected void buttonPressed(int buttonId) {
+ switch (buttonId) {
+ case IDialogConstants.YES_ID :
+ this.yesPressed();
+ break;
+ case IDialogConstants.YES_TO_ALL_ID :
+ this.yesToAllPressed();
+ break;
+ case IDialogConstants.NO_ID :
+ this.noPressed();
+ break;
+ case IDialogConstants.NO_TO_ALL_ID :
+ this.noToAllPressed();
+ break;
+ case IDialogConstants.CANCEL_ID :
+ this.cancelPressed();
+ break;
+ default :
+ break;
+ }
+ }
+
+ private void yesPressed() {
+ this.yes = true;
+ this.setReturnCode(OK);
+ this.close();
+ }
+
+ private void yesToAllPressed() {
+ this.yesToAll = true;
+ this.setReturnCode(OK);
+ this.close();
+ }
+
+ private void noPressed() {
+ this.no = true;
+ this.setReturnCode(OK);
+ this.close();
+ }
+
+ private void noToAllPressed() {
+ this.noToAll = true;
+ this.setReturnCode(OK);
+ this.close();
+ }
+
+ boolean yes() {
+ return this.yes;
+ }
+
+ boolean yesToAll() {
+ return this.yesToAll;
+ }
+
+ boolean no() {
+ return this.no;
+ }
+
+ boolean noToAll() {
+ return this.noToAll;
+ }
+ }
+
+
+ private DatabaseAnnotationNameBuilder buildDatabaseAnnotationNameBuilder() {
+ return new LocalDatabaseAnnotationNameBuilder(this.jpaProject.getJpaPlatform().getEntityGeneratorDatabaseAnnotationNameBuilder());
+ }
+
+ // ********** name builder adapter **********
+
+ /**
+ * adapt the JPA platform-supplied builder to the builder interface
+ * expected by the entity generator
+ */
+ static class LocalDatabaseAnnotationNameBuilder implements DatabaseAnnotationNameBuilder {
+ private EntityGeneratorDatabaseAnnotationNameBuilder builder;
+ LocalDatabaseAnnotationNameBuilder(EntityGeneratorDatabaseAnnotationNameBuilder builder) {
+ super();
+ this.builder = builder;
+ }
+ public String buildTableAnnotationName(String entityName, Table table) {
+ return this.builder.buildTableAnnotationName(entityName, table);
+ }
+ public String buildColumnAnnotationName(String attributeName, Column column) {
+ return this.builder.buildColumnAnnotationName(attributeName, column);
+ }
+ public String buildJoinColumnAnnotationName(String attributeName, ForeignKey foreignKey) {
+ return this.builder.buildJoinColumnAnnotationName(attributeName, foreignKey);
+ }
+ public String buildJoinColumnAnnotationName(Column column) {
+ return this.builder.buildJoinColumnAnnotationName(column);
+ }
+ public String buildJoinTableAnnotationName(Table table) {
+ return this.builder.buildJoinTableAnnotationName(table);
+ }
+ }
+
+ @Override
+ public IWizardPage getStartingPage() {
+ if (this.projectPage != null) {
+ if (this.tablesSelectorPage != null) {
+ return this.tablesSelectorPage;
+ }
+ return this.projectPage;
+ }
+ return super.getStartingPage();
+ }
+
+ public ORMGenCustomizer getCustomizer (){
+ return customizer;
+ }
+// Collection<Table> getPossibleTables() {
+// if ( this.tablesSelectorPage != null) {
+// return this.tablesSelectorPage.getTables();
+// }
+// return ( this.projectDefaultSchemaExists()) ? CollectionTools.collection( this.getDefaultSchema().tables()) : Collections.<Table>emptyList();
+// }
+
+ public ConnectionProfile getProjectConnectionProfile() {
+ return this.jpaProject.getConnectionProfile();
+ }
+
+ public JpaProject getJpaProject(){
+ return this.jpaProject;
+ }
+
+ public void setJpaProject(JpaProject jpaProject) {
+ if (this.jpaProject == null) {
+ this.jpaProject = jpaProject;
+ IWizardPage currentPage = getContainer().getCurrentPage();
+ if (this.projectPage != null && currentPage.equals(this.projectPage)) {
+ addMainPages();
+ }
+ }
+ }
+
+ public Schema getDefaultSchema() {
+ return getJpaProject().getDefaultDbSchema();
+ }
+
+ public void init(IWorkbench workbench, IStructuredSelection selection) {
+ Object sel = selection.getFirstElement();
+ if ( sel instanceof IResource ) {
+ IProject proj = ((IResource) sel).getProject();
+ JpaProject jpaProj = JptJpaCorePlugin.getJpaProject(proj);
+ this.jpaProject = jpaProj;
+ } else if( sel instanceof org.eclipse.jdt.core.IPackageFragmentRoot ) {
+ org.eclipse.jdt.core.IPackageFragmentRoot root = (org.eclipse.jdt.core.IPackageFragmentRoot) sel;
+ IProject proj = root.getJavaProject().getProject();
+ JpaProject jpaProj = JptJpaCorePlugin.getJpaProject(proj);
+ this.jpaProject = jpaProj;
+ } else if( sel instanceof org.eclipse.jdt.core.IPackageFragment) {
+ org.eclipse.jdt.core.IPackageFragment frag = (org.eclipse.jdt.core.IPackageFragment) sel;
+ IProject proj = frag.getJavaProject().getProject();
+ JpaProject jpaProj = JptJpaCorePlugin.getJpaProject(proj);
+ this.jpaProject = jpaProj;
+ }
+
+ this.selection = selection;
+ this.setWindowTitle(JptUiEntityGenMessages.GenerateEntitiesWizard_generateEntities);
+ }
+
+ @Override
+ public void dispose() {
+ this.resourceManager.dispose();
+ super.dispose();
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/gen/JoinColumnsPage.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/gen/JoinColumnsPage.java
new file mode 100644
index 0000000000..4bde36bf71
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/gen/JoinColumnsPage.java
@@ -0,0 +1,629 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2010 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.ui.internal.wizards.gen;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.TreeMap;
+
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.jface.dialogs.IPageChangedListener;
+import org.eclipse.jface.dialogs.PageChangedEvent;
+import org.eclipse.jface.viewers.ColumnWeightData;
+import org.eclipse.jface.viewers.ComboBoxCellEditor;
+import org.eclipse.jface.viewers.IBaseLabelProvider;
+import org.eclipse.jface.viewers.ICellModifier;
+import org.eclipse.jface.viewers.IContentProvider;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.IStructuredContentProvider;
+import org.eclipse.jface.viewers.ITableLabelProvider;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerSorter;
+import org.eclipse.jface.wizard.WizardDialog;
+import org.eclipse.jpt.common.ui.internal.util.SWTUtil;
+import org.eclipse.jpt.common.ui.internal.util.TableLayoutComposite;
+import org.eclipse.jpt.jpa.db.Column;
+import org.eclipse.jpt.jpa.db.Schema;
+import org.eclipse.jpt.jpa.db.Table;
+import org.eclipse.jpt.jpa.gen.internal.Association;
+import org.eclipse.jpt.jpa.gen.internal.ORMGenCustomizer;
+import org.eclipse.jpt.jpa.ui.internal.JpaHelpContextIds;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.TableColumn;
+import org.eclipse.swt.widgets.TableItem;
+
+
+public class JoinColumnsPage extends NewAssociationWizardPage {
+
+ private Label joinColumnsDescLabel1;
+ /*the table containing the association columns between table1 and table2
+ * , or table1 and join table if many to many*/
+ private TableViewer joinColumnsTable1;
+ private ArrayList<SimpleJoin> tableDataModel1 = new ArrayList<SimpleJoin>();
+ private Composite tablesGroup1;
+
+ private Label joinColumnsDescLabel2;
+ /*the table containing the association columns between join table and table2
+ * if many to many*/
+ private TableViewer joinColumnsTable2;
+ private ArrayList<SimpleJoin> tableDataModel2 = new ArrayList<SimpleJoin>();
+ private Composite tablesGroup2;
+
+ static final String[] JOINCOLUMNS_TABLE_COLUMN_PROPERTIES = { "referrerColumn", "referencedColumn" };
+
+ private static final int JOINCOLUMN1_COLUMN_INDEX = 0;
+ private static final int JOINCOLUMN2_COLUMN_INDEX = 1;
+
+ protected JoinColumnsPage(ORMGenCustomizer customizer ) {
+ super(customizer, "JoinColumnsPage");
+ setTitle( JptUiEntityGenMessages.GenerateEntitiesWizard_newAssoc_colsPage_title);
+ setDescription(JptUiEntityGenMessages.GenerateEntitiesWizard_newAssoc_colsPage_desc);
+ }
+
+ public void createControl(Composite parent) {
+ initializeDialogUnits(parent);
+
+ Composite composite = new Composite(parent, SWT.NONE);
+ GridLayout layout = new GridLayout();
+ layout.numColumns = 1;
+ composite.setLayout(layout);
+ this.getHelpSystem().setHelp(composite, JpaHelpContextIds.GENERATE_ENTITIES_WIZARD_JOIN_COLUMNS);
+
+ tablesGroup1 = new Composite(composite, SWT.SHADOW_ETCHED_IN);
+ tablesGroup1.setLayoutData(new GridData());
+ tablesGroup1.setLayout(new GridLayout(2, false));
+ createJoinColumnsTableControl1(tablesGroup1);
+
+ //createMtmJoinColumnsTable2(composite);
+
+ setControl(composite);
+ this.setPageComplete( false);
+
+ ((WizardDialog)getContainer()).addPageChangedListener(new IPageChangedListener(){
+ public void pageChanged(PageChangedEvent event) {
+ if( event.getSelectedPage() == JoinColumnsPage.this ){
+ ((Composite)JoinColumnsPage.this.getControl()).getParent().layout() ;
+
+ }
+ }
+ });
+ }
+
+ private void createMtmJoinColumnsTable2(Composite composite) {
+ tablesGroup2 = new Composite(composite, SWT.SHADOW_ETCHED_IN);
+ tablesGroup2.setLayoutData(new GridData());
+ tablesGroup2.setLayout(new GridLayout(2, false));
+ createJoinColumnsTableControl2(tablesGroup2);
+ }
+
+ /**
+ * Update wizard page UI with new table names
+ */
+ @Override
+ public void updateWithNewTables() {
+ String cardinality = this.getCardinality() ;
+ if( Association.MANY_TO_MANY.equals( cardinality ) ){
+ updateWithMtmTables();
+ }else{
+ updateWithOtmTables();
+ }
+ }
+
+ /**
+ * Update Wizard UI with a single TableViewer with columns from the two associated database tables
+ */
+ public void updateWithOtmTables() {
+ TableColumn[] columns = joinColumnsTable1.getTable().getColumns();
+ String table1Name = this.getReferrerTableName() ;
+ String table2Name = this.getReferencedTableName() ;
+
+ if( table1Name ==null || table2Name == null )
+ return;
+
+ columns[0].setText( table1Name );
+ columns[1].setText( table2Name );
+
+ //Hide the Join column table 2
+ if( tablesGroup2 !=null )
+ tablesGroup2.setVisible(false);
+
+ tableDataModel1.clear();
+ joinColumnsTable1.refresh();
+
+ String msg = String.format(JptUiEntityGenMessages.GenerateEntitiesWizard_newAssoc_colsPage_label, table1Name, table2Name);
+ joinColumnsDescLabel1.setText(msg);
+ joinColumnsDescLabel1.setToolTipText( msg );
+ tablesGroup1.layout();
+
+ String[] referrerColumnValues = getTableColumns(table1Name);
+ String[] referencedColumnValues = getTableColumns(table2Name);
+
+ updateCellEditors(joinColumnsTable1, referrerColumnValues, referencedColumnValues);
+
+
+ ((Composite)this.getControl()).layout() ;
+ }
+
+ /**
+ * Update Wizard UI with a two TableViewers with the first with columns from table1 to the MTM join table
+ * and the second one with columns from the MTM join table to table2
+ */
+ public void updateWithMtmTables() {
+ TableColumn[] columns = joinColumnsTable1.getTable().getColumns();
+ String table1Name = this.getReferrerTableName() ;
+ String table2Name = this.getReferencedTableName() ;
+ String joinTableName = this.getJoinTableName() ;
+ if( table1Name==null || table2Name==null || joinTableName==null ){
+ return;
+ }
+ if( tablesGroup2 == null ){
+ createMtmJoinColumnsTable2( tablesGroup1.getParent());
+ }
+
+ columns[0].setText( table1Name==null?"":table1Name );
+ columns[1].setText( table2Name==null?"":joinTableName );
+
+ //Update join column TableViewer 1
+ tableDataModel1.clear();
+ joinColumnsTable1.refresh();
+
+ String msg = String.format(JptUiEntityGenMessages.GenerateEntitiesWizard_newAssoc_colsPage_label, table1Name, joinTableName);
+ joinColumnsDescLabel1.setText(msg);
+ joinColumnsDescLabel1.setToolTipText( msg );
+ String[] referrerColumnValues = getTableColumns(table1Name);
+ String[] referencedColumnValues = getTableColumns(joinTableName);
+
+ updateCellEditors(joinColumnsTable1, referrerColumnValues, referencedColumnValues );
+
+ //Update join column TableViewer 2
+ columns = joinColumnsTable2.getTable().getColumns();
+ columns[0].setText( joinTableName==null?"":joinTableName );
+ columns[1].setText( table2Name==null?"":table2Name );
+ tablesGroup1.layout();
+
+ tableDataModel2.clear();
+ joinColumnsTable2.refresh();
+ msg = String.format(JptUiEntityGenMessages.GenerateEntitiesWizard_newAssoc_colsPage_label, joinTableName, table2Name);
+ joinColumnsDescLabel2.setText(msg);
+ joinColumnsDescLabel2.setToolTipText( msg );
+ referrerColumnValues = getTableColumns(joinTableName);
+ referencedColumnValues = getTableColumns(table2Name);
+ updateCellEditors(joinColumnsTable2, referrerColumnValues, referencedColumnValues );
+
+ tablesGroup2.layout();
+
+ //Show the Join column TableViewer 2
+ tablesGroup2.setVisible(true);
+
+
+ ((Composite)this.getControl()).layout(new Control[]{this.tablesGroup1, this.tablesGroup2});
+ }
+
+
+ private void createAddRemoveButtonComposite(Composite tablesGroup, final TableViewer joinColumnsTable, final ArrayList<SimpleJoin> tableDataModel) {
+ //Add and Remove JoinColumns buttons
+ Composite buttonComposite = new Composite(tablesGroup, SWT.NULL);
+ GridLayout buttonLayout = new GridLayout(1, false);
+ buttonComposite.setLayout(buttonLayout);
+ GridData data = new GridData();
+ data.horizontalAlignment = GridData.FILL;
+ data.verticalAlignment = GridData.BEGINNING;
+ buttonComposite.setLayoutData(data);
+
+ Button addButton = new Button(buttonComposite, SWT.PUSH);
+ addButton.setText( JptUiEntityGenMessages.add );
+ GridData gridData = new GridData();
+ gridData.horizontalAlignment = GridData.FILL;
+ addButton.setLayoutData(gridData);
+ addButton.addSelectionListener(new SelectionListener() {
+ public void widgetDefaultSelected(SelectionEvent e) {}
+
+ @SuppressWarnings("unchecked")
+ public void widgetSelected(SelectionEvent e) {
+
+ SimpleJoin join = getDefaultNewJoin(joinColumnsTable);
+ tableDataModel.add(join);
+ joinColumnsTable.refresh();
+
+ //Update Wizard model
+ TreeMap<String, String> joins = null;
+ if( joinColumnsTable == joinColumnsTable1 ){
+ joins = (TreeMap<String, String>)getWizardDataModel().get(NewAssociationWizard.ASSOCIATION_JOIN_COLUMNS1 );
+ }else{
+ joins = (TreeMap<String, String>)getWizardDataModel().get(NewAssociationWizard.ASSOCIATION_JOIN_COLUMNS2 );
+ }
+ joins.put( join.foreignKey, join.primaryKey);
+
+ updatePageComplete();
+ }
+ });
+
+ Button removeButton = new Button(buttonComposite, SWT.PUSH);
+ removeButton.setText( JptUiEntityGenMessages.remove );
+ gridData = new GridData();
+ gridData.horizontalAlignment = GridData.FILL;
+ removeButton.setLayoutData(gridData);
+ removeButton.addSelectionListener(new SelectionListener() {
+ public void widgetDefaultSelected(SelectionEvent e) {}
+
+ @SuppressWarnings("unchecked")
+ public void widgetSelected(SelectionEvent e) {
+ StructuredSelection selection = (StructuredSelection)joinColumnsTable.getSelection();
+ if( selection.isEmpty())
+ return;
+ SimpleJoin join = (SimpleJoin)selection.getFirstElement();
+
+ //Update TableViewer model
+ tableDataModel.remove( join );
+ //Update Wizard model
+
+ TreeMap<String, String> joins = null;
+ if( joinColumnsTable == joinColumnsTable1 ){
+ joins = (TreeMap<String, String>)getWizardDataModel().get(NewAssociationWizard.ASSOCIATION_JOIN_COLUMNS1 );
+ }else{
+ joins = (TreeMap<String, String>)getWizardDataModel().get(NewAssociationWizard.ASSOCIATION_JOIN_COLUMNS2 );
+ }
+ joins.remove(join.foreignKey);
+
+ joinColumnsTable.refresh();
+ }
+ });
+
+ addButton.setFocus();
+
+ }
+
+ protected SimpleJoin getDefaultNewJoin(TableViewer joinColumnsTable) {
+ String table1Name = "";
+ String table2Name = "";
+
+ TreeMap<String, String> existingJoins = null;
+ if( joinColumnsTable == this.joinColumnsTable1 ){
+ existingJoins = (TreeMap<String, String>)getWizardDataModel().get(NewAssociationWizard.ASSOCIATION_JOIN_COLUMNS1 );
+ if( this.getJoinTableName() == null) {
+ table1Name = this.getReferrerTableName();
+ table2Name = this.getReferencedTableName() ;
+ }else{
+ table1Name = this.getReferrerTableName();
+ table2Name = this.getJoinTableName() ;
+ }
+ }else{
+ existingJoins = (TreeMap<String, String>)getWizardDataModel().get(NewAssociationWizard.ASSOCIATION_JOIN_COLUMNS2 );
+ table1Name = this.getJoinTableName();
+ table2Name = this.getReferencedTableName() ;
+ }
+ //find next available column
+ String[] table1ColumnValues = getTableColumns(table1Name);
+ String nextCol1 = "";
+ for( String s: table1ColumnValues ){
+ if( !existingJoins.keySet().contains(s)){
+ nextCol1 = s;
+ break;
+ }
+ }
+
+ String[] table2ColumnValues = getTableColumns(table2Name);
+ String nextCol2 = "";
+ for( String s: table2ColumnValues ){
+ if( !existingJoins.values().contains(s)){
+ nextCol2 = s;
+ break;
+ }
+ }
+ return new SimpleJoin( nextCol1, nextCol2);
+ }
+
+ @Override
+ public boolean canFlipToNextPage() {
+ return isPageComplete();
+ }
+
+ public void updatePageComplete() {
+ boolean ret = tableDataModel1.size()> 0 ;
+ setPageComplete( ret );
+ }
+
+ private Label createLabel(Composite container, int span, String text) {
+ Label label = new Label(container, SWT.NONE);
+ label.setText(text);
+ GridData gd = new GridData();
+ gd.horizontalSpan = span;
+ label.setLayoutData(gd);
+ return label;
+ }
+
+ private void createJoinColumnsTableControl1(Composite tablesGroup) {
+ joinColumnsDescLabel1 = createLabel(tablesGroup, 2, JptUiEntityGenMessages.GenerateEntitiesWizard_newAssoc_colsPage_label );
+ joinColumnsTable1 = createJoinColumnsTableControl(tablesGroup, this.tableDataModel1);
+ createAddRemoveButtonComposite(tablesGroup, joinColumnsTable1, tableDataModel1);
+ }
+
+ private void createJoinColumnsTableControl2(Composite tablesGroup) {
+ joinColumnsDescLabel2 = createLabel(tablesGroup, 2, JptUiEntityGenMessages.GenerateEntitiesWizard_newAssoc_colsPage_label );
+ joinColumnsTable2 = createJoinColumnsTableControl(tablesGroup, this.tableDataModel2);
+ createAddRemoveButtonComposite(tablesGroup, joinColumnsTable2, tableDataModel2);
+ }
+
+ private TableViewer createJoinColumnsTableControl(Composite parent, ArrayList<SimpleJoin> tableDataModel ){
+
+ TableLayoutComposite layout= new TableLayoutComposite(parent, SWT.NONE);
+ addColumnLayoutData(layout);
+
+ final org.eclipse.swt.widgets.Table table = new org.eclipse.swt.widgets.Table(layout, SWT.H_SCROLL | SWT.V_SCROLL | SWT.SINGLE | SWT.FULL_SELECTION | SWT.BORDER );
+ table.setHeaderVisible(true);
+ table.setLinesVisible(true);
+
+ TableColumn referrerColumn = new TableColumn(table, SWT.NONE, JOINCOLUMN1_COLUMN_INDEX);
+ referrerColumn.setText("%table1");
+ referrerColumn.setResizable(true);
+
+ TableColumn referencedColumn = new TableColumn(table, SWT.NONE, JOINCOLUMN2_COLUMN_INDEX);
+ referencedColumn.setText("%table2");
+ referencedColumn.setResizable(true);
+
+ GridData gd= new GridData(GridData.FILL_BOTH);
+ gd.heightHint= SWTUtil.getTableHeightHint(table, 3);
+ gd.widthHint = 300;
+ layout.setLayoutData(gd);
+
+ TableViewer newJoinColumnsTable = new TableViewer(table);
+ newJoinColumnsTable.setUseHashlookup(true);
+ newJoinColumnsTable.setLabelProvider(this.buildTableTableLabelProvider());
+ newJoinColumnsTable.setContentProvider(this.buildTableTableContentProvider());
+ newJoinColumnsTable.setSorter(new ViewerSorter() {
+ @Override
+ public int compare(Viewer viewer, Object e1, Object e2) {
+ return ((SimpleJoin) e1).foreignKey.compareTo(((SimpleJoin) e2).foreignKey);
+ }
+ });
+
+ newJoinColumnsTable.addPostSelectionChangedListener(new ISelectionChangedListener() {
+ public void selectionChanged(SelectionChangedEvent event) {
+ //handleTablesListSelectionChanged(event);
+ }
+ });
+ populateTableDataModel();
+ newJoinColumnsTable.setInput( tableDataModel );
+ return newJoinColumnsTable;
+ }
+
+ @SuppressWarnings("unchecked")
+ public void populateTableDataModel(){
+ HashMap<String, Object> dataModel = getWizardDataModel();
+ TreeMap<String, String> joinColumns = (TreeMap<String, String>)dataModel.get(NewAssociationWizard.ASSOCIATION_JOIN_COLUMNS1);
+ if( joinColumns!= null ){
+ for( String referrerColumn : joinColumns.keySet() ){
+ tableDataModel1.add(new SimpleJoin(referrerColumn, joinColumns.get(referrerColumn) ));
+ }
+ }
+
+ TreeMap<String, String> joinColumns2 = (TreeMap<String, String>)dataModel.get(NewAssociationWizard.ASSOCIATION_JOIN_COLUMNS2);
+ if( joinColumns2!= null ){
+ for( String referrerColumn : joinColumns2.keySet() ){
+ tableDataModel2.add(new SimpleJoin(referrerColumn, joinColumns2.get(referrerColumn) ));
+ }
+ }
+
+ }
+
+ private IContentProvider buildTableTableContentProvider() {
+ return new JoinColumnsContentProvider();
+ }
+
+
+ private IBaseLabelProvider buildTableTableLabelProvider() {
+ return new JoinColumnsTableLabelProvider();
+ }
+
+
+ private void addColumnLayoutData(TableLayoutComposite layout) {
+ layout.addColumnData(new ColumnWeightData(50, true));
+ layout.addColumnData(new ColumnWeightData(50, true));
+ }
+
+
+ private void updateCellEditors(TableViewer joinColumnsTable, String[] referrerColumnValues, String[] referencedColumnValues ){
+ joinColumnsTable.setColumnProperties(JOINCOLUMNS_TABLE_COLUMN_PROPERTIES);
+ ComboBoxCellEditor[] editors = new ComboBoxCellEditor[JOINCOLUMNS_TABLE_COLUMN_PROPERTIES.length];
+
+ editors[JOINCOLUMN1_COLUMN_INDEX]= new ComboBoxCellEditor(joinColumnsTable.getTable(), referrerColumnValues, SWT.SINGLE);
+ editors[JOINCOLUMN2_COLUMN_INDEX]= new ComboBoxCellEditor(joinColumnsTable.getTable(), referencedColumnValues, SWT.SINGLE);
+
+ joinColumnsTable.setCellEditors(editors);
+ joinColumnsTable.setCellModifier(this.buildTableTableCellModifier(joinColumnsTable, referrerColumnValues, referencedColumnValues ));
+ }
+
+ public String[] getTableColumns(String tableName){
+ Schema schema = (Schema)getWizardDataModel().get(NewAssociationWizard.ASSOCIATION_SCHEMA);
+ Table table = schema.getTableNamed(tableName);
+ List<String> list = new ArrayList<String>();
+ for (Column column : table.getColumns()) {
+ list.add(column.getName());
+ }
+ String[] ret = new String[list.size()];
+ list.toArray(ret);
+ return ret;
+ }
+
+ private ICellModifier buildTableTableCellModifier(TableViewer joinColumnsTable, String[] referrerColumnValues, String[] referencedColumnValues) {
+ return new JoinColumnsCellModifier(joinColumnsTable, referrerColumnValues, referencedColumnValues);
+ }
+
+ /**
+ * A ContentProvider translates the SimpleJoin list into a Collection for display
+ *
+ */
+ private class JoinColumnsContentProvider implements IStructuredContentProvider {
+
+ JoinColumnsContentProvider() {
+ super();
+ }
+
+ public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {}
+ public void dispose() {}
+ public Object[] getElements(Object inputElement) {
+ return ((Collection<?>) inputElement).toArray();
+ }
+ }
+
+ /**
+ * Simple value object used as model backing the JFace table
+ *
+ */
+ private class SimpleJoin {
+ public SimpleJoin(String foreignKey, String primaryKey) {
+ this.foreignKey = foreignKey;
+ this.primaryKey = primaryKey;
+ }
+ public String foreignKey;
+ public String primaryKey;
+
+ @Override
+ public String toString(){
+ return "["+ this.foreignKey + " = " + this.primaryKey + "]";
+ }
+ }
+
+ /**
+ * A CellModifier to update the join columns in the wizard data model
+ */
+ private class JoinColumnsCellModifier implements ICellModifier {
+ private TableViewer joinColumnsTable;
+ private String[] referrerColumnValues;
+ private String[] referencedColumnValues;
+ JoinColumnsCellModifier(TableViewer joinColumnsTable, String[] referrerColumnValues, String[] referencedColumnValues) {
+ super();
+ this.joinColumnsTable = joinColumnsTable;
+ this.referrerColumnValues = referrerColumnValues;
+ this.referencedColumnValues = referencedColumnValues;
+ }
+
+ public boolean canModify(Object element, String property) {
+ return true;
+ }
+
+ @SuppressWarnings("unchecked")
+ public Object getValue(Object element, String property) {
+// SimpleJoin join = (SimpleJoin) element;
+// if (property.equals(JOINCOLUMNS_TABLE_COLUMN_PROPERTIES[JOINCOLUMN2_COLUMN_INDEX])) {
+// return join.primaryKey;
+// }
+// return join.foreignKey;
+ // returnt the index of the value in the ComboxCellEditor
+ ArrayList<SimpleJoin> tableDataModel = (ArrayList<SimpleJoin>) joinColumnsTable.getInput();
+ for(int i=0; i< tableDataModel.size(); i ++ ){
+ if( tableDataModel.get(i) == element )
+ return new Integer(i);
+ }
+ return new Integer(0);
+
+ }
+
+ /**
+ * element is the selected TableItem
+ * value is the selected item index in the comboCellEditor
+ */
+ @SuppressWarnings("unchecked")
+ public void modify(Object element, String property, Object value) {
+ if ( ! (element instanceof TableItem)) {
+ return;
+ }
+ Integer index = (Integer)value;
+ TableItem item = (TableItem)element;
+ boolean unchanged = false;
+ SimpleJoin join = (SimpleJoin) item.getData();
+ if (property.equals(JOINCOLUMNS_TABLE_COLUMN_PROPERTIES[JOINCOLUMN1_COLUMN_INDEX])) {
+ unchanged = join.foreignKey.equals( referrerColumnValues[ index.intValue() ] );
+ if (! unchanged) {
+
+ //update the wizard datamodel
+ TreeMap<String, String> joins = null;
+ if( joinColumnsTable == joinColumnsTable1 ){
+ joins = (TreeMap<String, String>)getWizardDataModel().get(NewAssociationWizard.ASSOCIATION_JOIN_COLUMNS1 );
+ }else{
+ joins = (TreeMap<String, String>)getWizardDataModel().get(NewAssociationWizard.ASSOCIATION_JOIN_COLUMNS2 );
+ }
+ joins.remove(join.foreignKey);
+ joins.put(referrerColumnValues[ index.intValue() ], join.primaryKey);
+
+ //Update the TableViewer model
+ join.foreignKey = referrerColumnValues[ index.intValue()];
+ joinColumnsTable.refresh();
+ }
+ return;
+ }
+
+ if (property.equals(JOINCOLUMNS_TABLE_COLUMN_PROPERTIES[JOINCOLUMN2_COLUMN_INDEX])) {
+ unchanged = join.primaryKey.equals( referencedColumnValues[ index.intValue()] ) ;
+ if (! unchanged) {
+ //Update the TableViewer model
+ join.primaryKey = referencedColumnValues[ index.intValue()] ;
+
+ //Update wizard data model
+ TreeMap<String, String> joins = null;
+ if( joinColumnsTable == joinColumnsTable1 ){
+ joins = (TreeMap<String, String>)getWizardDataModel().get(NewAssociationWizard.ASSOCIATION_JOIN_COLUMNS1 );
+ }else{
+ joins = (TreeMap<String, String>)getWizardDataModel().get(NewAssociationWizard.ASSOCIATION_JOIN_COLUMNS2 );
+ }
+ joins.put(join.foreignKey, join.primaryKey);
+
+ joinColumnsTable.refresh();
+ }
+ }
+
+
+ }
+
+ }
+
+ /**
+ * A table label provider to return the join column names for display
+ *
+ */
+ private final class JoinColumnsTableLabelProvider extends LabelProvider implements ITableLabelProvider {
+ public Image getColumnImage(Object element, int columnIndex) {
+ return null;
+ }
+ public String getColumnText(Object element, int columnIndex) {
+ if( !(element instanceof SimpleJoin) )
+ return null;
+ switch (columnIndex) {
+ case 0:
+ return ((SimpleJoin)element).foreignKey;
+ case 1:
+ return ((SimpleJoin)element).primaryKey;
+ default:
+ Assert.isTrue(false);
+ return null;
+ }
+ }
+ @Override
+ public String getText(Object element) {
+ return getColumnText(element, 0); // needed to make the sorter work
+ }
+ }
+
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/gen/JptUiEntityGenMessages.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/gen/JptUiEntityGenMessages.java
new file mode 100644
index 0000000000..dafe41f126
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/gen/JptUiEntityGenMessages.java
@@ -0,0 +1,123 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2010 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.ui.internal.wizards.gen;
+
+import org.eclipse.osgi.util.NLS;
+
+/**
+ * Localized messages used by Dali UI.
+ *
+ * @version 2.0
+ * @since 2.0
+ */
+public class JptUiEntityGenMessages {
+ private static final String BUNDLE_NAME = "jpt_ui_entity_gen"; //$NON-NLS-1$
+ private static final Class<?> BUNDLE_CLASS = JptUiEntityGenMessages.class;
+
+ public static String GenerateEntitiesWizard_tableSelectPage_Restore_Defaults;
+ public static String GenerateEntitiesWizard_generateEntities;
+ public static String GenerateEntitiesWizard_doNotShowWarning;
+ public static String GenerateEntitiesWizard_selectJPAProject;
+ public static String GenerateEntitiesWizard_selectJPAProject_msg;
+ public static String GenerateEntitiesWizard_tableSelectPage_selectTable;
+ public static String GenerateEntitiesWizard_tableSelectPage_chooseEntityTable;
+ public static String GenerateEntitiesWizard_tableSelectPage_updatePersistenceXml;
+ public static String GenerateEntitiesWizard_tableSelectPage_tables;
+ public static String GenerateEntitiesWizard_tableSelectPage_tableColumn;
+ //Database connection group
+ public static String connection;
+ public static String addConnectionLink;
+ public static String connectLink;
+ public static String schemaInfo;
+ public static String schema;
+ public static String connectingToDatabase;
+
+ //Default table gen properties
+ public static String GenerateEntitiesWizard_defaultTablePage_title;
+ public static String GenerateEntitiesWizard_defaultTablePage_desc;
+ public static String GenerateEntitiesWizard_defaultTablePage_domainJavaClass;
+ public static String GenerateEntitiesWizard_defaultTablePage_tableMapping;
+ public static String GenerateEntitiesWizard_tablePanel_className;
+ public static String GenerateEntitiesWizard_defaultTablePage_fetch;
+ public static String GenerateEntitiesWizard_defaultTablePage_collType;
+ public static String GenerateEntitiesWizard_defaultTablePage_sequence;
+ public static String GenerateEntitiesWizard_defaultTablePage_sequenceNote;
+ public static String GenerateEntitiesWizard_defaultTablePage_access;
+ public static String GenerateEntitiesWizard_defaultTablePage_keyGen;
+ public static String GenerateEntitiesWizard_defaultTablePage_genOptionalAnnotations;
+ public static String GenerateEntitiesWizard_defaultTablePage_genOptionalAnnotations_desc;
+
+ //Asso figure
+ public static String manyToOneDesc;
+ public static String oneToOneDesc;
+ public static String manyToManyDesc;
+ //table association wizard page
+ public static String GenerateEntitiesWizard_assocPage_title;
+ public static String GenerateEntitiesWizard_assocPage_desc;
+ public static String GenerateEntitiesWizard_assocPage_label;
+ public static String GenerateEntitiesWizard_assocPage_newAssoc;
+ public static String GenerateEntitiesWizard_assocPage_delAssoc;
+ public static String GenerateEntitiesWizard_assocEditor_genAssoc;
+ public static String GenerateEntitiesWizard_assocEditor_entityRef;
+ public static String property;
+ public static String cascade;
+ public static String GenerateEntitiesWizard_assocEditor_setRef;
+ public static String GenerateEntitiesWizard_assocEditor_joinedWhen;
+ public static String GenerateEntitiesWizard_assocEditor_tableJoin;
+ public static String cardinality;
+ public static String selectCascadeDlgTitle;
+ //new association wizard
+ public static String GenerateEntitiesWizard_newAssoc_title;
+ public static String GenerateEntitiesWizard_newAssoc_tablesPage_title;
+ public static String GenerateEntitiesWizard_newAssoc_tablesPage_desc;
+ public static String GenerateEntitiesWizard_newAssoc_tablesPage_assocKind;
+ public static String GenerateEntitiesWizard_newAssoc_tablesPage_simpleAssoc;
+ public static String GenerateEntitiesWizard_newAssoc_tablesPage_m2mAssoc;
+ public static String GenerateEntitiesWizard_newAssoc_tablesPage_assocTables;
+ public static String GenerateEntitiesWizard_newAssoc_tablesPage_table1;
+ public static String GenerateEntitiesWizard_newAssoc_tablesPage_table2;
+ public static String GenerateEntitiesWizard_newAssoc_tablesPage_intermediateTable;
+ public static String GenerateEntitiesWizard_newAssoc_colsPage_title;
+ public static String GenerateEntitiesWizard_newAssoc_colsPage_desc;
+ public static String GenerateEntitiesWizard_newAssoc_colsPage_label;
+ public static String add;
+ public static String remove;
+ public static String GenerateEntitiesWizard_newAssoc_cardinalityPage_title;
+ public static String GenerateEntitiesWizard_newAssoc_cardinalityPage_desc;
+ public static String manyToOne;
+ public static String oneToMany;
+ public static String oneToOne;
+ public static String manyToMany;
+ //select table dialog
+ public static String selectTableDlgTitle;
+ public static String selectTableDlgDesc;
+ //individual table and column gen properties
+ public static String GenerateEntitiesWizard_tablesAndColumnsPage_title;
+ public static String GenerateEntitiesWizard_tablesAndColumnsPage_desc;
+ public static String GenerateEntitiesWizard_tablesAndColumnsPage_labelTableAndColumns;
+ public static String GenerateEntitiesWizard_colPanel_genProp;
+ public static String GenerateEntitiesWizard_colPanel_colMapping;
+ public static String GenerateEntitiesWizard_colPanel_propName;
+ public static String GenerateEntitiesWizard_colPanel_propType;
+ public static String GenerateEntitiesWizard_colPanel_mapKind;
+ public static String GenerateEntitiesWizard_colPanel_colUpdateable;
+ public static String GenerateEntitiesWizard_colPanel_colInsertable;
+ public static String GenerateEntitiesWizard_colPanel_beanProp;
+ public static String GenerateEntitiesWizard_colPanel_getterScope;
+ public static String GenerateEntitiesWizard_colPanel_setterScope;
+ static {
+ NLS.initializeMessages(BUNDLE_NAME, BUNDLE_CLASS);
+ }
+
+ private JptUiEntityGenMessages() {
+ throw new UnsupportedOperationException();
+ }
+
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/gen/NewAssociationWizard.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/gen/NewAssociationWizard.java
new file mode 100644
index 0000000000..667b9d05af
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/gen/NewAssociationWizard.java
@@ -0,0 +1,199 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2010 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.ui.internal.wizards.gen;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.TreeMap;
+
+import org.eclipse.jface.resource.ResourceManager;
+import org.eclipse.jface.wizard.IWizardPage;
+import org.eclipse.jface.wizard.Wizard;
+import org.eclipse.jpt.jpa.core.JpaProject;
+import org.eclipse.jpt.jpa.gen.internal.Association;
+import org.eclipse.jpt.jpa.gen.internal.ORMGenCustomizer;
+
+
+public class NewAssociationWizard extends Wizard {
+
+ public static String ASSOCIATION_SCHEMA = "ASSOCIATION_SCHEMA"; //$NON-NLS-1$
+ public static String ASSOCIATION_REFERRER_TABLE = "ASSOCIATION_REFERRER_TABLE"; //$NON-NLS-1$
+ public static String ASSOCIATION_REFERENCED_TABLE = "ASSOCIATION_REFERENCED_TABLE"; //$NON-NLS-1$
+ public static String ASSOCIATION_JOIN_COLUMNS1 = "ASSOCIATION_REFERRER_COLUMNS1"; //$NON-NLS-1$
+ public static String ASSOCIATION_JOIN_COLUMNS2 = "ASSOCIATION_REFERRER_COLUMNS2"; //used in MTM associations only //$NON-NLS-1$
+ public static String ASSOCIATION_JOIN_TABLE = "ASSOCIATION_JOIN_TABLE"; // TreeMap<String, String> //$NON-NLS-1$
+ public static String ASSOCIATION_CADINALITY = "ASSOCIATION_CADINALITY"; //$NON-NLS-1$
+
+ private JpaProject jpaProject;
+ private HashMap<String, Object> associationDataModel = new HashMap<String, Object>();
+
+ private ORMGenCustomizer customizer = null;
+
+ private AssociationTablesPage associationTablesPage;
+ private JoinColumnsPage joinColumnsPage;
+ private CardinalityPage cardinalityPage;
+
+ protected final ResourceManager resourceManager;
+
+ public NewAssociationWizard( JpaProject jpaProject, ORMGenCustomizer customizer, ResourceManager resourceManager) {
+ super();
+ this.jpaProject = jpaProject;
+ this.customizer = customizer;
+ this.resourceManager = resourceManager;
+ this.setWindowTitle( JptUiEntityGenMessages.GenerateEntitiesWizard_newAssoc_title);
+
+ this.associationDataModel.put( NewAssociationWizard.ASSOCIATION_SCHEMA, this.customizer.getSchema());
+ this.associationDataModel.put( NewAssociationWizard.ASSOCIATION_JOIN_COLUMNS1, new TreeMap<String, String>());
+ this.associationDataModel.put( NewAssociationWizard.ASSOCIATION_JOIN_COLUMNS2, new TreeMap<String, String>());
+ }
+
+ @Override
+ public void addPages() {
+ super.addPages();
+ this.associationTablesPage = new AssociationTablesPage( customizer, this.resourceManager);
+ addPage(this.associationTablesPage);
+
+ this.joinColumnsPage = new JoinColumnsPage(customizer);
+ addPage(this.joinColumnsPage);
+
+ this.cardinalityPage = new CardinalityPage(customizer);
+ addPage(this.cardinalityPage);
+ }
+
+ @Override
+ public boolean performFinish() {
+ return true;
+ }
+
+ public ORMGenCustomizer getCustomizer (){
+ return customizer;
+ }
+
+ public JpaProject getJpaProject(){
+ return this.jpaProject;
+ }
+
+// public Schema getDefaultSchema() {
+// return getJpaProject().getDefaultDbSchema();
+// }
+//
+// private boolean projectDefaultSchemaExists() {
+// return ( this.getDefaultSchema() != null);
+// }
+
+ public HashMap<String, Object> getDataModel(){
+ return this.associationDataModel;
+ }
+
+ public void updateTableNames(){
+ IWizardPage[] pages = this.getPages();
+ for( IWizardPage page : pages){
+ ((NewAssociationWizardPage)page).updateWithNewTables();
+ }
+ }
+
+ @SuppressWarnings("unchecked")
+ public Association getNewAssociation(){
+ String referrerTableName =getReferrerTableName();
+ String referencedTableName = getReferencedTableName();
+ List<String> referrerColNames = new ArrayList<String>();
+ List<String> referencedColNames = new ArrayList<String>();
+
+ String cardinality = (String)associationDataModel.get( NewAssociationWizard.ASSOCIATION_CADINALITY );
+ if( cardinality.equals(Association.MANY_TO_MANY) ){
+ return createManyToManyAssociation();
+ }
+
+ Object value = associationDataModel.get( NewAssociationWizard.ASSOCIATION_JOIN_COLUMNS1);
+ if(value!=null){
+ TreeMap<String, String> joinColumns = (TreeMap<String, String>)value;
+ for( String pk : joinColumns.keySet()){
+ referrerColNames.add(pk);
+ referencedColNames.add( joinColumns.get(pk));
+ }
+ }
+
+ /*if one-to-many then convert it to many-to-one to be consistent
+ * with the associations computed from the db foreign keys.
+ * Don't see at this point how one-to-many would
+ * affect the generation.*/
+ if( cardinality.equals(Association.ONE_TO_MANY) ){
+ cardinality = Association.MANY_TO_ONE;
+
+ String temp1 = referrerTableName;
+ referrerTableName = referencedTableName;
+ referencedTableName = temp1;
+
+ List<String> temp2 = referrerColNames;
+ referrerColNames = referencedColNames;
+ referencedColNames = temp2;
+ }
+
+ Association association = null;
+ association = new Association(this.customizer, referrerTableName, referrerColNames , referencedTableName, referencedColNames);
+ association.setCardinality( cardinality );
+ association.setCustom(true);
+ return association;
+ }
+
+ @SuppressWarnings("unchecked")
+ private Association createManyToManyAssociation() {
+ String referrerTableName =getReferrerTableName();
+ String joinTable = getJoinTableName();
+ String referencedTableName = getReferencedTableName();
+
+ List<String> referrerColNames = new ArrayList<String>();
+ List<String> referrerJoinColNames = new ArrayList<String>();
+ Object value = associationDataModel.get( NewAssociationWizard.ASSOCIATION_JOIN_COLUMNS1);
+ if(value!=null){
+ TreeMap<String, String> joinColumns = (TreeMap<String, String>)value;
+ for( String pk : joinColumns.keySet()){
+ referrerColNames.add(pk);
+ referrerJoinColNames.add( joinColumns.get(pk));
+ }
+ }
+
+ value = associationDataModel.get( NewAssociationWizard.ASSOCIATION_JOIN_COLUMNS2);
+ List<String> referencedColNames = new ArrayList<String>();
+ List<String> referencedJoinColNames = new ArrayList<String>();
+ if(value!=null){
+ TreeMap<String, String> joinColumns = (TreeMap<String, String>)value;
+ for( String pk : joinColumns.keySet()){
+ referencedJoinColNames.add(pk);
+ referencedColNames.add( joinColumns.get(pk));
+ }
+ }
+
+
+ Association association = null;
+ association = new Association(this.customizer, referrerTableName, referrerColNames,
+ referencedTableName, referencedColNames, joinTable, referrerJoinColNames, referencedJoinColNames);
+ return association;
+ }
+
+ String getReferrerTableName(){
+ return (String)associationDataModel.get(NewAssociationWizard.ASSOCIATION_REFERRER_TABLE);
+ }
+
+ String getReferencedTableName(){
+ return (String)associationDataModel.get(NewAssociationWizard.ASSOCIATION_REFERENCED_TABLE);
+ }
+
+ String getJoinTableName(){
+ return (String)associationDataModel.get(NewAssociationWizard.ASSOCIATION_JOIN_TABLE );
+ }
+
+ String getCardinality(){
+ return (String)associationDataModel.get(NewAssociationWizard.ASSOCIATION_CADINALITY );
+ }
+
+} \ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/gen/NewAssociationWizardPage.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/gen/NewAssociationWizardPage.java
new file mode 100644
index 0000000000..8263181770
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/gen/NewAssociationWizardPage.java
@@ -0,0 +1,60 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 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.ui.internal.wizards.gen;
+
+import java.util.HashMap;
+
+import org.eclipse.jface.wizard.WizardPage;
+import org.eclipse.jpt.jpa.gen.internal.ORMGenCustomizer;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.help.IWorkbenchHelpSystem;
+
+
+public abstract class NewAssociationWizardPage extends WizardPage {
+
+ protected ORMGenCustomizer customizer;
+
+ public NewAssociationWizardPage(ORMGenCustomizer customizer, String name) {
+ super(name);
+ this.customizer = customizer ;
+ }
+
+ protected HashMap<String, Object> getWizardDataModel(){
+ return ((NewAssociationWizard)this.getWizard()).getDataModel();
+ }
+
+ protected String getReferrerTableName(){
+ return ((NewAssociationWizard)getWizard()).getReferrerTableName();
+ }
+
+ protected String getReferencedTableName(){
+ return ((NewAssociationWizard)getWizard()).getReferencedTableName();
+ }
+
+ protected String getJoinTableName(){
+ return ((NewAssociationWizard)getWizard()).getJoinTableName();
+ }
+
+ protected String getCardinality(){
+ return ((NewAssociationWizard)getWizard()).getCardinality() ;
+ }
+
+ public void updateWithNewTables() {
+ }
+
+ /**
+ * Returns the helps system.
+ * @return The platform's help system
+ */
+ protected final IWorkbenchHelpSystem getHelpSystem() {
+ return PlatformUI.getWorkbench().getHelpSystem();
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/gen/PromptJPAProjectWizardPage.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/gen/PromptJPAProjectWizardPage.java
new file mode 100644
index 0000000000..ef248f04ea
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/gen/PromptJPAProjectWizardPage.java
@@ -0,0 +1,154 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 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.ui.internal.wizards.gen;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.jface.viewers.IStructuredContentProvider;
+import org.eclipse.jface.viewers.ITableLabelProvider;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.wizard.WizardPage;
+import org.eclipse.jpt.jpa.core.JpaProject;
+import org.eclipse.jpt.jpa.core.JptJpaCorePlugin;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.TableItem;
+import org.eclipse.ui.PlatformUI;
+
+public class PromptJPAProjectWizardPage extends WizardPage {
+
+ private static String SELECT_PROJECT_PAGE_NAME = "SelectJPAProject"; //$NON-NLS-1$
+ private Table projTable;
+ private TableViewer projTableViewer;
+ private static int PROJECT_NAME_COLUMN_INDEX = 0;
+ private final String helpContextId;
+
+ protected PromptJPAProjectWizardPage( final String helpContextId ) {
+ super(SELECT_PROJECT_PAGE_NAME);
+ setTitle( JptUiEntityGenMessages.GenerateEntitiesWizard_selectJPAProject );
+ setMessage( JptUiEntityGenMessages.GenerateEntitiesWizard_selectJPAProject_msg );
+ this.helpContextId = helpContextId;
+ }
+
+ public void createControl(Composite parent) {
+ Composite composite = new Composite(parent, SWT.NULL);
+ int nColumns= 1;
+ GridLayout layout = new GridLayout();
+ layout.numColumns = nColumns;
+ composite.setLayout(layout);
+ Label label = new Label( composite, SWT.NONE );
+ label.setText( JptUiEntityGenMessages.GenerateEntitiesWizard_selectJPAProject );
+
+ projTableViewer = new TableViewer(composite, SWT.SINGLE | SWT.BORDER | SWT.V_SCROLL | SWT.VIRTUAL);
+ projTable = projTableViewer.getTable();
+ GridData gd = new GridData( SWT.FILL, SWT.FILL, true, true );
+ projTable.setLayoutData(gd);
+
+ projTable.addSelectionListener(new SelectionAdapter() {
+ public void widgetSelected(SelectionEvent e) {
+ handleJpaProjectSelection();
+ }
+
+ public void widgetDefaultSelected(SelectionEvent e) {
+ widgetSelected(e);
+ }
+
+ });
+
+ projTableViewer = new TableViewer(projTable);
+ projTableViewer.setLabelProvider(new ProjectTableLabelProvider());
+ projTableViewer.setContentProvider(new ProjectTableContentProvider());
+ fillJpaProjectList();
+ setControl( composite );
+ validate();
+ }
+
+ private void handleJpaProjectSelection() {
+ if (projTable.getSelectionIndex() != -1) {
+ TableItem item = projTable.getItem(projTable.getSelectionIndex());
+ String projName = item.getText(0);
+ IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(projName);
+ JpaProject jpaProj = JptJpaCorePlugin.getJpaProject( project );
+ ((GenerateEntitiesFromSchemaWizard)getWizard()).setJpaProject(jpaProj);
+ validate();
+ }
+ }
+
+ private void fillJpaProjectList() {
+ IProject[] projects = ResourcesPlugin.getWorkspace().getRoot().getProjects();
+ List<String> projNames = new ArrayList<String>();
+ for ( IProject project : projects )
+ {
+ JpaProject jpaProj = JptJpaCorePlugin.getJpaProject( project );
+ if ( jpaProj != null ) {
+ projNames.add(project.getName());
+ }
+ }
+ projTableViewer.setInput(projNames);
+ }
+
+ private void validate() {
+ if (projTable.getSelectionIndex() != -1)
+ setPageComplete(true);
+ else
+ setPageComplete(false);
+ }
+
+ @Override
+ public final void performHelp()
+ {
+ PlatformUI.getWorkbench().getHelpSystem().displayHelp( this.helpContextId );
+ }
+
+ // inner classes
+ private final class ProjectTableLabelProvider extends LabelProvider implements ITableLabelProvider {
+ public Image getColumnImage(Object element, int columnIndex)
+ {
+ if (columnIndex == PROJECT_NAME_COLUMN_INDEX)
+ return PlatformUI.getWorkbench().getSharedImages().getImage(org.eclipse.ui.ide.IDE.SharedImages.IMG_OBJ_PROJECT);
+ return null;
+ }
+
+ public String getColumnText(Object element, int columnIndex)
+ {
+ assert element instanceof String;
+ String projectName = (String)element;
+ if (columnIndex == PROJECT_NAME_COLUMN_INDEX)
+ return projectName;
+ return null;
+ }
+ }
+
+ private final class ProjectTableContentProvider implements IStructuredContentProvider
+ {
+ public Object[] getElements(Object inputElement){
+ return ((Collection<?>) inputElement).toArray();
+ }
+
+ public void dispose(){}
+
+ public void inputChanged(Viewer viewer, Object oldInput, Object newInput){}
+
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/gen/SWTUtil.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/gen/SWTUtil.java
new file mode 100644
index 0000000000..c295097241
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/gen/SWTUtil.java
@@ -0,0 +1,133 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 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.ui.internal.wizards.gen;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+
+/**
+ * Collection of utility methods to create SWT UI
+ *
+ */
+public class SWTUtil {
+ /**
+ * Set the layoutData of the input control to occupy specified number of columns
+ * @param c
+ * @param columns
+ */
+ public static void fillColumns(Control c, int columns){
+ GridData layoutData = new GridData();
+ layoutData.horizontalSpan = columns;
+ layoutData.verticalAlignment = SWT.FILL;
+ layoutData.horizontalAlignment = SWT.FILL;
+ layoutData.grabExcessHorizontalSpace = true;
+ layoutData.grabExcessVerticalSpace = false;
+ c.setLayoutData(layoutData);
+ return ;
+ }
+
+ public static void fillColumnsWithIndent(Control c, int columns, int indent){
+ GridData layoutData = new GridData();
+ layoutData.horizontalSpan = columns;
+ layoutData.verticalAlignment = SWT.FILL;
+ layoutData.horizontalAlignment = SWT.FILL;
+ layoutData.grabExcessHorizontalSpace = true;
+ layoutData.grabExcessVerticalSpace = false;
+ layoutData.horizontalIndent = indent ;
+ c.setLayoutData(layoutData);
+ return ;
+ }
+
+ public static Label createLabel(Composite container, int span, String text) {
+ Label label = new Label(container, SWT.NONE);
+ label.setText(text);
+ GridData gd = new GridData();
+ gd.horizontalSpan = span;
+ label.setLayoutData(gd);
+ return label;
+ }
+
+ /**
+ * Create a new label which occupies one grid column
+ * @param parent
+ * @param text
+ */
+ public static Label newLabel(Composite parent, String text) {
+ Label label = new Label( parent, SWT.NONE);
+ label.setText( text );
+ label.setLayoutData(new GridData());
+ return label;
+ }
+
+ /**
+ * Create a new label which occupies one grid column
+ * @param parent
+ * @param text
+ */
+ public static Label newLabelWithIndent(Composite parent, String text, int indent) {
+ Label label = new Label( parent, SWT.NONE);
+ label.setText( text );
+ GridData layoutData = new GridData();
+ layoutData.horizontalAlignment = SWT.BEGINNING;
+ layoutData.verticalAlignment = SWT.TOP ;
+ layoutData.horizontalIndent = indent ;
+ label.setLayoutData(layoutData);
+ return label;
+ }
+
+ /**
+ * Creates a separator line. Expects a <code>GridLayout</code> with at least 1 column.
+ *
+ * @param composite the parent composite
+ * @param nColumns number of columns to span
+ */
+ @SuppressWarnings("restriction")
+ public static void createSeparator(Composite composite, int nColumns) {
+ (new org.eclipse.jdt.internal.ui.wizards.dialogfields.Separator(
+ SWT.SEPARATOR | SWT.HORIZONTAL)).doFillIntoGrid(composite, nColumns, 5);
+ }
+
+
+ public static Button createButton(Composite container, int span, String text, int style) {
+ Button btn = new Button(container, style);
+ btn.setText(text);
+ GridData gd = new GridData();
+ gd.horizontalSpan = span;
+ btn.setLayoutData(gd);
+ return btn;
+ }
+
+ public static Combo createCombo(Composite container, int span ) {
+ Combo combo = new Combo(container, SWT.SINGLE | SWT.READ_ONLY);
+ GridData gd = new GridData();
+ gd.horizontalSpan = span;
+ gd.grabExcessHorizontalSpace=true;
+ gd.horizontalAlignment = SWT.FILL;
+ combo.setLayoutData(gd);
+ return combo;
+ }
+
+ public static Text createText(Composite container, int span ) {
+ Text text = new Text(container, SWT.BORDER);
+ GridData gd = new GridData();
+ gd.horizontalSpan = span;
+ gd.grabExcessHorizontalSpace=true;
+ gd.horizontalAlignment = SWT.FILL;
+ text.setLayoutData(gd);
+ return text;
+ }
+
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/gen/SelectTableDialog.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/gen/SelectTableDialog.java
new file mode 100644
index 0000000000..f9b9ee0d97
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/gen/SelectTableDialog.java
@@ -0,0 +1,75 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2010 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.ui.internal.wizards.gen;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.jface.resource.ResourceManager;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.ILabelProviderListener;
+import org.eclipse.jpt.jpa.db.Schema;
+import org.eclipse.jpt.jpa.db.Table;
+import org.eclipse.jpt.jpa.ui.internal.ImageRepository;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.dialogs.ElementListSelectionDialog;
+
+/**
+ * A database table selection dialog which allows user to filter tables by name
+ */
+public class SelectTableDialog extends ElementListSelectionDialog {
+
+ public SelectTableDialog(Shell shell, final ResourceManager resourceManager){
+ super(shell, new ILabelProvider(){
+ public Image getImage(Object element) {
+ return ImageRepository.getTableImage(resourceManager);
+ }
+
+ public String getText(Object element) {
+ return element.toString();
+ }
+ public void addListener(ILabelProviderListener listener) {}
+ public void dispose() {}
+
+ public boolean isLabelProperty(Object element, String property) {
+ return false;
+ }
+
+ public void removeListener(ILabelProviderListener listener) {}
+
+ });
+ this.setTitle( JptUiEntityGenMessages.selectTableDlgTitle );//
+ this.setMessage( JptUiEntityGenMessages.selectTableDlgDesc);//
+ }
+
+ public SelectTableDialog(Shell shell, ResourceManager resourceManager, Schema schema){
+ this(shell, resourceManager);
+
+ ArrayList<String> list = new ArrayList<String>();
+ for (Table table : schema.getTables()) {
+ list.add(table.getName());
+ }
+ this.setElements( list.toArray() );
+
+ }
+
+ public SelectTableDialog(Shell shell, ResourceManager resourceManager, List<String> tableNames){
+ this(shell, resourceManager);
+ this.setElements( tableNames.toArray() );
+ }
+
+ public String getSelectedTable() {
+ String tableName = (String)this.getFirstResult();
+ return tableName ;
+ }
+
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/gen/TableAssociationsWizardPage.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/gen/TableAssociationsWizardPage.java
new file mode 100644
index 0000000000..51663f6159
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/gen/TableAssociationsWizardPage.java
@@ -0,0 +1,775 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2010 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.ui.internal.wizards.gen;
+
+
+import static org.eclipse.jpt.jpa.ui.internal.wizards.gen.SWTUtil.fillColumns;
+import static org.eclipse.jpt.jpa.ui.internal.wizards.gen.SWTUtil.newLabel;
+import static org.eclipse.jpt.jpa.ui.internal.wizards.gen.SWTUtil.newLabelWithIndent;
+
+import java.util.List;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jdt.core.JavaConventions;
+import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.jdt.internal.ui.dialogs.StatusUtil;
+import org.eclipse.jdt.internal.ui.wizards.dialogfields.DialogField;
+import org.eclipse.jdt.internal.ui.wizards.dialogfields.IStringButtonAdapter;
+import org.eclipse.jdt.internal.ui.wizards.dialogfields.LayoutUtil;
+import org.eclipse.jdt.internal.ui.wizards.dialogfields.StringButtonDialogField;
+import org.eclipse.jface.resource.ResourceManager;
+import org.eclipse.jface.window.Window;
+import org.eclipse.jface.wizard.WizardDialog;
+import org.eclipse.jface.wizard.WizardPage;
+import org.eclipse.jpt.jpa.core.JpaProject;
+import org.eclipse.jpt.jpa.gen.internal.Association;
+import org.eclipse.jpt.jpa.gen.internal.AssociationRole;
+import org.eclipse.jpt.jpa.gen.internal.ORMGenColumn;
+import org.eclipse.jpt.jpa.gen.internal.ORMGenCustomizer;
+import org.eclipse.jpt.jpa.ui.internal.ImageRepository;
+import org.eclipse.jpt.jpa.ui.internal.JpaHelpContextIds;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.StackLayout;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.layout.FillLayout;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.help.IWorkbenchHelpSystem;
+
+public class TableAssociationsWizardPage extends WizardPage {
+
+ private JpaProject jpaProject;
+ private ORMGenCustomizer customizer ;
+
+ private AssociationsListComposite associationList;
+ private Association selectedAssociation;
+ private Button deleteAssociationLink ;
+ private Button createAssociationLink ;
+
+ //Controls in Association Edit Panel
+ private Composite associationsEditPanel ;
+ private Button generateAssociationCheckBox;
+ private Label cardinalityLabel ;
+ private Combo cardinalityCombo ;
+ /*whether to generate the referrer-->referenced role.*/
+ private Button referrerRoleCheckBox;
+ /*the name of the property in the referrer-->referenced role.*/
+ private Label referrerRolePropertyLabel;
+ private Text referrerRolePropertyField ;
+ /*the cascade in the referrer-->referenced role.*/
+ @SuppressWarnings("restriction")
+ private StringButtonDialogField referrerRoleCascadeField;
+ /*whether to generate the referenced->referrer role.*/
+ private Button referencedRoleCheckBox;
+ /*the name of the property in the referenced->referrer role.*/
+ private Label referencedRolePropertyLabel;
+ private Text referencedRolePropertyField ;
+ /*the cascade in the referenced->referrer role.*/
+ @SuppressWarnings("restriction")
+ private StringButtonDialogField referencedRoleCascadeField;
+ private Label joinConditionLabel;
+ private Text joinConditionText;
+
+ private Composite detailPanel;
+ private StackLayout detailPanelStatckLayout;
+ private Composite emptyPanel;
+
+ protected final ResourceManager resourceManager;
+
+ protected TableAssociationsWizardPage(JpaProject jpaProject, ResourceManager resourceManager) {
+ super("Table Associations"); //$NON-NLS-1$
+ this.jpaProject = jpaProject;
+ this.resourceManager = resourceManager;
+ setTitle(JptUiEntityGenMessages.GenerateEntitiesWizard_assocPage_title);
+ setMessage(JptUiEntityGenMessages.GenerateEntitiesWizard_assocPage_desc);
+
+ }
+
+ public void createControl(Composite parent) {
+ initializeDialogUnits(parent);
+
+ Composite composite = new Composite(parent, SWT.NULL);
+ int nColumns= 2 ;
+ GridLayout layout = new GridLayout();
+ layout.numColumns = nColumns;
+ composite.setLayout(layout);
+ this.getHelpSystem().setHelp(composite, JpaHelpContextIds.GENERATE_ENTITIES_WIZARD_TABLE_ASSOCIATIONS);
+
+ Label label = new Label(composite, SWT.NONE);
+ label.setText( JptUiEntityGenMessages.GenerateEntitiesWizard_assocPage_label );
+ GridData gd = new GridData();
+ gd.horizontalSpan = 2;
+ label.setLayoutData( gd );
+
+ createAssociationsListPanel(composite);
+ createAddDeleteButtons(composite, nColumns);
+ SWTUtil.createSeparator(composite, nColumns);
+
+ createDetailPanel(composite);
+ setControl(composite);
+
+ composite.layout(true);
+ this.setPageComplete( true);
+
+ }
+
+ private void createAddDeleteButtons(Composite composite, int columns) {
+
+ Composite c = new Composite( composite, SWT.NONE);
+ fillColumns(c, 1);
+ c.setLayout( new GridLayout(1,true) );
+
+ createAssociationLink = new Button(c, SWT.NONE);
+ createAssociationLink.setToolTipText( JptUiEntityGenMessages.GenerateEntitiesWizard_assocPage_newAssoc );
+ createAssociationLink.setImage( ImageRepository.getAddButtonImage(this.resourceManager) );
+ createAssociationLink.addSelectionListener(new SelectionListener(){
+ public void widgetDefaultSelected(SelectionEvent e) {}
+ public void widgetSelected(SelectionEvent e) {
+ launchNewAssociationsWizard();
+ }
+
+ });
+
+ deleteAssociationLink = new Button(c, SWT.NONE);
+ Color foreground = new Color(Display.getDefault(), 0,0,255);
+ deleteAssociationLink.setForeground(foreground);
+ foreground.dispose();
+ deleteAssociationLink.setImage( ImageRepository.getDeleteButtonImage(this.resourceManager));
+ deleteAssociationLink.setToolTipText( JptUiEntityGenMessages.GenerateEntitiesWizard_assocPage_delAssoc );
+ deleteAssociationLink.addSelectionListener(new SelectionListener(){
+ public void widgetDefaultSelected(SelectionEvent e) {}
+ public void widgetSelected(SelectionEvent e) {
+ Association association = associationList.getSelectedAssociation();
+ if( association != null ){
+ ORMGenCustomizer customizer = getCustomizer();
+ customizer.deleteAssociation(association);
+ List<Association> associations = customizer.getAssociations();
+ associationList.updateAssociations(associations);
+ if( associations.size()==0 ){
+ hideAssociationDetail();
+ }
+ }
+ }
+ });
+ deleteAssociationLink.setEnabled(false);
+
+ }
+
+ private void createGenerateAssociationCheckbox(Composite composite, int columns) {
+ generateAssociationCheckBox = new Button(composite, SWT.CHECK);
+ generateAssociationCheckBox.setText( JptUiEntityGenMessages.GenerateEntitiesWizard_assocEditor_genAssoc);
+ generateAssociationCheckBox.addSelectionListener(new SelectionListener() {
+ public void widgetDefaultSelected(SelectionEvent e) {}
+
+ public void widgetSelected(SelectionEvent e) {
+ Association association = associationList.getSelectedAssociation();
+ if( association == null )
+ return;
+ association.setGenerated(generateAssociationCheckBox.getSelection());
+
+ updateAssociationEditPanel(association);
+ associationList.updateSelectedAssociation();
+ }
+
+ });
+
+ fillColumns(generateAssociationCheckBox, columns-1);
+ newLabel(composite, "");
+ }
+
+ @SuppressWarnings("restriction")
+ private void createGenerateReferrerRoleControls(Composite parent, int columns) {
+ referrerRoleCheckBox = new Button(parent, SWT.CHECK);
+ referrerRoleCheckBox.setText( JptUiEntityGenMessages.GenerateEntitiesWizard_assocEditor_entityRef );
+ referrerRoleCheckBox.addSelectionListener(new SelectionListener() {
+ public void widgetDefaultSelected(SelectionEvent e) {}
+
+ public void widgetSelected(SelectionEvent e) {
+ boolean generate = referrerRoleCheckBox.getSelection();
+ //referrerRolePropertyField.setEditable( generate );
+ referrerRolePropertyLabel.setEnabled( generate );
+ referrerRolePropertyField.setEnabled( generate );
+ referrerRoleCascadeField.setEnabled(generate);
+
+ //If both referencedRoleCheckBox and referencedRoleCheckBox unchecked,
+ //the association itself shouldn't be generated
+ if( !generate && !referencedRoleCheckBox.getSelection()){
+ generateAssociationCheckBox.setSelection(false);
+ cardinalityLabel.setEnabled( false );
+ cardinalityCombo.setEnabled(false);
+ referrerRoleCheckBox.setEnabled(false);
+ referencedRoleCheckBox.setEnabled(false);
+ }
+
+ directionalityCheckBoxChanged( );
+
+ if( generate ){
+ AssociationRole role = selectedAssociation.getReferrerRole();
+ referrerRolePropertyField.setText( role.getPropertyName() );
+ }
+ }
+
+ });
+
+ SWTUtil.fillColumnsWithIndent(referrerRoleCheckBox , columns-1, 20 );
+ newLabel(parent, "");//$NON-NLS-1$
+
+ referrerRolePropertyLabel = newLabelWithIndent( parent, JptUiEntityGenMessages.property, 40 );
+ referrerRolePropertyField = new Text( parent, SWT.BORDER);
+ fillColumns(referrerRolePropertyField, 2);
+ referrerRolePropertyField.addModifyListener(new ModifyListener(){
+ @SuppressWarnings("deprecation")
+ public void modifyText(ModifyEvent e) {
+ if( selectedAssociation.getReferrerRole() == null )
+ return;
+ String fieldName = referrerRolePropertyField.getText();
+ IStatus status = JavaConventions.validateFieldName( fieldName );
+ if( !status.matches(IStatus.ERROR) ){
+ selectedAssociation.getReferrerRole().setPropertyName(fieldName);
+ }
+ updateStatus(status);
+ }
+ });
+
+ Label label = new Label( parent, SWT.NONE);
+ label.setText( "" );//$NON-NLS-1$
+ label.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL));
+
+ referrerRoleCascadeField = new StringButtonDialogField( new IStringButtonAdapter(){
+ public void changeControlPressed(DialogField field) {
+ if( editCascade( selectedAssociation.getReferrerRole() )){
+ referrerRoleCascadeField.setText(selectedAssociation.getReferrerRole().getCascade());
+ }
+ }
+ }) ;
+ referrerRoleCascadeField.setLabelText( JptUiEntityGenMessages.cascade );
+ referrerRoleCascadeField.setButtonLabel(""); //$NON-NLS-1$
+ referrerRoleCascadeField.doFillIntoGrid(parent, 3);
+ referrerRoleCascadeField.getTextControl(parent).setEditable(false);
+ int maxFieldWidth = convertWidthInCharsToPixels(40);
+ LayoutUtil.setWidthHint(referrerRoleCascadeField.getTextControl(null), maxFieldWidth );
+ Button btn = referrerRoleCascadeField.getChangeControl(null);
+ GridData data = (GridData)btn.getLayoutData();
+ btn.setImage( ImageRepository.getBrowseButtonImage(this.resourceManager) );
+ data.horizontalAlignment = SWT.BEGINNING;
+ data.widthHint = 30;
+ btn.setLayoutData(data);
+
+ Label labelCtrl = referrerRoleCascadeField.getLabelControl(parent);
+ data = (GridData)labelCtrl.getLayoutData();
+ data.horizontalIndent = 40 ;
+ labelCtrl.setLayoutData(data);
+
+
+ label = new Label( parent, SWT.NONE);
+ label.setText( "" );//$NON-NLS-1$
+ label.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL));
+
+ }
+
+
+ @Override
+ public void setVisible(boolean visible) {
+ super.setVisible(visible);
+ if( visible ){
+ hideAssociationDetail();
+ updateAssociationsListPanel();
+ }
+ }
+
+ private void hideAssociationDetail( ){
+ this.detailPanelStatckLayout.topControl = emptyPanel;
+ this.detailPanel.layout();
+ this.detailPanel.getParent().layout();
+ }
+
+ /**
+ * Updates the status line and the OK button according to the given status
+ *
+ * @param status status to apply
+ */
+ @SuppressWarnings("restriction")
+ protected void updateStatus(IStatus status) {
+ setPageComplete(!status.matches(IStatus.ERROR));
+
+ StatusUtil.applyToStatusLine(this, status);
+ if( status.getCode() == Status.OK ){
+ setMessage(JptUiEntityGenMessages.GenerateEntitiesWizard_assocPage_desc);
+ }
+ }
+
+ @SuppressWarnings("restriction")
+ private void createGenerateReferencedRoleControls(Composite parent, int columns) {
+ referencedRoleCheckBox = new Button(parent, SWT.CHECK);
+ referencedRoleCheckBox.setText( JptUiEntityGenMessages.GenerateEntitiesWizard_assocEditor_setRef );
+ referencedRoleCheckBox.addSelectionListener(new SelectionListener() {
+ public void widgetDefaultSelected(SelectionEvent e) {}
+
+ public void widgetSelected(SelectionEvent e) {
+ boolean generate = referencedRoleCheckBox.getSelection();
+ referencedRolePropertyLabel.setEnabled( generate);
+ referencedRolePropertyField.setEnabled( generate);
+ referencedRoleCascadeField.setEnabled(generate);
+
+ if( !generate && !referrerRoleCheckBox.getSelection()){
+ generateAssociationCheckBox.setSelection(false);
+ cardinalityCombo.setEnabled(false);
+ referrerRoleCheckBox.setEnabled(false);
+ referencedRoleCheckBox.setEnabled(false);
+ }
+ directionalityCheckBoxChanged();
+ if( generate ){
+ AssociationRole role = selectedAssociation.getReferencedRole();
+ referencedRolePropertyField.setText( role.getPropertyName() );
+ }
+ }
+
+ });
+
+ SWTUtil.fillColumnsWithIndent( referencedRoleCheckBox , columns-1, 20 );
+ newLabel(parent, "");//$NON-NLS-1$
+
+ referencedRolePropertyLabel = SWTUtil.newLabelWithIndent(parent, JptUiEntityGenMessages.property, 40 );
+
+ referencedRolePropertyField = new Text( parent, SWT.BORDER);
+ fillColumns(referencedRolePropertyField, 2);
+ referencedRolePropertyField.addModifyListener(new ModifyListener(){
+ public void modifyText(ModifyEvent e) {
+ if( selectedAssociation.getReferencedRole() == null )
+ return ;
+
+ String fieldName = referencedRolePropertyField.getText();
+ IStatus status = JavaConventions.validateIdentifier(fieldName,
+ JavaCore.VERSION_1_3, JavaCore.VERSION_1_3);
+ if( !status.matches(IStatus.ERROR) ){
+ if( !fieldName.equals(selectedAssociation.getReferencedRole().getPropertyName()) )
+ selectedAssociation.getReferencedRole().setPropertyName(fieldName);
+ }
+ updateStatus(status);
+ }
+ });
+
+
+ Label label = new Label( parent, SWT.NONE);
+ label.setText( "" );//$NON-NLS-1$
+ label.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL));
+
+
+ referencedRoleCascadeField = new StringButtonDialogField( new IStringButtonAdapter(){
+ public void changeControlPressed(DialogField field) {
+ if( editCascade( selectedAssociation.getReferencedRole() ) ){
+ referencedRoleCascadeField.setText( selectedAssociation.getReferencedRole().getCascade() );
+ }
+ }
+ }) ;
+ referencedRoleCascadeField.setLabelText( JptUiEntityGenMessages.cascade );
+ referencedRoleCascadeField.setButtonLabel(""); //$NON-NLS-1$
+ referencedRoleCascadeField.doFillIntoGrid(parent, 3);
+ referencedRoleCascadeField.getTextControl(parent).setEditable( false);
+ int maxFieldWidth = convertWidthInCharsToPixels(40);
+ LayoutUtil.setWidthHint(referencedRoleCascadeField.getTextControl(null), maxFieldWidth );
+ Button btn = referencedRoleCascadeField.getChangeControl(null);
+ btn.setImage( ImageRepository.getBrowseButtonImage(this.resourceManager) );
+ GridData data = (GridData)btn.getLayoutData();
+ data.horizontalAlignment = SWT.BEGINNING;
+ data.widthHint = 30;
+ btn.setLayoutData(data);
+
+ Label labelCtrl = referencedRoleCascadeField.getLabelControl(parent);
+ data = (GridData)labelCtrl.getLayoutData();
+ data.horizontalIndent = 40 ;
+ labelCtrl.setLayoutData(data);
+
+ label = new Label( parent, SWT.NONE);
+ label.setText( "" );//$NON-NLS-1$
+ label.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL));
+
+ }
+
+ private void createDetailPanel(Composite composite ) {
+
+ this.detailPanel = new Composite( composite, SWT.NONE);
+ GridData gd = new GridData(GridData.FILL_HORIZONTAL);
+ gd.grabExcessVerticalSpace = false;
+ this.detailPanel.setLayoutData(gd);
+ this.detailPanelStatckLayout = new StackLayout();
+ this.detailPanel.setLayout( this.detailPanelStatckLayout );
+
+ emptyPanel = new Composite( detailPanel, SWT.NONE);
+ emptyPanel.setLayoutData(new GridData());
+ detailPanelStatckLayout.topControl = emptyPanel;
+ detailPanel.layout();
+
+ composite.layout();
+ }
+
+
+ private Composite createAssociationsEditPanel(Composite composite, int columns) {
+ Composite parent = new Composite( composite, SWT.NONE);
+ fillColumns(parent, 4);
+
+ createGenerateAssociationCheckbox(parent,columns);
+ int nColumns= 4 ;
+ GridLayout layout = new GridLayout();
+ layout.numColumns = nColumns;
+ parent.setLayout(layout);
+
+ //Cardinality
+ cardinalityLabel = new Label(parent, SWT.NONE);
+ cardinalityLabel.setText( JptUiEntityGenMessages.cardinality);
+ GridData gd = new GridData();
+ gd.horizontalIndent = 20;
+ cardinalityLabel.setLayoutData( gd );
+
+ cardinalityCombo = new Combo(parent, SWT.SINGLE | SWT.READ_ONLY );
+
+ fillColumns(cardinalityCombo, 1);
+
+ cardinalityCombo.addSelectionListener(new SelectionListener(){
+ public void widgetDefaultSelected(SelectionEvent e) {}
+ public void widgetSelected(SelectionEvent e) {
+ selectedAssociation.setCardinality( cardinalityCombo.getText());
+ associationList.updateSelectedAssociation();
+ }
+ });
+
+ //Adding a filler column
+ Label label = new Label( parent, SWT.NONE);
+ label.setText( "");//$NON-NLS-1$
+ GridData layoutData = new GridData();
+ layoutData.horizontalSpan = 2;
+ layoutData.horizontalAlignment = SWT.FILL;
+ layoutData.grabExcessHorizontalSpace = true;
+ label.setLayoutData(layoutData);
+
+ //Table join condition
+ joinConditionLabel = newLabelWithIndent(parent, JptUiEntityGenMessages.GenerateEntitiesWizard_assocEditor_tableJoin, 20 );
+
+ joinConditionText = new Text( parent, SWT.MULTI | SWT.BORDER );
+ joinConditionText.setEditable(false);
+ joinConditionText.setText(JptUiEntityGenMessages.GenerateEntitiesWizard_assocEditor_joinedWhen);
+ layoutData = new GridData();
+ layoutData.horizontalSpan = 2;
+ layoutData.verticalAlignment = SWT.TOP;
+ layoutData.horizontalAlignment = SWT.FILL;
+ layoutData.grabExcessHorizontalSpace = true;
+ layoutData.grabExcessVerticalSpace = false;
+ layoutData.heightHint = 50;
+ joinConditionText.setLayoutData(layoutData);
+ newLabel(parent, "");//$NON-NLS-1$
+
+ //Generate UI controls for ReferrerRole
+ createGenerateReferrerRoleControls(parent, columns);
+
+ //Generate UI controls for ReferencedRole
+ createGenerateReferencedRoleControls(parent, columns);
+
+
+ return parent;
+ }
+
+ public boolean editCascade(AssociationRole role) {
+ CascadeDialog dlg = CascadeDialog.create(role);
+ if (dlg.open() == Window.CANCEL ) {
+ return false;
+ }
+
+ return true;
+ }
+
+ private void createAssociationsListPanel(Composite parent) {
+ Composite composite = new Composite( parent, SWT.NULL );
+ composite.setLayout( new FillLayout());
+ Color backgroundColor = new Color(Display.getDefault(),255, 0,0);
+ composite.setBackground(backgroundColor);
+ backgroundColor.dispose();
+ GridData layoutData = new GridData();
+ layoutData.horizontalSpan = 1;
+ layoutData.verticalAlignment = SWT.FILL;
+ layoutData.horizontalAlignment = SWT.FILL;
+ layoutData.grabExcessHorizontalSpace = false;
+ layoutData.grabExcessVerticalSpace = true;
+ layoutData.widthHint = 400;
+ layoutData.heightHint = 400;
+ composite.setLayoutData(layoutData);
+
+ associationList = new AssociationsListComposite(composite, this, this.resourceManager);
+ }
+
+ private void launchNewAssociationsWizard() {
+ ORMGenCustomizer customizer = getCustomizer();
+ NewAssociationWizard wizard = new NewAssociationWizard(this.jpaProject, customizer, this.resourceManager);
+
+ WizardDialog dialog = new WizardDialog( this.getShell(), wizard);
+ dialog.create();
+ int returnCode = dialog.open();
+ if (returnCode == Window.OK) {
+ Association association = wizard.getNewAssociation();
+ if( association !=null ){
+ customizer.addAssociation(association);
+ updateForeignKeyColumnGenProperty(association);
+ updateAssociationsListPanel();
+ }
+ }
+ }
+ /**
+ * For user created association:
+ * If association is to be generated, no need to generate the getter/setter for the column itself
+ */
+ private void updateForeignKeyColumnGenProperty(Association association) {
+ //Need to process MANY_TO_ONE only since the the associations list are optimized to have MANY_TO_ONE
+ if( association.isCustom() && association.getCardinality().equals( Association.MANY_TO_ONE ) ){
+ boolean generateColumn = !association.isGenerated();
+ //The "MANY" side DB table
+ //ORMGenTable table1 = association.getReferrerTable();
+ //The "ONE" side DB table
+ //ORMGenTable table2 = association.getReferencedTable();
+ //The list of foreign key columns in the MANY side, should not be generated
+ //The list of primary keys in the ONE side, will be generated
+ //List<ORMGenColumn> list2 = association.getReferencedColumns();
+ List<ORMGenColumn> list1 = association.getReferrerColumns();
+ for(ORMGenColumn c : list1 ){
+ if( c.isGenerated() != generateColumn){
+ if( !generateColumn && c.getDbColumn().isPartOfPrimaryKey() ){
+ continue;
+ }
+ c.setGenerated(generateColumn);
+ c.setInsertable(generateColumn);
+ c.setUpdateable(generateColumn);
+ }
+ }
+ }
+ }
+
+ private void updateAssociationsListPanel() {
+ ORMGenCustomizer customizer = getCustomizer();
+ //If user changed the connection or schema
+ if( this.customizer != customizer ){
+ this.customizer = customizer;
+ }
+ List<Association> associations = customizer.getAssociations();
+ this.associationList.updateAssociations( associations );
+ }
+
+ @SuppressWarnings("restriction")
+ public void updateAssociationEditPanel(Association association) {
+ this.selectedAssociation = association;
+
+ boolean enabled = association.isCustom();
+ this.deleteAssociationLink.setEnabled(enabled);
+
+ //Create and display the associationsEditPanel if it was hidden before
+ if( associationsEditPanel == null ){
+ associationsEditPanel = this.createAssociationsEditPanel(this.detailPanel, 4);
+ }
+ this.detailPanelStatckLayout.topControl = associationsEditPanel;
+ this.detailPanel.layout();
+ this.detailPanel.getParent().layout();
+
+ //Update the UI controls from the model
+ String table1Name = association.getReferrerTableName();
+ String table2Name = association.getReferencedTableName();
+ String joinTableName = association.getJoinTableName();
+
+ boolean isGenerated = association.isGenerated();
+ this.generateAssociationCheckBox.setSelection(isGenerated);
+ this.referrerRolePropertyLabel.setEnabled( isGenerated );
+ this.referrerRolePropertyField.setEnabled( isGenerated );
+ this.referrerRoleCheckBox.setEnabled( isGenerated );
+ this.referencedRolePropertyLabel.setEnabled( isGenerated );
+ this.referencedRolePropertyField.setEnabled( isGenerated );
+ this.referencedRoleCheckBox.setEnabled( isGenerated );
+ this.cardinalityLabel.setEnabled(isGenerated);
+ this.cardinalityCombo.setEnabled(isGenerated);
+ this.joinConditionLabel.setEnabled( isGenerated );
+ this.joinConditionText.setEnabled( isGenerated );
+
+ String cardinality = association.getCardinality();
+ if( Association.MANY_TO_MANY.equals( cardinality ) ){
+ cardinalityCombo.removeAll();
+ cardinalityCombo.add( Association.MANY_TO_MANY);
+ }else{
+ cardinalityCombo.removeAll();
+ cardinalityCombo.add( Association.MANY_TO_ONE);
+ cardinalityCombo.add( Association.ONE_TO_ONE);
+ }
+
+ cardinalityCombo.setText(cardinality);
+ cardinalityCombo.setEnabled(enabled);
+
+ String text = null;
+ //if MTM
+ if( Association.MANY_TO_MANY.equals( cardinality ) ){
+ text = String.format( JptUiEntityGenMessages.GenerateEntitiesWizard_assocEditor_setRef, table2Name, table1Name);
+ }else{
+ text = String.format( JptUiEntityGenMessages.GenerateEntitiesWizard_assocEditor_entityRef, table2Name, table1Name);
+ }
+ this.referrerRoleCheckBox.setText(text);
+
+ //if OTO
+ if( Association.ONE_TO_ONE.equals( cardinality ) ){
+ text = String.format( JptUiEntityGenMessages.GenerateEntitiesWizard_assocEditor_entityRef, table1Name, table2Name);
+ }else{
+ text = String.format( JptUiEntityGenMessages.GenerateEntitiesWizard_assocEditor_setRef, table1Name, table2Name);
+ }
+ this.referencedRoleCheckBox.setText(text);
+
+ //AssociationRole properties
+ AssociationRole referrerRole = association.getReferrerRole();
+ if( referrerRole != null){
+ this.referrerRoleCheckBox.setSelection( true );
+ this.referrerRolePropertyField.setEditable(true);
+ this.referrerRolePropertyField.setText(referrerRole.getPropertyName());
+ this.referrerRoleCascadeField.setEnabled(true);
+ String cascade = referrerRole.getCascade();
+ if( cascade!=null )
+ this.referrerRoleCascadeField.setText( cascade );
+
+ //if MTO:
+ if( Association.MANY_TO_ONE.equals( cardinality ) ){
+ this.referrerRoleCheckBox.setEnabled( false );
+ }
+ }else{
+ this.referrerRoleCheckBox.setSelection( false );
+ this.referrerRolePropertyLabel.setEnabled(false);
+ this.referrerRolePropertyField.setEditable(false);
+ this.referrerRolePropertyField.setText("");
+ this.referrerRoleCascadeField.setEnabled(false);
+ }
+
+ AssociationRole referencedRole = association.getReferencedRole();
+ if( referencedRole != null){
+ this.referencedRoleCheckBox.setSelection( true );
+ this.referencedRolePropertyLabel.setEnabled(true);
+ this.referencedRolePropertyField.setEditable(true);
+ this.referencedRolePropertyField.setText(referencedRole.getPropertyName());
+ this.referencedRoleCascadeField.setEnabled(true);
+ String cascade = referencedRole.getCascade();
+ if( cascade!=null )
+ this.referencedRoleCascadeField.setText(cascade);
+ }else{
+ this.referencedRoleCheckBox.setSelection( false );
+ this.referencedRolePropertyLabel.setEnabled(false);
+ this.referencedRolePropertyField.setEditable(false);
+ this.referencedRolePropertyField.setText("");
+ this.referencedRoleCascadeField.setEnabled(false);
+ }
+
+ //Join conditions
+ updateJoinConditions(association, table1Name, table2Name, joinTableName);
+ }
+
+ private void updateJoinConditions(Association association,
+ String table1Name, String table2Name, String joinTableName) {
+ String text = "%s";
+ if( joinTableName == null ){
+ StringBuilder strText = new StringBuilder();
+ //text = JptUiEntityGenMessages.GenerateEntitiesWizard_assocEditor_joinedWhen;
+ List<String> columnList1 = association.getReferrerColumnNames() ;
+ List<String> columnList2 = association.getReferencedColumnNames();
+ for( int i=0; i < columnList1.size(); i++){
+ strText.append( table1Name + "." + columnList1.get(i) );//$NON-NLS-1$
+ strText.append( "=" );//$NON-NLS-1$
+ strText.append( table2Name + "." + columnList2.get(i) );//$NON-NLS-1$
+ if( i < columnList1.size()-1 )
+ strText.append( "\n AND " );//$NON-NLS-1$
+ }
+ joinConditionText.setText( String.format( text , strText.toString()) );
+ }else{
+ StringBuilder strText = new StringBuilder();
+ //text = JptUiEntityGenMessages.GenerateEntitiesWizard_assocEditor_joinedWhen;
+ List<String> columnList1 = association.getReferrerColumnNames() ;
+ List<String> joinColumnList1 = association.getReferrerJoinColumnNames() ;
+ for( int i=0; i < columnList1.size(); i++){
+ strText.append( table1Name + "." + columnList1.get(i) );//$NON-NLS-1$
+ strText.append( "=" );//$NON-NLS-1$
+ strText.append( joinTableName + "." + joinColumnList1.get(i) );
+ strText.append( "\n AND " );//$NON-NLS-1$
+ }
+
+ List<String> joinTableColumnList2 = association.getReferencedJoinColumnNames();
+ List<String> columnList2 = association.getReferencedColumnNames();
+ for( int i=0; i < joinTableColumnList2.size(); i++){
+ strText.append( joinTableName + "." + joinTableColumnList2.get(i) );
+ strText.append( "=" );//$NON-NLS-1$
+ strText.append( table2Name + "." + columnList2.get(i) );//$NON-NLS-1$
+ if( i < joinTableColumnList2.size()-1 )
+ strText.append( "\n AND " );//$NON-NLS-1$
+ }
+
+ joinConditionText.setText( String.format( text , strText.toString()) );
+
+ }
+ }
+
+ /**
+ * Called when one of referrerRoleCheckBox or referencedRoleCheckBox
+ * changes value.
+ *
+ */
+ private void directionalityCheckBoxChanged() {
+ String dir;
+ if (referrerRoleCheckBox.getSelection()) {
+ dir = referencedRoleCheckBox.getSelection() ? Association.BI_DI : Association.NORMAL_DI;
+ } else {
+ if (referencedRoleCheckBox.getSelection()) {
+ dir = Association.OPPOSITE_DI;
+ } else {
+ dir = null;
+ }
+ }
+ if (dir != null) {
+ selectedAssociation.setDirectionality(dir);
+ } else {
+ selectedAssociation.setGenerated(false);
+ }
+
+ this.associationList.updateSelectedAssociation();
+ }
+
+ private ORMGenCustomizer getCustomizer(){
+ GenerateEntitiesFromSchemaWizard wizard = (GenerateEntitiesFromSchemaWizard) this.getWizard();
+ return wizard.getCustomizer();
+ }
+
+
+ @Override
+ public final void performHelp()
+ {
+ this.getHelpSystem().displayHelp( GenerateEntitiesFromSchemaWizard.HELP_CONTEXT_ID );
+ }
+
+ protected final IWorkbenchHelpSystem getHelpSystem() {
+ return PlatformUI.getWorkbench().getHelpSystem();
+ }
+
+ @Override
+ public void dispose() {
+ //when the JPA project wizard page is shown first, the other wizard pages are lazily built, thus
+ //associationList can be null - bug 307894
+ if (this.associationList != null) {
+ this.associationList.dispose();
+ }
+ super.dispose();
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/gen/TableFigure.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/gen/TableFigure.java
new file mode 100644
index 0000000000..7cf16fa95c
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/gen/TableFigure.java
@@ -0,0 +1,86 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2010 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.ui.internal.wizards.gen;
+
+import org.eclipse.draw2d.ColorConstants;
+import org.eclipse.draw2d.Figure;
+import org.eclipse.draw2d.Graphics;
+import org.eclipse.draw2d.GridLayout;
+import org.eclipse.draw2d.Label;
+import org.eclipse.draw2d.LineBorder;
+import org.eclipse.draw2d.PositionConstants;
+import org.eclipse.draw2d.geometry.Insets;
+import org.eclipse.draw2d.geometry.Rectangle;
+import org.eclipse.jface.resource.ResourceManager;
+import org.eclipse.jpt.jpa.ui.internal.ImageRepository;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.Font;
+
+/**
+ * A draw2D figure representing a database table
+ *
+ */
+public class TableFigure extends Figure
+{
+ private Color tableColor = new Color(null, 220, 232, 241);
+
+ private Font tableFont = new Font(null, "Arial", 8, SWT.NONE); //$NON-NLS-1$
+
+ private Color borderColor = new Color(null, 14, 66, 115);
+
+ public static final int OUTLINE_CORNER_RADIUS = 6;
+
+ protected final ResourceManager resourceManager;
+
+ public TableFigure(String name, ResourceManager resourceManager) {
+ this.resourceManager = resourceManager;
+ GridLayout gl = new GridLayout();
+ gl.marginHeight = 2;
+ gl.marginWidth = 10;
+ setLayoutManager(gl);
+ setBorder(new LineBorder(this.tableColor, 0));
+ setBackgroundColor(this.tableColor);
+ setOpaque(true);
+ setSize(150, 20);
+ Label nameLabel = new Label("", ImageRepository.getTableObjImage(this.resourceManager));
+ nameLabel.setFont(this.tableFont);
+ nameLabel.setText(name);
+ nameLabel.setForegroundColor(this.borderColor);
+ nameLabel.setLabelAlignment(PositionConstants.CENTER);
+ add(nameLabel);
+ }
+
+ @Override
+ protected void paintClientArea(Graphics graphics) {
+ super.paintClientArea(graphics);
+ graphics.pushState();
+ Rectangle r = getBounds().getCopy();
+ graphics.drawRoundRectangle(r.expand(new Insets(-1, -1, -2, -2)), OUTLINE_CORNER_RADIUS, OUTLINE_CORNER_RADIUS);
+ graphics.popState();
+ }
+
+ @Override
+ public void setEnabled(boolean enabled) {
+ super.setEnabled(enabled);
+ if (enabled) {
+ setBackgroundColor(this.tableColor);
+ }
+ else {
+ setBackgroundColor(ColorConstants.white);
+ }
+ }
+
+ public void dispose() {
+ this.borderColor.dispose();
+ this.tableFont.dispose();
+ this.tableColor.dispose();
+ }
+} \ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/gen/TableGenPanel.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/gen/TableGenPanel.java
new file mode 100644
index 0000000000..926e72b0a5
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/gen/TableGenPanel.java
@@ -0,0 +1,400 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2010 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.ui.internal.wizards.gen;
+
+import java.util.List;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.jdt.core.JavaConventions;
+import org.eclipse.jface.wizard.WizardPage;
+import org.eclipse.jpt.jpa.gen.internal.ORMGenTable;
+import org.eclipse.jpt.jpa.ui.JptJpaUiPlugin;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.layout.RowLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+
+/**
+ * The UI panel for setting the default and specific
+ * table entity generation properties.
+ *
+ */
+class TableGenPanel
+{
+ WizardPage wizardPage ;
+
+ private Text classNameField; // used in setting individual table/entity generation only
+
+ private Combo idGeneratorCombo;
+ private Text sequenceNameField;
+
+ private Button entityAccessField;
+ private Button entityAccessProperty;
+ private Button associationFetchDefault;
+ private Button associationFetchEager;
+ private Button associationFetchLazy;
+
+ private Button collectionTypeSet;
+ private Button collectionTypeList;
+
+ private Button generateOptionalAnnotations;
+
+ private Label sequenceNameNoteLabel;
+
+ private boolean isUpdatingControls;
+
+ private ORMGenTable mTable;
+
+ private boolean isDefaultTable = false;
+
+ public TableGenPanel(Composite parent, int columns , boolean isDefaultTable, WizardPage wizardPage ){
+ super();
+ this.wizardPage = wizardPage;
+ this.isDefaultTable = isDefaultTable;
+ createTableMappingPropertiesGroup(parent, columns);
+ SWTUtil.createLabel(parent, 4, ""); //$NON-NLS-1$
+ }
+
+ protected void createTableMappingPropertiesGroup(Composite composite, int columns) {
+ Group parent = new Group(composite, SWT.NONE );
+ parent.setText( JptUiEntityGenMessages.GenerateEntitiesWizard_defaultTablePage_tableMapping);
+ parent.setLayout(new GridLayout(columns, false));
+ GridData layoutData = new GridData();
+ layoutData.horizontalSpan = columns;
+ layoutData.verticalAlignment = SWT.FILL;
+ layoutData.horizontalAlignment = SWT.FILL;
+ layoutData.grabExcessHorizontalSpace = true;
+ layoutData.grabExcessVerticalSpace = false;
+ parent.setLayoutData(layoutData);
+
+ createClassNameControl(parent, columns);
+
+ createIdGeneratorControls(parent, columns);
+ createEntityAccessControls(parent, columns);
+
+ //AssociationFetch and CollectionType only available for default table generation
+ if ( isDefaultTable ) {
+ createAssociationFetchControls(parent, columns);
+ createCollectionTypeControls(parent, columns);
+ createGenerateOptionalAnnotationControls(parent, columns);
+ }
+ }
+
+ private void createGenerateOptionalAnnotationControls(Group parent, int columns) {
+ generateOptionalAnnotations = new Button(parent, SWT.CHECK );
+ generateOptionalAnnotations.setText( JptUiEntityGenMessages.GenerateEntitiesWizard_defaultTablePage_genOptionalAnnotations);
+ generateOptionalAnnotations.setToolTipText(JptUiEntityGenMessages.GenerateEntitiesWizard_defaultTablePage_genOptionalAnnotations_desc);
+
+ GridData gd = new GridData();
+ gd.horizontalSpan = columns;
+ generateOptionalAnnotations.setLayoutData(gd);
+ generateOptionalAnnotations.addSelectionListener(new SelectionListener(){
+ public void widgetDefaultSelected(SelectionEvent e) {}
+ public void widgetSelected(SelectionEvent e) {
+ boolean selected = generateOptionalAnnotations.getSelection();
+ mTable.setGenerateDDLAnnotations(selected);
+ }
+ });
+ }
+
+ private void createClassNameControl(Composite parent, int columns) {
+ //Customize class name for specific table only
+ if ( !isDefaultTable ) {
+ SWTUtil.createLabel( parent, 1 , JptUiEntityGenMessages.GenerateEntitiesWizard_tablePanel_className );
+
+ classNameField = new Text(parent, SWT.SINGLE | SWT.BORDER );
+ //mPackageNameField.setEditable(false);
+ SWTUtil.fillColumns(classNameField,3);
+ classNameField.addModifyListener(new ModifyListener(){
+ @SuppressWarnings({ "deprecation" })
+ public void modifyText(ModifyEvent e) {
+ if (e.getSource() == null || !isUpdatingControls) {
+ String className = classNameField.getText();
+ IStatus status = JavaConventions.validateJavaTypeName( className );
+ if( !status.matches(IStatus.ERROR) ){
+ mTable.setClassName( className );
+ wizardPage.setErrorMessage(null);
+ }else{
+ wizardPage.setErrorMessage(status.getMessage());
+ }
+ }
+ }
+ });
+ }
+ }
+
+ class AssociationFetchListener implements SelectionListener{
+ public void widgetDefaultSelected(SelectionEvent e) {}
+ public void widgetSelected(SelectionEvent e) {
+ if (!isUpdatingControls) {
+ Button radioBtn = (Button)e.getSource();
+ mTable.setDefaultFetch( radioBtn.getData().toString());
+ }
+ }
+ }
+
+ private void createAssociationFetchControls(Composite composite, int columns) {
+ SWTUtil.createLabel(composite, 1, JptUiEntityGenMessages.GenerateEntitiesWizard_defaultTablePage_fetch );
+
+ Composite parent = new Composite( composite, SWT.NONE);
+ parent.setLayout(new RowLayout());
+ SWTUtil.fillColumns( parent , 3);
+ associationFetchDefault = new Button( parent, SWT.RADIO );
+ associationFetchDefault.setText( "Default");
+ associationFetchDefault.setData( ORMGenTable.DEFAULT_FETCH );
+
+ associationFetchEager = new Button( parent, SWT.RADIO );
+ associationFetchEager.setText( "&Eager");
+ associationFetchEager.setData( ORMGenTable.EAGER_FETCH );
+
+ associationFetchLazy = new Button( parent, SWT.RADIO );
+ associationFetchLazy.setText( "La&zy");
+ associationFetchLazy.setData( ORMGenTable.LAZY_FETCH );
+
+ AssociationFetchListener associationFetchListener = new AssociationFetchListener();
+ associationFetchDefault.addSelectionListener( associationFetchListener );
+ associationFetchLazy.addSelectionListener( associationFetchListener );
+ associationFetchEager.addSelectionListener( associationFetchListener );
+ }
+
+ class CollectionTypeListener implements SelectionListener {
+ public void widgetDefaultSelected(SelectionEvent e) {}
+ public void widgetSelected(SelectionEvent e) {
+ if (!isUpdatingControls) {
+ Button radioBtn = (Button)e.getSource();
+ mTable.setDefaultCollectionType( radioBtn.getData().toString());
+ }
+ }
+ }
+
+ private void createCollectionTypeControls(Composite composite, int columns) {
+ SWTUtil.createLabel(composite, 1, JptUiEntityGenMessages.GenerateEntitiesWizard_defaultTablePage_collType );
+
+ Composite parent = new Composite( composite, SWT.NONE);
+ parent.setLayout(new RowLayout());
+ SWTUtil.fillColumns( parent , 3);
+
+ this.collectionTypeSet = new Button( parent, SWT.RADIO);
+ this.collectionTypeSet.setText( "java.util.Se&t");
+ this.collectionTypeSet.setData( ORMGenTable.SET_COLLECTION_TYPE );
+ this.collectionTypeList = new Button( parent, SWT.RADIO);
+ this.collectionTypeList.setText("java.util.&List");
+ this.collectionTypeList.setData(ORMGenTable.LIST_COLLECTION_TYPE);
+
+ CollectionTypeListener collectionTypeListener = new CollectionTypeListener();
+ collectionTypeList.addSelectionListener( collectionTypeListener );
+ collectionTypeSet.addSelectionListener( collectionTypeListener );
+ }
+
+
+ public void setORMGenTable(ORMGenTable table) {
+ mTable = table;
+
+ isUpdatingControls = true;
+
+ try {
+ //ClassNameField is not available for default table
+ if(classNameField!= null )
+ classNameField.setText( mTable.getClassName() );
+
+ final List<String> schemes = this.mTable.getCustomizer().getAllIdGenerators();
+ String[] values = new String[schemes.size()];
+ schemes.toArray(values);
+ idGeneratorCombo.setItems( values );
+ String idGenerator = mTable.getIdGenerator();
+ idGeneratorCombo.setText( idGenerator);
+
+ boolean isSequence = this.mTable.getCustomizer().getSequenceIdGenerators().contains(idGenerator);
+ String sequenceName = mTable.isDefaultsTable() ? mTable.getSequence() : mTable.getFormattedSequence();
+ sequenceName = ( sequenceName == null ? "" : sequenceName );
+ sequenceNameField.setText( sequenceName );
+ if ( isSequence ) {
+ sequenceNameField.setEnabled(true);
+ sequenceNameNoteLabel.setEnabled(true);
+ } else {
+ sequenceNameField.setEnabled(false);
+ sequenceNameNoteLabel.setEnabled(false);
+ }
+
+ String access = mTable.getAccess() ;
+ if ( ORMGenTable.FIELD_ACCESS.equals( access ) ) {
+ this.entityAccessField.setSelection( true );
+ this.entityAccessProperty.setSelection( false );
+ } else {
+ this.entityAccessProperty.setSelection( true );
+ this.entityAccessField.setSelection( false );
+ }
+
+ if (associationFetchLazy != null && associationFetchEager != null ) {
+ String defaultFetch = mTable.getDefaultFetch();
+ //reset all three buttons
+ associationFetchDefault.setSelection(false);
+ associationFetchEager.setSelection(false);
+ associationFetchLazy.setSelection(false);
+ if( ORMGenTable.DEFAULT_FETCH.equals( defaultFetch ) )
+ associationFetchDefault.setSelection(true);
+ else if( ORMGenTable.EAGER_FETCH.equals( defaultFetch ) )
+ associationFetchEager.setSelection(true);
+ else
+ associationFetchLazy.setSelection(true);
+ }
+
+ //DefaultTable only
+ if (collectionTypeList != null) {
+ String cType = mTable.getDefaultCollectionType();
+ if ( ORMGenTable.LIST_COLLECTION_TYPE.equals( cType ) ) {
+ this.collectionTypeList.setSelection( true );
+ this.collectionTypeSet.setSelection( false );
+ } else {
+ this.collectionTypeSet.setSelection( true );
+ this.collectionTypeList.setSelection( false );
+ }
+
+ this.generateOptionalAnnotations.setSelection( mTable.isGenerateDDLAnnotations());
+ }
+
+ } catch (Exception e) {
+ JptJpaUiPlugin.log(e);
+ }
+
+ isUpdatingControls = false;
+ }
+
+ private void createIdGeneratorControls(Composite parent, int columns) {
+ SWTUtil.createLabel(parent, 1, JptUiEntityGenMessages.GenerateEntitiesWizard_defaultTablePage_keyGen );
+
+ idGeneratorCombo = new Combo(parent,SWT.SINGLE | SWT.READ_ONLY);
+ SWTUtil.fillColumns(idGeneratorCombo, 3);
+
+ idGeneratorCombo.addSelectionListener( new SelectionListener() {
+ public void widgetDefaultSelected(SelectionEvent e) {}
+
+ public void widgetSelected(SelectionEvent e) {
+ if (isUpdatingControls) {
+ return;
+ }
+
+ idGenChanged();
+ }});
+
+ SWTUtil.createLabel(parent, 1, JptUiEntityGenMessages.GenerateEntitiesWizard_defaultTablePage_sequence );
+ sequenceNameField = new Text( parent, SWT.SINGLE | SWT.BORDER );
+
+ SWTUtil.fillColumns(sequenceNameField, 3);
+ sequenceNameField.addModifyListener(new ModifyListener(){
+ public void modifyText(ModifyEvent e) {
+ if (e.getSource() == null || !isUpdatingControls) {
+
+ if ( idGeneratorCombo.getText().equals("sequence")) { //$NON-NLS-1$
+ String sequenceName = sequenceNameField.getText();
+ if ( sequenceName.toLowerCase().indexOf("$table") >= 0 || //$NON-NLS-1$
+ sequenceName.toLowerCase().indexOf("$pk") >= 0 ) { //$NON-NLS-1$
+ sequenceName = convertVarToLowerCase("$table", sequenceName); //$NON-NLS-1$
+ sequenceName = convertVarToLowerCase("$pk", sequenceName); //$NON-NLS-1$
+ }
+ if ( sequenceName.trim().length() != 0 ) {
+ mTable.setSequence( sequenceName );
+ } else{
+ mTable.setSequence( "" ); //$NON-NLS-1$
+ }
+ }
+ }
+ }
+
+ private String convertVarToLowerCase(String var, String sequenceName) {
+ int n = sequenceName.toLowerCase().indexOf( var );
+ if( n==0 ) {
+ return var + sequenceName.substring( var.length());
+ } else if( n >0 ) {
+ return sequenceName.substring(0,n) + var + sequenceName.substring( n + var.length());
+ }
+ return sequenceName;
+ }
+ });
+
+ SWTUtil.newLabel(parent, "");//$NON-NLS-1$
+ sequenceNameNoteLabel = new Label(parent, SWT.NONE);
+ String text =String.format( JptUiEntityGenMessages.GenerateEntitiesWizard_defaultTablePage_sequenceNote,
+ ORMGenTable.TABLE_SEQ_PATTERN, ORMGenTable.PK_SEQ_PATTERN);
+ sequenceNameNoteLabel.setText( text ) ;
+ sequenceNameNoteLabel.setEnabled(false);
+ SWTUtil.fillColumns( sequenceNameNoteLabel, 3);
+ }
+
+ private void idGenChanged() {
+ String scheme = idGeneratorCombo.getText();
+ mTable.setIdGenerator(scheme);
+
+ boolean isSequence = this.mTable.getCustomizer().getSequenceIdGenerators().contains(scheme);
+ if (!isSequence) {
+ sequenceNameField.setText("");
+ sequenceNameField.setEnabled(false);
+ mTable.setSequence(null);
+ sequenceNameNoteLabel.setEnabled(false);
+ } else {
+ sequenceNameField.setEnabled(true);
+ Color NOTE_LABEL_COLOR = new Color( Display.getDefault(), 102,102,102);
+ sequenceNameNoteLabel.setForeground( NOTE_LABEL_COLOR );
+ NOTE_LABEL_COLOR.dispose();
+ sequenceNameNoteLabel.setEnabled(true);
+ if ( sequenceNameField.getText().length()==0 ) {
+ String newMessage = "Please specify a sequence name";
+ this.wizardPage.setMessage(newMessage);
+ this.wizardPage.setPageComplete(true);
+ } else {
+ this.wizardPage.setErrorMessage(null);
+ this.wizardPage.setPageComplete(true);
+ }
+ }
+ }
+
+ class EntityAccessFetchListener implements SelectionListener{
+ public void widgetDefaultSelected(SelectionEvent e) {}
+ public void widgetSelected(SelectionEvent e) {
+ if (!isUpdatingControls) {
+ Button radioBtn = (Button)e.getSource();
+ mTable.setAccess( radioBtn.getData().toString() );
+ }
+ }
+ }
+
+ private void createEntityAccessControls(Composite composite, int columns) {
+ SWTUtil.createLabel(composite, 1, JptUiEntityGenMessages.GenerateEntitiesWizard_defaultTablePage_access );
+
+ Composite parent = new Composite( composite, SWT.NONE);
+ SWTUtil.fillColumns( parent , 3);
+ parent.setLayout(new RowLayout());
+
+ entityAccessField = new Button( parent, SWT.RADIO );
+ entityAccessField.setText( "&Field" ); //$NON-NLS1$
+ entityAccessField.setData( ORMGenTable.FIELD_ACCESS);
+
+ entityAccessProperty = new Button( parent, SWT.RADIO );
+ entityAccessProperty.setText( "&Property" );//$NON-NLS1$
+ entityAccessProperty.setData( ORMGenTable.PROPERTY_ACCESS );
+
+ EntityAccessFetchListener entityAccessFetchListener = new EntityAccessFetchListener();
+ entityAccessField.addSelectionListener( entityAccessFetchListener );
+ entityAccessProperty.addSelectionListener( entityAccessFetchListener );
+ }
+
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/gen/TablesAndColumnsCustomizationWizardPage.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/gen/TablesAndColumnsCustomizationWizardPage.java
new file mode 100644
index 0000000000..1dd211762d
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/gen/TablesAndColumnsCustomizationWizardPage.java
@@ -0,0 +1,377 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2010 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.ui.internal.wizards.gen;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.jdt.core.IJavaElement;
+import org.eclipse.jdt.internal.ui.wizards.dialogfields.LayoutUtil;
+import org.eclipse.jdt.ui.wizards.NewTypeWizardPage;
+import org.eclipse.jface.dialogs.IMessageProvider;
+import org.eclipse.jface.resource.ResourceManager;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.TreeSelection;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jpt.jpa.core.JpaProject;
+import org.eclipse.jpt.jpa.gen.internal.ORMGenColumn;
+import org.eclipse.jpt.jpa.gen.internal.ORMGenCustomizer;
+import org.eclipse.jpt.jpa.gen.internal.ORMGenTable;
+import org.eclipse.jpt.jpa.ui.internal.ImageRepository;
+import org.eclipse.jpt.jpa.ui.internal.JpaHelpContextIds;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.StackLayout;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.help.IWorkbenchHelpSystem;
+
+public class TablesAndColumnsCustomizationWizardPage extends NewTypeWizardPage {
+
+ private JpaProject jpaProject;
+
+ private TreeViewer tableColumnTreeViewer;
+
+ private Composite detailPanel ;
+ private StackLayout detailPanelStatckLayout;
+ private Composite tableGenDetatilGroup;
+ private ColumnGenPanel columnGenPanel;
+ private Composite columnGenDetatilGroup;
+ private TableGenPanel tableGenPanel;
+ private ORMGenTable selectedTable;
+
+ private ORMGenCustomizer customizer;
+
+ protected final ResourceManager resourceManager;
+
+ protected TablesAndColumnsCustomizationWizardPage(JpaProject jpaProject, ResourceManager resourceManager) {
+ super(true, "TablesAndColumnsCustomizationWizardPage"); //$NON-NLS-1$
+ this.jpaProject = jpaProject;
+ this.resourceManager = resourceManager;
+ setTitle( JptUiEntityGenMessages.GenerateEntitiesWizard_tablesAndColumnsPage_title );
+ setMessage( JptUiEntityGenMessages.GenerateEntitiesWizard_tablesAndColumnsPage_desc);
+ }
+
+ // -------- Initialization ---------
+ /**
+ * The wizard owning this page is responsible for calling this method with the
+ * current selection. The selection is used to initialize the fields of the wizard
+ * page.
+ *
+ * @param selection used to initialize the fields
+ */
+ void init(IStructuredSelection selection) {
+ if ( jpaProject != null ) {
+ IJavaElement jelem = this.jpaProject.getJavaProject();
+ initContainerPage(jelem);
+ initTypePage(jelem);
+ }
+ }
+
+ public void createControl(Composite parent) {
+ initializeDialogUnits(parent);
+ Composite composite = new Composite(parent, SWT.NULL);
+ int nColumns= 1 ;
+ GridLayout layout = new GridLayout();
+ layout.numColumns = nColumns;
+ composite.setLayout(layout);
+ this.getHelpSystem().setHelp(composite, JpaHelpContextIds.GENERATE_ENTITIES_WIZARD_CUSTOMIZE_INDIVIDUAL_ENTITIES);
+
+ createTableAndColumnsListPanel(composite, 1);
+
+ SWTUtil.createLabel( composite, 1, ""); //$NON-NLS-1$
+
+ SWTUtil.createSeparator(composite, 1);
+
+ createGenerateDetailGroup(composite, 1);
+
+ setControl(composite);
+ this.setPageComplete( true );
+ }
+
+ /**
+ * A panel with JFace TreeViewer showing tables and columns to be generated into JPA entities
+ *
+ * @param parent
+ * @param columns
+ */
+ private void createTableAndColumnsListPanel(Composite parent, int columns) {
+ Label label = new Label(parent, columns );
+ label.setText( JptUiEntityGenMessages.GenerateEntitiesWizard_tablesAndColumnsPage_labelTableAndColumns );
+ SWTUtil.fillColumns( label , columns);
+
+ GridData data = new GridData();
+ data.horizontalSpan = columns;
+ data.verticalAlignment = SWT.FILL;
+ data.horizontalAlignment = SWT.FILL;
+ data.grabExcessHorizontalSpace = true;
+ data.heightHint = 200;
+ data.grabExcessVerticalSpace = true;
+
+ tableColumnTreeViewer = new TreeViewer(parent);
+ tableColumnTreeViewer.getTree().setLayoutData( data);
+ tableColumnTreeViewer.setContentProvider(new TableColumnTreeContentProvider());
+ tableColumnTreeViewer.setLabelProvider(new TableColumnTreeLabelProvider());
+
+ tableColumnTreeViewer.addSelectionChangedListener( new ISelectionChangedListener(){
+ public void selectionChanged(SelectionChangedEvent event) {
+ updateDetailPanel(event.getSelection());
+ }
+
+ });
+ }
+
+ @Override
+ public void setVisible(boolean visible) {
+ super.setVisible(visible);
+ if(visible){
+ ORMGenCustomizer customizer = getCustomizer();
+ //If user changed the connection or schema
+ if( this.customizer != customizer ){
+ this.customizer = customizer;
+ tableColumnTreeViewer.setInput( customizer );
+ }else{
+ tableColumnTreeViewer.refresh();
+ }
+ List<String> tableNames = this.customizer.getTableNames();
+
+ //Select the first table
+ ORMGenTable ormGenTable = this.customizer.getTable(tableNames.get(0));
+ updateTabelGenDetail( ormGenTable );
+ }
+ }
+
+
+ private void updateDetailPanel(ISelection selection) {
+ TreeSelection ts = (TreeSelection)selection;
+ Object selectedObject = ts.getFirstElement();
+ if( selectedObject instanceof ORMGenTable ){
+ updateTabelGenDetail( (ORMGenTable)selectedObject );
+ }else if( selectedObject instanceof ORMGenColumn ){
+ updateColumnGenDetail( (ORMGenColumn)selectedObject );
+ }
+ }
+
+ private void updateColumnGenDetail(ORMGenColumn column) {
+ if(columnGenDetatilGroup==null){
+ columnGenDetatilGroup = new Composite(detailPanel, SWT.NONE);
+ GridLayout gridLayout = new GridLayout();
+ gridLayout.numColumns = 4;
+ columnGenDetatilGroup.setLayout(gridLayout);
+ this.columnGenPanel = new ColumnGenPanel(columnGenDetatilGroup, 4, getCustomizer() , this );
+ }
+ columnGenPanel.setColumn(column);
+ this.detailPanelStatckLayout.topControl = columnGenDetatilGroup;
+ this.detailPanel.layout();
+ detailPanel.getParent().layout();
+ }
+
+ private void updateTabelGenDetail(ORMGenTable table) {
+ this.selectedTable = table;
+ if(tableGenDetatilGroup==null){
+ tableGenDetatilGroup = new Composite(detailPanel, SWT.NONE);
+ GridLayout gridLayout = new GridLayout();
+ gridLayout.numColumns = 4;
+ tableGenDetatilGroup.setLayout(gridLayout);
+
+ this.tableGenPanel = new TableGenPanel(tableGenDetatilGroup, 4 , false, this );
+ createDomainJavaClassesPropertiesGroup(tableGenDetatilGroup, 4 );
+ }
+ tableGenPanel.setORMGenTable(table);
+
+ this.detailPanelStatckLayout.topControl = tableGenDetatilGroup;
+ this.detailPanel.layout();
+
+ String baseClass = table.getExtends();
+ if( baseClass!= null )
+ setSuperClass(baseClass, true);
+
+ setSuperInterfaces( table.getImplements(), true);
+
+ detailPanel.getParent().layout();
+ }
+
+ protected void createDomainJavaClassesPropertiesGroup(Composite composite, int columns) {
+ Group parent = new Group( composite, SWT.NONE);
+ parent.setText( JptUiEntityGenMessages.GenerateEntitiesWizard_defaultTablePage_domainJavaClass );
+ parent.setLayout(new GridLayout(columns, false));
+ SWTUtil.fillColumns( parent, columns);
+
+ createSuperClassControls(parent, columns);
+ createSuperInterfacesControls(parent, columns);
+
+ //Resize supper class text width to fill the parent group.
+ //Have to do it indirectly since fSuperClassDialogField is private in super class.
+ Control[] controls = parent.getChildren();
+ if( controls.length>1 && controls[1] instanceof Text ){
+ Text text = (Text)(parent.getChildren()[1]);
+ LayoutUtil.setWidthHint(text, getMaxFieldWidth());
+ LayoutUtil.setHorizontalGrabbing(text);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jdt.ui.wizards.NewTypeWizardPage#superClassChanged()
+ */
+ @Override
+ protected IStatus superClassChanged() {
+ IStatus status = super.superClassChanged();
+ String baseClass = getSuperClass();
+ if(baseClass!=null && this.selectedTable!=null ){
+ String oldBaseClass = this.selectedTable.getExtends();
+ if( !oldBaseClass.equals(baseClass ))
+ this.selectedTable.setExtends(baseClass);
+ }
+ return status;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jdt.ui.wizards.NewTypeWizardPage#addSuperInterface(java.lang.String)
+ */
+ @Override
+ @SuppressWarnings("unchecked")
+ public boolean addSuperInterface(String superInterface) {
+ super.addSuperInterface(superInterface);
+ List interfaces = getSuperInterfaces();
+ if(this.selectedTable!=null)
+ this.selectedTable.setImplements(interfaces);
+ return true;
+ }
+
+ @Override
+ protected void handleFieldChanged(String fieldName) {
+ super.handleFieldChanged(fieldName);
+ if( this.fSuperClassStatus.matches(IStatus.ERROR)){
+ updateStatus(fSuperClassStatus);
+ }else{
+ setMessage("", IMessageProvider.NONE);
+ setErrorMessage(null);
+ }
+
+ }
+
+ private ORMGenCustomizer getCustomizer(){
+ GenerateEntitiesFromSchemaWizard wizard = (GenerateEntitiesFromSchemaWizard) this.getWizard();
+ return wizard.getCustomizer();
+ }
+ /**
+ * Content provider, and label provider for the DB Table/Column TreeViewer
+ *
+ */
+ class TableColumnTreeContentProvider implements ITreeContentProvider {
+ public Object[] getElements(Object inputElement) {
+ if( inputElement instanceof ORMGenCustomizer ){
+ ORMGenCustomizer input = (ORMGenCustomizer )inputElement;
+ List<String> tableNameList = input.getGenTableNames();
+ List<ORMGenTable> ret = new ArrayList<ORMGenTable>();
+ for(String t : tableNameList){
+ ORMGenTable ormGenTable = getCustomizer().getTable( t );
+ ret.add( ormGenTable );
+ }
+ return ret.toArray();
+ }
+ return new Object[]{};
+ }
+ public Object[] getChildren(Object parentElement) {
+ if( parentElement instanceof ORMGenTable ){
+ ORMGenTable table = (ORMGenTable) parentElement;
+ List<ORMGenColumn> columns = table.getColumns();
+ List<ORMGenColumn> ret = new ArrayList<ORMGenColumn>();
+ for( ORMGenColumn col : columns){
+ if( col.isForeignKey() )
+ continue;
+ if( col.isPrimaryKey() ){
+ ret.add(0,col );
+ }else{
+ ret.add(col);
+ }
+ }
+ return ret.toArray();
+ }
+ return new Object[]{};
+ }
+ public Object getParent(Object element) {
+ if( element instanceof ORMGenColumn){
+ return null;
+ }
+ return null;
+ }
+ public boolean hasChildren(Object element) {
+ return( element instanceof ORMGenTable );
+ }
+ public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {}
+ public void dispose() {}
+ }
+
+ class TableColumnTreeLabelProvider extends LabelProvider{
+
+ @Override
+ public Image getImage(Object element) {
+ if( element instanceof ORMGenTable ){
+ return ImageRepository.getTableImage(resourceManager);
+ }else if( element instanceof ORMGenColumn ){
+ ORMGenColumn col = ( ORMGenColumn)element;
+ return col.isPrimaryKey() ?
+ ImageRepository.getKeyColumnImage(resourceManager) :
+ ImageRepository.getColumnImage(resourceManager);
+ }
+ return null;
+ }
+
+
+ @Override
+ public String getText(Object element) {
+ if( element instanceof ORMGenTable ){
+ return ((ORMGenTable)element).getName();
+ }else if( element instanceof ORMGenColumn ){
+ return ((ORMGenColumn)element).getName();
+ }
+ return super.getText(element);
+ }
+ }
+
+ private void createGenerateDetailGroup(Composite parent, int columns) {
+ detailPanel = new Composite(parent, SWT.NONE);
+ SWTUtil.fillColumns( detailPanel, columns);
+
+ detailPanelStatckLayout = new StackLayout();
+ detailPanel.setLayout(detailPanelStatckLayout);
+
+ Composite emptyPanel = new Composite(detailPanel, SWT.NONE);
+ emptyPanel.setLayoutData(new GridData());
+
+ detailPanelStatckLayout.topControl = emptyPanel;
+ detailPanel.layout();
+ }
+
+ @Override
+ public final void performHelp()
+ {
+ this.getHelpSystem().displayHelp( GenerateEntitiesFromSchemaWizard.HELP_CONTEXT_ID );
+ }
+
+ protected final IWorkbenchHelpSystem getHelpSystem() {
+ return PlatformUI.getWorkbench().getHelpSystem();
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/gen/TablesSelectorWizardPage.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/gen/TablesSelectorWizardPage.java
new file mode 100644
index 0000000000..a4613f3e00
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/gen/TablesSelectorWizardPage.java
@@ -0,0 +1,557 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2010 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.ui.internal.wizards.gen;
+
+import java.lang.reflect.InvocationTargetException;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.jface.operation.IRunnableWithProgress;
+import org.eclipse.jface.resource.ResourceManager;
+import org.eclipse.jface.viewers.CheckboxTableViewer;
+import org.eclipse.jface.viewers.ColumnWeightData;
+import org.eclipse.jface.viewers.IBaseLabelProvider;
+import org.eclipse.jface.viewers.IContentProvider;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.IStructuredContentProvider;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.ITableLabelProvider;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerSorter;
+import org.eclipse.jface.wizard.IWizardPage;
+import org.eclipse.jface.wizard.WizardPage;
+import org.eclipse.jpt.common.ui.internal.util.SWTUtil;
+import org.eclipse.jpt.common.ui.internal.util.TableLayoutComposite;
+import org.eclipse.jpt.common.utility.internal.CollectionTools;
+import org.eclipse.jpt.jpa.core.JpaProject;
+import org.eclipse.jpt.jpa.db.ConnectionProfile;
+import org.eclipse.jpt.jpa.db.JptJpaDbPlugin;
+import org.eclipse.jpt.jpa.db.Schema;
+import org.eclipse.jpt.jpa.db.Table;
+import org.eclipse.jpt.jpa.gen.internal.ORMGenCustomizer;
+import org.eclipse.jpt.jpa.ui.JptJpaUiPlugin;
+import org.eclipse.jpt.jpa.ui.internal.ImageRepository;
+import org.eclipse.jpt.jpa.ui.internal.JpaHelpContextIds;
+import org.eclipse.jpt.jpa.ui.internal.JptUiMessages;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.KeyAdapter;
+import org.eclipse.swt.events.KeyEvent;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.TableColumn;
+import org.eclipse.swt.widgets.TableItem;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.help.IWorkbenchHelpSystem;
+
+class TablesSelectorWizardPage extends WizardPage{
+
+ private static final int TABLE_COLUMN_INDEX = 0;
+ private JpaProject jpaProject;
+ private Schema schema = null;
+ private ORMGenCustomizer customizer = null;
+ private boolean updatePersistenceXml = true;
+
+ private DatabaseGroup databaseGroup;
+ private CheckboxTableViewer tableTable;
+ private Button updatePersistenceXmlCheckBox;
+
+ protected final ResourceManager resourceManager;
+
+ TablesSelectorWizardPage(JpaProject jpaProject, ResourceManager resourceManager) {
+ super("TablesSelectorWizardPage"); //$NON-NLS-1$
+ this.jpaProject = jpaProject;
+ this.resourceManager = resourceManager;
+ this.schema = jpaProject.getDefaultDbSchema();
+ setTitle(JptUiEntityGenMessages.GenerateEntitiesWizard_tableSelectPage_selectTable );
+ setMessage(JptUiEntityGenMessages.GenerateEntitiesWizard_tableSelectPage_chooseEntityTable );
+ }
+
+ @Override
+ public void setVisible(boolean visible) {
+ super.setVisible(visible);
+ doStatusUpdate();
+ }
+
+ // -------- Provide access to wrapped DTP connection related classes ---------
+ ConnectionProfile getProjectConnectionProfile() {
+ String profileName = this.jpaProject.getDataSource().getConnectionProfileName();
+ return this.connectionProfileNamed(profileName);
+ }
+
+ ConnectionProfile connectionProfileNamed(String profileName) {
+ return JptJpaDbPlugin.getConnectionProfileFactory().buildConnectionProfile(profileName);
+ }
+
+ Schema getSchema(){
+ return this.schema;
+ }
+
+ void setSchema(Schema s){
+ this.schema = s;
+ }
+
+ private Collection<Table> possibleTables() {
+ Schema schema = this.getSchema();
+ if (schema != null && schema.getName() != null) {
+ return CollectionTools.collection(schema.getTables());
+ }
+ return Collections.<Table> emptyList();
+ }
+
+ public void createControl(Composite parent) {
+ initializeDialogUnits(parent);
+
+ Composite composite = new Composite(parent, SWT.NULL);
+ int nColumns= 3;
+ GridLayout layout = new GridLayout();
+ layout.numColumns = nColumns;
+ composite.setLayout(layout);
+ this.getHelpSystem().setHelp(composite, JpaHelpContextIds.GENERATE_ENTITIES_WIZARD_SELECT_TABLES);
+
+ this.databaseGroup = createDatabaseGroup(composite, 400);
+
+ createTablesSelectionControl(composite, nColumns);
+
+
+ this.updatePersistenceXmlCheckBox = new Button(composite, SWT.CHECK);
+ this.updatePersistenceXmlCheckBox.setText(JptUiEntityGenMessages.GenerateEntitiesWizard_tableSelectPage_updatePersistenceXml );
+ this.updatePersistenceXmlCheckBox.setSelection(updatePersistenceXml());
+ this.updatePersistenceXmlCheckBox.addSelectionListener(new SelectionListener() {
+ public void widgetDefaultSelected(SelectionEvent e) {}
+
+ public void widgetSelected(SelectionEvent e) {
+ setShouldUpdatePersistenceXml(updatePersistenceXmlCheckBox.getSelection());
+ }
+
+ });
+ fillColumns( this.updatePersistenceXmlCheckBox, 3);
+
+
+ //Filler column
+ new Label( composite, SWT.NONE);
+ //Restore default button
+ final Button restoreBtn = new Button(composite, SWT.PUSH );
+ restoreBtn.setText( JptUiEntityGenMessages.GenerateEntitiesWizard_tableSelectPage_Restore_Defaults );
+ restoreBtn.addSelectionListener(new SelectionListener() {
+ public void widgetDefaultSelected(SelectionEvent e) {}
+ public void widgetSelected(SelectionEvent e) {
+ if( customizer!=null && customizer.getFile()!=null ){
+ if( customizer.getFile().exists() ){
+ customizer.getFile().delete();
+ }
+ deselectAllTables();
+ restoreUpdatePersistenceXmlDefault();
+ }
+ }
+
+ });
+ GridData gridData = new GridData();
+ gridData.horizontalAlignment = SWT.END;
+ restoreBtn.setLayoutData(gridData);
+
+ this.updateSelectionState(databaseGroup.getSelectedSchema());
+ this.getHelpSystem().setHelp(this.tableTable.getControl(), JpaHelpContextIds.DIALOG_GENERATE_ENTITIES_TABLES);
+ this.setControl(composite);
+
+ this.setPageComplete(true);
+ }
+
+ private void restoreUpdatePersistenceXmlDefault(){
+ updatePersistenceXmlCheckBox.setSelection(true);
+ setShouldUpdatePersistenceXml(true);
+ }
+
+ @Override
+ public void dispose() {
+ if (this.databaseGroup != null)
+ this.databaseGroup.dispose();
+ super.dispose();
+ }
+
+ @Override
+ public IWizardPage getPreviousPage() {
+ IWizardPage prevPage = super.getPreviousPage();
+ if (prevPage instanceof PromptJPAProjectWizardPage)
+ //Prevent going back to the PromptJPAProjectWizardPage
+ //if JPA project already selected
+ return prevPage.getPreviousPage();
+ else
+ return prevPage;
+ }
+
+ private DatabaseGroup createDatabaseGroup(Composite parent, int widthHint) {
+ DatabaseGroup dbGroup = new DatabaseGroup(this.getContainer(), jpaProject, parent, resourceManager, widthHint);
+ /**
+ * listen for when the Database Connection changes its selected schema
+ * so we can keep the page in synch
+ */
+ class DatabasePageListener implements DatabaseGroup.Listener {
+ public void selectedConnectionProfileChanged(ConnectionProfile connectionProfile) {
+ jpaProject.getDataSource().setConnectionProfileName(connectionProfile.getName());
+ }
+ @SuppressWarnings("unchecked")
+ public void selectedSchemaChanged(Schema schema) {
+ if (schema==null) {
+ updateTablesListViewer(Collections.EMPTY_LIST );
+ } else {
+ // store the *identifier* in the JPA project, since it gets put in Java annotations
+ jpaProject.setUserOverrideDefaultSchema(schema.getIdentifier());
+ setSchema( schema );
+ updateSelectionState(schema);
+ }
+ doStatusUpdate();
+ }
+ }
+ dbGroup.addListener(new DatabasePageListener());
+ dbGroup.init();
+ return dbGroup;
+ }
+
+ private boolean updatePersistenceXml() {
+ return this.updatePersistenceXml;
+ }
+
+ private void setShouldUpdatePersistenceXml(boolean updatePersistenceXml){
+ this.updatePersistenceXml = updatePersistenceXml;
+ doStatusUpdate();
+ }
+
+ private void selectAllTables(){
+ this.tableTable.setAllChecked(true);
+ doStatusUpdate();
+ }
+
+ private void deselectAllTables(){
+ this.tableTable.setAllChecked(false);
+ doStatusUpdate();
+ }
+
+ private void initTablesSelectionControl(Collection<Table> possibleTables) {
+ this.tableTable.setInput(possibleTables);
+ }
+
+ private void createTablesSelectionControl(Composite parent, int columns) {
+ Label tableLabel = new Label(parent, SWT.NONE);
+ GridData gd= new GridData();
+ gd.horizontalAlignment = GridData.FILL;
+ gd.verticalAlignment = GridData.BEGINNING;
+ tableLabel.setLayoutData( gd );
+ tableLabel.setText( JptUiEntityGenMessages.GenerateEntitiesWizard_tableSelectPage_tables );
+
+ TableLayoutComposite layout= new TableLayoutComposite(parent, SWT.NONE);
+ addColumnLayoutData(layout);
+
+ final org.eclipse.swt.widgets.Table table = new org.eclipse.swt.widgets.Table(layout, SWT.H_SCROLL | SWT.V_SCROLL | SWT.SINGLE | SWT.FULL_SELECTION | SWT.BORDER | SWT.CHECK);
+
+ TableColumn tableNameColumn = new TableColumn(table, SWT.NONE, TABLE_COLUMN_INDEX);
+ tableNameColumn.setText(JptUiEntityGenMessages.GenerateEntitiesWizard_tableSelectPage_tableColumn );
+ tableNameColumn.setResizable(true);
+
+ gd= new GridData(GridData.FILL_BOTH);
+ gd.heightHint= SWTUtil.getTableHeightHint(table, 20);
+ gd.widthHint = 250;
+ gd.grabExcessHorizontalSpace = true;
+ gd.grabExcessVerticalSpace = true ;
+ layout.setLayoutData(gd);
+ Color backgroundColor = new Color( Display.getDefault(), 255, 0,0);
+ layout.setBackground(backgroundColor);
+ backgroundColor.dispose();
+
+ this.tableTable = new CheckboxTableViewer(table);
+ this.tableTable.setUseHashlookup(true);
+ this.tableTable.setLabelProvider(this.buildTableTableLabelProvider());
+ this.tableTable.setContentProvider(this.buildTableTableContentProvider());
+ this.tableTable.setSorter(new ViewerSorter() {
+ @Override
+ public int compare(Viewer viewer, Object e1, Object e2) {
+ return ((Table) e1).getName().compareTo(((Table) e2).getName());
+ }
+ });
+
+ this.tableTable.addPostSelectionChangedListener(new ISelectionChangedListener() {
+ public void selectionChanged(SelectionChangedEvent event) {
+ handleTablesListSelectionChanged(event);
+ }
+ });
+
+ table.addKeyListener(new KeyAdapter() {
+ @Override
+ public void keyPressed(KeyEvent e) {
+ if (e.keyCode == SWT.F2 && e.stateMask == SWT.NONE) {
+ editEntityNameIfPossible();
+ e.doit= false;
+ }
+ }
+ });
+
+ createButtonComposite(parent);
+ initTablesSelectionControl(possibleTables());
+ }
+
+ private void createButtonComposite(Composite parent){
+
+ Composite buttonComposite = new Composite(parent, SWT.NULL);
+ GridLayout buttonLayout = new GridLayout(1, false);
+ buttonLayout.marginHeight = 0;
+ buttonLayout.marginWidth = 0;
+
+ buttonComposite.setLayout(buttonLayout);
+ GridData data = new GridData();
+ data.horizontalAlignment = GridData.FILL;
+ data.verticalAlignment = GridData.BEGINNING;
+ buttonComposite.setLayoutData(data);
+
+ Button selectAllButton = new Button(buttonComposite, SWT.PUSH);
+ selectAllButton.setToolTipText(JptUiMessages.General_selectAll);
+ selectAllButton.setImage( ImageRepository.getSelectAllButtonImage(this.resourceManager) );
+ GridData gridData = new GridData();
+ gridData.horizontalAlignment = GridData.FILL;
+ selectAllButton.setLayoutData(gridData);
+ selectAllButton.addSelectionListener(new SelectionListener() {
+ public void widgetDefaultSelected(SelectionEvent e) {}
+
+ public void widgetSelected(SelectionEvent e) {
+ selectAllTables();
+ }
+ });
+
+ Button deselectAllButton = new Button(buttonComposite, SWT.PUSH);
+ deselectAllButton.setToolTipText(JptUiMessages.General_deselectAll);
+ deselectAllButton.setImage( ImageRepository.getDeselectAllButtonImage(this.resourceManager) );
+ gridData = new GridData();
+ gridData.horizontalAlignment = GridData.FILL;
+ deselectAllButton.setLayoutData(gridData);
+ deselectAllButton.addSelectionListener(new SelectionListener() {
+ public void widgetDefaultSelected(SelectionEvent e) {}
+
+ public void widgetSelected(SelectionEvent e) {
+ deselectAllTables();
+ }
+ });
+ }
+
+
+ private void addColumnLayoutData(TableLayoutComposite layout) {
+ layout.addColumnData(new ColumnWeightData(50, true));
+ }
+
+ void editEntityNameIfPossible(){
+ Object[] selected = ((IStructuredSelection) this.tableTable.getSelection()).toArray();
+ if (selected.length != 1) {
+ return;
+ }
+ }
+
+ void handleTablesListSelectionChanged(SelectionChangedEvent event) {
+ doStatusUpdate();
+ }
+
+ private IBaseLabelProvider buildTableTableLabelProvider() {
+ return new TableTableLabelProvider();
+ }
+
+ private IContentProvider buildTableTableContentProvider() {
+ return new TableTableContentProvider();
+ }
+
+ public Schema getDefaultSchema() {
+ return this.jpaProject.getDefaultDbSchema() ;
+ }
+
+ Collection<Table> getSelectedTables() {
+ ArrayList<Table> selectedTables = new ArrayList<Table>();
+ for (Object selectedTable : this.tableTable.getCheckedElements())
+ selectedTables.add((Table) selectedTable);
+ return selectedTables;
+ }
+
+ private boolean hasTablesSelected() {
+ return (this.tableTable != null) ? (this.getSelectedTables().size() > 0) : false;
+ }
+
+ void updateTablesListViewer(Collection<Table> possibleTables) {
+ if (this.tableTable != null) {
+ this.initTablesSelectionControl(possibleTables);
+ }
+ }
+
+ /**
+ * Update the status line and the OK button according to the given status
+ */
+ protected void doStatusUpdate() {
+ if ( ! this.hasTablesSelected()) {
+ this.setPageComplete(false);
+ }else{
+ setPageComplete(true);
+ try{
+ getContainer().run(false, false, new IRunnableWithProgress(){
+ public void run( final IProgressMonitor monitor )
+ throws InvocationTargetException, InterruptedException
+ {
+ monitor.beginTask("Updating", 10);
+
+ Collection<Table> ret = getSelectedTables();
+ ArrayList<String> tableNames = new ArrayList<String>();
+ for( Table t : ret ){
+ tableNames.add(t.getName());
+ }
+ Schema schema = getSchema();
+ if( schema == null ){
+ return ;
+ }
+ customizer.setSchema(schema);
+ customizer.setTableNames(tableNames);
+ customizer.setUpdatePersistenceXml(updatePersistenceXml);
+ monitor.done();
+ }
+ });
+ } catch (Exception e) {
+ JptJpaUiPlugin.log(e);
+ }
+
+ }
+ }
+
+ // ********** inner classes **********
+ private class TableTableLabelProvider extends LabelProvider implements ITableLabelProvider {
+
+ TableTableLabelProvider() {
+ super();
+ }
+
+ @Override
+ public String getText(Object element) {
+ return ((Table) element).getName();
+ }
+
+ public Image getColumnImage(Object element, int columnIndex) {
+ return null;
+ }
+
+ public String getColumnText(Object element, int columnIndex) {
+ if (element == null) {
+ return null;
+ }
+ switch (columnIndex) {
+ case TABLE_COLUMN_INDEX:
+ return ((Table) element).getName();
+
+ }
+ throw new IllegalArgumentException("invalid column index: " + columnIndex);// $NON-NLS-1$
+ }
+
+ }
+
+
+ private class TableTableContentProvider implements IStructuredContentProvider {
+
+ TableTableContentProvider() {
+ super();
+ }
+
+ public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { }
+
+ public void dispose() {}
+
+ public Object[] getElements(Object inputElement) {
+ return ((Collection<?>) inputElement).toArray();
+ }
+
+ }
+
+ private void updateSelectionState(final Schema schema) {
+ if(schema ==null)
+ return;
+ this.jpaProject.setUserOverrideDefaultSchema( schema.getIdentifier());
+
+ updateTablesListViewer(CollectionTools.collection(schema.getTables()));
+
+ //Create the ORMGenCustomizer
+ GenerateEntitiesFromSchemaWizard wizard = (GenerateEntitiesFromSchemaWizard) getWizard();
+ customizer = wizard.createORMGenCustomizer( schema );
+
+ if( this.tableTable!=null && this.updatePersistenceXmlCheckBox!=null && customizer != null ){
+ restoreWizardState();
+ }
+ doStatusUpdate();
+
+ }
+
+ private boolean restoreWizardState(){
+ boolean pageComplete = false;
+ this.updatePersistenceXmlCheckBox.setSelection(this.customizer.updatePersistenceXml());
+ List<String> preSelectedTableNames = this.customizer.getTableNames();
+ if(preSelectedTableNames!=null && preSelectedTableNames.size()>0) {
+ Set<String> set = new HashSet<String>();
+ for(String s : preSelectedTableNames ){
+ set.add(s);
+ }
+ TableItem[] items = this.tableTable.getTable().getItems();
+ for (int i = 0; i < items.length; ++i) {
+ TableItem item = items[i];
+ org.eclipse.jpt.jpa.db.Table element = (org.eclipse.jpt.jpa.db.Table)item.getData();
+ if (element != null) {
+ boolean check = set.contains(element.getName());
+ // only set if different, to avoid flicker
+ if (item.getChecked() != check) {
+ item.setChecked(check);
+ pageComplete = true;
+ }
+ }
+ }
+ }
+ return pageComplete;
+ }
+
+
+ /**
+ * Set the layoutData of the input control to occupy specified number of columns
+ * @param c
+ * @param columns
+ */
+ private void fillColumns(Control c, int columns){
+ GridData layoutData = new GridData();
+ layoutData.horizontalSpan = columns;
+ layoutData.verticalAlignment = SWT.FILL;
+ layoutData.horizontalAlignment = SWT.FILL;
+ layoutData.grabExcessHorizontalSpace = true;
+ layoutData.grabExcessVerticalSpace = false;
+ c.setLayoutData(layoutData);
+ return ;
+ }
+
+ @Override
+ public final void performHelp()
+ {
+ this.getHelpSystem().displayHelp( GenerateEntitiesFromSchemaWizard.HELP_CONTEXT_ID );
+ }
+
+ protected final IWorkbenchHelpSystem getHelpSystem() {
+ return PlatformUI.getWorkbench().getHelpSystem();
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/orm/MappingFileNewFileWizardPage.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/orm/MappingFileNewFileWizardPage.java
new file mode 100644
index 0000000000..4803e1d5ec
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/orm/MappingFileNewFileWizardPage.java
@@ -0,0 +1,76 @@
+/*******************************************************************************
+ * Copyright (c) 2010, 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.ui.internal.wizards.orm;
+
+import static org.eclipse.jpt.common.core.internal.operations.JptFileCreationDataModelProperties.*;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.ui.dialogs.WizardNewFileCreationPage;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+
+public class MappingFileNewFileWizardPage
+ extends WizardNewFileCreationPage {
+
+ protected IDataModel dataModel;
+
+
+ public MappingFileNewFileWizardPage(
+ String pageName, IStructuredSelection selection, IDataModel dataModel,
+ String title, String description) {
+
+ super(pageName, selection);
+ init(dataModel);
+ setTitle(title);
+ setDescription(description);
+ }
+
+
+ protected void init(IDataModel dataModel) {
+ this.dataModel = dataModel;
+ IPath containerPath = (IPath) this.dataModel.getProperty(CONTAINER_PATH);
+ if (containerPath != null) {
+ setContainerFullPath(containerPath);
+ }
+ String fileName = (String) this.dataModel.getProperty(FILE_NAME);
+ if (fileName != null) {
+ setFileName(fileName);
+ }
+ }
+
+ @Override
+ protected boolean validatePage() {
+ this.dataModel.setProperty(CONTAINER_PATH, getContainerFullPath());
+ this.dataModel.setProperty(FILE_NAME, getFileName());
+
+ boolean valid = super.validatePage();
+ if (! valid) {
+ return valid;
+ }
+
+ IStatus validationStatus = this.dataModel.validateProperty(CONTAINER_PATH);
+ if (validationStatus.isOK()) {
+ validationStatus = this.dataModel.validateProperty(FILE_NAME);
+ }
+ if (validationStatus.isOK()) {
+ setErrorMessage(null);
+ return true;
+ }
+ else if (validationStatus.getSeverity() == IStatus.WARNING) {
+ setErrorMessage(null);
+ setMessage(validationStatus.getMessage(), IStatus.WARNING);
+ return true;
+ }
+ else {
+ setErrorMessage(validationStatus.getMessage());
+ return false;
+ }
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/orm/MappingFileOptionsWizardPage.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/orm/MappingFileOptionsWizardPage.java
new file mode 100644
index 0000000000..d6484a7f06
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/orm/MappingFileOptionsWizardPage.java
@@ -0,0 +1,125 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 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.ui.internal.wizards.orm;
+
+import static org.eclipse.jpt.common.core.internal.operations.JptFileCreationDataModelProperties.*;
+import static org.eclipse.jpt.jpa.core.internal.operations.OrmFileCreationDataModelProperties.*;
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jpt.jpa.ui.internal.JptUiMessages;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wst.common.frameworks.internal.datamodel.ui.DataModelWizardPage;
+
+public class MappingFileOptionsWizardPage
+ extends DataModelWizardPage {
+
+ private Label accessLabel;
+
+ private Combo accessCombo;
+
+ private Button addToPersistenceUnitButton;
+
+ private Label persistenceUnitLabel;
+
+ private Combo persistenceUnitCombo;
+
+
+ public MappingFileOptionsWizardPage(
+ String pageName, IDataModel dataModel,
+ String title, String description) {
+
+ super(dataModel, pageName);
+ setTitle(title);
+ setDescription(description);
+ setPageComplete(false);
+ }
+
+
+ @Override
+ protected String[] getValidationPropertyNames() {
+ return new String[] {
+ CONTAINER_PATH,
+ FILE_NAME,
+ DEFAULT_ACCESS,
+ ADD_TO_PERSISTENCE_UNIT,
+ PERSISTENCE_UNIT
+ };
+ }
+
+ @Override
+ protected Composite createTopLevelComposite(Composite parent) {
+ Composite composite = new Composite(parent, SWT.NULL);
+ GridLayout layout = new GridLayout();
+ layout.numColumns = 3;
+ composite.setLayout(layout);
+ GridData data = new GridData();
+ data.verticalAlignment = GridData.FILL;
+ data.horizontalAlignment = GridData.FILL;
+ composite.setLayoutData(data);
+
+ this.accessLabel = new Label(composite, SWT.NONE);
+ this.accessLabel.setText(JptUiMessages.MappingFileWizardPage_accessLabel);
+ data = new GridData();
+ this.accessLabel.setLayoutData(data);
+
+ this.accessCombo = new Combo(composite, SWT.BORDER | SWT.READ_ONLY);
+ data = new GridData(GridData.FILL_HORIZONTAL);
+ data.horizontalSpan = 1;
+ data.grabExcessHorizontalSpace = true;
+ this.accessCombo.setLayoutData(data);
+ this.synchHelper.synchCombo(this.accessCombo, DEFAULT_ACCESS, null);
+ new Label(composite, SWT.NONE);
+
+ this.addToPersistenceUnitButton = new Button(composite, SWT.CHECK | SWT.BEGINNING);
+ this.addToPersistenceUnitButton.setText(JptUiMessages.MappingFileWizardPage_addToPersistenceUnitButton);
+ data = new GridData(GridData.FILL_HORIZONTAL);
+ data.horizontalSpan = 3;
+ data.verticalIndent = 10;
+ this.addToPersistenceUnitButton.setLayoutData(data);
+ this.synchHelper.synchCheckbox(this.addToPersistenceUnitButton, ADD_TO_PERSISTENCE_UNIT, null);
+
+ this.persistenceUnitLabel = new Label(composite, SWT.NONE);
+ this.persistenceUnitLabel.setText(JptUiMessages.MappingFileWizardPage_persistenceUnitLabel);
+ data = new GridData();
+ data.horizontalIndent = 10;
+ this.persistenceUnitLabel.setLayoutData(data);
+ this.persistenceUnitLabel.setEnabled(false);
+ this.addToPersistenceUnitButton.addSelectionListener(new SelectionListener() {
+ public void widgetSelected(SelectionEvent e) {
+ persistenceUnitLabel.setEnabled(addToPersistenceUnitButton.getSelection());
+ }
+ public void widgetDefaultSelected(SelectionEvent e) {/*not called*/}
+ });
+
+ this.persistenceUnitCombo = new Combo(composite, SWT.BORDER | SWT.READ_ONLY);
+ data = new GridData(GridData.FILL_HORIZONTAL);
+ data.horizontalSpan = 1;
+ data.grabExcessHorizontalSpace = true;
+ this.persistenceUnitCombo.setLayoutData(data);
+ this.synchHelper.synchCombo(this.persistenceUnitCombo, PERSISTENCE_UNIT, null);
+
+ new Label(composite, SWT.NONE);
+
+// classText.setFocus();
+ PlatformUI.getWorkbench().getHelpSystem().setHelp(composite, getInfopopID());
+ Dialog.applyDialogFont(parent);
+ return composite;
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/orm/MappingFileWizard.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/orm/MappingFileWizard.java
new file mode 100644
index 0000000000..b1b70cea79
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/orm/MappingFileWizard.java
@@ -0,0 +1,347 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 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.ui.internal.wizards.orm;
+
+import static org.eclipse.jpt.common.core.internal.operations.JptFileCreationDataModelProperties.*;
+import static org.eclipse.jpt.jpa.core.internal.operations.OrmFileCreationDataModelProperties.*;
+import java.lang.reflect.InvocationTargetException;
+import org.eclipse.core.resources.IContainer;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.operation.IRunnableWithProgress;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.window.Window;
+import org.eclipse.jface.wizard.IWizardPage;
+import org.eclipse.jface.wizard.Wizard;
+import org.eclipse.jface.wizard.WizardDialog;
+import org.eclipse.jpt.common.core.JptCommonCorePlugin;
+import org.eclipse.jpt.common.core.internal.utility.PlatformTools;
+import org.eclipse.jpt.jpa.core.JpaFacet;
+import org.eclipse.jpt.jpa.core.context.JpaContextNode;
+import org.eclipse.jpt.jpa.core.context.persistence.PersistenceUnit;
+import org.eclipse.jpt.jpa.core.internal.operations.OrmFileCreationDataModelProvider;
+import org.eclipse.jpt.jpa.ui.JptJpaUiPlugin;
+import org.eclipse.jpt.jpa.ui.internal.JptUiIcons;
+import org.eclipse.jpt.jpa.ui.internal.JptUiMessages;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.INewWizard;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.ide.IDE;
+import org.eclipse.wst.common.frameworks.datamodel.DataModelFactory;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModelProvider;
+import org.eclipse.wst.common.frameworks.internal.datamodel.IDataModelPausibleOperation;
+import org.eclipse.wst.common.frameworks.internal.dialog.ui.WarningDialog;
+import org.eclipse.wst.common.frameworks.internal.ui.ErrorDialog;
+import org.eclipse.wst.common.frameworks.internal.ui.WTPCommonUIResourceHandler;
+
+public class MappingFileWizard extends Wizard
+ implements INewWizard
+{
+ protected IDataModel dataModel;
+
+ protected IStructuredSelection initialSelection;
+
+ protected IStructuredSelection mungedSelection;
+
+ private IWizardPage firstPage;
+
+ private IWizardPage secondPage;
+
+
+ public MappingFileWizard() {
+ this(null);
+ }
+
+ public MappingFileWizard(IDataModel dataModel) {
+ super();
+ this.dataModel = dataModel;
+ setWindowTitle(JptUiMessages.MappingFileWizard_title);
+ setDefaultPageImageDescriptor(JptJpaUiPlugin.getImageDescriptor(JptUiIcons.JPA_FILE_WIZ_BANNER));
+ }
+
+
+ public void init(IWorkbench workbench, IStructuredSelection selection) {
+ this.initialSelection = selection;
+ this.mungedSelection = selection;
+
+ if (selection == null || selection.isEmpty()) {
+ return;
+ }
+
+ Object firstSelection = selection.getFirstElement();
+
+ PersistenceUnit pUnit = extractPersistenceUnit(firstSelection);
+ IContainer container = extractContainer(pUnit, firstSelection);
+
+ if (container != null) {
+ this.mungedSelection = new StructuredSelection(container);
+ }
+
+ if (pUnit != null) {
+ getDataModel().setBooleanProperty(ADD_TO_PERSISTENCE_UNIT, true);
+ getDataModel().setStringProperty(PERSISTENCE_UNIT, pUnit.getName());
+ }
+ }
+
+ private PersistenceUnit extractPersistenceUnit(Object selection) {
+ if (selection instanceof JpaContextNode) {
+ // may be null if node is above level of persistence unit, but in those cases
+ // null is the expected result
+ try {
+ return ((JpaContextNode) selection).getPersistenceUnit();
+ }
+ catch (Exception e) { /* do nothing, just continue */ }
+ }
+
+ if (selection instanceof IAdaptable) {
+ JpaContextNode node = (JpaContextNode) ((IAdaptable) selection).getAdapter(JpaContextNode.class);
+ if (node != null) {
+ return node.getPersistenceUnit();
+ }
+ }
+ return null;
+ }
+
+ private IContainer extractContainer(PersistenceUnit pUnit, Object selection) {
+ if (pUnit != null) {
+ return pUnit.getResource().getParent();
+ }
+ if (selection instanceof IProject) {
+ return getDefaultContainer((IProject) selection);
+ }
+ if (selection instanceof IContainer) {
+ return (IContainer) selection;
+ }
+ if (selection instanceof JpaContextNode) {
+ return getDefaultContainer(((JpaContextNode) selection).getJpaProject().getProject());
+ }
+
+ if (selection instanceof IAdaptable) {
+ IResource resource = (IResource) ((IAdaptable) selection).getAdapter(IResource.class);
+ if (resource != null) {
+ if (resource instanceof IProject) {
+ return getDefaultContainer((IProject) resource);
+ }
+ else if (resource instanceof IContainer) {
+ return (IContainer) resource;
+ }
+ }
+ JpaContextNode node = (JpaContextNode) ((IAdaptable) selection).getAdapter(JpaContextNode.class);
+ if (node != null) {
+ return getDefaultContainer(node.getJpaProject().getProject());
+ }
+ }
+ return null;
+ }
+
+ private IContainer getDefaultContainer(IProject project) {
+ if (JpaFacet.isInstalled(project)) {
+ return JptCommonCorePlugin.getResourceLocator(project).getDefaultResourceLocation(project);
+ }
+ return project;
+ }
+
+ @Override
+ public void addPages() {
+ super.addPages();
+ this.firstPage = buildMappingFileNewFileWizardPage();
+ this.secondPage = buildMappingFileOptionsWizardPage();
+ addPage(this.firstPage);
+ addPage(this.secondPage);
+ }
+
+ protected MappingFileNewFileWizardPage buildMappingFileNewFileWizardPage() {
+ return new MappingFileNewFileWizardPage(
+ "Page_1", this.mungedSelection, getDataModel(),
+ JptUiMessages.MappingFileWizardPage_newFile_title,
+ JptUiMessages.MappingFileWizardPage_newFile_desc);
+ }
+
+ protected MappingFileOptionsWizardPage buildMappingFileOptionsWizardPage() {
+ return new MappingFileOptionsWizardPage(
+ "Page_2", getDataModel(),
+ JptUiMessages.MappingFileWizardPage_options_title,
+ JptUiMessages.MappingFileWizardPage_options_desc);
+ }
+
+ @Override
+ public boolean canFinish() {
+ // override so that visit to second page is not necessary
+ return this.firstPage.isPageComplete() && getDataModel().isValid();
+ }
+
+ public IDataModel getDataModel() {
+ if (this.dataModel == null) {
+ this.dataModel = DataModelFactory.createDataModel(getDefaultProvider());
+ }
+ return this.dataModel;
+ }
+
+ protected IDataModelProvider getDefaultProvider() {
+ return new OrmFileCreationDataModelProvider();
+ }
+
+ protected IDataModelPausibleOperation getOperation() {
+ return (IDataModelPausibleOperation) getDataModel().getDefaultOperation();
+ }
+
+ @Override
+ public final boolean performFinish() {
+ try {
+ final IStatus st = runOperations();
+
+ if (st.getSeverity() == IStatus.ERROR) {
+ JptJpaUiPlugin.log(st);
+ Throwable t = st.getException() == null ? new CoreException(st) : st.getException();
+ ErrorDialog.openError(
+ getShell(),
+ WTPCommonUIResourceHandler.getString(WTPCommonUIResourceHandler.WTPWizard_UI_0, new Object[]{getWindowTitle()}),
+ WTPCommonUIResourceHandler.getString(WTPCommonUIResourceHandler.WTPWizard_UI_1, new Object[]{getWindowTitle()}),
+ t, 0, false);
+ }
+ else if(st.getSeverity() == IStatus.WARNING){
+ WarningDialog.openWarning(
+ getShell(),
+ WTPCommonUIResourceHandler.getString(WTPCommonUIResourceHandler.WTPWizard_UI_2, new Object[]{getWindowTitle()}),
+ st.getMessage(),
+ st, IStatus.WARNING);
+ }
+
+ postPerformFinish();
+ }
+ catch (Exception e) {
+ JptJpaUiPlugin.log(e);
+ ErrorDialog.openError(
+ getShell(),
+ WTPCommonUIResourceHandler.getString(WTPCommonUIResourceHandler.WTPWizard_UI_0, new Object[]{getWindowTitle()}),
+ WTPCommonUIResourceHandler.getString(WTPCommonUIResourceHandler.WTPWizard_UI_1, new Object[]{getWindowTitle()}),
+ e, 0, false);
+ }
+ return true;
+ }
+
+ private IStatus runOperations() {
+
+ class CatchThrowableRunnableWithProgress
+ implements IRunnableWithProgress {
+
+ public IStatus status = null;
+ public Throwable caught = null;
+
+ public void run(IProgressMonitor pm) {
+ try {
+ status = getOperation().execute(pm, null);
+ }
+ catch (Throwable e) {
+ caught = e;
+ }
+ }
+ }
+
+ CatchThrowableRunnableWithProgress runnable = new CatchThrowableRunnableWithProgress();
+
+ try {
+ getContainer().run(true, false, runnable);
+ }
+ catch (Throwable e) {
+ runnable.caught = e;
+ }
+
+ if (runnable.caught == null) {
+ return runnable.status;
+ }
+ else {
+ JptJpaUiPlugin.log(runnable.caught);
+ ErrorDialog.openError(
+ getShell(),
+ WTPCommonUIResourceHandler.getString(WTPCommonUIResourceHandler.WTPWizard_UI_0, new Object[]{getWindowTitle()}),
+ WTPCommonUIResourceHandler.getString(WTPCommonUIResourceHandler.WTPWizard_UI_1, new Object[]{getWindowTitle()}),
+ runnable.caught, 0, false);
+ return new Status(IStatus.ERROR, "id", 0, runnable.caught.getMessage(), runnable.caught); //$NON-NLS-1$
+ }
+ }
+
+ protected void postPerformFinish()
+ throws InvocationTargetException {
+
+ try {
+ IPath containerPath = (IPath) getDataModel().getProperty(CONTAINER_PATH);
+ String fileName = getDataModel().getStringProperty(FILE_NAME);
+ IContainer container = PlatformTools.getContainer(containerPath);
+ IFile file = container.getFile(new Path(fileName));
+ openEditor(file);
+ }
+ catch (Exception cantOpen) {
+ throw new InvocationTargetException(cantOpen);
+ }
+ }
+
+ private void openEditor(final IFile file) {
+ if (file != null) {
+ getShell().getDisplay().asyncExec(new Runnable() {
+ public void run() {
+ try {
+ IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
+ IDE.openEditor(page, file, true);
+ }
+ catch (PartInitException e) {
+ JptJpaUiPlugin.log(e);
+ }
+ }
+ });
+ }
+ }
+
+ @Override
+ public void dispose() {
+ super.dispose();
+ getDataModel().dispose();
+ }
+
+ public static IPath createNewMappingFile(IStructuredSelection selection, String xmlFileName) {
+ MappingFileWizard wizard = new MappingFileWizard(DataModelFactory.createDataModel(new OrmFileCreationDataModelProvider()));
+ wizard.getDataModel().setProperty(FILE_NAME, xmlFileName);
+ wizard.init(PlatformUI.getWorkbench(), selection);
+ WizardDialog dialog = new WizardDialog(getCurrentShell(), wizard);
+ dialog.create();
+ if (dialog.open() == Window.OK) {
+ IPath containerPath = (IPath) wizard.getDataModel().getProperty(CONTAINER_PATH);
+ String fileName = wizard.getDataModel().getStringProperty(FILE_NAME);
+ IContainer container = PlatformTools.getContainer(containerPath);
+ IPath filePath = container.getFullPath().append(fileName);
+ IProject project = container.getProject();
+ IPath runtimePath = JptCommonCorePlugin.getResourceLocator(project).getRuntimePath(project, filePath);
+
+ return runtimePath;
+ }
+ return null;
+ }
+
+ private static Shell getCurrentShell() {
+ return Display.getCurrent().getActiveShell();
+ }
+
+
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/proj/AddToEarComposite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/proj/AddToEarComposite.java
new file mode 100644
index 0000000000..3b4f1efa4e
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/proj/AddToEarComposite.java
@@ -0,0 +1,114 @@
+/*******************************************************************************
+ * Copyright (c) 2010 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.ui.internal.wizards.proj;
+
+import static org.eclipse.jpt.jpa.ui.internal.wizards.proj.model.JpaProjectCreationDataModelProperties.*;
+import static org.eclipse.wst.common.componentcore.datamodel.properties.IFacetProjectCreationDataModelProperties.FACET_RUNTIME;
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.layout.GridDataFactory;
+import org.eclipse.jface.window.Window;
+import org.eclipse.jface.wizard.WizardDialog;
+import org.eclipse.jpt.jpa.ui.internal.JptUiMessages;
+import org.eclipse.jst.j2ee.ui.project.facet.EarProjectWizard;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wst.common.frameworks.internal.datamodel.ui.DataModelSynchHelper;
+import org.eclipse.wst.common.project.facet.core.runtime.IRuntime;
+
+public class AddToEarComposite {
+
+ private final Button addToEar;
+ private final Combo combo;
+ private final Button newButton;
+ private final Label label;
+
+ private final IDataModel model;
+ private DataModelSynchHelper synchhelper;
+
+ public AddToEarComposite(IDataModel model, Composite parent) {
+ this.model = model;
+ this.synchhelper = new DataModelSynchHelper(model);
+
+ Group group = new Group(parent, SWT.NONE);
+ group.setLayoutData(gdhfill());
+ group.setLayout(new GridLayout(3, false));
+ group.setText(JptUiMessages.AddToEarComposite_earMemberShip);
+
+ this.addToEar = new Button(group, SWT.CHECK);
+ this.addToEar.setText(JptUiMessages.AddToEarComposite_addToEarLabel);
+ GridDataFactory.defaultsFor(this.addToEar).span(3, 1).applyTo(this.addToEar);
+ this.synchhelper.synchCheckbox(addToEar, ADD_TO_EAR, null);
+
+ this.label = new Label(group, SWT.NULL);
+ this.label.setText(JptUiMessages.AddToEarComposite_earProjectLabel);
+ this.combo = new Combo(group, SWT.NONE);
+ this.combo.setLayoutData(gdhfill());
+
+ this.newButton = new Button(group, SWT.PUSH);
+ this.newButton.setText(JptUiMessages.AddToEarComposite_newButtonLabel);
+ GridDataFactory.defaultsFor(this.newButton).applyTo(this.newButton);
+
+ this.newButton.addSelectionListener(
+ new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent event) {
+ handleAddButton();
+ }
+ });
+
+ this.synchhelper.synchCombo(combo, EAR_PROJECT_NAME, new Control[]{label, newButton});
+ Dialog.applyDialogFont(parent);
+ }
+
+ private void handleAddButton() {
+ EarProjectWizard wizard = new EarProjectWizard();
+
+ WizardDialog dialog = new WizardDialog(newButton.getShell(), wizard);
+
+ IRuntime runtime = (IRuntime) this.model.getProperty(FACET_RUNTIME);
+ wizard.setRuntimeInDataModel(runtime);
+
+ if (dialog.open() != Window.CANCEL) {
+ this.model.notifyPropertyChange(EAR_PROJECT_NAME, IDataModel.VALID_VALUES_CHG);
+ String earproj = wizard.getProjectName();
+ this.model.setProperty(EAR_PROJECT_NAME, earproj);
+ }
+ }
+
+ private static GridData gdhfill() {
+ return new GridData(GridData.FILL_HORIZONTAL);
+ }
+
+ public static final GridData gdhspan(GridData gd, int span) {
+ gd.horizontalSpan = span;
+ return gd;
+ }
+
+ public void dispose() {
+ if (this.synchhelper != null){
+ this.synchhelper.dispose();
+ this.synchhelper = null;
+ }
+ }
+
+ public String getComboText(){
+ return this.combo.getText();
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/proj/JpaProjectWizard.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/proj/JpaProjectWizard.java
new file mode 100644
index 0000000000..70a3c0f530
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/proj/JpaProjectWizard.java
@@ -0,0 +1,62 @@
+/*******************************************************************************
+ * Copyright (c) 2010 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.ui.internal.wizards.proj;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.wizard.IWizardPage;
+import org.eclipse.jpt.jpa.ui.JptJpaUiPlugin;
+import org.eclipse.jpt.jpa.ui.internal.JptUiIcons;
+import org.eclipse.jpt.jpa.ui.internal.JptUiMessages;
+import org.eclipse.jpt.jpa.ui.internal.wizards.proj.model.JpaProjectCreationDataModelProvider;
+import org.eclipse.wst.common.frameworks.datamodel.DataModelFactory;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wst.common.project.facet.core.IFacetedProjectTemplate;
+import org.eclipse.wst.common.project.facet.core.ProjectFacetsManager;
+import org.eclipse.wst.web.ui.internal.wizards.NewProjectDataModelFacetWizard;
+
+public class JpaProjectWizard
+ extends NewProjectDataModelFacetWizard {
+
+ public JpaProjectWizard() {
+ super();
+ setWindowTitle(JptUiMessages.JpaProjectWizard_title);
+ }
+
+ public JpaProjectWizard(IDataModel dataModel) {
+ super(dataModel);
+ setWindowTitle(JptUiMessages.JpaProjectWizard_title);
+ }
+
+
+ @Override
+ protected ImageDescriptor getDefaultPageImageDescriptor() {
+ return JptJpaUiPlugin.getImageDescriptor(JptUiIcons.JPA_WIZ_BANNER);
+ }
+
+ @Override
+ protected IWizardPage createFirstPage() {
+ return new JpaProjectWizardFirstPage(model, "first.page"); //$NON-NLS-1$
+ }
+
+ @Override
+ protected IDataModel createDataModel() {
+ return DataModelFactory.createDataModel(new JpaProjectCreationDataModelProvider());
+ }
+
+ @Override
+ protected IFacetedProjectTemplate getTemplate() {
+ return ProjectFacetsManager.getTemplate("jpt.jpa.template");
+ }
+
+ @Override
+ protected String getFinalPerspectiveID() {
+ return "org.eclipse.jpt.jpa.ui.jpaPerspective";
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/proj/JpaProjectWizardFirstPage.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/proj/JpaProjectWizardFirstPage.java
new file mode 100644
index 0000000000..33b11a0b74
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/proj/JpaProjectWizardFirstPage.java
@@ -0,0 +1,121 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2010 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.ui.internal.wizards.proj;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import org.eclipse.jpt.jpa.core.JpaFacet;
+import org.eclipse.jpt.jpa.core.internal.facet.FacetTools;
+import org.eclipse.jpt.jpa.ui.internal.JpaHelpContextIds;
+import org.eclipse.jpt.jpa.ui.internal.JptUiMessages;
+import org.eclipse.jpt.jpa.ui.internal.wizards.proj.model.JpaProjectCreationDataModelProperties;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wst.common.project.facet.core.IFacetedProjectWorkingCopy;
+import org.eclipse.wst.common.project.facet.core.IProjectFacetVersion;
+import org.eclipse.wst.web.ui.internal.wizards.DataModelFacetCreationWizardPage;
+
+public class JpaProjectWizardFirstPage
+ extends DataModelFacetCreationWizardPage {
+
+ private AddToEarComposite addToEarComposite;
+
+ public JpaProjectWizardFirstPage(IDataModel dataModel, String pageName) {
+ super(dataModel, pageName);
+ setTitle(JptUiMessages.NewJpaProjectWizard_firstPage_title);
+ setDescription(JptUiMessages.NewJpaProjectWizard_firstPage_description);
+ setInfopopID(JpaHelpContextIds.NEW_JPA_PROJECT);
+ }
+
+
+ @Override
+ protected Composite createTopLevelComposite(Composite parent) {
+ final Composite top = super.createTopLevelComposite(parent);
+ createEarComposite(top);
+ createWorkingSetGroupPanel(top, new String[] { RESOURCE_WORKING_SET, JAVA_WORKING_SET });
+ return top;
+ }
+
+ private void createEarComposite(Composite top) {
+ this.addToEarComposite = new AddToEarComposite(getDataModel(), top);
+ }
+
+ @Override
+ public boolean internalLaunchNewRuntimeWizard(Shell shell, IDataModel model) {
+ IFacetedProjectWorkingCopy fpwc = (IFacetedProjectWorkingCopy) model.getProperty(FACETED_PROJECT_WORKING_COPY);
+ IProjectFacetVersion moduleFacet = FacetTools.getModuleFacet(fpwc);
+ if (moduleFacet != null) {
+ return launchNewRuntimeWizard(shell, model, moduleFacet.getProjectFacet().getId());
+ }
+ else {
+ return launchNewRuntimeWizard(shell, model);
+ }
+ }
+
+ @Override
+ protected String getModuleTypeID() {
+ return JpaFacet.ID;
+ }
+
+ @Override
+ public void dispose() {
+ super.dispose();
+ this.addToEarComposite.dispose();
+ }
+
+ @Override
+ public void storeDefaultSettings() {
+ super.storeDefaultSettings();
+ // TODO
+// IDialogSettings settings = getDialogSettings();
+// if (settings != null) {
+// FacetDataModelMap map = (FacetDataModelMap)model.getProperty(IFacetProjectCreationDataModelProperties.FACET_DM_MAP);
+// String facetID = getModuleFacetID();
+// IDataModel j2eeModel = map.getFacetDataModel(facetID);
+// if(j2eeModel.getBooleanProperty(IJ2EEModuleFacetInstallDataModelProperties.ADD_TO_EAR)){
+// String lastEARName = j2eeModel.getStringProperty(IJ2EEModuleFacetInstallDataModelProperties.EAR_PROJECT_NAME);
+// settings.put(STORE_LABEL, lastEARName);
+// }
+// }
+ }
+
+ @Override
+ public void restoreDefaultSettings() {
+ super.restoreDefaultSettings();
+ // TODO
+// IDialogSettings settings = getDialogSettings();
+// if (settings != null) {
+// String lastEARName = settings.get(STORE_LABEL);
+// if (lastEARName != null){
+// FacetDataModelMap map = (FacetDataModelMap)model.getProperty(IFacetProjectCreationDataModelProperties.FACET_DM_MAP);
+// String facetID = getModuleFacetID();
+// IDataModel j2eeModel = map.getFacetDataModel(facetID);
+// j2eeModel.setProperty(IJ2EEModuleFacetInstallDataModelProperties.LAST_EAR_NAME, lastEARName);
+// }
+// }
+ }
+
+// @Override
+// protected IDialogSettings getDialogSettings() {
+// return J2EEUIPlugin.getDefault().getDialogSettings();
+// }
+
+ @Override
+ protected String[] getValidationPropertyNames() {
+ String[] superProperties = super.getValidationPropertyNames();
+ List list = Arrays.asList(superProperties);
+ ArrayList<String> arrayList = new ArrayList<String>();
+ arrayList.addAll(list);
+ arrayList.add(JpaProjectCreationDataModelProperties.EAR_PROJECT_NAME);
+ arrayList.add(JpaProjectCreationDataModelProperties.ADD_TO_EAR );
+ return arrayList.toArray( new String[0] );
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/proj/model/JpaProjectCreationDataModelProperties.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/proj/model/JpaProjectCreationDataModelProperties.java
new file mode 100644
index 0000000000..50968897b1
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/proj/model/JpaProjectCreationDataModelProperties.java
@@ -0,0 +1,28 @@
+/*******************************************************************************
+ * Copyright (c) 2010 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.ui.internal.wizards.proj.model;
+
+import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetProjectCreationDataModelProperties;
+
+public interface JpaProjectCreationDataModelProperties
+ extends IFacetProjectCreationDataModelProperties {
+
+ public static final String MODULE_FACET_DATA_MODEL
+ = "JpaProjectCreationDataModelProperties.MODULE_FACET_DATA_MODEL"; //$NON-NLS-1$
+
+ public static final String ADDED_UTILITY_FACET
+ = "JpaProjectCreationDataModelProperties.ADDED_UTILITY_FACET"; //$NON-NLS-1$
+
+ public static final String ADD_TO_EAR
+ = "JpaProjectCreationDataModelProperties.ADD_TO_EAR"; //$NON-NLS-1$
+
+ public static final String EAR_PROJECT_NAME
+ = "JpaProjectCreationDataModelProperties.EAR_PROJECT_NAME"; //$NON-NLS-1$
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/proj/model/JpaProjectCreationDataModelProvider.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/proj/model/JpaProjectCreationDataModelProvider.java
new file mode 100644
index 0000000000..ba7fd01ca9
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/wizards/proj/model/JpaProjectCreationDataModelProvider.java
@@ -0,0 +1,349 @@
+/*******************************************************************************
+ * Copyright (c) 2010 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.ui.internal.wizards.proj.model;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.Set;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jem.util.emf.workbench.ProjectUtilities;
+import org.eclipse.jpt.jpa.core.JpaFacet;
+import org.eclipse.jpt.jpa.core.internal.facet.FacetTools;
+import org.eclipse.jst.common.project.facet.core.JavaFacet;
+import org.eclipse.jst.j2ee.internal.plugin.J2EEPlugin;
+import org.eclipse.jst.j2ee.project.facet.IJ2EEFacetConstants;
+import org.eclipse.jst.j2ee.project.facet.IJ2EEModuleFacetInstallDataModelProperties;
+import org.eclipse.wst.common.componentcore.datamodel.FacetProjectCreationDataModelProvider;
+import org.eclipse.wst.common.frameworks.datamodel.DataModelEvent;
+import org.eclipse.wst.common.frameworks.datamodel.DataModelPropertyDescriptor;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModelListener;
+import org.eclipse.wst.common.frameworks.internal.operations.ProjectCreationDataModelProviderNew;
+import org.eclipse.wst.common.frameworks.internal.plugin.WTPCommonMessages;
+import org.eclipse.wst.common.frameworks.internal.plugin.WTPCommonPlugin;
+import org.eclipse.wst.common.project.facet.core.IFacetedProject;
+import org.eclipse.wst.common.project.facet.core.IFacetedProjectWorkingCopy;
+import org.eclipse.wst.common.project.facet.core.IProjectFacet;
+import org.eclipse.wst.common.project.facet.core.IProjectFacetVersion;
+import org.eclipse.wst.common.project.facet.core.ProjectFacetsManager;
+import org.eclipse.wst.common.project.facet.core.runtime.IRuntime;
+
+public class JpaProjectCreationDataModelProvider
+ extends FacetProjectCreationDataModelProvider
+ implements JpaProjectCreationDataModelProperties {
+
+ private IDataModelListener moduleFacetDataModelListener;
+
+
+ public JpaProjectCreationDataModelProvider() {
+ super();
+ this.moduleFacetDataModelListener
+ = new IDataModelListener() {
+ public void propertyChanged(DataModelEvent event) {
+ if (IJ2EEModuleFacetInstallDataModelProperties.EAR_PROJECT_NAME.equals(event.getPropertyName())) {
+ if (isPropertySet(EAR_PROJECT_NAME)) {
+ setProperty(EAR_PROJECT_NAME, event.getProperty());
+ }
+ else {
+ model.notifyPropertyChange(EAR_PROJECT_NAME, IDataModel.DEFAULT_CHG);
+ }
+ }
+ else if (IJ2EEModuleFacetInstallDataModelProperties.ADD_TO_EAR.equals(event.getPropertyName())) {
+ setProperty(ADD_TO_EAR, event.getProperty());
+ }
+ }
+ };
+ }
+
+
+ @Override
+ public Set getPropertyNames() {
+ Set names = super.getPropertyNames();
+ names.add(MODULE_FACET_DATA_MODEL);
+ names.add(ADDED_UTILITY_FACET);
+ names.add(EAR_PROJECT_NAME);
+ names.add(ADD_TO_EAR);
+ return names;
+ }
+
+ @Override
+ public void init() {
+ super.init();
+
+ Collection<IProjectFacet> requiredFacets = new ArrayList<IProjectFacet>();
+ requiredFacets.add(JavaFacet.FACET);
+ requiredFacets.add(JpaFacet.FACET);
+ setProperty(REQUIRED_FACETS_COLLECTION, requiredFacets);
+
+ getDataModel().addListener(
+ new IDataModelListener() {
+ public void propertyChanged(DataModelEvent event) {
+ if (FACET_ACTION_MAP.equals(event.getPropertyName())) {
+ updateModuleFacetDataModel();
+ }
+ }
+ });
+ }
+
+ @Override
+ public boolean isPropertyEnabled(String propertyName) {
+ if (FACET_RUNTIME.equals(propertyName)) {
+ if (isAddToEar()) {
+ IStatus status = validateEAR(model.getStringProperty(EAR_PROJECT_NAME));
+ if (status.isOK()) {
+ IProject earProject = ProjectUtilities.getProject(getStringProperty(EAR_PROJECT_NAME));
+ if (earProject != null) {
+ IFacetedProject facetedEarProject;
+ try {
+ facetedEarProject = ProjectFacetsManager.create(earProject);
+ if (facetedEarProject != null) {
+ return false;
+ }
+ } catch (CoreException e) {
+ J2EEPlugin.logError(e);
+ }
+ }
+ }
+ }
+ return true;
+ }
+ else if (EAR_PROJECT_NAME.equals(propertyName)) {
+ return isAddToEar();
+ }
+
+ return super.isPropertyEnabled(propertyName);
+ }
+
+ @Override
+ public Object getDefaultProperty(String propertyName) {
+ if (ADDED_UTILITY_FACET.equals(propertyName)) {
+ return Boolean.FALSE;
+ }
+ else if (ADD_TO_EAR.equals(propertyName)) {
+ IDataModel moduleFacetDataModel = getModuleFacetDataModel();
+ if (moduleFacetDataModel != null) {
+ return moduleFacetDataModel.getDefaultProperty(IJ2EEModuleFacetInstallDataModelProperties.ADD_TO_EAR);
+ }
+ }
+ else if (EAR_PROJECT_NAME.equals(propertyName)) {
+ IDataModel moduleFacetDataModel = getModuleFacetDataModel();
+ if (moduleFacetDataModel !=null) {
+ return moduleFacetDataModel.getDefaultProperty(IJ2EEModuleFacetInstallDataModelProperties.EAR_PROJECT_NAME);
+ }
+ }
+
+ return super.getDefaultProperty(propertyName);
+ }
+
+ @Override
+ public DataModelPropertyDescriptor[] getValidPropertyDescriptors(String propertyName) {
+ if (FACET_RUNTIME.equals(propertyName) && isAddToEar()) {
+ DataModelPropertyDescriptor[] descriptors = super.getValidPropertyDescriptors(propertyName);
+ List list = new ArrayList();
+ for (int i = 0; i < descriptors.length; i++) {
+ IRuntime rt = (IRuntime) descriptors[i].getPropertyValue();
+ if (rt == null || rt.supports(IJ2EEFacetConstants.ENTERPRISE_APPLICATION_FACET)) {
+ list.add(descriptors[i]);
+ }
+ }
+ descriptors = new DataModelPropertyDescriptor[list.size()];
+ for (int i = 0; i < descriptors.length; i++) {
+ descriptors[i] = (DataModelPropertyDescriptor) list.get(i);
+ }
+ return descriptors;
+ }
+ else if (EAR_PROJECT_NAME.equals(propertyName)) {
+ IDataModel moduleFacetDataModel = getModuleFacetDataModel();
+ if (moduleFacetDataModel != null) {
+ return moduleFacetDataModel.getValidPropertyDescriptors(
+ IJ2EEModuleFacetInstallDataModelProperties.EAR_PROJECT_NAME);
+ }
+ else {
+ return new DataModelPropertyDescriptor[0];
+ }
+ }
+
+ return super.getValidPropertyDescriptors(propertyName);
+ }
+
+ @Override
+ public boolean propertySet(String propertyName, Object propertyValue) {
+ if (EAR_PROJECT_NAME.equals(propertyName) || ADD_TO_EAR.equals(propertyName)) {
+ IDataModel moduleFacetDataModel = getModuleFacetDataModel();
+ if (moduleFacetDataModel != null){
+ if (EAR_PROJECT_NAME.equals(propertyName)) {
+ moduleFacetDataModel.setProperty(
+ IJ2EEModuleFacetInstallDataModelProperties.EAR_PROJECT_NAME, propertyValue);
+ }
+ else {
+ moduleFacetDataModel.setProperty(
+ IJ2EEModuleFacetInstallDataModelProperties.ADD_TO_EAR, propertyValue);
+ }
+ }
+ if (isAddToEar()) {
+ IStatus status = validateEAR(model.getStringProperty(EAR_PROJECT_NAME));
+ if (status.isOK()) {
+ IProject earProject = ProjectUtilities.getProject(getStringProperty(EAR_PROJECT_NAME));
+ if (earProject != null) {
+ IFacetedProject facetedEarProject;
+ try {
+ facetedEarProject = ProjectFacetsManager.create(earProject);
+ if (facetedEarProject != null) {
+ setProperty(FACET_RUNTIME, facetedEarProject.getPrimaryRuntime());
+ }
+ }
+ catch (CoreException e) {
+ J2EEPlugin.logError(e);
+ }
+ }
+ }
+ }
+ if (ADD_TO_EAR.equals(propertyName)) {
+ this.model.notifyPropertyChange(FACET_RUNTIME, IDataModel.VALID_VALUES_CHG);
+ IProjectFacetVersion moduleFacet = findModuleFacet();
+ if (isAddToEar()) {
+ if (moduleFacet == null) {
+ getFacetedProject().addProjectFacet(IJ2EEFacetConstants.UTILITY_FACET_10);
+ setBooleanProperty(ADDED_UTILITY_FACET, true);
+ }
+ }
+ else {
+ if (moduleFacet != null && isAddedUtilityFacet()) {
+ if (moduleFacet.equals(IJ2EEFacetConstants.UTILITY_FACET_10)) {
+ getFacetedProject().removeProjectFacet(IJ2EEFacetConstants.UTILITY_FACET_10);
+ }
+ setBooleanProperty(ADDED_UTILITY_FACET, false);
+ }
+ }
+ this.model.notifyPropertyChange(EAR_PROJECT_NAME, IDataModel.ENABLE_CHG);
+ this.model.notifyPropertyChange(EAR_PROJECT_NAME, IDataModel.VALID_VALUES_CHG);
+ this.model.notifyPropertyChange(EAR_PROJECT_NAME, IDataModel.VALUE_CHG);
+ }
+ this.model.notifyPropertyChange(FACET_RUNTIME, IDataModel.ENABLE_CHG);
+ }
+
+ return super.propertySet(propertyName, propertyValue);
+ }
+
+ @Override
+ public IStatus validate(String propertyName) {
+ IStatus status = super.validate(propertyName);
+
+ if (status == null) {
+ status = Status.OK_STATUS;
+ }
+
+ if (! status.isOK()) {
+ return status;
+ }
+
+ if (ADD_TO_EAR.equals(propertyName) || EAR_PROJECT_NAME.equals(propertyName) || FACET_PROJECT_NAME.equals(propertyName)) {
+ if (model.getBooleanProperty(ADD_TO_EAR)) {
+ status = validateEAR(model.getStringProperty(EAR_PROJECT_NAME));
+ if (status.isOK()) {
+ if (getStringProperty(FACET_PROJECT_NAME).equals(getStringProperty(EAR_PROJECT_NAME))) {
+ String errorMessage = WTPCommonPlugin.getResourceString(WTPCommonMessages.SAME_MODULE_AND_EAR_NAME, new Object[]{getStringProperty(EAR_PROJECT_NAME)});
+ status = WTPCommonPlugin.createErrorStatus(errorMessage);
+ }
+ }
+ }
+ }
+
+ return status;
+ }
+
+ protected IStatus validateEAR(String earName) {
+ if (earName.indexOf("#") != -1 || earName.indexOf("/") != -1) { //$NON-NLS-1$ //$NON-NLS-2$
+ String errorMessage = WTPCommonPlugin.getResourceString(WTPCommonMessages.ERR_INVALID_CHARS);
+ return WTPCommonPlugin.createErrorStatus(errorMessage);
+ }
+ else if (earName.equals("")) { //$NON-NLS-1$
+ String errorMessage = WTPCommonPlugin.getResourceString(WTPCommonMessages.ERR_EMPTY_MODULE_NAME);
+ return WTPCommonPlugin.createErrorStatus(errorMessage);
+ }
+
+ IStatus status = ProjectCreationDataModelProviderNew.validateProjectName(earName);
+ //check for the deleted case, the project is deleted from the workspace but still exists in the
+ //file system.
+ if (status.isOK()) {
+ IProject earProject = ProjectUtilities.getProject(getStringProperty(EAR_PROJECT_NAME));
+ if (! earProject.exists()) {
+ IPath path = ResourcesPlugin.getWorkspace().getRoot().getLocation();
+ path = path.append(earName);
+ status = ProjectCreationDataModelProviderNew.validateExisting(earName, path.toString());
+ }
+ }
+ return status;
+ }
+
+ protected void updateModuleFacetDataModel() {
+ IDataModel newModuleFacetDataModel = findModuleFacetDataModel();
+ IDataModel oldModuleFacetDataModel = getModuleFacetDataModel();
+
+ if (oldModuleFacetDataModel != newModuleFacetDataModel) {
+ if (oldModuleFacetDataModel != null) {
+ oldModuleFacetDataModel.removeListener(this.moduleFacetDataModelListener);
+ }
+ if (newModuleFacetDataModel != null) {
+ newModuleFacetDataModel.setProperty(
+ IJ2EEModuleFacetInstallDataModelProperties.ADD_TO_EAR,
+ getProperty(ADD_TO_EAR));
+ newModuleFacetDataModel.setProperty(
+ IJ2EEModuleFacetInstallDataModelProperties.EAR_PROJECT_NAME,
+ getProperty(EAR_PROJECT_NAME));
+ newModuleFacetDataModel.addListener(this.moduleFacetDataModelListener);
+ }
+ else {
+ this.model.setBooleanProperty(ADD_TO_EAR, false);
+ this.model.setBooleanProperty(ADDED_UTILITY_FACET, false);
+ }
+ setProperty(MODULE_FACET_DATA_MODEL, newModuleFacetDataModel);
+ this.model.notifyPropertyChange(ADD_TO_EAR, IDataModel.DEFAULT_CHG);
+ this.model.notifyPropertyChange(EAR_PROJECT_NAME, IDataModel.DEFAULT_CHG);
+ this.model.notifyPropertyChange(EAR_PROJECT_NAME, IDataModel.VALID_VALUES_CHG);
+ }
+ }
+
+ protected IFacetedProjectWorkingCopy getFacetedProject() {
+ return (IFacetedProjectWorkingCopy) this.model.getProperty(FACETED_PROJECT_WORKING_COPY);
+ }
+
+ protected IDataModel getModuleFacetDataModel() {
+ return (IDataModel) getProperty(MODULE_FACET_DATA_MODEL);
+ }
+
+ protected boolean isAddedUtilityFacet() {
+ return getBooleanProperty(ADDED_UTILITY_FACET);
+ }
+
+ protected boolean isAddToEar() {
+ return getBooleanProperty(ADD_TO_EAR);
+ }
+
+ protected IDataModel findModuleFacetDataModel() {
+ FacetActionMap map = (FacetActionMap) getProperty(FACET_ACTION_MAP);
+ IProjectFacetVersion moduleFacet = findModuleFacet();
+ if (moduleFacet != null) {
+ IFacetedProject.Action action = map.getAction(moduleFacet.getProjectFacet().getId());
+ return (action == null) ? null : (IDataModel) action.getConfig();
+ }
+ return null;
+ }
+
+ protected IProjectFacetVersion findModuleFacet() {
+ return FacetTools.getModuleFacet(getFacetedProject());
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/jpa2/details/java/JavaUiFactory2_0.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/jpa2/details/java/JavaUiFactory2_0.java
new file mode 100644
index 0000000000..32616e75f2
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/jpa2/details/java/JavaUiFactory2_0.java
@@ -0,0 +1,41 @@
+/*******************************************************************************
+ * Copyright (c) 2009 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.ui.jpa2.details.java;
+
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.jpa2.context.java.JavaElementCollectionMapping2_0;
+import org.eclipse.jpt.jpa.ui.details.JpaComposite;
+import org.eclipse.jpt.jpa.ui.details.java.JavaUiFactory;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * Use {@link JavaUiFactory2_0} to create any java JPA composites
+ * <p>
+ * Provisional API: This interface is part of an interim API that is still under
+ * development and expected to change significantly before reaching stability.
+ * It is available at this early stage to solicit feedback from pioneering
+ * adopters on the understanding that any code that uses this API will almost
+ * certainly be broken (repeatedly) as the API evolves.
+ *
+ *
+ * @version 3.0
+ * @since 3.0
+ */
+public interface JavaUiFactory2_0
+ extends JavaUiFactory
+{
+
+ JpaComposite createJavaElementCollectionMapping2_0Composite(
+ PropertyValueModel<JavaElementCollectionMapping2_0> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory);
+
+} \ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/jpa2/details/orm/OrmXmlUiFactory2_0.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/jpa2/details/orm/OrmXmlUiFactory2_0.java
new file mode 100644
index 0000000000..159a12dab1
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/jpa2/details/orm/OrmXmlUiFactory2_0.java
@@ -0,0 +1,41 @@
+/*******************************************************************************
+ * Copyright (c) 2009 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.ui.jpa2.details.orm;
+
+import org.eclipse.jpt.common.ui.WidgetFactory;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.jpa2.context.orm.OrmElementCollectionMapping2_0;
+import org.eclipse.jpt.jpa.ui.details.JpaComposite;
+import org.eclipse.jpt.jpa.ui.details.orm.OrmXmlUiFactory;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * Use {@link OrmXmlUiFactory2_0} to create any ORM JPA composites
+ * <p>
+ * Provisional API: This interface is part of an interim API that is still under
+ * development and expected to change significantly before reaching stability.
+ * It is available at this early stage to solicit feedback from pioneering
+ * adopters on the understanding that any code that uses this API will almost
+ * certainly be broken (repeatedly) as the API evolves.
+ *
+ * @see org.eclipse.jpt.jpa.ui.internal.BaseJpaUiFactory
+ *
+ * @version 3.0
+ * @since 3.0
+ */
+public interface OrmXmlUiFactory2_0 extends OrmXmlUiFactory
+{
+
+ JpaComposite createOrmElementCollectionMapping2_0Composite(
+ PropertyValueModel<OrmElementCollectionMapping2_0> subjectHolder,
+ Composite parent,
+ WidgetFactory widgetFactory);
+
+} \ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/navigator/JpaNavigatorProvider.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/navigator/JpaNavigatorProvider.java
new file mode 100644
index 0000000000..b221d6f1dd
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/navigator/JpaNavigatorProvider.java
@@ -0,0 +1,43 @@
+/*******************************************************************************
+ * Copyright (c) 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.jpa.ui.navigator;
+
+import org.eclipse.jpt.common.ui.jface.ItemLabelProvider;
+import org.eclipse.jpt.common.ui.jface.ItemLabelProviderFactory;
+import org.eclipse.jpt.common.ui.jface.TreeItemContentProvider;
+import org.eclipse.jpt.common.ui.jface.TreeItemContentProviderFactory;
+
+/**
+ * This provider is responsible to create the Project Navigator view contents and
+ * labels for a given JPA project.
+ *
+ * @version 2.0
+ * @since 2.0
+ *
+ * Provisional API: This interface is part of an interim API that is still
+ * under development and expected to change significantly before reaching
+ * stability. It is available at this early stage to solicit feedback from
+ * pioneering adopters on the understanding that any code that uses this API
+ * will almost certainly be broken (repeatedly) as the API evolves.
+ */
+public interface JpaNavigatorProvider
+{
+ /**
+ * Build an factory to create {@link TreeItemContentProvider}s
+ */
+ TreeItemContentProviderFactory getTreeItemContentProviderFactory();
+
+ /**
+ * Build a factory to create {@link ItemLabelProvider}s
+ */
+ ItemLabelProviderFactory getItemLabelProviderFactory();
+
+ void dispose();
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/structure/JpaStructureProvider.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/structure/JpaStructureProvider.java
new file mode 100644
index 0000000000..5b6579d22b
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/structure/JpaStructureProvider.java
@@ -0,0 +1,41 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2009 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.ui.structure;
+
+import org.eclipse.jpt.common.ui.jface.ItemLabelProvider;
+import org.eclipse.jpt.common.ui.jface.ItemLabelProviderFactory;
+import org.eclipse.jpt.common.ui.jface.TreeItemContentProvider;
+import org.eclipse.jpt.common.ui.jface.TreeItemContentProviderFactory;
+
+/**
+ * This provider is responsible to create the JPA Structure view contents and
+ * labels for a given JPA resource.
+ *
+ * @version 3.0
+ * @since 2.0
+ *
+ * Provisional API: This interface is part of an interim API that is still
+ * under development and expected to change significantly before reaching
+ * stability. It is available at this early stage to solicit feedback from
+ * pioneering adopters on the understanding that any code that uses this API
+ * will almost certainly be broken (repeatedly) as the API evolves.
+ */
+public interface JpaStructureProvider
+{
+ /**
+ * Build an factory to create {@link TreeItemContentProvider}s
+ */
+ TreeItemContentProviderFactory getTreeItemContentProviderFactory();
+
+ /**
+ * Build a factory to create {@link ItemLabelProvider}s
+ */
+ ItemLabelProviderFactory getItemLabelProviderFactory();
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/templates/annotated_entity.javajet b/jpa/plugins/org.eclipse.jpt.jpa.ui/templates/annotated_entity.javajet
new file mode 100644
index 0000000000..2b4bc1d95c
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/templates/annotated_entity.javajet
@@ -0,0 +1,64 @@
+<%@ jet package="org.eclipse.jpt.jpa.ui.internal.wizards.entity"
+ imports="org.eclipse.jpt.jpa.ui.internal.wizards.entity.data.model.* java.util.* "
+ class="AnnotatedEntityTemplate"
+%>
+<% CreateEntityTemplateModel model = (CreateEntityTemplateModel) argument;
+if (model.getJavaPackageName()!=null && model.getJavaPackageName()!="") { %>package <%=model.getJavaPackageName()%>;<%}%>
+
+<% Collection<String> imports = model.getImports(false);
+for (String anImport : imports) { %>
+import <%=anImport%>;
+<% } %>
+
+/**
+ * Entity implementation class for Entity: <%=model.getEntityName()%>
+ *
+ */
+<%=model.getArtifactType()%><%String ENTITY_NAME = model.getEntityName();
+if (model.isEntityNameSet()) {%>(name="<%=ENTITY_NAME%>")<%}%>
+<%if (model.isTableNameSet()) {%>
+@Table(name="<%=model.getTableName()%>")<%}%>
+<%=model.getInheritanceStrategy()%>
+<%if (model.isCompositePK()) {%>
+@IdClass(<%=model.getIdClassName()%>.class)<%}%>
+public class <%=model.getClassName()%><%String superClass = model.getSuperclassName();
+ if (! "".equals(superClass)) {%> extends <%=superClass%><%}%><%
+ List<String> interfaces = model.getInterfaces();
+ if (interfaces.size()>0) {%> implements <% }
+ for (int i=0; i<interfaces.size(); i++) {
+ String INTERFACE = (String) interfaces.get(i);
+ if (i>0) { %>, <%}%><%=INTERFACE%><%}%> {
+
+ <% List<EntityRow> fields = model.getEntityFields();
+ List<String> pkFields = model.getPKFields();
+ for (EntityRow entity : fields) {
+ String NAME = entity.getName();
+ if (pkFields.contains(NAME) && model.isFieldAccess()) {
+ %>
+ @Id<%}%>
+ private <%=entity.getType()%> <%=entity.getName()%>;<%}%>
+ private static final long serialVersionUID = 1L;
+
+ public <%=model.getClassName()%>() {
+ super();
+ }
+ <%
+ fields = model.getEntityFields();
+ if (fields != null) for (int i=0; i<fields.size(); i++) {
+ EntityRow field = (EntityRow) fields.get(i);
+ String TYPE = field.getType();
+ String NAME = field.getName();
+ String METHOD = NAME.substring(0,1).toUpperCase() + NAME.substring(1);
+ if (pkFields.contains(NAME) && !model.isFieldAccess()) {
+ %>
+ @Id <%}%>
+ public <%=TYPE%> get<%=METHOD%>() {
+ return this.<%=NAME%>;
+ }
+
+ public void set<%=METHOD%>(<%=TYPE%> <%=NAME%>) {
+ this.<%=NAME%> = <%=NAME%>;
+ }
+ <%}%>
+
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/templates/entity.javajet b/jpa/plugins/org.eclipse.jpt.jpa.ui/templates/entity.javajet
new file mode 100644
index 0000000000..98dc806d15
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/templates/entity.javajet
@@ -0,0 +1,50 @@
+<%@ jet package="org.eclipse.jpt.jpa.ui.internal.wizards.entity"
+ imports="org.eclipse.jpt.jpa.ui.internal.wizards.entity.data.model.* java.util.* "
+ class="EntityTemplate"
+%>
+<% CreateEntityTemplateModel model = (CreateEntityTemplateModel) argument;
+if (model.getJavaPackageName()!=null && model.getJavaPackageName()!="") { %>package <%=model.getJavaPackageName()%>;<%}%>
+
+<% Collection<String> imports = model.getImports(false);
+for (String anImport : imports) { %>
+import <%=anImport%>;
+<% } %>
+
+/**
+ * Entity implementation class for Entity: <%=model.getEntityName()%>
+ *
+ */
+public class <%=model.getClassName()%><%String superClass = model.getSuperclassName();
+ if (! "".equals(superClass)) {%> extends <%=superClass%><%}%><%
+ List<String> interfaces = model.getInterfaces();
+ if (interfaces.size()>0) {%> implements <% }
+ for (int i=0; i<interfaces.size(); i++) {
+ String INTERFACE = (String) interfaces.get(i);
+ if (i>0) { %>, <%}%><%=INTERFACE%><%}%> {
+
+ <% List<EntityRow> fields = model.getEntityFields();
+ for (EntityRow entity : fields) {
+ %>
+ private <%=entity.getType()%> <%=entity.getName()%>;<%}%>
+ private static final long serialVersionUID = 1L;
+ public <%=model.getClassName()%>() {
+ super();
+ }
+ <%
+ fields = model.getEntityFields();
+ if (fields != null) for (int i=0; i<fields.size(); i++) {
+ EntityRow field = (EntityRow) fields.get(i);
+ String TYPE = field.getType();
+ String NAME = field.getName();
+ String METHOD = NAME.substring(0,1).toUpperCase() + NAME.substring(1);
+ %>
+ public <%=TYPE%> get<%=METHOD%>() {
+ return this.<%=NAME%>;
+ }
+
+ public void set<%=METHOD%>(<%=TYPE%> <%=NAME%>) {
+ this.<%=NAME%> = <%=NAME%>;
+ }
+ <%}%>
+
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/templates/idClass.javajet b/jpa/plugins/org.eclipse.jpt.jpa.ui/templates/idClass.javajet
new file mode 100644
index 0000000000..2617675e2c
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/templates/idClass.javajet
@@ -0,0 +1,124 @@
+<%@ jet package="org.eclipse.jpt.jpa.ui.internal.wizards.entity"
+ imports="org.eclipse.jpt.jpa.ui.internal.wizards.entity.data.model.* java.util.* "
+ class="IdClassTemplate"
+%>
+<% CreateEntityTemplateModel model = (CreateEntityTemplateModel) argument;
+if (model.getJavaPackageName()!=null && model.getJavaPackageName()!="") { %>package <%=model.getJavaPackageName()%>;<%}%>
+
+<% Collection<String> imports = model.getImports(true);
+for (String anImport : imports) { %>
+import <%=anImport%>;
+<% } %>
+
+/**
+ * ID class for entity: <%=model.getClassName()%>
+ *
+ */
+public class <%=model.getIdClassName()%>
+<% List<String> interfaces = model.getInterfaces();
+ if (interfaces.size()>0) {%> implements <% }
+ for (int i=0; i<interfaces.size(); i++) {
+ String INTERFACE = (String) interfaces.get(i);
+ if (i>0) { %>, <%}%><%=INTERFACE%><%}%> {
+
+ <% List<EntityRow> fields = model.getEntityFields();
+ List<String> pkFields = model.getPKFields();
+ for (int i=0; i<fields.size(); i++) {
+ EntityRow entity = (EntityRow) fields.get(i);
+ if (!pkFields.contains(entity.getName())) {
+ continue;
+ }
+ %>
+ private <%=entity.getType()%> <%=entity.getName()%>;<%}%>
+ private static final long serialVersionUID = 1L;
+
+ public <%=model.getIdClassName()%>() {}
+
+ <%
+ fields = model.getEntityFields();
+ if (fields != null) for (int i=0; i<fields.size(); i++) {
+ EntityRow field = (EntityRow) fields.get(i);
+ String TYPE = field.getType();
+ String NAME = field.getName();
+ if (!pkFields.contains(NAME)) {
+ continue;
+ }
+ String METHOD = NAME.substring(0,1).toUpperCase() + NAME.substring(1);
+ %>
+
+ public <%=TYPE%> get<%=METHOD%>() {
+ return this.<%=NAME%>;
+ }
+
+ public void set<%=METHOD%>(<%=TYPE%> <%=NAME%>) {
+ this.<%=NAME%> = <%=NAME%>;
+ }
+ <%}%>
+
+ /*
+ * @see java.lang.Object#equals(Object)
+ */
+ public boolean equals(Object o) {
+ if (o == this) {
+ return true;
+ }
+ if (!(o instanceof <%=model.getIdClassName()%>)) {
+ return false;
+ }
+ <%=model.getIdClassName()%> other = (<%=model.getIdClassName()%>) o;
+ return true
+<% if (fields != null) for (int i=0; i<fields.size(); i++) {
+ EntityRow field = (EntityRow) fields.get(i);
+ String NAME = field.getName();
+ if (!pkFields.contains(NAME)) {
+ continue;
+ }%>
+<% String TYPE = field.getType();
+ String GET_METHOD = "get" + NAME.substring(0,1).toUpperCase() + NAME.substring(1); %>
+<% if (TYPE.equals("boolean") || TYPE.equals("byte") || TYPE.equals("char") || TYPE.equals("short") || TYPE.equals("int") || TYPE.equals("long")) { %>
+ && <%=GET_METHOD%>() == other.<%=GET_METHOD%>()
+<% } else if (TYPE.equals("double")) { %>
+ && (Double.doubleToLongBits(<%=GET_METHOD%>()) == Double.doubleToLongBits(other.<%=GET_METHOD%>()))
+<% } else if (TYPE.equals("float")) { %>
+ && (Float.floatToIntBits(<%=GET_METHOD%>()) == Float.floatToIntBits(other.<%=GET_METHOD%>()))
+<% } else { %>
+ && (<%=GET_METHOD%>() == null ? other.<%=GET_METHOD%>() == null : <%=GET_METHOD%>().equals(other.<%=GET_METHOD%>()))
+<% } %>
+<% } %>;
+ }
+
+ /*
+ * @see java.lang.Object#hashCode()
+ */
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+<% if (fields != null) for (int i=0; i<fields.size(); i++) {
+ EntityRow field = (EntityRow) fields.get(i);
+ String NAME = field.getName();
+ if (!pkFields.contains(NAME)) {
+ continue;
+ }%>
+<% String TYPE = field.getType();
+ String GET_METHOD = "get" + NAME.substring(0,1).toUpperCase() + NAME.substring(1); %>
+<% if (TYPE.equals("boolean")) { %>
+ result = prime * result + (<%=GET_METHOD%>() ? 1 : 0);
+<% } else if (TYPE.equals("int")) { %>
+ result = prime * result + <%=GET_METHOD%>();
+<% } else if (TYPE.equals("byte") || TYPE.equals("char") || TYPE.equals("short")) { %>
+ result = prime * result + ((int) <%=GET_METHOD%>());
+<% } else if (TYPE.equals("long")) { %>
+ result = prime * result + ((int) (<%=GET_METHOD%>() ^ (<%=GET_METHOD%>() >>> 32)));
+<% } else if (TYPE.equals("double")) { %>
+ result = prime * result + ((int) (Double.doubleToLongBits(<%=GET_METHOD%>() ) ^ (Double.doubleToLongBits(<%=GET_METHOD%>()) >>> 32)));
+<% } else if (TYPE.equals("float")) { %>
+ result = prime * result + Float.floatToIntBits(<%=GET_METHOD%>());
+<% } else { %>
+ result = prime * result + (<%=GET_METHOD%>() == null ? 0 : <%=GET_METHOD%>().hashCode());
+<% } %>
+<% } %>
+ return result;
+ }
+
+
+}

Back to the top