Bugfixes merged into trunk
authorn.hoffmann <n.hoffmann@localhost>
Wed, 18 Aug 2010 17:26:57 +0000 (17:26 +0000)
committern.hoffmann <n.hoffmann@localhost>
Wed, 18 Aug 2010 17:26:57 +0000 (17:26 +0000)
115 files changed:
.gitattributes
taxeditor-application/plugin.properties
taxeditor-bulkeditor/src/main/java/eu/etaxonomy/taxeditor/annotatedlineeditor/AnnotatedLineEditor.java
taxeditor-editor/plugin.xml
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/CdmDataTransfer.java
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/CompositeBorderDecorator.java [deleted file]
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/EditorUtil.java
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/GroupComposite.java [deleted file]
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/GroupCompositeLabel.java [deleted file]
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/GroupedComposite.java [deleted file]
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/IDropTargetable.java [new file with mode: 0644]
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/MultiPageTaxonEditor.java
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/SimpleSelectionProvider.java
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/TaxonEditorInput.java
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/WidgetTransfer.java [deleted file]
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/handler/EditNewTaxonHandler.java
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/handler/OpenParentHandler.java
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/AbstractGroup.java [new file with mode: 0644]
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/AbstractGroupedContainer.java [new file with mode: 0644]
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/AbstractNameComposite.java [deleted file]
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/AcceptedNameContainer.java [moved from taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/AcceptedNameComposite.java with 63% similarity]
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/ConceptContainer.java [moved from taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/ConceptComposite.java with 55% similarity]
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/ConceptGroup.java [new file with mode: 0644]
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/ConceptGroupComposite.java [deleted file]
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/ContainerFactory.java [new file with mode: 0644]
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/EditorAnnotation.java [moved from taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/EditorAnnotation.java with 94% similarity]
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/HomotypicalGroupComposite.java [deleted file]
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/HomotypicalSynonymGroup.java [new file with mode: 0644]
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/LineBreakListener.java [moved from taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/LineBreakListener.java with 95% similarity]
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/LineWrapSquigglesStrategy.java [moved from taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/LineWrapSquigglesStrategy.java with 95% similarity]
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/LineWrapSupport.java [moved from taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/LineWrapSupport.java with 94% similarity]
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/MisapplicationContainer.java [moved from taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/MisapplicationComposite.java with 52% similarity]
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/MisappliedGroup.java [new file with mode: 0644]
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/MisappliedGroupComposite.java [deleted file]
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/NameEditorDragListener.java [new file with mode: 0644]
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/NameEditorDragSourceEffect.java [new file with mode: 0644]
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/NameEditorDropTargetEffect.java [new file with mode: 0644]
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/NameEditorDropTargetListener.java [new file with mode: 0644]
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/NameViewer.java
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/SynonymComposite.java [deleted file]
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/SynonymContainer.java [new file with mode: 0644]
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/TaxonNameEditor.java
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/handler/ChangeAcceptedTaxonToSynonymHandler.java
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/handler/ChangeConceptRelationshipTypeHandler.java
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/handler/ChangeSynonymToAcceptedTaxonHandler.java
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/handler/ChangeToConceptRelationHandler.java
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/handler/ChangeToMisapplicationHandler.java
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/handler/ChangeToSynonymHandler.java
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/handler/CreateConceptRelationHandler.java
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/handler/CreateHeterotypicSynonymHandler.java
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/handler/CreateHomotypicSynonymHandler.java
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/handler/CreateMisapplicationHandler.java
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/handler/CreateSynonymInHomotypicalGroupHandler.java
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/handler/DeleteTaxonBaseHandler.java
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/handler/NameEditorMenuPropertyTester.java
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/handler/RemoveBasionymHandler.java
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/handler/SetBasionymHandler.java
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/AbstractCdmDataViewer.java
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/AbstractCdmViewPart.java
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/CdmSectionPart.java
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/descriptive/DescriptiveViewPart.java
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/descriptive/handler/AddDescriptionHandler.java
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/descriptive/handler/CreateDescriptionElementHandler.java
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/descriptive/handler/DeleteDescriptionHandler.java
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/detail/DetailsViewPart.java
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/detail/DetailsViewer.java
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/media/MediaViewPart.java
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/media/handler/AddImageGalleryHandler.java
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/media/handler/CreateMediaHandler.java
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/media/handler/DeleteMediaHandler.java
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/media/handler/MoveImageDownInListHandler.java
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/media/handler/MoveImageUpInListHandler.java
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/supplementaldata/SupplementalDataViewPart.java
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/supplementaldata/SupplementalDataViewer.java
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/forms/CdmFormFactory.java
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/forms/TextWithLabelElement.java
taxeditor-feature-platform/feature.xml
taxeditor-feature-product/taxeditor.product
taxeditor-navigation/plugin.xml
taxeditor-navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/NavigationUtil.java
taxeditor-navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/StateManager.java
taxeditor-navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/handler/DeleteTreeNodeHandler.java
taxeditor-navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/handler/EditHandler.java
taxeditor-navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/handler/MoveTaxonHandler.java
taxeditor-navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/navigator/ClassificationContentProvider.java [moved from taxeditor-navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/navigator/TaxonomicTreeContentProvider.java with 85% similarity]
taxeditor-navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/navigator/ClassificationLabelProvider.java [moved from taxeditor-navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/navigator/TaxonomicTreeLabelProvider.java with 94% similarity]
taxeditor-navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/navigator/TaxonNavigator.java
taxeditor-navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/navigator/TaxonNavigatorDataChangeBehavior.java
taxeditor-navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/navigator/TaxonNodeContentProvider.java
taxeditor-navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/navigator/TaxonNodeDropAdapterAssistant.java
taxeditor-navigation/src/main/java/eu/etaxonomy/taxeditor/wizard/ClassificationWizard.java
taxeditor-navigation/src/main/java/eu/etaxonomy/taxeditor/wizard/NewTaxonNodeWizard.java
taxeditor-store/plugin.xml
taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/model/AbstractUtility.java
taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/model/IPartChangeListener.java [new file with mode: 0644]
taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/model/TaxeditorPartService.java [new file with mode: 0644]
taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/operations/AbstractPostOperation.java
taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/operations/ChangeConceptToSynonymOperation.java
taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/operations/ChangeHomotypicGroupOperation.java
taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/operations/ChangeSynonymToMisapplicationOperation.java
taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/operations/IPostOperationEnabled.java
taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/preference/Resources.java
taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/CdmStore.java
taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/user/handler/ToggleUserEnablementHandler.java
taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/user/view/UserManagerView.java
taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/user/wizard/UserWizard.java
taxeditor-store/src/test/java/eu/etaxonomy/taxeditor/store/operations/ChangeConceptToSynonymOperationTest.java
taxeditor-store/src/test/java/eu/etaxonomy/taxeditor/store/operations/ChangeHomotypicGroupOperationTest.java
taxeditor-store/src/test/java/eu/etaxonomy/taxeditor/store/operations/ChangeHomotypicalGroupBasionymOperationTest.java
taxeditor-store/src/test/java/eu/etaxonomy/taxeditor/store/operations/ChangeSynonymToConceptOperationTest.java
taxeditor-store/src/test/java/eu/etaxonomy/taxeditor/store/operations/ChangeSynonymToMisapplicationOperationTest.java
taxeditor-store/src/test/java/eu/etaxonomy/taxeditor/store/operations/CreateConceptRelationOperationTest.java
taxeditor-store/src/test/java/eu/etaxonomy/taxeditor/store/operations/DeleteConceptRelationOperationTest.java
taxeditor-store/src/test/java/eu/etaxonomy/taxeditor/store/operations/DeleteMisapplicationOperationTest.java
taxeditor-store/src/test/java/eu/etaxonomy/taxeditor/store/operations/SwapSynonymAndAcceptedOperationTest.java

index 9158fdc2866f029338e90a01712e9107497ffd68..9d576df7244b4ac0c37611ddd4bb77559c2aaf6f 100644 (file)
@@ -126,17 +126,10 @@ taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/dialogs/filteredSelection/
 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/dialogs/filteredSelection/FilteredTaxonomicTreeSelectionDialog.java -text
 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/dialogs/filteredSelection/FilteredTeamSelectionDialog.java -text
 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/CdmDataTransfer.java -text
-taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/CompositeBorderDecorator.java -text
-taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/EditorAnnotation.java -text
 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/EditorUtil.java -text
-taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/GroupComposite.java -text
-taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/GroupCompositeLabel.java -text
-taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/GroupedComposite.java -text
 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/IDirtyMarkableSelectionProvider.java -text
+taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/IDropTargetable.java -text
 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/IMultiPageTaxonEditorPage.java -text
-taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/LineBreakListener.java -text
-taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/LineWrapSquigglesStrategy.java -text
-taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/LineWrapSupport.java -text
 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/MultiPageTaxonEditor.java -text
 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/MultiPageTaxonEditorAdapterFactory.java -text
 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/MultiPageTaxonEditorDataChangeBehaviour.java -text
@@ -146,7 +139,6 @@ taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/TaxonEditorInput.ja
 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/TaxonEditorInputDataChangeBehaviour.java -text
 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/TaxonEditorInputFactory.java -text
 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/ViewerConfiguration.java -text
-taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/WidgetTransfer.java -text
 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/handler/EditNewTaxonHandler.java -text
 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/handler/OpenParentHandler.java -text
 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/handler/SaveAllHandler.java -text
@@ -161,17 +153,27 @@ taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/handler/create/NewR
 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/handler/create/NewSpecimenHandler.java -text
 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/handler/create/NewTeamHandler.java -text
 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/internal/TaxeditorEditorPlugin.java -text
-taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/AbstractNameComposite.java -text
-taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/AcceptedNameComposite.java -text
-taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/ConceptComposite.java -text
-taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/ConceptGroupComposite.java -text
-taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/HomotypicalGroupComposite.java -text
+taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/AbstractGroup.java -text
+taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/AbstractGroupedContainer.java -text
+taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/AcceptedNameContainer.java -text
+taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/ConceptContainer.java -text
+taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/ConceptGroup.java -text
+taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/ContainerFactory.java -text
+taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/EditorAnnotation.java -text
+taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/HomotypicalSynonymGroup.java -text
 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/IterableSynonymyList.java -text
-taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/MisapplicationComposite.java -text
-taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/MisappliedGroupComposite.java -text
+taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/LineBreakListener.java -text
+taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/LineWrapSquigglesStrategy.java -text
+taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/LineWrapSupport.java -text
+taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/MisapplicationContainer.java -text
+taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/MisappliedGroup.java -text
+taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/NameEditorDragListener.java -text
+taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/NameEditorDragSourceEffect.java -text
+taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/NameEditorDropTargetEffect.java -text
+taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/NameEditorDropTargetListener.java -text
 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/NameViewer.java -text
 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/RulerWithIcon.java -text
-taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/SynonymComposite.java -text
+taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/SynonymContainer.java -text
 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/TaxonNameEditor.java -text
 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/handler/AbstractDynamicConceptRelationMenu.java -text
 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/handler/ChangeAcceptedTaxonToSynonymHandler.java -text
@@ -423,6 +425,8 @@ taxeditor-navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/handler/New
 taxeditor-navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/handler/RefreshTreeHandler.java -text
 taxeditor-navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/handler/ShowTaxonomicTreeViewHandler.java -text
 taxeditor-navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/internal/TaxeditorNavigationPlugin.java -text
+taxeditor-navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/navigator/ClassificationContentProvider.java -text
+taxeditor-navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/navigator/ClassificationLabelProvider.java -text
 taxeditor-navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/navigator/EmptyRoot.java -text
 taxeditor-navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/navigator/Root.java -text
 taxeditor-navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/navigator/SynonymContentProvider.java -text
@@ -434,8 +438,6 @@ taxeditor-navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/navigator/T
 taxeditor-navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/navigator/TaxonNodeDropAdapterAssistant.java -text
 taxeditor-navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/navigator/TaxonNodeLabelProvider.java -text
 taxeditor-navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/navigator/TaxonNodePropertyTester.java -text
-taxeditor-navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/navigator/TaxonomicTreeContentProvider.java -text
-taxeditor-navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/navigator/TaxonomicTreeLabelProvider.java -text
 taxeditor-navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/search/SearchBar.java -text
 taxeditor-navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/search/SearchResultLabelProvider.java -text
 taxeditor-navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/search/SearchResultView.java -text
@@ -652,6 +654,7 @@ taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/model/DataChangeBridge.java
 taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/model/DescriptionHelper.java -text
 taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/model/IContextListener.java -text
 taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/model/IDataChangeBehavior.java -text
+taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/model/IPartChangeListener.java -text
 taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/model/IPartContentHasDetails.java -text
 taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/model/IPartContentHasSupplementalData.java -text
 taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/model/ImageResources.java -text
@@ -659,6 +662,7 @@ taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/model/LineSelection.java -t
 taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/model/MementoHelper.java -text
 taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/model/NameHelper.java -text
 taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/model/NomenclaturalCodeHelper.java -text
+taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/model/TaxeditorPartService.java -text
 taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/model/TaxonTransfer.java -text
 taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/model/TextHelper.java -text
 taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/model/TimeHelper.java -text
index 0a0e9835143eddfa9bf00be1d01a15ce320f473d..cbceb513b58ebec677fd48153632ea5a934e379d 100644 (file)
@@ -1,2 +1,2 @@
 productName=EDIT Taxonomic Editor\r
-productBlurb=EDIT Taxonomic Editor\n\Version: 2.1.0\n\n\Copyright (C) 2009 EDIT\n\European Distributed Institute of Taxonomy\n\http://www.e-taxonomy.eu\r
+productBlurb=EDIT Taxonomic Editor\n\Version: 3.0\n\n\Copyright (C) 2009 EDIT\n\European Distributed Institute of Taxonomy\n\http://www.e-taxonomy.eu\r
index 87e32f6a234a99cc9ee14b1f2a8018e229a99316..915acbf055f643bc03b853cd06f51789ee269e9c 100644 (file)
@@ -269,4 +269,9 @@ public class AnnotatedLineEditor extends TextEditor implements IConversationEnab
                super.dispose();\r
                conversation.close();\r
        }\r
+\r
+       public boolean onComplete() {\r
+               // TODO Auto-generated method stub\r
+               return false;\r
+       }\r
 }
\ No newline at end of file
index bd61165cf4de47053cfaf2a0f2d43c5cc120cb3f..0adc12222e100313f21bf8e94bbcf195b7964e8b 100644 (file)
                <menu
                      label="Concept Relation">
                   <visibleWhen>
-                     <and>
-                        <not>
-                           <reference
-                                 definitionId="isSynonym">
-                           </reference>
-                        </not>
-                        <not>
-                           <reference
-                                 definitionId="isMisapplication">
-                           </reference></not>
-                     </and>
+                     <or>
+                        <reference
+                              definitionId="isAcceptedTaxon">
+                        </reference>
+                        <reference
+                              definitionId="isConceptRelation">
+                        </reference>
+                     </or>
                   </visibleWhen>
                   <dynamic
                         class="eu.etaxonomy.taxeditor.editor.name.handler.CreateConceptRelationMenu"
                      label="Misapplication"
                      style="push">
                   <visibleWhen>
-                     <and>
-                        <not>
-                           <reference
-                                 definitionId="isSynonym">
-                           </reference>
-                        </not>
-                        <not>
-                           <reference
-                                 definitionId="isConceptRelation">
-                           </reference>
-                        </not>
-                     </and>                     
+                     <or>
+                        <reference
+                              definitionId="isAcceptedTaxon">
+                        </reference>
+                        <reference
+                              definitionId="isMisapplication">
+                        </reference>
+                     </or>
                   </visibleWhen>
                </command>
             </menu>
                   label="Delete"
                   style="push">
                <visibleWhen>
-                  <not>
+                  <or>
                      <reference
-                           definitionId="isAcceptedTaxon">
+                           definitionId="isSynonym">
+                     </reference>
+                     <reference
+                           definitionId="isMisapplication">
                      </reference>
-                  </not>
+                     <reference
+                           definitionId="isConceptRelation">
+                     </reference>
+                  </or>
                </visibleWhen>
             </command>
             <separator
                   class="eu.etaxonomy.taxeditor.editor.name.handler.GroupBasionymContributionItem"
                   id="taxeditor-editor.dynamic.setBasionym">
                <visibleWhen>
-                  <reference
-                        definitionId="isTaxonBase">
-                  </reference>
+                  <or>
+                     <reference
+                           definitionId="isAcceptedTaxon">
+                     </reference>
+                     <reference
+                           definitionId="isSynonym">
+                     </reference>
+                  </or>
                </visibleWhen>
             </dynamic>
             <command
index 5e19fa6258868642f27324ba637dc7164b3cc6fb..523c0cfc0aa4ce0df94be7342ab5a2804578479d 100644 (file)
 
 package eu.etaxonomy.taxeditor.editor;
 
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.EOFException;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.UUID;
+
 import org.apache.log4j.Logger;
 import org.eclipse.swt.dnd.ByteArrayTransfer;
 import org.eclipse.swt.dnd.TransferData;
+import org.hibernate.HibernateException;
+import org.hibernate.Session;
 
-import eu.etaxonomy.cdm.model.common.CdmBase;
+import eu.etaxonomy.cdm.model.common.ICdmBase;
+import eu.etaxonomy.cdm.model.taxon.Synonym;
+import eu.etaxonomy.cdm.model.taxon.Taxon;
+import eu.etaxonomy.taxeditor.store.CdmStore;
 
 /**
  * @author n.hoffmann
@@ -25,34 +40,25 @@ public class CdmDataTransfer extends ByteArrayTransfer {
        private static final Logger logger = Logger
                        .getLogger(CdmDataTransfer.class);
 
-       private static final String CDMTYPENAME = "widget_type";
-       private static final int CDMTYPEID = registerType (CDMTYPENAME);                
-       private static final CdmDataTransfer instance = new CdmDataTransfer();
+       private static int SEPARATOR = -10;
+       private static int EOF = -20;
        
-       /*
-        * The object associated with this transfer event
-        */
-       private CdmBase cdmObject;
+       private static final String TYPE_NAME = "cdmdata-transfer-format";
+       private static final int TYPE_ID = registerType (TYPE_NAME);            
+       private static final CdmDataTransfer instance = new CdmDataTransfer();
        
        public static synchronized CdmDataTransfer getInstance() {
                return instance;
        }
-       
-       
-       public CdmBase getCdmObject(){
-               return cdmObject;
-       }
-       
-       public void setCdmObject(CdmBase cdmObject) {
-               this.cdmObject = cdmObject;
-       }
+
+       private ICdmBase cdmBase;
        
        /* (non-Javadoc)
         * @see org.eclipse.swt.dnd.Transfer#getTypeIds()
         */
        @Override
        protected int[] getTypeIds() {
-               return new int[] { CDMTYPEID }; 
+               return new int[] { TYPE_ID }; 
        }
 
        /* (non-Javadoc)
@@ -60,33 +66,101 @@ public class CdmDataTransfer extends ByteArrayTransfer {
         */
        @Override
        protected String[] getTypeNames() {
-               return new String[]{ CDMTYPENAME };
+               return new String[]{ TYPE_NAME };
        }
 
        @Override
        protected void javaToNative(Object object, TransferData transferData) {
-               // No encoding needed since this is a hardcoded string read and written
-               // in the same process.
-               // See nativeToJava below
-               byte[] check = CDMTYPENAME.getBytes();
-               super.javaToNative(check, transferData);
+               byte[] bytes = toByteArray((ICdmBase[]) object);
+               if (bytes != null)
+                       super.javaToNative(bytes, transferData);
        }
 
+
+
        @Override
        protected Object nativeToJava(TransferData transferData) {
-               Object result = super.nativeToJava(transferData);
-               if (isInvalidNativeType(result)) {
-                       throw new RuntimeException(); //$NON-NLS-1$
+               byte[] bytes = (byte[]) super.nativeToJava(transferData);
+               return fromByteArray(bytes);
+       }
+
+
+       private byte[] toByteArray(ICdmBase[] cdmBaseObjects) {
+               /**
+                * Transfer data is an array of gadgets. Serialized version is: (int)
+                * number of gadgets (Gadget) gadget 1 (Gadget) gadget 2 ... repeat for
+                * each subsequent gadget see writeGadget for the (Gadget) format.
+                */
+               ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
+               DataOutputStream out = new DataOutputStream(byteOut);
+
+               byte[] bytes = null;
+
+               try {
+                       
+                       for(ICdmBase cdmBaseObject : cdmBaseObjects){
+                               writeCdmBaseObject(cdmBaseObject, out);
+                       }
+                       out.close();
+                       bytes = byteOut.toByteArray();
+               } catch (IOException e) {
+                       // when in doubt send nothing
+               }
+               return bytes;
+       }
+       
+       
+       private ICdmBase[] fromByteArray(byte[] bytes) {
+               DataInputStream in = new DataInputStream(new ByteArrayInputStream(bytes));
+               
+               try {
+                       List<ICdmBase> cdmBaseObjects = new ArrayList<ICdmBase>();
+                      
+                       try{
+                               while(true){
+                                       cdmBaseObjects.add(readCdmBaseObject(in));
+                               }
+                       }catch(EOFException e){
+                               return cdmBaseObjects.toArray(new ICdmBase[]{});
+                       }
+               } catch (IOException e) {
+                       return null;
+               }
+       }
+       
+       private ICdmBase readCdmBaseObject(DataInputStream in) throws IOException{
+               String className = in.readUTF();
+               in.readInt();
+               String idString = in.readUTF();
+               in.readInt();
+               
+               if(className.equals(Synonym.class.getName()) || className.equals(Taxon.class.getName())){
+                       ICdmBase object = CdmStore.getTaxonService().load(UUID.fromString(idString));
+                       
+                       if(object == null){
+                               return cdmBase;
+                       }
+                       
+                       return object;
                }
-               return cdmObject;
+               
+               return null;
        }
        
-       private boolean isInvalidNativeType(Object result) {
-               // No encoding needed since this is a hardcoded string read and written
-               // in the same process.
-               // See javaToNative above
-               return !(result instanceof byte[])
-                               || !CDMTYPENAME.equals(new String((byte[]) result));
+       private void writeCdmBaseObject(ICdmBase cdmBase, DataOutputStream out) throws IOException{
+               /**
+                * CdmBase object serialization:
+                * 
+                */
+               out.writeUTF(cdmBase.getClass().getName());
+               out.writeInt(SEPARATOR);
+               out.writeUTF(cdmBase.getUuid().toString());
+               out.writeInt(EOF);
+               
+               if(cdmBase.getId() == 0){
+                       // fallback for unsaved instances
+                       this.cdmBase = cdmBase;
+               }
        }
 
 }
diff --git a/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/CompositeBorderDecorator.java b/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/CompositeBorderDecorator.java
deleted file mode 100644 (file)
index ee9f702..0000000
+++ /dev/null
@@ -1,101 +0,0 @@
-/**\r
-* Copyright (C) 2007 EDIT\r
-* European Distributed Institute of Taxonomy \r
-* http://www.e-taxonomy.eu\r
-* \r
-* The contents of this file are subject to the Mozilla Public License Version 1.1\r
-* See LICENSE.TXT at the top of this package for the full license terms.\r
-*/\r
-\r
-package eu.etaxonomy.taxeditor.editor;\r
-\r
-import org.apache.log4j.Logger;\r
-import org.eclipse.swt.events.FocusEvent;\r
-import org.eclipse.swt.events.FocusListener;\r
-import org.eclipse.swt.graphics.Color;\r
-import org.eclipse.swt.widgets.Composite;\r
-import org.eclipse.ui.forms.IManagedForm;\r
-import org.eclipse.ui.forms.widgets.FormToolkit;\r
-import org.eclipse.ui.forms.widgets.ScrolledForm;\r
-\r
-/**\r
- * Draws a border on a Composite on an IManagedForm when it gets focus, \r
- *  undraws it when the Composite loses focus.\r
- *  \r
- * @author p.ciardelli\r
- *\r
- */\r
-public class CompositeBorderDecorator implements FocusListener {       \r
-       private static final Logger logger = Logger.getLogger(CompositeBorderDecorator.class);\r
-               \r
-       private FormToolkit toolkit;\r
-       private ScrolledForm scrolledForm;\r
-       private Composite borderedComposite;\r
-       \r
-       /**\r
-        * If true, the <code>borderedComposite</code>'s border is erased when\r
-        * it loses focus.\r
-        */\r
-       private boolean doLoseFocus = true;\r
-\r
-       public CompositeBorderDecorator(Composite composite, IManagedForm form) {\r
-                               \r
-               this.borderedComposite = composite;\r
-               this.toolkit = form.getToolkit();\r
-               this.scrolledForm = form.getForm();\r
-               \r
-               // Make sure composite retains its color scheme after being adapted to toolkit\r
-               Color backgroundColor = composite.getBackground();\r
-               \r
-               toolkit.adapt(composite);\r
-               \r
-               composite.setBackground(backgroundColor);\r
-               \r
-       }\r
-       \r
-       \r
-       public void focusGained(FocusEvent e) {\r
-               paintBorder();\r
-       }\r
-\r
-       \r
-       public void focusLost(FocusEvent e) {\r
-               if (doLoseFocus) {\r
-                       unpaintBorder();\r
-               }\r
-       }\r
-       \r
-       public void setBorderedComposite(Composite borderedComposite) {\r
-               this.borderedComposite = borderedComposite;\r
-       }\r
-       \r
-       /**\r
-        * If this is set to true, border will disappear when focus is lost.\r
-        * Otherwise, it will remain until explicitly erased. \r
-        * \r
-        * @param doLoseFocus\r
-        */\r
-       public void setLoseFocus(boolean doLoseFocus) {\r
-               this.doLoseFocus = doLoseFocus;\r
-       }\r
-       \r
-       /**\r
-        * Removes the border from <code>borderedComposite</code>.\r
-        */\r
-       public void unpaintBorder() {\r
-               paintBorder(null);              \r
-       }\r
-       \r
-       /**\r
-        * Adds a border to <code>borderedComposite</code>.\r
-        */\r
-       public void paintBorder() {\r
-               paintBorder(FormToolkit.TEXT_BORDER);\r
-       }\r
-       \r
-       private void paintBorder(String border) {               \r
-               borderedComposite.setData(FormToolkit.KEY_DRAW_BORDER, border);\r
-               toolkit.paintBordersFor(borderedComposite.getParent());\r
-               scrolledForm.reflow(false);\r
-       }\r
-}
\ No newline at end of file
index 3e1a978ff2b417469aba6d3d9465458aca0ebf2f..cde4841c828756c6ee75075b2b76eae3e501983b 100644 (file)
@@ -19,6 +19,7 @@ import org.eclipse.core.commands.operations.IUndoContext;
 import org.eclipse.jface.dialogs.MessageDialog;\r
 import org.eclipse.jface.viewers.ISelection;\r
 import org.eclipse.jface.viewers.IStructuredSelection;\r
+import org.eclipse.swt.widgets.Display;\r
 import org.eclipse.swt.widgets.Shell;\r
 import org.eclipse.ui.IEditorInput;\r
 import org.eclipse.ui.IEditorPart;\r
@@ -67,9 +68,8 @@ public class EditorUtil extends AbstractUtility{
         * @return \r
         * @throws PartInitException\r
         */\r
-       private static IEditorPart open(IEditorInput input, String editorId)\r
-                       throws PartInitException {\r
-               return getActivePage().openEditor(input, editorId);\r
+       private static void open(final IEditorInput input, final String editorId) throws PartInitException{\r
+               getActivePage().openEditor(input, editorId);\r
        }\r
        \r
        /**\r
@@ -79,10 +79,8 @@ public class EditorUtil extends AbstractUtility{
         * @return\r
         * @throws PartInitException\r
         */\r
-       public static IEditorPart open(TaxonEditorInput input) throws PartInitException{\r
-               IEditorPart editor = open(input, MultiPageTaxonEditor.ID);\r
-//             editor.setFocus();\r
-               return editor;\r
+       public static void open(TaxonEditorInput input) throws PartInitException{\r
+               open(input, MultiPageTaxonEditor.ID);\r
        }\r
 \r
        /**\r
@@ -93,9 +91,9 @@ public class EditorUtil extends AbstractUtility{
         * @return\r
         * @throws PartInitException \r
         */\r
-       public static IEditorPart openTaxonNode(UUID taxonNodeUuid) throws PartInitException {\r
+       public static void openTaxonNode(UUID taxonNodeUuid) throws PartInitException {\r
                TaxonEditorInput input = TaxonEditorInput.NewInstance(taxonNodeUuid); \r
-               return open(input);\r
+               open(input);\r
        }\r
        \r
        /**\r
@@ -106,14 +104,14 @@ public class EditorUtil extends AbstractUtility{
         * @return\r
         * @throws PartInitException \r
         */\r
-       public static IEditorPart openTaxon(UUID taxonUuid) throws PartInitException {\r
+       public static void openTaxon(UUID taxonUuid) throws PartInitException {\r
                TaxonEditorInput input = TaxonEditorInput.NewInstanceFromTaxon(taxonUuid); \r
-               return open(input);\r
+               open(input);\r
        }\r
        \r
-       public static IEditorPart openTaxonBase(UUID taxonBaseUuid) throws PartInitException {\r
+       public static void openTaxonBase(UUID taxonBaseUuid) throws PartInitException {\r
                TaxonEditorInput input = TaxonEditorInput.NewInstanceFromTaxonBase(taxonBaseUuid); \r
-               return open(input);\r
+               open(input);\r
        }\r
        \r
 \r
@@ -131,15 +129,13 @@ public class EditorUtil extends AbstractUtility{
         * @return                              The EditorPart.\r
         * @throws PartInitException \r
         */\r
-       public static IEditorPart openEmpty(UUID parentNodeUuid) throws PartInitException{\r
+       public static void openEmpty(UUID parentNodeUuid) throws PartInitException{\r
                TaxonEditorInput input = TaxonEditorInput.NewEmptyInstance(parentNodeUuid);\r
-               IEditorPart editorPart = open(input, MultiPageTaxonEditor.ID);\r
+               open(input, MultiPageTaxonEditor.ID);\r
+               \r
+               getActiveMultiPageTaxonEditor().changed(null);\r
                \r
-               if(editorPart instanceof MultiPageTaxonEditor){\r
-                       ((MultiPageTaxonEditor) editorPart).changed(null);\r
-               }\r
                \r
-               return editorPart;\r
        }\r
 \r
        public static void setSaving(boolean isSaving) {\r
diff --git a/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/GroupComposite.java b/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/GroupComposite.java
deleted file mode 100644 (file)
index 924866b..0000000
+++ /dev/null
@@ -1,132 +0,0 @@
-/**\r
-* Copyright (C) 2007 EDIT\r
-* European Distributed Institute of Taxonomy \r
-* http://www.e-taxonomy.eu\r
-* \r
-* The contents of this file are subject to the Mozilla Public License Version 1.1\r
-* See LICENSE.TXT at the top of this package for the full license terms.\r
-*/\r
-\r
-package eu.etaxonomy.taxeditor.editor;\r
-\r
-import org.apache.log4j.Logger;\r
-import org.eclipse.swt.SWT;\r
-import org.eclipse.swt.dnd.DND;\r
-import org.eclipse.swt.dnd.DropTarget;\r
-import org.eclipse.swt.dnd.DropTargetAdapter;\r
-import org.eclipse.swt.dnd.DropTargetEvent;\r
-import org.eclipse.swt.dnd.DropTargetListener;\r
-import org.eclipse.swt.dnd.Transfer;\r
-import org.eclipse.swt.graphics.Color;\r
-import org.eclipse.swt.widgets.Composite;\r
-import org.eclipse.swt.widgets.Event;\r
-import org.eclipse.swt.widgets.Listener;\r
-import org.eclipse.ui.forms.widgets.TableWrapData;\r
-import org.eclipse.ui.forms.widgets.TableWrapLayout;\r
-\r
-import eu.etaxonomy.cdm.model.common.CdmBase;\r
-import eu.etaxonomy.cdm.model.taxon.Taxon;\r
-import eu.etaxonomy.taxeditor.editor.name.AbstractNameComposite;\r
-import eu.etaxonomy.taxeditor.editor.name.TaxonNameEditor;\r
-import eu.etaxonomy.taxeditor.preference.Resources;\r
-\r
-/**\r
- * @author p.ciardelli\r
- * @created 25.06.2008\r
- * @version 1.0\r
- */\r
-public class GroupComposite extends Composite {\r
-       private static final Logger logger = Logger.getLogger(GroupComposite.class);\r
-       \r
-       protected TaxonNameEditor editor;\r
-       protected Taxon taxon;\r
-       \r
-       private DropTarget target;\r
-       private DropTargetListener dropListener;\r
-               \r
-       public GroupComposite(Composite parent) {\r
-               super(parent, SWT.NONE);\r
-\r
-               // Graphic layout of composite\r
-               this.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB));\r
-               this.setLayout(new TableWrapLayout());\r
-               Color groupBackgroundColor = EditorUtil.\r
-                               getColor(Resources.COLOR_COMPOSITE_BACKGROUND);\r
-               this.setBackground(groupBackgroundColor);\r
-\r
-               // Drop functionality\r
-               this.setDroppable(true);\r
-               \r
-               logger.trace("Created a new Group composite");\r
-       }\r
-       \r
-       public GroupComposite(TaxonNameEditor editor, Composite parent){\r
-               this(parent);\r
-               this.editor = editor;\r
-               this.taxon = editor.getTaxon();\r
-       }\r
-       \r
-       public void setDroppable(boolean droppable) {\r
-               if (droppable) {\r
-                       Transfer[] types = new Transfer[] {CdmDataTransfer.getInstance()};      \r
-                       int operations = DND.DROP_MOVE | DND.DROP_COPY | DND.DROP_DEFAULT;\r
-                       target = new DropTarget(this, operations);\r
-                       target.setTransfer(types);\r
-                       dropListener = new DropTargetAdapter() {\r
-                                                       \r
-                               public void dragEnter(DropTargetEvent event) {\r
-                                       GroupComposite.this.notifyListeners(SWT.FocusIn, null);\r
-                               }\r
-                               \r
-                               public void dragLeave(DropTargetEvent event) {\r
-                                       GroupComposite.this.notifyListeners(SWT.FocusOut, null);\r
-                               }\r
-                               \r
-                               public void drop(DropTargetEvent event) {\r
-                                                                       \r
-                                       if (event.data instanceof CdmBase) {\r
-                                               \r
-                                               final AbstractNameComposite composite = editor.getNameComposite(event.data);\r
-                                               \r
-                                               if(composite != null && composite.getDragSource() != null){\r
-                                                       \r
-                                                       // Make sure composite is not being dropped onto its current parent\r
-                                                       if ( ! composite.getParent().equals(GroupComposite.this)) {\r
-                                                               \r
-                                                               // Change parent at end of drag event\r
-                                                               composite.getDragSource().addListener(DND.DragEnd, new Listener() {\r
-                                                                       \r
-                                                                       public void handleEvent(Event event) {\r
-                                                                               composite.setParent(GroupComposite.this);\r
-                                                                       }\r
-                                                               });\r
-                                                       }                                                       \r
-                                               }\r
-                                       }\r
-                               }\r
-                       };\r
-                       target.addDropListener(dropListener);                   \r
-               } else {\r
-                       if (dropListener != null) {\r
-                               target.removeDropListener(dropListener);\r
-                       }\r
-               }\r
-       }\r
-       \r
-       public void dispose() {\r
-               \r
-               if (target != null) {\r
-                       target.removeDropListener(dropListener);\r
-                       target.dispose();\r
-               }\r
-                               \r
-               super.dispose();\r
-       }\r
-\r
-       /**\r
-        * @return the taxon\r
-        */\r
-       public Taxon getTaxon() {\r
-               return taxon;\r
-       }\r
-}\r
diff --git a/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/GroupCompositeLabel.java b/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/GroupCompositeLabel.java
deleted file mode 100644 (file)
index 7772695..0000000
+++ /dev/null
@@ -1,49 +0,0 @@
-/**\r
-* Copyright (C) 2007 EDIT\r
-* European Distributed Institute of Taxonomy \r
-* http://www.e-taxonomy.eu\r
-* \r
-* The contents of this file are subject to the Mozilla Public License Version 1.1\r
-* See LICENSE.TXT at the top of this package for the full license terms.\r
-*/\r
-\r
-package eu.etaxonomy.taxeditor.editor;\r
-\r
-import org.apache.log4j.Logger;\r
-import org.eclipse.swt.SWT;\r
-import org.eclipse.swt.widgets.Composite;\r
-import org.eclipse.swt.widgets.Label;\r
-import org.eclipse.ui.forms.widgets.TableWrapData;\r
-import org.eclipse.ui.forms.widgets.TableWrapLayout;\r
-\r
-/**\r
- * @author p.ciardelli\r
- * @created 10.09.2008\r
- * @version 1.0\r
- */\r
-public class GroupCompositeLabel extends Composite {\r
-       private static final Logger logger = Logger\r
-                       .getLogger(GroupCompositeLabel.class);\r
-\r
-       public GroupCompositeLabel(Composite parent, String labelText) {\r
-               super(parent, SWT.NONE);\r
-               \r
-               // TODO move to group composite?\r
-               \r
-               TableWrapLayout tableWrapLayout = new TableWrapLayout();\r
-               tableWrapLayout.horizontalSpacing = 1;\r
-               tableWrapLayout.rightMargin = 10;\r
-               tableWrapLayout.leftMargin = 10;\r
-               tableWrapLayout.bottomMargin = 1;\r
-               tableWrapLayout.topMargin = 1;\r
-               tableWrapLayout.verticalSpacing = 1;\r
-               setLayout(tableWrapLayout);\r
-               setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB, TableWrapData.MIDDLE));\r
-               \r
-               // Add the label\r
-               final Label label = new Label(this, SWT.NONE);\r
-               label.setText(labelText.toUpperCase());\r
-               \r
-               logger.trace(this.getClass().getSimpleName() + " created");\r
-       }\r
-}\r
diff --git a/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/GroupedComposite.java b/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/GroupedComposite.java
deleted file mode 100644 (file)
index b293066..0000000
+++ /dev/null
@@ -1,633 +0,0 @@
-/**\r
- * Copyright (C) 2007 EDIT\r
- * European Distributed Institute of Taxonomy \r
- * http://www.e-taxonomy.eu\r
- * \r
- * The contents of this file are subject to the Mozilla Public License Version 1.1\r
- * See LICENSE.TXT at the top of this package for the full license terms.\r
- */\r
-\r
-package eu.etaxonomy.taxeditor.editor;\r
-\r
-import org.apache.log4j.Logger;\r
-import org.eclipse.core.runtime.Assert;\r
-import org.eclipse.jface.dialogs.Dialog;\r
-import org.eclipse.jface.text.IDocument;\r
-import org.eclipse.jface.text.TextViewer;\r
-import org.eclipse.jface.window.DefaultToolTip;\r
-import org.eclipse.swt.SWT;\r
-import org.eclipse.swt.custom.StyledText;\r
-import org.eclipse.swt.dnd.DND;\r
-import org.eclipse.swt.dnd.DragSource;\r
-import org.eclipse.swt.dnd.DragSourceAdapter;\r
-import org.eclipse.swt.dnd.DragSourceEvent;\r
-import org.eclipse.swt.dnd.DragSourceListener;\r
-import org.eclipse.swt.dnd.Transfer;\r
-import org.eclipse.swt.events.ControlAdapter;\r
-import org.eclipse.swt.events.ControlEvent;\r
-import org.eclipse.swt.events.ControlListener;\r
-import org.eclipse.swt.events.FocusAdapter;\r
-import org.eclipse.swt.events.FocusEvent;\r
-import org.eclipse.swt.events.FocusListener;\r
-import org.eclipse.swt.events.MouseAdapter;\r
-import org.eclipse.swt.events.MouseEvent;\r
-import org.eclipse.swt.graphics.Color;\r
-import org.eclipse.swt.graphics.Font;\r
-import org.eclipse.swt.graphics.Image;\r
-import org.eclipse.swt.widgets.Composite;\r
-import org.eclipse.swt.widgets.Control;\r
-import org.eclipse.swt.widgets.Display;\r
-import org.eclipse.swt.widgets.Label;\r
-import org.eclipse.swt.widgets.Menu;\r
-import org.eclipse.ui.forms.IManagedForm;\r
-import org.eclipse.ui.forms.widgets.TableWrapData;\r
-import org.eclipse.ui.forms.widgets.TableWrapLayout;\r
-\r
-import eu.etaxonomy.cdm.model.common.CdmBase;\r
-import eu.etaxonomy.cdm.model.taxon.Taxon;\r
-import eu.etaxonomy.taxeditor.editor.name.NameViewer;\r
-import eu.etaxonomy.taxeditor.editor.name.TaxonNameEditor;\r
-import eu.etaxonomy.taxeditor.model.TextHelper;\r
-import eu.etaxonomy.taxeditor.preference.Resources;\r
-\r
-/** \r
- * Formats <code>GroupedComposite</code> with cosmetic and layout properties specific to the\r
- * Editor. This should be used to maintain a consistent look and feel for all Editor \r
- * freetext area components, such as DescriptionElementComposite.\r
- * <p>\r
- * Requires an <code>IManagedForm</code>, whose <code>input</code> is set to the contents\r
- * of {@link #getData()} when the <code>GroupedComposite</code> gets focus, i.e. to\r
- * populate the property sheet with the data.\r
- * </p>\r
- * <p>\r
- * The <code>IManagedForm</code> is also required to have a <code>Taxon</code> in its \r
- * own <code>getData()</code>.\r
- * </p> \r
- * <p>\r
- * The <code>IManagedForm</code> can also used for drawing borders by calling the method \r
- * <code>createBorderSupport()</code>.\r
- * </p>\r
- * @author p.ciardelli\r
- * @created 02.06.2008\r
- * @version 1.0\r
- */\r
-abstract public class GroupedComposite extends Composite {     \r
-       private static final Logger logger = Logger.getLogger(GroupedComposite.class);\r
-       \r
-       protected TaxonNameEditor editor;\r
-       \r
-       protected NameViewer textViewer;\r
-       protected IManagedForm managedForm;\r
-       private Label nonEditableInfoLabel;\r
-       private DefaultToolTip nonEditableInfoHover;\r
-       \r
-       private static GroupedComposite selection;\r
-       \r
-       private Taxon acceptedTaxon;\r
-       \r
-       private CompositeBorderDecorator borderDecorator;       \r
-       private FocusListener focusListener;\r
-       private LineBreakListener lineBreakListener;\r
-\r
-       private String emptyViewerPrompt;\r
-       \r
-       private int cursorPosition;\r
-       \r
-       public GroupedComposite(TaxonNameEditor editor, Composite parent){\r
-               super(parent, SWT.NONE);\r
-               \r
-               this.editor = editor;\r
-               this.managedForm = editor.getManagedForm();\r
-               \r
-               Object formData = managedForm.getForm().getBody().getData();\r
-               Assert.isTrue(formData instanceof Taxon, \r
-                               "Managed form must have a Taxon in its data field.");\r
-               acceptedTaxon = (Taxon) formData;\r
-\r
-               createControl();\r
-               \r
-               logger.trace(this.getClass().getSimpleName() + " created");\r
-       }\r
-               \r
-       protected void createControl() {\r
-               setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB));\r
-               TableWrapLayout layout = new TableWrapLayout();\r
-               layout.leftMargin = 0;\r
-               layout.topMargin = 0;\r
-               layout.bottomMargin = 0;\r
-               layout.verticalSpacing = 0;\r
-               setLayout(layout);\r
-               \r
-               setBackground(EditorUtil.getColor(Resources.COLOR_COMPOSITE_BACKGROUND));\r
-       }\r
-       \r
-       protected void createLineWrapSupport() {\r
-               if (textViewer instanceof NameViewer) {\r
-                       new LineWrapSupport(textViewer, managedForm);\r
-               } else {\r
-                       logger.warn("Can't create line wrap support because textViewer has not been initialized.");\r
-               }\r
-       }\r
-       \r
-       public Taxon getEditorTaxon() {\r
-               return acceptedTaxon;\r
-       }\r
-       \r
-       protected void createTextViewer() {\r
-               textViewer = new NameViewer(this);\r
-               \r
-//             textViewer.addSelectionChangedListener(new ISelectionChangedListener() {\r
-//                     \r
-//                     public void selectionChanged(SelectionChangedEvent event) {\r
-//                             // TODO Auto-generated method stub\r
-//                             \r
-//                             logger.warn("selectionChanged");\r
-//                     }\r
-//             });\r
-//             \r
-//             textViewer.addViewportListener(new IViewportListener() {\r
-//                     \r
-//                     public void viewportChanged(int verticalOffset) {\r
-//                             // TODO Auto-generated method stub\r
-//                             logger.warn("viewportChanged");\r
-//                     }\r
-//             });\r
-//             \r
-               focusListener = new FocusAdapter() {\r
-                       public void focusGained(FocusEvent e) {\r
-                               setFocus();\r
-//                             logger.warn("focusGained");\r
-                       }\r
-               \r
-               };\r
-               \r
-               textViewer.getTextWidget().addFocusListener(focusListener);\r
-//             \r
-               MouseAdapter mouseListener = new MouseAdapter() {\r
-                       public void mouseDown(MouseEvent e) {\r
-                               storeCursor();\r
-                               setFocus();             \r
-                               \r
-//                             logger.warn("mouseDown");\r
-//                             logger.warn(textViewer.getCursorPosition());\r
-                       }\r
-               };\r
-               this.addMouseListener(mouseListener);\r
-               textViewer.getRulerControl().addMouseListener(mouseListener);\r
-               textViewer.getTextWidget().addMouseListener(mouseListener);\r
-       }\r
-       \r
-       /**\r
-        * @param icon\r
-        */\r
-       public void setIcon(Image icon) {\r
-               if (textViewer instanceof NameViewer) {\r
-                       textViewer.setIcon(icon);\r
-               } else {\r
-                       logger.warn("Can't set icon because textViewer has not been initialized.");\r
-               }\r
-       }\r
-       \r
-       /**\r
-        * @param indent\r
-        */\r
-       public void setIndent(int indent) {\r
-               if (getLayout() instanceof TableWrapLayout) {\r
-                       TableWrapLayout layout = ((TableWrapLayout) getLayout());\r
-                       layout.leftMargin = indent;\r
-                       this.setLayout(layout);\r
-               } else {\r
-                       logger.warn("Couldn't indent - composite's layout must be TableWrapLayout.");\r
-               }\r
-       }       \r
-       \r
-       /* (non-Javadoc)\r
-        * @see org.eclipse.swt.widgets.Composite#setFocus()\r
-        */\r
-       public boolean setFocus() {\r
-               //logger.warn("Setting focus to groupd composite");\r
-               setSelection();\r
-               textViewer.getTextWidget().setFocus();\r
-               return true;\r
-       }\r
-       \r
-       /**\r
-        * Set background on selection and the cursor to EOL\r
-        * I wanted to move this to setFocus() but that leads to an infinite loop\r
-        */\r
-       public void setSelected(){\r
-               setBackground(EditorUtil.getColor(Resources.COLOR_COMPOSITE_SELECTED));\r
-               if(textViewer != null){\r
-                       placeCursor();\r
-               }\r
-       }\r
-       \r
-       /**\r
-        * \r
-        */\r
-       protected void setSelection() {\r
-               managedForm.setInput(this);\r
-       }\r
-       \r
-       /**\r
-        * \r
-        */\r
-       protected void setDelayedSelection(){\r
-               //TODO this might be done better\r
-               // this is the quickest solution i could come up with and it improves performance\r
-               // please reimplement if you know better.\r
-               selection = this;\r
-               \r
-               // start timer\r
-               Display display = Display.getCurrent();\r
-               Runnable runnable = new Runnable() {\r
-                       \r
-                       public void run() {\r
-                               managedForm.setInput(selection);\r
-                       }\r
-               };\r
-               display.timerExec(1000, runnable);\r
-               \r
-       }\r
-       \r
-       /**\r
-        * \r
-        */\r
-       @Override\r
-       public void setBackground(Color color) {\r
-               super.setBackground(color);\r
-               if(textViewer != null){\r
-                       textViewer.setBackground(color);\r
-               }\r
-       }\r
-\r
-       /* (non-Javadoc)\r
-        * @see org.eclipse.swt.widgets.Control#setFont(org.eclipse.swt.graphics.Font)\r
-        */\r
-       public void setFont(Font font) {\r
-               if (textViewer != null) {\r
-                       textViewer.getTextWidget().setFont(font);\r
-               } else {\r
-                       logger.warn("Can't set font because textViewer has not been initalized.");\r
-               }\r
-       }\r
-       \r
-       public TextViewer getTextViewer() {\r
-               return textViewer;\r
-       }\r
-       \r
-       /**\r
-        * If <code>textViewer</code> has already been set, it will show a \r
-        * <code>prompt</code> along the lines of "Click here to start entering data" \r
-        * when empty.\r
-        * \r
-        * @param prompt\r
-        */\r
-       public void createEmptyViewerPrompt(final String prompt) {\r
-               \r
-               emptyViewerPrompt = prompt;\r
-               \r
-               Assert.isNotNull(textViewer);\r
-//             new EmptyTextViewerPrompt(getTextViewer(), prompt);\r
-                \r
-               final StyledText textControl = textViewer.getTextWidget();\r
-               final IDocument document = textViewer.getDocument();\r
-               \r
-               setFocusListener(new FocusListener() {\r
-\r
-                       \r
-                       public void focusGained(FocusEvent e) {\r
-                               if (document.get().equals(prompt)) {\r
-                                       textControl.setFont(getViewerFont());\r
-                                       document.set("");\r
-                               }\r
-                       }\r
-\r
-                       \r
-                       public void focusLost(FocusEvent e) {\r
-                               if (document.getLength() == 0) {\r
-                                       initEmptyText();\r
-                               }\r
-                       }\r
-                       \r
-               });\r
-               textControl.addFocusListener(getFocusListener());\r
-               \r
-               if (document.getLength() == 0) {\r
-                       textControl.setFont(EditorUtil.getFont(Resources.FONT_DEFAULT_PROMPT));\r
-                       document.set(prompt);\r
-               }\r
-       }\r
-       \r
-       abstract protected Font getViewerFont();\r
-\r
-       protected void initEmptyText() {\r
-               Font defaultFont = EditorUtil.getFont(Resources.FONT_DEFAULT_PROMPT);\r
-               textViewer.getTextWidget().setFont(defaultFont);\r
-               \r
-               textViewer.getDocument().set(getEmptyTextPrompt());\r
-               placeCursor();\r
-       }\r
-\r
-       protected String getEmptyTextPrompt() {\r
-               if (emptyViewerPrompt == null) {\r
-                       emptyViewerPrompt = "Click to edit";\r
-               }\r
-               return emptyViewerPrompt;\r
-       }\r
-\r
-       protected void setFocusListener(FocusListener focusListener) {\r
-               this.focusListener = focusListener;\r
-       }\r
-\r
-       private FocusListener getFocusListener() {\r
-               return focusListener;\r
-       }\r
-               \r
-       /**\r
-        * \r
-        */\r
-       public void createBorderSupport() {\r
-               \r
-               if (textViewer == null) {\r
-                       logger.warn("Could not create border support - getTextViewer() returned null.");\r
-               } else {\r
-                       borderDecorator = new CompositeBorderDecorator(\r
-                                       textViewer.getTextWidget(), managedForm);               \r
-                       borderDecorator.setLoseFocus(false);\r
-                       textViewer.getTextWidget().addFocusListener(borderDecorator);\r
-               }\r
-       }\r
-       \r
-       protected void setBorderDecorator(CompositeBorderDecorator borderDecorator) {\r
-               this.borderDecorator = borderDecorator;\r
-       }\r
-       \r
-       protected CompositeBorderDecorator getBorderDecorator() {\r
-               return borderDecorator;\r
-       }\r
-       \r
-       public void drawBorder() {\r
-               if (borderDecorator != null) {\r
-                       borderDecorator.paintBorder();\r
-               }\r
-       }\r
-\r
-       /**\r
-        * @param isDirty\r
-        */\r
-       public void setDirty(boolean isDirty) {\r
-               managedForm.dirtyStateChanged();\r
-       }\r
-       \r
-       public boolean isDirty(){\r
-               return managedForm.isDirty();\r
-       }\r
-       \r
-       public void setMenu (Menu menu) {\r
-               super.setMenu(menu);\r
-               \r
-               if (textViewer != null) {\r
-                       textViewer.setMenu(menu);\r
-               }\r
-       }\r
-       \r
-       public void unpaintBorder() {\r
-               if (borderDecorator != null) {\r
-                       borderDecorator.unpaintBorder();\r
-               }\r
-       }\r
-       \r
-       private Control draggableControl;\r
-       private DragSource dragSource;\r
-       \r
-       protected void setDraggableControl(Control control) {\r
-               draggableControl = control;\r
-       }\r
-\r
-       public DragSource getDragSource() {\r
-               return dragSource;\r
-       }\r
-       \r
-       public void setIsDraggable(boolean draggable) {\r
-\r
-               if (draggable) {\r
-\r
-                       if (dragSource != null) {\r
-                               // Already initialized\r
-                               return;\r
-                       }\r
-\r
-                       if (draggableControl == null) {\r
-                               throw new NullPointerException(\r
-                                               "Draggable control must be set to add draggability");\r
-                       }\r
-                       \r
-                       Transfer[] types = new Transfer[] { CdmDataTransfer.getInstance() };                    \r
-                       int operations = DND.DROP_MOVE | DND.DROP_COPY | DND.DROP_LINK;\r
-\r
-                       dragSource = new DragSource(draggableControl, operations);\r
-                       dragSource.setTransfer(types);\r
-                       dragSource.addDragListener(dragSourceListener);\r
-\r
-               } else {\r
-                       dragSource = null;\r
-               }\r
-       }\r
-\r
-       /**\r
-        * Drag listener which passes the Composite as the data in a drag event.\r
-        */\r
-       DragSourceListener dragSourceListener = new DragSourceAdapter() {\r
-\r
-               public void dragStart(DragSourceEvent event) {\r
-                       if (textViewer != null) {\r
-                               textViewer.getTextWidget().setFocus();\r
-                       }\r
-                       event.doit = true;\r
-               }\r
-               \r
-               public void dragSetData(DragSourceEvent event) {\r
-                       Object data = GroupedComposite.this.getData();\r
-                       if(data instanceof CdmBase){\r
-                               CdmDataTransfer.getInstance().setCdmObject((CdmBase) data);\r
-                       }\r
-//                     WidgetTransfer.getInstance().setWidget(GroupedComposite.this);\r
-               }\r
-       };\r
-\r
-       private String nonEditableText;\r
-       ControlListener nonEditableResizeListener = new ControlAdapter() {\r
-               \r
-               int width = 0;\r
-               \r
-               public void controlResized(ControlEvent e) {\r
-                       if (nonEditableInfoLabel.getBounds().width == width) {\r
-                               return;\r
-                       }\r
-                       width = nonEditableInfoLabel.getBounds().width;\r
-                       if (nonEditableInfoLabel.getBounds().width > 0) {\r
-                               nonEditableInfoLabel.setText(\r
-                                               Dialog.shortenText(nonEditableText.toUpperCase(), \r
-                                               nonEditableInfoLabel));\r
-                       }\r
-               }\r
-       };\r
-\r
-       private String nonEditableHoverText;\r
-\r
-       private LabelEllipsisListener nonEditableLabelEllipsisListener;\r
-                       \r
-       /**\r
-        * nonEditableInfo is a label displayed underneath a GroupedComposite's \r
-        * input field. For instance, NameComposites display things like name relations,\r
-        * sec. references, etc. here.\r
-        * \r
-        * @param info the text to display in the label\r
-        * @param append whether the string should be appended to text that is already shown in the label\r
-        */\r
-       public void setNonEditableInfo(String info, boolean append) {\r
-               // TODO non editable info should only be drawn once, when everything else is drawn\r
-               info = info.toUpperCase();\r
-               \r
-               if(append){\r
-                       nonEditableText += ", " + info;\r
-                       nonEditableHoverText += "\n" + info;\r
-               }else{\r
-                       nonEditableText = info;\r
-                       nonEditableHoverText = info;\r
-               }\r
-               \r
-               if (nonEditableInfoLabel == null) {\r
-                       nonEditableInfoLabel = new Label(this, SWT.NONE);\r
-                       TableWrapData layoutData = new TableWrapData(TableWrapData.FILL_GRAB, TableWrapData.TOP);\r
-                       // Set indent to viewer ruler's width \r
-                       if (textViewer != null && textViewer.getRulerControl() != null) {\r
-                               // TODO right justify\r
-                               layoutData.indent = NameViewer.RULER_WIDTH;\r
-                       }\r
-                       nonEditableInfoLabel.setLayoutData(layoutData);\r
-                       \r
-\r
-                       \r
-                       nonEditableLabelEllipsisListener = new LabelEllipsisListener(nonEditableInfoLabel) {\r
-                               @Override\r
-                               public String getLabelText() {\r
-                                       return nonEditableText.toUpperCase();\r
-                               }\r
-                       }; \r
-                       nonEditableInfoLabel.addControlListener(nonEditableLabelEllipsisListener);\r
-                       \r
-                       nonEditableInfoHover = new DefaultToolTip(nonEditableInfoLabel);\r
-                       nonEditableInfoHover.setRespectDisplayBounds(true);\r
-                       \r
-               } \r
-               nonEditableInfoHover.setText(nonEditableHoverText);\r
-               nonEditableInfoLabel.setText(nonEditableText);\r
-       }\r
-       \r
-       /**\r
-        * If the user hitting carriage return should cause something to happen -\r
-        * i.e. the creation of a new composite - call this method and override\r
-        * the method handleSplitText().\r
-        */\r
-       protected void createLineBreakListener() {\r
-               if (textViewer != null) {\r
-                       lineBreakListener = new LineBreakListener() {\r
-                               @Override\r
-                               public void handleSplitText(String text) {\r
-                                       GroupedComposite.this.handleSplitText(text);    \r
-                               }\r
-                       };\r
-                       \r
-                       textViewer.getTextWidget().addVerifyListener(lineBreakListener);\r
-                       textViewer.getTextWidget().addKeyListener(lineBreakListener);\r
-               } else {\r
-                       logger.warn("Can't create line break listener because textViewer has not been initalized.");\r
-               }\r
-       }\r
-       \r
-       /**\r
-        * Supposed to be overridden in implementing classes\r
-        * \r
-        * @param text\r
-        */\r
-       protected void handleSplitText(String text) {\r
-               logger.warn("No handleSplitText method defined for this composite.");\r
-       }\r
-       \r
-       /* (non-Javadoc)\r
-        * @see eu.etaxonomy.taxeditor.editor.name.GroupedComposite#dispose()\r
-        */\r
-       public void dispose () {\r
-               \r
-               if (dragSource != null) {\r
-                       dragSource.removeDragListener(dragSourceListener);\r
-               }               \r
-               \r
-               if (textViewer != null) {\r
-                       StyledText textWidget = textViewer.getTextWidget();\r
-               \r
-                       if (focusListener != null) {\r
-                               textWidget.removeFocusListener(focusListener);\r
-                       }\r
-                       \r
-                       if (lineBreakListener != null) {\r
-                               textWidget.removeVerifyListener(lineBreakListener);\r
-                               textWidget.removeKeyListener(lineBreakListener);\r
-                       }\r
-                       \r
-                       if (borderDecorator != null) {\r
-                               textWidget.removeFocusListener(borderDecorator);\r
-                       }\r
-               }\r
-               \r
-               if (nonEditableInfoLabel != null && nonEditableLabelEllipsisListener != null) {\r
-                       nonEditableInfoLabel.removeControlListener(nonEditableLabelEllipsisListener);\r
-               }\r
-\r
-               super.dispose();\r
-       }\r
-       \r
-       \r
-       \r
-       abstract class LabelEllipsisListener extends ControlAdapter {\r
-               \r
-               private Label label;\r
-               int width = 0;\r
-\r
-               LabelEllipsisListener(Label label) {\r
-                       this.label = label;\r
-               }\r
-               \r
-               abstract public String getLabelText();\r
-               \r
-               public void controlResized(ControlEvent e) {\r
-                       if (label.getBounds().width == width) {\r
-                               return;\r
-                       }\r
-                       width = label.getBounds().width;\r
-                       if (label.getBounds().width > 0) {\r
-                               label.setText(\r
-//                                             Dialog.shortenText(getLabelText(), label));\r
-                                               TextHelper.shortenText(getLabelText(), label));\r
-                       }\r
-               }\r
-       }\r
-\r
-       public void storeCursor() {\r
-               this.cursorPosition = textViewer.getCursorPosition();\r
-       }\r
-       \r
-       /**\r
-        * Puts the cursor to the position it was last seen on or to the end of line\r
-        * if no former position is known.\r
-        */\r
-       public void placeCursor(){\r
-               if(cursorPosition == 0){\r
-                       textViewer.setCursorToEOL();\r
-               }else{\r
-                       textViewer.setCursorPosition(cursorPosition);\r
-               }\r
-       }\r
-} 
\ No newline at end of file
diff --git a/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/IDropTargetable.java b/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/IDropTargetable.java
new file mode 100644 (file)
index 0000000..f1cc39d
--- /dev/null
@@ -0,0 +1,24 @@
+/**
+ * 
+ */
+package eu.etaxonomy.taxeditor.editor;
+
+import org.eclipse.swt.widgets.Composite;
+
+import eu.etaxonomy.taxeditor.editor.name.TaxonNameEditor;
+import eu.etaxonomy.taxeditor.operations.IPostOperationEnabled;
+
+/**
+ * @author n.hoffmann
+ *
+ */
+public interface IDropTargetable extends IPostOperationEnabled {
+
+       public Composite getControl();
+       
+       public TaxonNameEditor getNameEditor();
+
+       public void dragEntered();
+
+       public void dragLeft();
+}
index 99ae7de6d918d5065dcf1f898b26b4f45f5cf283..80158f1c94d76ef6d0a0a09f6676672c1f22322c 100644 (file)
@@ -18,7 +18,6 @@ import org.apache.log4j.Logger;
 import org.eclipse.core.commands.operations.IUndoContext;\r
 import org.eclipse.core.commands.operations.UndoContext;\r
 import org.eclipse.core.runtime.IProgressMonitor;\r
-import org.eclipse.core.runtime.OperationCanceledException;\r
 import org.eclipse.ui.IEditorInput;\r
 import org.eclipse.ui.IEditorPart;\r
 import org.eclipse.ui.IEditorSite;\r
@@ -100,14 +99,12 @@ public class MultiPageTaxonEditor extends FormEditor implements IConversationEna
        \r
        @Override\r
        public void doSave(IProgressMonitor monitor) {\r
-\r
-               // Start the main progress monitor. The number of steps is set to the number of objects to be saved.\r
-        IProgressMonitor newMonitor = EditorUtil.startMainMonitor(monitor,"Saving", getPages().size());\r
-\r
-        try {\r
+               monitor.beginTask("Saving Editor", 4);\r
+               try{\r
                        if( ! conversation.isBound()){\r
                                conversation.bind();\r
                        }\r
+                       monitor.worked(1);\r
                        \r
                        for(IEditorPart editorPage : getPages()){\r
                                if(editorPage instanceof TaxonNameEditor){\r
@@ -116,28 +113,20 @@ public class MultiPageTaxonEditor extends FormEditor implements IConversationEna
                                                return;\r
                                        }\r
                                }\r
-//                             newMonitor.subTask("- step X");\r
+       \r
                                editorPage.doSave(monitor);\r
-                               \r
-                               // In case the progress monitor was canceled throw an exception.\r
-                               if (newMonitor.isCanceled()) {\r
-                       throw new OperationCanceledException();\r
-                   }\r
-                               \r
-                               // Otherwise declare this step as done.\r
-                   newMonitor.worked(1);\r
+                               monitor.worked(1);\r
                        }\r
                        \r
                        // commit the conversation and start a new transaction immediately\r
                        conversation.commit(true);\r
+                       monitor.worked(1);\r
                        \r
                        this.setDirty(false);\r
-        }\r
-        finally {\r
-               \r
-               // Stop the progress monitor.\r
-            newMonitor.done();\r
-        }\r
+                       monitor.worked(1);\r
+               }finally{\r
+                       monitor.done();\r
+               }\r
        }\r
 \r
 \r
@@ -192,14 +181,6 @@ public class MultiPageTaxonEditor extends FormEditor implements IConversationEna
                        throw new PartInitException(\r
                                        "Invalid Input: Must be TaxonEditorInput");\r
                \r
-               // FIXME looks like we do it differently now\r
-               // Get taxon from editor input\r
-//             if (input.getAdapter(Taxon.class) != null) {\r
-//                     taxon = (Taxon) input.getAdapter(Taxon.class);\r
-//             } else {\r
-//                     taxon = null;\r
-//             }\r
-               \r
                this.input = (TaxonEditorInput) input;\r
 \r
                try {\r
@@ -375,4 +356,9 @@ public class MultiPageTaxonEditor extends FormEditor implements IConversationEna
                IMultiPageTaxonEditorPage editorPage = getPage(page);\r
                return editorPage != null && editorPage.redraw(focus);\r
        }\r
+\r
+       public boolean onComplete() {\r
+               // TODO Auto-generated method stub\r
+               return false;\r
+       }\r
 }
\ No newline at end of file
index c7aeb11c7038c8bba87fcc5538f8fc47eba752cb..6e6600d8cc4ba049dcdfd482bde82ccea0c5b25a 100644 (file)
@@ -9,16 +9,22 @@
 \r
 package eu.etaxonomy.taxeditor.editor;\r
 \r
+import org.eclipse.core.runtime.IProgressMonitor;\r
+import org.eclipse.core.runtime.IStatus;\r
 import org.eclipse.core.runtime.ListenerList;\r
+import org.eclipse.core.runtime.Status;\r
+import org.eclipse.core.runtime.jobs.Job;\r
 import org.eclipse.jface.util.SafeRunnable;\r
 import org.eclipse.jface.viewers.IPostSelectionProvider;\r
 import org.eclipse.jface.viewers.ISelection;\r
 import org.eclipse.jface.viewers.ISelectionChangedListener;\r
 import org.eclipse.jface.viewers.SelectionChangedEvent;\r
 import org.eclipse.jface.viewers.StructuredSelection;\r
+import org.eclipse.swt.widgets.Display;\r
 \r
 /**\r
  * @author p.ciardelli\r
+ * @author n.hoffmann\r
  * @created 16.05.2008\r
  * @version 1.0\r
  */\r
@@ -27,6 +33,7 @@ public class SimpleSelectionProvider implements IPostSelectionProvider {
        private ListenerList selectionChangedListeners = new ListenerList();\r
        private ListenerList postSelectionChangedListeners = new ListenerList();\r
        private ISelection selection;\r
+       private Job job;\r
        \r
        /*\r
         * (non-Javadoc)\r
@@ -64,7 +71,40 @@ public class SimpleSelectionProvider implements IPostSelectionProvider {
         */\r
        public void setSelection(ISelection selection) {\r
                this.selection = selection;\r
-               firePostSelectionChanged(new SelectionChangedEvent(this, selection));\r
+               \r
+               // cancel previous selection setting\r
+               if(job != null){\r
+                       job.cancel();\r
+                       job = null;\r
+               }\r
+               \r
+               if(job == null){\r
+                       final SelectionChangedEvent selectionChangedEvent = new SelectionChangedEvent(this, selection);\r
+                       final Display display = Display.getCurrent();\r
+                       job = new Job("Setting Selection"){\r
+       \r
+                               @Override\r
+                               protected IStatus run(IProgressMonitor monitor) {\r
+                                       monitor.beginTask("Setting Selection", 10);\r
+                                       \r
+                                       if(!monitor.isCanceled()){\r
+                                               display.asyncExec(new Runnable() {\r
+                                        \r
+                                                       public void run() {\r
+                                                               firePostSelectionChanged(selectionChangedEvent);\r
+                                                       }\r
+                                               });\r
+                                       }\r
+                                       \r
+                                       return Status.OK_STATUS;\r
+                               }\r
+                               \r
+                       };\r
+                       \r
+                       job.setPriority(Job.DECORATE);\r
+                       job.schedule();\r
+               }\r
+               \r
        }\r
 \r
        private void firePostSelectionChanged(final SelectionChangedEvent event) {\r
index ace2c65dd44a4669fc62ad363b3efef479899195..4e3f84acfa6c3de20cf68f57f891faf3500e8950 100644 (file)
@@ -99,7 +99,7 @@ public class TaxonEditorInput implements IEditorInput, IConversationEnabled, IPe
        TaxonNode taxonNode = CdmStore.getTaxonNodeService().load(taxonNodeUuid, null);
                
                if(taxonNode == null){
-                       MessageDialog.openWarning(EditorUtil.getShell(), "Not yet implemented", "Selected element is not type TaxonBase.");
+                       EditorUtil.warningDialog("Not yet implemented", "Selected element is not type TaxonBase.");
                        return null;
                }       
                
diff --git a/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/WidgetTransfer.java b/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/WidgetTransfer.java
deleted file mode 100644 (file)
index 1677b2b..0000000
+++ /dev/null
@@ -1,82 +0,0 @@
-package eu.etaxonomy.taxeditor.editor;\r
-\r
-import org.eclipse.swt.dnd.ByteArrayTransfer;\r
-import org.eclipse.swt.dnd.TransferData;\r
-import org.eclipse.swt.widgets.Widget;\r
-\r
-/**\r
- * For drag and drop - a drag widget with this transfer type can only be dropped onto\r
- *  a drop widget with the same type.\r
- *    \r
- * @author p.ciardelli\r
- *\r
- */\r
-public class WidgetTransfer extends ByteArrayTransfer {\r
-\r
-       private static final String WIDGETTYPENAME = "widget_type";\r
-       private static final int WIDGETTYPEID = registerType (WIDGETTYPENAME);          \r
-       private static final WidgetTransfer INSTANCE = new WidgetTransfer();\r
-       \r
-       /*\r
-        * The object associated with this transfer event\r
-        */\r
-       private Widget widget;\r
-               \r
-       /*\r
-        * Returns the singleton\r
-        */\r
-       public static synchronized WidgetTransfer getInstance() {\r
-               return INSTANCE;\r
-       }\r
-       /*\r
-        * Set transfer data for local use\r
-        */\r
-       public void setWidget(Widget widget) {\r
-               this.widget = widget;\r
-       }\r
-       /*\r
-        * Returns the local transfer data\r
-        */\r
-       public Widget getWidget() {\r
-               return widget;\r
-       }\r
-       \r
-       /* \r
-        * The type ID is used to identify this transfer\r
-        */\r
-       @Override\r
-       protected int[] getTypeIds() {\r
-               return new int[] { WIDGETTYPEID };\r
-       }\r
-\r
-       @Override\r
-       protected String[] getTypeNames() {\r
-               return new String[] { WIDGETTYPENAME } ;\r
-       }\r
-\r
-       @Override\r
-       protected void javaToNative(Object object, TransferData transferData) {\r
-               // No encoding needed since this is a hardcoded string read and written\r
-               // in the same process.\r
-               // See nativeToJava below\r
-               byte[] check = WIDGETTYPENAME.getBytes();\r
-               super.javaToNative(check, transferData);\r
-       }\r
-\r
-       @Override\r
-       protected Object nativeToJava(TransferData transferData) {\r
-               Object result = super.nativeToJava(transferData);\r
-               if (isInvalidNativeType(result)) {\r
-                       throw new RuntimeException(); //$NON-NLS-1$\r
-               }\r
-               return widget;\r
-       }\r
-       \r
-       private boolean isInvalidNativeType(Object result) {\r
-               // No encoding needed since this is a hardcoded string read and written\r
-               // in the same process.\r
-               // See javaToNative above\r
-               return !(result instanceof byte[])\r
-                               || !WIDGETTYPENAME.equals(new String((byte[]) result));\r
-       }\r
-}\r
index 66163b2061270668176e0a65e0a6d6a4400dd32e..13d06f3bfeb5f255067f2c92c730526e6d0ca152 100644 (file)
@@ -14,6 +14,7 @@ import org.eclipse.core.commands.AbstractHandler;
 import org.eclipse.core.commands.ExecutionEvent;\r
 import org.eclipse.core.commands.ExecutionException;\r
 import org.eclipse.core.commands.IHandler;\r
+import org.eclipse.swt.widgets.Display;\r
 import org.eclipse.ui.PartInitException;\r
 \r
 import eu.etaxonomy.taxeditor.editor.EditorUtil;\r
index 7ac5275af033b40fa18d4eceb721a317183d015f..1792e3569dfab816cefc3b0ccf205f0b2cdb2b80 100644 (file)
@@ -14,6 +14,7 @@ import org.eclipse.core.commands.AbstractHandler;
 import org.eclipse.core.commands.ExecutionEvent;
 import org.eclipse.core.commands.ExecutionException;
 import org.eclipse.core.commands.IHandler;
+import org.eclipse.swt.widgets.Display;
 import org.eclipse.ui.PartInitException;
 
 import eu.etaxonomy.cdm.model.taxon.Taxon;
diff --git a/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/AbstractGroup.java b/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/AbstractGroup.java
new file mode 100644 (file)
index 0000000..8d03854
--- /dev/null
@@ -0,0 +1,166 @@
+/**\r
+* Copyright (C) 2007 EDIT\r
+* European Distributed Institute of Taxonomy \r
+* http://www.e-taxonomy.eu\r
+* \r
+* The contents of this file are subject to the Mozilla Public License Version 1.1\r
+* See LICENSE.TXT at the top of this package for the full license terms.\r
+*/\r
+\r
+package eu.etaxonomy.taxeditor.editor.name;\r
+\r
+import java.util.ArrayList;\r
+import java.util.List;\r
+\r
+import org.apache.log4j.Logger;\r
+import org.eclipse.swt.SWT;\r
+import org.eclipse.swt.dnd.DND;\r
+import org.eclipse.swt.dnd.DropTarget;\r
+import org.eclipse.swt.dnd.DropTargetListener;\r
+import org.eclipse.swt.dnd.Transfer;\r
+import org.eclipse.swt.graphics.Color;\r
+import org.eclipse.swt.widgets.Composite;\r
+import org.eclipse.swt.widgets.Display;\r
+import org.eclipse.ui.forms.widgets.TableWrapData;\r
+import org.eclipse.ui.forms.widgets.TableWrapLayout;\r
+\r
+import eu.etaxonomy.cdm.model.common.CdmBase;\r
+import eu.etaxonomy.cdm.model.taxon.TaxonBase;\r
+import eu.etaxonomy.taxeditor.editor.CdmDataTransfer;\r
+import eu.etaxonomy.taxeditor.editor.EditorUtil;\r
+import eu.etaxonomy.taxeditor.editor.IDropTargetable;\r
+import eu.etaxonomy.taxeditor.preference.Resources;\r
+\r
+/**\r
+ * @author p.ciardelli\r
+ * @author n.hoffmann\r
+ * @created 25.06.2008\r
+ * @version 1.0\r
+ */\r
+public abstract class AbstractGroup<T extends TaxonBase> implements IDropTargetable{\r
+       private static final Logger logger = Logger.getLogger(AbstractGroup.class);\r
+       \r
+       private Composite control;\r
+       \r
+       private List<AbstractGroupedContainer<T>> groupedContainers = new ArrayList<AbstractGroupedContainer<T>>(); \r
+       \r
+       protected TaxonNameEditor editor;\r
+       \r
+       private DropTarget target;\r
+       private DropTargetListener dropListener;\r
+\r
+       public AbstractGroup(TaxonNameEditor editor){\r
+               this.editor = editor;\r
+               \r
+               createControl();\r
+               \r
+               // Drop functionality\r
+               this.setDroppable(true);\r
+\r
+       }\r
+       \r
+       protected void createControl() {\r
+               control = editor.getToolkit().createComposite(editor.getControl());\r
+               \r
+               control.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB));\r
+               TableWrapLayout layout = new TableWrapLayout();\r
+               \r
+               layout.topMargin = 0;\r
+               layout.rightMargin = 0;\r
+               layout.bottomMargin = 1;\r
+               layout.leftMargin = 0;\r
+               \r
+               layout.verticalSpacing = 0;\r
+               layout.horizontalSpacing = 0;\r
+               control.setLayout(layout);\r
+       \r
+               control.setBackground(Display.getDefault().getSystemColor(SWT.COLOR_GRAY));\r
+       }\r
+       \r
+       public void add(AbstractGroupedContainer groupedContainer){\r
+               groupedContainers.add(groupedContainer);\r
+               groupedContainer.setGroup(this);\r
+       }\r
+       \r
+       public void remove(AbstractGroupedContainer groupedContainer){\r
+               deleteContainer(groupedContainer);\r
+               groupedContainers.remove(groupedContainer);\r
+               \r
+               editor.getManagedForm().reflow(true);\r
+       }\r
+       \r
+       public void removeAllContainers() {\r
+               for(AbstractGroupedContainer container : groupedContainers){\r
+                       deleteContainer(container);\r
+               }\r
+               \r
+               groupedContainers.clear();\r
+       }\r
+       \r
+       public void clearContainers(){\r
+               groupedContainers.clear();\r
+       }\r
+       \r
+       public void deleteContainer(AbstractGroupedContainer groupedContainer){\r
+               groupedContainer.setMenu(null);\r
+               groupedContainer.getControl().dispose();\r
+       }\r
+       \r
+       public void clear(){\r
+               control.setMenu(null);\r
+               control.dispose();\r
+       }\r
+       \r
+       public List<AbstractGroupedContainer<T>> getGroupedContainers(){\r
+               return groupedContainers;\r
+       }\r
+       \r
+       \r
+       public void setDroppable(boolean droppable) {\r
+               if (droppable) {\r
+                       Transfer[] types = new Transfer[] {CdmDataTransfer.getInstance()};      \r
+                       int operations = DND.DROP_MOVE;\r
+                       target = new DropTarget(control, operations);\r
+                       target.setTransfer(types);\r
+                       dropListener = new NameEditorDropTargetListener(this);\r
+                       target.addDropListener(dropListener);\r
+                       \r
+                       target.setDropTargetEffect(new NameEditorDropTargetEffect(control));\r
+                       \r
+               } else {\r
+                       if (dropListener != null) {\r
+                               target.removeDropListener(dropListener);\r
+                       }\r
+               }\r
+       }\r
+       \r
+       public Composite getControl(){\r
+               return control;\r
+       }\r
+\r
+       public TaxonNameEditor getNameEditor() {\r
+               return editor;\r
+       }\r
+\r
+       public void dragEntered() {\r
+               Color color = EditorUtil.getColor(Resources.COLOR_DRAG_ENTER);\r
+               \r
+               for(AbstractGroupedContainer container : groupedContainers){\r
+                       container.setBackground(color);\r
+               }               \r
+       }\r
+\r
+       public void dragLeft() {\r
+               for(AbstractGroupedContainer container : groupedContainers){\r
+                       container.restoreColor();\r
+               }\r
+       }\r
+       \r
+       public boolean postOperation(CdmBase objectAffectedByOperation) {\r
+               editor.getMultiPageTaxonEditor().changed(null);\r
+               redraw();\r
+               return true;\r
+       }\r
+\r
+       public abstract void redraw();\r
+}\r
diff --git a/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/AbstractGroupedContainer.java b/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/AbstractGroupedContainer.java
new file mode 100644 (file)
index 0000000..c03c99b
--- /dev/null
@@ -0,0 +1,980 @@
+/**\r
+ * Copyright (C) 2007 EDIT\r
+ * European Distributed Institute of Taxonomy \r
+ * http://www.e-taxonomy.eu\r
+ * \r
+ * The contents of this file are subject to the Mozilla Public License Version 1.1\r
+ * See LICENSE.TXT at the top of this package for the full license terms.\r
+ */\r
+\r
+package eu.etaxonomy.taxeditor.editor.name;\r
+\r
+import java.lang.reflect.Method;\r
+import java.util.Set;\r
+\r
+import org.apache.log4j.Logger;\r
+import org.eclipse.core.runtime.Assert;\r
+import org.eclipse.jface.dialogs.Dialog;\r
+import org.eclipse.jface.text.IDocument;\r
+import org.eclipse.jface.text.TextViewer;\r
+import org.eclipse.jface.window.DefaultToolTip;\r
+import org.eclipse.swt.custom.StyledText;\r
+import org.eclipse.swt.dnd.DND;\r
+import org.eclipse.swt.dnd.DragSource;\r
+import org.eclipse.swt.dnd.Transfer;\r
+import org.eclipse.swt.events.ControlAdapter;\r
+import org.eclipse.swt.events.ControlEvent;\r
+import org.eclipse.swt.events.ControlListener;\r
+import org.eclipse.swt.events.FocusAdapter;\r
+import org.eclipse.swt.events.FocusEvent;\r
+import org.eclipse.swt.events.FocusListener;\r
+import org.eclipse.swt.events.ModifyEvent;\r
+import org.eclipse.swt.events.ModifyListener;\r
+import org.eclipse.swt.events.MouseAdapter;\r
+import org.eclipse.swt.events.MouseEvent;\r
+import org.eclipse.swt.graphics.Color;\r
+import org.eclipse.swt.graphics.Font;\r
+import org.eclipse.swt.graphics.Image;\r
+import org.eclipse.swt.widgets.Composite;\r
+import org.eclipse.swt.widgets.Control;\r
+import org.eclipse.swt.widgets.Display;\r
+import org.eclipse.swt.widgets.Label;\r
+import org.eclipse.swt.widgets.Menu;\r
+import org.eclipse.ui.IWorkbenchPart;\r
+import org.eclipse.ui.forms.widgets.TableWrapData;\r
+import org.eclipse.ui.forms.widgets.TableWrapLayout;\r
+\r
+import eu.etaxonomy.cdm.common.CdmUtils;\r
+import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper;\r
+import eu.etaxonomy.cdm.model.common.CdmBase;\r
+import eu.etaxonomy.cdm.model.name.NameRelationship;\r
+import eu.etaxonomy.cdm.model.name.NonViralName;\r
+import eu.etaxonomy.cdm.model.name.TaxonNameBase;\r
+import eu.etaxonomy.cdm.model.taxon.TaxonBase;\r
+import eu.etaxonomy.taxeditor.editor.CdmDataTransfer;\r
+import eu.etaxonomy.taxeditor.editor.EditorUtil;\r
+import eu.etaxonomy.taxeditor.labels.ILabelImageStrategy;\r
+import eu.etaxonomy.taxeditor.labels.LabelImageProvider;\r
+import eu.etaxonomy.taxeditor.model.ImageResources;\r
+import eu.etaxonomy.taxeditor.model.NameHelper;\r
+import eu.etaxonomy.taxeditor.model.TextHelper;\r
+import eu.etaxonomy.taxeditor.operations.CreateSynonymInNewGroupOperation;\r
+import eu.etaxonomy.taxeditor.parser.ParseHandler;\r
+import eu.etaxonomy.taxeditor.preference.Resources;\r
+\r
+/** \r
+ * Formats <code>GroupedComposite</code> with cosmetic and layout properties specific to the\r
+ * Editor. This should be used to maintain a consistent look and feel for all Editor \r
+ * freetext area components, such as DescriptionElementComposite.\r
+ * <p>\r
+ * Requires an <code>IManagedForm</code>, whose <code>input</code> is set to the contents\r
+ * of {@link #getData()} when the <code>GroupedComposite</code> gets focus, i.e. to\r
+ * populate the property sheet with the data.\r
+ * </p>\r
+ * <p>\r
+ * The <code>IManagedForm</code> is also required to have a <code>Taxon</code> in its \r
+ * own <code>getData()</code>.\r
+ * </p> \r
+ * <p>\r
+ * The <code>IManagedForm</code> can also used for drawing borders by calling the method \r
+ * <code>createBorderSupport()</code>.\r
+ * </p>\r
+ * @author p.ciardelli\r
+ * @author n.hoffmann\r
+ * @created 02.06.2008\r
+ * @version 1.0\r
+ */\r
+abstract public class AbstractGroupedContainer<T extends TaxonBase> {  \r
+       private static final Logger logger = Logger.getLogger(AbstractGroupedContainer.class);\r
+       \r
+       /**\r
+        * \r
+        */\r
+       public static final int SELECTED_FOCUS = 1;\r
+       public static final int SELECTED_NO_FOCUS = 2;\r
+       public static final int NOT_SELECTED = 3;\r
+       \r
+       /**\r
+        * ************ COMPOSITE TYPES ************\r
+        */\r
+       public String compositeType;\r
+       public static final String ACCEPTED_TAXON = "accepted_name_composite";\r
+       public static final String HOMOTYPIC_SYNONYM = "homotypic_name_composite";\r
+       public static final String HETEROTYPIC_SYNONYM = "heterotypic_name_composite";\r
+       public static final String MISAPPLIED_NAME = "misappliedname_name_composite";\r
+       public static final String CONCEPTRELATION = "concept_name_composite";\r
+\r
+       /**\r
+        * ************ INDENTATIONS ************\r
+        */\r
+       public static final int ACCEPTED_INDENT = 20;\r
+       public static final int SYNONYM_INDENT = 40;\r
+       public static final int MISAPPLIEDNAME_INDENT = 40;\r
+       public static final int CONCEPT_INDENT = 40;\r
+\r
+       \r
+       /**\r
+        * ************ ICONS ************\r
+        */\r
+       public static final Image ACCEPTED_ICON = ImageResources.getImage(ImageResources.BLACK_SQUARE_ICON);\r
+       public static final Image HOMOTYPIC_SYNONYM_ICON = ImageResources.getImage(ImageResources.HOMOTYPIC_SYN_ICON);\r
+       public static final Image HOMOTYPIC_SYNONYM_ORIGINAL_COMBINATION_ICON = ImageResources.getImage(\r
+                       ImageResources.HOMOTYPIC_SYN_ORIGINAL_ICON);\r
+       public static final Image HETEROTYPIC_SYNONYM_ICON = ImageResources.getImage(ImageResources.HETEROTYPIC_SYN_ICON);\r
+       public static final Image HETEROTYPIC_SYNONYM_ORIGINAL_COMBINATION_ICON = ImageResources.getImage(\r
+                       ImageResources.HETEROTYPIC_SYN_ORIGINAL_ICON);\r
+       public static final Image MISAPPLIEDNAME_ICON = ImageResources.getImage(ImageResources.MISAPPLIED_NAME_ICON);\r
+       public static final Image CONCEPT_ICON = ImageResources.getImage(ImageResources.CONCEPT_ICON);\r
+       public static final Image AUTONYM_ICON = ImageResources\r
+                       .getImage(ImageResources.AUTONYM_ICON);\r
+       public static final Image MOVE = ImageResources.getImage(ImageResources.MOVE_ICON);\r
+\r
+       /**\r
+        * ************ TRANSFORMATIONS ************\r
+        */\r
+       public static final String ADD_GROUP_BASIONYM = "add_group_basionym";\r
+       public static final String REMOVE_GROUP_BASIONYM = "remove_group_basionym";\r
+\r
+       private static final String EMPTY_NAME_PROMPT = "Click to add name";\r
+       \r
+       protected ParseHandler parseHandler;\r
+       \r
+       private FocusListener nameCompositeFocusListener;\r
+       private ModifyListener nameCompositeModifyListener;\r
+       \r
+       final Color not_editable_color = new Color(Display.getDefault(), 105, 114, 124);\r
+\r
+       /**\r
+        *  1st column: Return value expected from the last method mentioned in the object path (3rd column et seq.) to enable the freetext.\r
+        *  2nd column: The class the last method mentioned in the object path should be a member of. This should be null if there is no need to narrow this.\r
+        *  3rd column et seq.: The sequence of method names reflects the object path to the desired method starting from a member of TaxonBase.\r
+        */\r
+       private Object[][] enableFreetextFor = {\r
+                       {"", null, "getName", "getAppendedPhrase"},\r
+                       {false, null, "getName", "isProtectedAuthorshipCache"},\r
+                       {false, null, "getName", "isProtectedNameCache"},\r
+//                     {false, "eu.etaxonomy.cdm.model.agent.Team", "getName", "getCombinationAuthorTeam", "isProtectedNomenclaturalTitleCache"}\r
+       };\r
+\r
+       \r
+       \r
+       protected TaxonNameEditor editor;\r
+       \r
+       protected NameViewer textViewer;\r
+       \r
+       private AbstractGroup<T> group;\r
+       \r
+       private Label nonEditableInfoLabel;\r
+       private DefaultToolTip nonEditableInfoHover;\r
+       \r
+       private static AbstractGroupedContainer selection;\r
+       \r
+       private FocusListener focusListener;\r
+       private LineBreakListener lineBreakListener;\r
+\r
+       private int cursorPosition;\r
+\r
+       protected Composite control;\r
+\r
+       private Color backgroundColor;\r
+       \r
+       public AbstractGroupedContainer(TaxonNameEditor editor, AbstractGroup<T> group, T taxonBase){\r
+               this.editor = editor;\r
+               \r
+               this.group = group;     \r
+               group.add(this);\r
+               \r
+               setData( (T) HibernateProxyHelper.deproxy(taxonBase));\r
+               \r
+               createControl();\r
+               \r
+               createTextViewer();\r
+               createLineWrapSupport();\r
+               createLineBreakListener();\r
+\r
+               setMenu(editor.getMenu());\r
+               \r
+               setDraggableControl(textViewer.getRulerControl());\r
+               \r
+               createEmptyViewerPrompt(EMPTY_NAME_PROMPT);\r
+               \r
+               parseHandler = ParseHandler.NewInstance(textViewer.getTextWidget(), taxonBase.getName());\r
+               \r
+               initializeComposite();\r
+               \r
+               createListener();\r
+\r
+               isFreeTextEnabled();\r
+               \r
+               logger.trace(this.getClass().getSimpleName() + " created");\r
+       }\r
+\r
+       \r
+       \r
+       protected void createListener(){\r
+               nameCompositeModifyListener = new ModifyListener(){\r
+                       \r
+                       public void modifyText(ModifyEvent e) {\r
+                               // mark the composite dirty\r
+                               setDirty(true);\r
+                               // parse the text\r
+                               NonViralName name = parseHandler.parse();\r
+                               getTaxonBase().setName(name);\r
+                               getTaxonBase().setTitleCache((getTaxonBase().generateTitle()));\r
+                               \r
+                               // show errors resulting from parsing\r
+                               calculateErrors();\r
+                               // store the position of the cursor                             \r
+                               storeCursor();\r
+                               // notify selection listener\r
+                               setDelayedSelection();\r
+                       }\r
+               };\r
+               nameCompositeFocusListener = new FocusAdapter(){\r
+\r
+                       /* (non-Javadoc)\r
+                        * @see org.eclipse.swt.events.FocusAdapter#focusLost(org.eclipse.swt.events.FocusEvent)\r
+                        */\r
+                       @Override\r
+                       public void focusLost(FocusEvent e) {\r
+                               super.focusLost(e);\r
+\r
+                               persistName();\r
+                       }               \r
+               };\r
+               \r
+               addListener();\r
+       }\r
+       \r
+       private void addListener(){\r
+               textViewer.getTextWidget().addModifyListener(nameCompositeModifyListener);\r
+               textViewer.getTextWidget().addFocusListener(nameCompositeFocusListener);\r
+       }\r
+       \r
+       private void removeListener(){\r
+               textViewer.getTextWidget().removeModifyListener(nameCompositeModifyListener);\r
+               textViewer.getTextWidget().removeFocusListener(nameCompositeFocusListener);\r
+       }\r
+               \r
+       /**\r
+        * Initialize the composite specific code\r
+        * \r
+        */\r
+       protected abstract void initializeComposite();\r
+       \r
+       protected String getEmptyTextPrompt() {\r
+               return EMPTY_NAME_PROMPT;\r
+       }\r
+       \r
+       /**\r
+        * \r
+        */\r
+       private void showNameRelations() {\r
+               TaxonNameBase<?, ?> name = getName();\r
+               if (name == null) {\r
+                       return;\r
+               }\r
+               \r
+               ILabelImageStrategy strategy = LabelImageProvider.getLabelStrategy(name);\r
+               LabelImageProvider labelProvider = new LabelImageProvider(strategy);\r
+               \r
+               Set<NameRelationship> nameRelations = name.getNameRelations();\r
+               if (nameRelations.size() == 0) {\r
+                       return;\r
+               }\r
+               for (NameRelationship nameRelation : nameRelations) {\r
+                       String typeLabel = null;\r
+                       TaxonNameBase<?, ?> relatedName = null; \r
+\r
+                       if (name.equals(nameRelation.getFromName())) {\r
+                               typeLabel = labelProvider.getNameRelationTypeLabel( \r
+                                                               nameRelation.getType());\r
+                               relatedName = nameRelation.getToName();\r
+                       } else {\r
+                               typeLabel = labelProvider.getNameRelationTypeInverseLabel( \r
+                                                               nameRelation.getType());\r
+                               relatedName = nameRelation.getFromName();\r
+                       }\r
+                       \r
+//                     setNonEditableInfo(typeLabel + " " + NameHelper.getDisplayName(relatedName));\r
+               }\r
+       }\r
+               \r
+       protected void initTextViewer() {\r
+               \r
+               showNameRelations();\r
+               \r
+               String text = NameHelper.getDisplayNameWithRef(getData());\r
+               \r
+               if (text.length() == 0) {\r
+                       initEmptyText();\r
+               } else {\r
+                       textViewer.setText(text);\r
+                       placeCursor();\r
+               }\r
+               calculateErrors();\r
+       }\r
+       \r
+       synchronized protected void calculateErrors() {\r
+               textViewer.clearErrors();\r
+               textViewer.setShowParsingErrors(getName());\r
+       }\r
+\r
+       protected void handleSplitText(String text) {\r
+               // Create a synonym in a new homotypic group using text as name\r
+               TaxonNameBase synonymName = ParseHandler.quickParse(text);\r
+               \r
+               EditorUtil.executeOperation(new CreateSynonymInNewGroupOperation\r
+                               ("New Heterotypic Synonym", editor.getUndoContext(), editor.getTaxon(), synonymName, editor));\r
+               logger.debug("new heterotypic synonym created through entering of line break");\r
+       }\r
+\r
+       /**\r
+        * Refreshes the display with latest data from the model.\r
+        * \r
+        * Note: Will not parse the text and not calculate errors! \r
+        * \r
+        */\r
+       public void refresh() {\r
+               showNameRelations();\r
+               \r
+               String text = NameHelper.getDisplayNameWithRef(getTaxonBase());\r
+               \r
+               if (text.length() == 0) {\r
+                       initEmptyText();\r
+               } else {\r
+                       removeListener();\r
+                       textViewer.getTextWidget().setText(text);\r
+                       addListener();\r
+               }\r
+               \r
+               updateNonEditableInfo();\r
+               \r
+//             placeCursor();\r
+               \r
+               isFreeTextEnabled();\r
+       }\r
+\r
+       protected abstract void updateNonEditableInfo();\r
+       \r
+       /**\r
+        * \r
+        */\r
+       private void isFreeTextEnabled() {\r
+               // Decide whether editing of freetext is allowed or not.\r
+               if (freetextEditingAllowed()) {\r
+                       \r
+                       // set editable\r
+                       textViewer.getTextWidget().setEditable(true);\r
+                       \r
+                       // restore foreground font color again\r
+                       textViewer.getTextWidget().setForeground(control.getForeground());\r
+               } else {\r
+                       // set non-editable\r
+                       textViewer.getTextWidget().setEditable(false);\r
+                       \r
+                       // grey out text as a non-editable indicator\r
+                       textViewer.getTextWidget().setForeground(not_editable_color);\r
+               }\r
+       }\r
+\r
+       /**\r
+        * Checks whether the freetext should be editable based on specific empty fields.\r
+        * @return\r
+        */\r
+       private boolean freetextEditingAllowed() {\r
+               boolean enableFreetext = true;\r
+\r
+               enableFreetext &= taxonFieldsEmpty();\r
+\r
+               return enableFreetext;\r
+       }\r
+\r
+       /**\r
+        * Checks whether specific fields of specific type have specific values.\r
+        * This generic implementation can easily go completely nuts if enableFreetextFor was filled wrong.\r
+        * @return\r
+        */\r
+       private boolean taxonFieldsEmpty() {\r
+               boolean enableFreetext = true;\r
+\r
+               if (getTaxonBase() != null) {\r
+                       for (Object[] methodSequence : enableFreetextFor) {\r
+                               int sequenceCount = 0;\r
+                               Object taxonObject = HibernateProxyHelper.deproxy(getTaxonBase());\r
+                               Object referenceType = null;\r
+                               boolean useReference = false;\r
+                               Class<? extends CdmBase> referenceInstance = null;\r
+                               for (Object method : methodSequence) {\r
+                                       sequenceCount++;\r
+\r
+                                       if (sequenceCount == 1) {\r
+                                               referenceType = method;\r
+                                       } else if (sequenceCount == 2) {\r
+                                               try {\r
+                                                       if (method != null) {\r
+                                                               referenceInstance = (Class<? extends CdmBase>) Class.forName((String) method);\r
+                                                               useReference = true;\r
+                                                       } else {\r
+                                                               useReference = false;\r
+                                                       }\r
+                                               } catch (ClassNotFoundException e) {\r
+                                                       logger.error("Class " + method + " could not be found: ", e);\r
+                                                       return false;\r
+                                               }\r
+                                       } else {\r
+                                               Method getter = null;\r
+                                               try {\r
+                                                       if (taxonObject != null) { // authorTeams can be null\r
+                                                               Class<? extends Object> clazz = taxonObject.getClass();\r
+                                                               boolean goOn = false;\r
+                                                               if (methodSequence.length == sequenceCount) {\r
+                                                                       if (useReference) {\r
+                                                                               if (referenceInstance.newInstance().isInstanceOf((Class<? extends CdmBase>) clazz)) {\r
+                                                                                       goOn = true;\r
+                                                                               } else {\r
+                                                                                       goOn = false;\r
+                                                                               }\r
+                                                                       } else {\r
+                                                                               goOn = true;\r
+                                                                       }\r
+                                                               } else {\r
+                                                                       goOn = true;\r
+                                                               }\r
+                                                               \r
+                                                               if (goOn) {\r
+                                                                       getter = clazz.getMethod((String)method, (Class<?>[])null);\r
+                                                                       taxonObject = HibernateProxyHelper.deproxy(getter.invoke(taxonObject, (Object[])null));\r
+                                                                       if (methodSequence.length == sequenceCount) {\r
+                                                                               enableFreetext &= isEqual(referenceType, taxonObject);\r
+//                                                                             if (!enableFreetext) {\r
+//                                                                                     logger.error("Freetext disabled for: " + taxonBase);\r
+//                                                                             }\r
+                                                                       }\r
+                                                               }\r
+                                                       }\r
+                                               } catch (Exception e) {\r
+                                                       e.printStackTrace();\r
+                                                       logger.error("Method " + method + " could not be called: " + e.getMessage());\r
+                                                       return false;\r
+                                               }\r
+                                       }\r
+                               }\r
+                       }\r
+               } else {\r
+                       logger.warn("TaxonBase is null. This should not happen.");\r
+               }\r
+\r
+               return enableFreetext;\r
+       }\r
+\r
+       /**\r
+        * Checks whether two objects are equal. Only works for cases of interest.\r
+        * @param referenceType\r
+        * @param object\r
+        * @return\r
+        */\r
+       private boolean isEqual(Object referenceType, Object object) {\r
+               boolean equal = false;\r
+               if (referenceType instanceof Boolean) {\r
+                       if ((Boolean)referenceType.equals((Boolean)object)) {\r
+                               equal = true;\r
+                       } else {\r
+                               equal = false;\r
+                       }\r
+               } else {\r
+                       // This can only be a String in our cases so far. Needs reimplementation in case this is not always the case.\r
+                       if (referenceType.equals(CdmUtils.Nz((String)object))) {\r
+                               equal = true;\r
+                       } else {\r
+                               equal = false;\r
+                       }\r
+               }\r
+               return equal;\r
+       }\r
+\r
+       /**\r
+        * Parse the text and calculate errors\r
+        * \r
+        */\r
+       public void parseAndCalculateErrors(){\r
+               removeListener();\r
+               parseHandler.parse();\r
+               addListener();\r
+               calculateErrors();\r
+       }\r
+\r
+       /**\r
+        * @return the taxonBase\r
+        */\r
+       public T getTaxonBase() {\r
+               return getData();\r
+       }\r
+       \r
+       public TaxonNameBase getName(){\r
+               return getTaxonBase().getName();\r
+       }\r
+\r
+       public void persistName(){\r
+               if(isDirty()){\r
+                       logger.warn("Found dirty composite: " + this + ". Name: " + textViewer.getTextWidget().getText());\r
+                       getTaxonBase().setName(parseHandler.parseAndResolveDuplicates());\r
+                       \r
+                       getTaxonBase().setTitleCache((getTaxonBase().generateTitle()));\r
+\r
+               }\r
+       }\r
+       \r
+       public AbstractGroup getGroup(){\r
+               return group;\r
+       }\r
+       \r
+       public void remove(){\r
+               getGroup().remove(this);\r
+       }\r
+               \r
+       protected void createControl() {\r
+               control = editor.getToolkit().createComposite(group.getControl());\r
+               \r
+               control.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB));\r
+               TableWrapLayout layout = new TableWrapLayout();\r
+               layout.leftMargin = 0;\r
+               layout.rightMargin = 0;\r
+               layout.topMargin = 5;\r
+               layout.bottomMargin = 5;\r
+               \r
+               layout.verticalSpacing = 0;\r
+               layout.horizontalSpacing = 0;\r
+               \r
+               control.setLayout(layout);\r
+               \r
+               setBackground(EditorUtil.getColor(Resources.COLOR_COMPOSITE_BACKGROUND));\r
+       }\r
+       \r
+       public Composite getControl(){\r
+               return control;\r
+       }\r
+       \r
+       protected void createLineWrapSupport() {\r
+               if (textViewer instanceof NameViewer) {\r
+                       new LineWrapSupport(textViewer, editor.getManagedForm());\r
+               } else {\r
+                       logger.warn("Can't create line wrap support because textViewer has not been initialized.");\r
+               }\r
+       }\r
+       \r
+       \r
+       protected void createTextViewer() {\r
+               textViewer = new NameViewer(control);\r
+               \r
+               focusListener = new FocusAdapter() {\r
+                       public void focusGained(FocusEvent e) {\r
+                               for(AbstractGroupedContainer container : editor.getGroupedContainers()){\r
+                                       container.colorSelected(NOT_SELECTED);\r
+                               }\r
+                               editor.getManagedForm().setInput(AbstractGroupedContainer.this);\r
+//                             setSelected();\r
+                               placeCursor();\r
+                               colorSelected(SELECTED_FOCUS);\r
+                               logger.warn("TextViewer gained focus: " + AbstractGroupedContainer.this);\r
+                       }\r
+                       public void focusLost(FocusEvent e) {\r
+//                             colorSelected(NOT_SELECTED);\r
+                               logger.warn("TextViewer lost focus: " + AbstractGroupedContainer.this);\r
+                               logger.warn("------------");\r
+                       };\r
+               };\r
+               textViewer.getTextWidget().addFocusListener(focusListener);\r
+               \r
+//             \r
+               MouseAdapter mouseListener = new MouseAdapter() {\r
+                       public void mouseDown(MouseEvent e) {\r
+                               storeCursor();\r
+//                             setFocus();             \r
+                               \r
+//                             logger.warn("mouseDown");\r
+//                             logger.warn(textViewer.getCursorPosition());\r
+                       }\r
+               };\r
+               control.addMouseListener(mouseListener);\r
+               textViewer.getRulerControl().addMouseListener(mouseListener);\r
+               textViewer.getTextWidget().addMouseListener(mouseListener);\r
+       }\r
+       \r
+       /**\r
+        * @param icon\r
+        */\r
+       public void setIcon(Image icon) {\r
+               if (textViewer instanceof NameViewer) {\r
+                       textViewer.setIcon(icon);\r
+               } else {\r
+                       logger.warn("Can't set icon because textViewer has not been initialized.");\r
+               }\r
+       }\r
+       \r
+       /**\r
+        * @param indent\r
+        */\r
+       public void setIndent(int indent) {\r
+               if (control.getLayout() instanceof TableWrapLayout) {\r
+                       TableWrapLayout layout = ((TableWrapLayout) control.getLayout());\r
+                       layout.leftMargin = indent;\r
+                       layout.rightMargin = ACCEPTED_INDENT;\r
+                       control.setLayout(layout);\r
+               } else {\r
+                       logger.warn("Couldn't indent - composite's layout must be TableWrapLayout.");\r
+               }\r
+       }       \r
+       \r
+       /**\r
+        * \r
+        * @return\r
+        */\r
+       public void setSelected() {\r
+               textViewer.getTextWidget().setFocus();\r
+       }\r
+       \r
+       public boolean isSelected(){\r
+               return editor.getSelectedObject() == this;\r
+       }\r
+       \r
+       public void colorSelected(int mode){\r
+               if(!control.isDisposed()){\r
+                       String colorString = null;\r
+                       \r
+                       switch(mode){\r
+                       case SELECTED_FOCUS:\r
+                               colorString = Resources.COLOR_CONTROL_SELECTED_FOCUS;\r
+                               break;\r
+                       case SELECTED_NO_FOCUS:\r
+                               colorString = Resources.COLOR_CONTROL_SELECTED;\r
+                               break;\r
+                       default:\r
+                               colorString = Resources.COLOR_COMPOSITE_BACKGROUND;\r
+                       }\r
+                       \r
+                       backgroundColor = EditorUtil.getColor(colorString);\r
+                       \r
+                       setBackground(backgroundColor);\r
+               }\r
+       }\r
+\r
+       \r
+       /**\r
+        * \r
+        */\r
+       protected void setDelayedSelection(){\r
+               //TODO this might be done better\r
+               // this is the quickest solution i could come up with and it improves performance\r
+               // please reimplement if you know better.\r
+               selection = this;\r
+               \r
+               // start timer\r
+               Display display = Display.getCurrent();\r
+               Runnable runnable = new Runnable() {\r
+                       \r
+                       public void run() {\r
+                               editor.getManagedForm().setInput(selection);\r
+                       }\r
+               };\r
+               display.timerExec(1000, runnable);\r
+               \r
+       }\r
+       \r
+       /**\r
+        * \r
+        */\r
+       public void setBackground(Color color) {\r
+               control.setBackground(color);\r
+               \r
+               for(Control child : control.getChildren()){\r
+                       child.setBackground(color);\r
+               }\r
+               \r
+               if(textViewer != null){\r
+                       textViewer.setBackground(color);\r
+               }\r
+       }\r
+\r
+       /* (non-Javadoc)\r
+        * @see org.eclipse.swt.widgets.Control#setFont(org.eclipse.swt.graphics.Font)\r
+        */\r
+       public void setFont(Font font) {\r
+               if (textViewer != null) {\r
+                       textViewer.getTextWidget().setFont(font);\r
+               } else {\r
+                       logger.warn("Can't set font because textViewer has not been initalized.");\r
+               }\r
+       }\r
+       \r
+       public TextViewer getTextViewer() {\r
+               return textViewer;\r
+       }\r
+       \r
+       /**\r
+        * If <code>textViewer</code> has already been set, it will show a \r
+        * <code>prompt</code> along the lines of "Click here to start entering data" \r
+        * when empty.\r
+        * \r
+        * @param prompt\r
+        */\r
+       public void createEmptyViewerPrompt(final String prompt) {\r
+               \r
+               Assert.isNotNull(textViewer);\r
+                \r
+               final StyledText textControl = textViewer.getTextWidget();\r
+               final IDocument document = textViewer.getDocument();\r
+               \r
+               setFocusListener(new FocusListener() {\r
+\r
+                       \r
+                       public void focusGained(FocusEvent e) {\r
+                               if (document.get().equals(prompt)) {\r
+                                       textControl.setFont(getViewerFont());\r
+                                       document.set("");\r
+                               }\r
+                       }\r
+\r
+                       \r
+                       public void focusLost(FocusEvent e) {\r
+                               if (document.getLength() == 0) {\r
+                                       initEmptyText();\r
+                               }\r
+                       }\r
+                       \r
+               });\r
+               textControl.addFocusListener(getFocusListener());\r
+               \r
+               if (document.getLength() == 0) {\r
+                       textControl.setFont(EditorUtil.getFont(Resources.FONT_DEFAULT_PROMPT));\r
+                       document.set(prompt);\r
+               }\r
+       }\r
+       \r
+       abstract protected Font getViewerFont();\r
+\r
+       protected void initEmptyText() {\r
+               Font defaultFont = EditorUtil.getFont(Resources.FONT_DEFAULT_PROMPT);\r
+               textViewer.getTextWidget().setFont(defaultFont);\r
+               \r
+               textViewer.getDocument().set(getEmptyTextPrompt());\r
+               placeCursor();\r
+       }\r
+\r
+       protected void setFocusListener(FocusListener focusListener) {\r
+               this.focusListener = focusListener;\r
+       }\r
+\r
+       private FocusListener getFocusListener() {\r
+               return focusListener;\r
+       }\r
+\r
+       /**\r
+        * @param isDirty\r
+        */\r
+       public void setDirty(boolean isDirty) {\r
+               editor.getManagedForm().dirtyStateChanged();\r
+       }\r
+       \r
+       public boolean isDirty(){\r
+               return editor.getManagedForm().isDirty();\r
+       }\r
+       \r
+       public void setMenu (Menu menu) {\r
+               control.setMenu(menu);\r
+               \r
+               if (textViewer != null) {\r
+                       textViewer.setMenu(menu);\r
+               }\r
+       }\r
+       \r
+       private Control draggableControl;\r
+       private DragSource dragSource;\r
+       \r
+       protected void setDraggableControl(Control control) {\r
+               draggableControl = control;\r
+       }\r
+\r
+       public DragSource getDragSource() {\r
+               return dragSource;\r
+       }\r
+       \r
+       public void setIsDraggable(boolean draggable) {\r
+\r
+               if (draggable) {\r
+\r
+                       if (dragSource != null) {\r
+                               // Already initialized\r
+                               return;\r
+                       }\r
+\r
+                       if (draggableControl == null) {\r
+                               throw new NullPointerException(\r
+                                               "Draggable control must be set to add draggability");\r
+                       }\r
+                       \r
+                       Transfer[] types = new Transfer[] { CdmDataTransfer.getInstance() };                    \r
+                       int operations = DND.DROP_MOVE;\r
+\r
+                       dragSource = new DragSource(draggableControl, operations);\r
+                       dragSource.setTransfer(types);\r
+                       \r
+                       dragSource.addDragListener(new NameEditorDragListener(this));\r
+                       dragSource.setDragSourceEffect(new NameEditorDragSourceEffect(control));\r
+               } else {\r
+                       dragSource = null;\r
+               }\r
+       }\r
+\r
+       private String nonEditableText;\r
+\r
+       ControlListener nonEditableResizeListener = new ControlAdapter() {\r
+               \r
+               int width = 0;\r
+               \r
+               public void controlResized(ControlEvent e) {\r
+                       if (nonEditableInfoLabel.getBounds().width == width) {\r
+                               return;\r
+                       }\r
+                       width = nonEditableInfoLabel.getBounds().width;\r
+                       if (nonEditableInfoLabel.getBounds().width > 0) {\r
+                               nonEditableInfoLabel.setText(\r
+                                               Dialog.shortenText(nonEditableText.toUpperCase(), \r
+                                               nonEditableInfoLabel));\r
+                       }\r
+               }\r
+       };\r
+\r
+       private String nonEditableHoverText;\r
+\r
+       private LabelEllipsisListener nonEditableLabelEllipsisListener;\r
+\r
+       private T data;\r
+                       \r
+       /**\r
+        * nonEditableInfo is a label displayed underneath a GroupedComposite's \r
+        * input field. For instance, NameComposites display things like name relations,\r
+        * sec. references, etc. here.\r
+        * \r
+        * @param info the text to display in the label\r
+        * @param append whether the string should be appended to text that is already shown in the label\r
+        */\r
+       public void setNonEditableInfo(String info, boolean append) {\r
+               // TODO non editable info should only be drawn once, when everything else is drawn\r
+               info = info.toUpperCase();\r
+               \r
+               if(append){\r
+                       nonEditableText += ", " + info;\r
+                       nonEditableHoverText += "\n" + info;\r
+               }else{\r
+                       nonEditableText = info;\r
+                       nonEditableHoverText = info;\r
+               }\r
+               \r
+               if (nonEditableInfoLabel == null) {\r
+                       nonEditableInfoLabel = editor.getToolkit().createLabel(control, "");\r
+                       TableWrapData layoutData = new TableWrapData(TableWrapData.FILL_GRAB, TableWrapData.TOP);\r
+                       // Set indent to viewer ruler's width \r
+                       if (textViewer != null && textViewer.getRulerControl() != null) {\r
+                               // TODO right justify\r
+                               layoutData.indent = NameViewer.RULER_WIDTH;\r
+                       }\r
+                       nonEditableInfoLabel.setLayoutData(layoutData);\r
+                       \r
+\r
+                       \r
+                       nonEditableLabelEllipsisListener = new LabelEllipsisListener(nonEditableInfoLabel) {\r
+                               @Override\r
+                               public String getLabelText() {\r
+                                       return nonEditableText.toUpperCase();\r
+                               }\r
+                       }; \r
+                       nonEditableInfoLabel.addControlListener(nonEditableLabelEllipsisListener);\r
+                       \r
+                       nonEditableInfoHover = new DefaultToolTip(nonEditableInfoLabel);\r
+                       nonEditableInfoHover.setRespectDisplayBounds(true);\r
+                       \r
+               } \r
+               nonEditableInfoHover.setText(nonEditableHoverText);\r
+               nonEditableInfoLabel.setText(nonEditableText);\r
+       }\r
+       \r
+       public T getData(){\r
+               return data;\r
+       }\r
+       \r
+       public void setData(T data){\r
+               this.data = data;\r
+       }\r
+\r
+       /**\r
+        * If the user hitting carriage return should cause something to happen -\r
+        * i.e. the creation of a new composite - call this method and override\r
+        * the method handleSplitText().\r
+        */\r
+       protected void createLineBreakListener() {\r
+               if (textViewer != null) {\r
+                       lineBreakListener = new LineBreakListener() {\r
+                               @Override\r
+                               public void handleSplitText(String text) {\r
+                                       AbstractGroupedContainer.this.handleSplitText(text);    \r
+                               }\r
+                       };\r
+                       \r
+                       textViewer.getTextWidget().addVerifyListener(lineBreakListener);\r
+                       textViewer.getTextWidget().addKeyListener(lineBreakListener);\r
+               } else {\r
+                       logger.warn("Can't create line break listener because textViewer has not been initalized.");\r
+               }\r
+       }\r
+               \r
+       abstract class LabelEllipsisListener extends ControlAdapter {\r
+               \r
+               private Label label;\r
+               int width = 0;\r
+\r
+               LabelEllipsisListener(Label label) {\r
+                       this.label = label;\r
+               }\r
+               \r
+               abstract public String getLabelText();\r
+               \r
+               public void controlResized(ControlEvent e) {\r
+                       if (label.getBounds().width == width) {\r
+                               return;\r
+                       }\r
+                       width = label.getBounds().width;\r
+                       if (label.getBounds().width > 0) {\r
+                               label.setText(TextHelper.shortenText(getLabelText(), label));\r
+                       }\r
+               }\r
+       }\r
+\r
+       public void storeCursor() {\r
+               this.cursorPosition = textViewer.getCursorPosition();\r
+       }\r
+       \r
+       /**\r
+        * Puts the cursor to the position it was last seen on or to the end of line\r
+        * if no former position is known.\r
+        */\r
+       public void placeCursor(){\r
+               if(cursorPosition == 0){\r
+                       textViewer.setCursorToEOL();\r
+               }else{\r
+                       textViewer.setCursorPosition(cursorPosition);\r
+               }\r
+       }\r
+\r
+\r
+\r
+       public void setGroup(AbstractGroup<T> group) {\r
+               this.group = group;\r
+       }\r
+\r
+\r
+\r
+       public void restoreColor() {\r
+               setBackground(backgroundColor);\r
+       }\r
+} 
\ No newline at end of file
diff --git a/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/AbstractNameComposite.java b/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/AbstractNameComposite.java
deleted file mode 100644 (file)
index 5ab258d..0000000
+++ /dev/null
@@ -1,500 +0,0 @@
-/**\r
- * Copyright (C) 2007 EDIT\r
- * European Distributed Institute of Taxonomy \r
- * http://www.e-taxonomy.eu\r
- * \r
- * The contents of this file are subject to the Mozilla Public License Version 1.1\r
- * See LICENSE.TXT at the top of this package for the full license terms.\r
- */\r
-\r
-package eu.etaxonomy.taxeditor.editor.name;\r
-\r
-import java.lang.reflect.Method;\r
-import java.util.Set;\r
-\r
-import org.apache.log4j.Logger;\r
-import org.eclipse.swt.events.FocusAdapter;\r
-import org.eclipse.swt.events.FocusEvent;\r
-import org.eclipse.swt.events.FocusListener;\r
-import org.eclipse.swt.events.ModifyEvent;\r
-import org.eclipse.swt.events.ModifyListener;\r
-import org.eclipse.swt.graphics.Color;\r
-import org.eclipse.swt.graphics.Font;\r
-import org.eclipse.swt.graphics.Image;\r
-import org.eclipse.swt.widgets.Composite;\r
-import org.eclipse.swt.widgets.Display;\r
-\r
-import eu.etaxonomy.cdm.common.CdmUtils;\r
-import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper;\r
-import eu.etaxonomy.cdm.model.common.CdmBase;\r
-import eu.etaxonomy.cdm.model.name.NameRelationship;\r
-import eu.etaxonomy.cdm.model.name.NonViralName;\r
-import eu.etaxonomy.cdm.model.name.TaxonNameBase;\r
-import eu.etaxonomy.cdm.model.taxon.TaxonBase;\r
-import eu.etaxonomy.taxeditor.editor.EditorUtil;\r
-import eu.etaxonomy.taxeditor.editor.GroupedComposite;\r
-import eu.etaxonomy.taxeditor.labels.ILabelImageStrategy;\r
-import eu.etaxonomy.taxeditor.labels.LabelImageProvider;\r
-import eu.etaxonomy.taxeditor.model.ImageResources;\r
-import eu.etaxonomy.taxeditor.model.NameHelper;\r
-import eu.etaxonomy.taxeditor.operations.CreateSynonymInNewGroupOperation;\r
-import eu.etaxonomy.taxeditor.parser.ParseHandler;\r
-import eu.etaxonomy.taxeditor.preference.Resources;\r
-import eu.etaxonomy.taxeditor.store.StoreUtil;\r
-\r
-/**\r
- * Formats an <code>GroupedComposite</code> to display <code>TaxonNameBase</code> elements\r
- * in a <code>NameViewer</code>.\r
- * \r
- * @author p.ciardelli\r
- * @created 02.06.2008\r
- * @version 1.0\r
- */\r
-public abstract class AbstractNameComposite<T extends TaxonBase> extends GroupedComposite{\r
-       private static final Logger logger = Logger\r
-                                       .getLogger(AbstractNameComposite.class);\r
-       /**\r
-        * ************ COMPOSITE TYPES ************\r
-        */\r
-       public String compositeType;\r
-       public static final String ACCEPTED_TAXON = "accepted_name_composite";\r
-       public static final String HOMOTYPIC_SYNONYM = "homotypic_name_composite";\r
-       public static final String HETEROTYPIC_SYNONYM = "heterotypic_name_composite";\r
-       public static final String MISAPPLIED_NAME = "misappliedname_name_composite";\r
-       public static final String CONCEPTRELATION = "concept_name_composite";\r
-\r
-       /**\r
-        * ************ INDENTATIONS ************\r
-        */\r
-       public static final int ACCEPTED_INDENT = 0;\r
-       public static final int SYNONYM_INDENT = 15;\r
-       public static final int MISAPPLIEDNAME_INDENT = 15;\r
-       public static final int CONCEPT_INDENT = 15;\r
-\r
-       /**\r
-        * ************ FONTS ************\r
-        */\r
-\r
-       public Font getAcceptedFont(){\r
-               Font font = StoreUtil.getFont(Resources.ACCEPTED_TAXON_FONT);\r
-               return font;\r
-       }\r
-       \r
-       public Font getSynonymFont(){\r
-               Font font = StoreUtil.getFont(Resources.SYNONYM_FONT);\r
-               return font;\r
-       }\r
-       \r
-       public Font getMisapplicationFont(){\r
-               Font font = StoreUtil.getFont(Resources.MISAPPLIEDNAME_FONT);\r
-               return font;\r
-       }\r
-       \r
-       public Font getConceptFont(){\r
-               Font font = StoreUtil.getFont(Resources.CONCEPT_FONT);\r
-               return font;\r
-       }\r
-       \r
-       /**\r
-        * ************ ICONS ************\r
-        */\r
-       public static final Image ACCEPTED_ICON = ImageResources\r
-                       .getImage(ImageResources.BLACK_SQUARE_ICON);\r
-       public static final Image HOMOTYPIC_SYNONYM_ICON = ImageResources.getImage(ImageResources.HOMOTYPIC_SYN_ICON);\r
-       public static final Image HOMOTYPIC_SYNONYM_ORIGINAL_COMBINATION_ICON = ImageResources.getImage(\r
-                       ImageResources.HOMOTYPIC_SYN_ORIGINAL_ICON);\r
-       public static final Image HETEROTYPIC_SYNONYM_ICON = ImageResources.getImage(ImageResources.HETEROTYPIC_SYN_ICON);\r
-       public static final Image HETEROTYPIC_SYNONYM_ORIGINAL_COMBINATION_ICON = ImageResources.getImage(\r
-                       ImageResources.HETEROTYPIC_SYN_ORIGINAL_ICON);\r
-       public static final Image MISAPPLIEDNAME_ICON = ImageResources.getImage(ImageResources.MISAPPLIED_NAME_ICON);\r
-       public static final Image CONCEPT_ICON = ImageResources.getImage(ImageResources.CONCEPT_ICON);\r
-       public static final Image AUTONYM_ICON = ImageResources\r
-                       .getImage(ImageResources.AUTONYM_ICON);\r
-       public static final Image MOVE = ImageResources.getImage(ImageResources.MOVE_ICON);\r
-\r
-       /**\r
-        * ************ TRANSFORMATIONS ************\r
-        */\r
-       public static final String ADD_GROUP_BASIONYM = "add_group_basionym";\r
-       public static final String REMOVE_GROUP_BASIONYM = "remove_group_basionym";\r
-\r
-       private static final String EMPTY_NAME_PROMPT = "Click to add name";\r
-       \r
-       protected ParseHandler parseHandler;\r
-       \r
-       protected T taxonBase;\r
-       private FocusListener nameCompositeFocusListener;\r
-       private ModifyListener nameCompositeModifyListener;\r
-       final Color not_editable_color = new Color(Display.getDefault(), 105, 114, 124);\r
-\r
-       /**\r
-        *  1st column: Return value expected from the last method mentioned in the object path (3rd column et seq.) to enable the freetext.\r
-        *  2nd column: The class the last method mentioned in the object path should be a member of. This should be null if there is no need to narrow this.\r
-        *  3rd column et seq.: The sequence of method names reflects the object path to the desired method starting from a member of TaxonBase.\r
-        */\r
-       private Object[][] enableFreetextFor = {\r
-                       {"", null, "getName", "getAppendedPhrase"},\r
-                       {false, null, "getName", "isProtectedAuthorshipCache"},\r
-                       {false, null, "getName", "isProtectedNameCache"},\r
-//                     {false, "eu.etaxonomy.cdm.model.agent.Team", "getName", "getCombinationAuthorTeam", "isProtectedNomenclaturalTitleCache"}\r
-       };\r
-\r
-       /**\r
-        * The constructor for a DescriptionElementComposite. Takes a parent Composite on which to\r
-        * create itself, and an IManagedForm for Composite life cycle methods, i.e.\r
-        * drawing borders, creating other Composites, creating line wrap support,\r
-        * etc.\r
-        * \r
-        * @param parent\r
-        * @param managedForm\r
-        */\r
-       public AbstractNameComposite(TaxonNameEditor editor, Composite parent, T taxonBase) {\r
-               super(editor, parent);\r
-               \r
-               this.taxonBase = (T) HibernateProxyHelper.deproxy(taxonBase);\r
-               \r
-               setData(this.taxonBase);\r
-               \r
-               createTextViewer();\r
-//             createBorderSupport();\r
-               createLineWrapSupport();\r
-               createLineBreakListener();\r
-\r
-               this.setMenu(editor.getMenu());\r
-               \r
-               setDraggableControl(textViewer.getRulerControl());\r
-               \r
-               createEmptyViewerPrompt(EMPTY_NAME_PROMPT);\r
-               \r
-               parseHandler = ParseHandler.NewInstance(textViewer.getTextWidget(), taxonBase.getName());\r
-               \r
-               initializeComposite();\r
-               \r
-               createListener();\r
-\r
-               isFreeTextEnabled();\r
-       }\r
-\r
-       protected void createListener(){\r
-               nameCompositeModifyListener = new ModifyListener(){\r
-                       \r
-                       public void modifyText(ModifyEvent e) {\r
-                               // mark the composite dirty\r
-                               setDirty(true);\r
-                               // parse the text\r
-                               NonViralName name = parseHandler.parse();\r
-                               taxonBase.setName(name);\r
-                               taxonBase.setTitleCache((getTaxonBase().generateTitle()));\r
-                               \r
-                               // show errors resulting from parsing\r
-                               calculateErrors();\r
-                               // store the position of the cursor                             \r
-                               storeCursor();\r
-                               // notify selection listener\r
-                               setDelayedSelection();\r
-                       }\r
-               };\r
-               nameCompositeFocusListener = new FocusAdapter(){\r
-\r
-                       /* (non-Javadoc)\r
-                        * @see org.eclipse.swt.events.FocusAdapter#focusLost(org.eclipse.swt.events.FocusEvent)\r
-                        */\r
-                       @Override\r
-                       public void focusLost(FocusEvent e) {\r
-                               super.focusLost(e);\r
-\r
-                               persistName();\r
-                       }               \r
-               };\r
-               \r
-               addListener();\r
-       }\r
-       \r
-       private void addListener(){\r
-               textViewer.getTextWidget().addModifyListener(nameCompositeModifyListener);\r
-               textViewer.getTextWidget().addFocusListener(nameCompositeFocusListener);\r
-       }\r
-       \r
-       private void removeListener(){\r
-               textViewer.getTextWidget().removeModifyListener(nameCompositeModifyListener);\r
-               textViewer.getTextWidget().removeFocusListener(nameCompositeFocusListener);\r
-       }\r
-               \r
-       /**\r
-        * Initialize the composite specific code\r
-        * \r
-        */\r
-       protected abstract void initializeComposite();\r
-       \r
-       protected String getEmptyTextPrompt() {\r
-               return EMPTY_NAME_PROMPT;\r
-       }\r
-       \r
-       /**\r
-        * \r
-        */\r
-       private void showNameRelations() {\r
-               TaxonNameBase<?, ?> name = getName();\r
-               if (name == null) {\r
-                       return;\r
-               }\r
-               \r
-               ILabelImageStrategy strategy = LabelImageProvider.getLabelStrategy(name);\r
-               LabelImageProvider labelProvider = new LabelImageProvider(strategy);\r
-               \r
-               Set<NameRelationship> nameRelations = name.getNameRelations();\r
-               if (nameRelations.size() == 0) {\r
-                       return;\r
-               }\r
-               for (NameRelationship nameRelation : nameRelations) {\r
-                       String typeLabel = null;\r
-                       TaxonNameBase<?, ?> relatedName = null; \r
-\r
-                       if (name.equals(nameRelation.getFromName())) {\r
-                               typeLabel = labelProvider.getNameRelationTypeLabel( \r
-                                                               nameRelation.getType());\r
-                               relatedName = nameRelation.getToName();\r
-                       } else {\r
-                               typeLabel = labelProvider.getNameRelationTypeInverseLabel( \r
-                                                               nameRelation.getType());\r
-                               relatedName = nameRelation.getFromName();\r
-                       }\r
-                       \r
-//                     setNonEditableInfo(typeLabel + " " + NameHelper.getDisplayName(relatedName));\r
-               }\r
-       }\r
-               \r
-       protected void initTextViewer(TaxonBase<?> taxonBase) {\r
-               \r
-               showNameRelations();\r
-               \r
-               String text = NameHelper.getDisplayNameWithRef(taxonBase);\r
-               \r
-               if (text.length() == 0) {\r
-                       initEmptyText();\r
-               } else {\r
-                       textViewer.setText(text);\r
-                       placeCursor();\r
-               }\r
-               calculateErrors();\r
-       }\r
-       \r
-       synchronized protected void calculateErrors() {\r
-               textViewer.clearErrors();\r
-               textViewer.setShowParsingErrors(getName());\r
-       }\r
-\r
-       protected void handleSplitText(String text) {\r
-               // Create a synonym in a new homotypic group using text as name\r
-               TaxonNameBase synonymName = ParseHandler.quickParse(text);\r
-               \r
-               EditorUtil.executeOperation(new CreateSynonymInNewGroupOperation\r
-                               ("New Heterotypic Synonym", editor.getUndoContext(), editor.getTaxon(), synonymName, editor));\r
-               logger.debug("new heterotypic synonym created through entering of line break");\r
-       }\r
-\r
-       /**\r
-        * Refreshes the display with latest data from the model.\r
-        * \r
-        * Note: Will not parse the text and not calculate errors! \r
-        * \r
-        */\r
-       public void refresh() {\r
-               showNameRelations();\r
-               \r
-               String text = NameHelper.getDisplayNameWithRef(getTaxonBase());\r
-               \r
-               if (text.length() == 0) {\r
-                       initEmptyText();\r
-               } else {\r
-                       removeListener();\r
-                       textViewer.getTextWidget().setText(text);\r
-                       addListener();\r
-               }\r
-               \r
-               updateNonEditableInfo();\r
-               \r
-//             placeCursor();\r
-               \r
-               isFreeTextEnabled();\r
-       }\r
-\r
-       protected abstract void updateNonEditableInfo();\r
-       \r
-       /**\r
-        * \r
-        */\r
-       private void isFreeTextEnabled() {\r
-               // Decide whether editing of freetext is allowed or not.\r
-               if (freetextEditingAllowed()) {\r
-                       \r
-                       // set editable\r
-                       textViewer.getTextWidget().setEditable(true);\r
-                       \r
-                       // restore foreground font color again\r
-                       textViewer.getTextWidget().setForeground(getForeground());\r
-               } else {\r
-                       // set non-editable\r
-                       textViewer.getTextWidget().setEditable(false);\r
-                       \r
-                       // grey out text as a non-editable indicator\r
-                       textViewer.getTextWidget().setForeground(not_editable_color);\r
-               }\r
-       }\r
-\r
-       /**\r
-        * Checks whether the freetext should be editable based on specific empty fields.\r
-        * @return\r
-        */\r
-       private boolean freetextEditingAllowed() {\r
-               boolean enableFreetext = true;\r
-\r
-               enableFreetext &= taxonFieldsEmpty();\r
-\r
-               return enableFreetext;\r
-       }\r
-\r
-       /**\r
-        * Checks whether specific fields of specific type have specific values.\r
-        * This generic implementation can easily go completely nuts if enableFreetextFor was filled wrong.\r
-        * @return\r
-        */\r
-       private boolean taxonFieldsEmpty() {\r
-               boolean enableFreetext = true;\r
-\r
-               if (taxonBase != null) {\r
-                       for (Object[] methodSequence : enableFreetextFor) {\r
-                               int sequenceCount = 0;\r
-                               Object taxonObject = HibernateProxyHelper.deproxy(taxonBase);\r
-                               Object referenceType = null;\r
-                               boolean useReference = false;\r
-                               Class<? extends CdmBase> referenceInstance = null;\r
-                               for (Object method : methodSequence) {\r
-                                       sequenceCount++;\r
-\r
-                                       if (sequenceCount == 1) {\r
-                                               referenceType = method;\r
-                                       } else if (sequenceCount == 2) {\r
-                                               try {\r
-                                                       if (method != null) {\r
-                                                               referenceInstance = (Class<? extends CdmBase>) Class.forName((String) method);\r
-                                                               useReference = true;\r
-                                                       } else {\r
-                                                               useReference = false;\r
-                                                       }\r
-                                               } catch (ClassNotFoundException e) {\r
-                                                       logger.error("Class " + method + " could not be found: ", e);\r
-                                                       return false;\r
-                                               }\r
-                                       } else {\r
-                                               Method getter = null;\r
-                                               try {\r
-                                                       if (taxonObject != null) { // authorTeams can be null\r
-                                                               Class<? extends Object> clazz = taxonObject.getClass();\r
-                                                               boolean goOn = false;\r
-                                                               if (methodSequence.length == sequenceCount) {\r
-                                                                       if (useReference) {\r
-                                                                               if (referenceInstance.newInstance().isInstanceOf((Class<? extends CdmBase>) clazz)) {\r
-                                                                                       goOn = true;\r
-                                                                               } else {\r
-                                                                                       goOn = false;\r
-                                                                               }\r
-                                                                       } else {\r
-                                                                               goOn = true;\r
-                                                                       }\r
-                                                               } else {\r
-                                                                       goOn = true;\r
-                                                               }\r
-                                                               \r
-                                                               if (goOn) {\r
-                                                                       getter = clazz.getMethod((String)method, (Class<?>[])null);\r
-                                                                       taxonObject = HibernateProxyHelper.deproxy(getter.invoke(taxonObject, (Object[])null));\r
-                                                                       if (methodSequence.length == sequenceCount) {\r
-                                                                               enableFreetext &= isEqual(referenceType, taxonObject);\r
-//                                                                             if (!enableFreetext) {\r
-//                                                                                     logger.error("Freetext disabled for: " + taxonBase);\r
-//                                                                             }\r
-                                                                       }\r
-                                                               }\r
-                                                       }\r
-                                               } catch (Exception e) {\r
-                                                       e.printStackTrace();\r
-                                                       logger.error("Method " + method + " could not be called: " + e.getMessage());\r
-                                                       return false;\r
-                                               }\r
-                                       }\r
-                               }\r
-                       }\r
-               } else {\r
-                       logger.warn("TaxonBase is null. This should not happen.");\r
-               }\r
-\r
-               return enableFreetext;\r
-       }\r
-\r
-       /**\r
-        * Checks whether two objects are equal. Only works for cases of interest.\r
-        * @param referenceType\r
-        * @param object\r
-        * @return\r
-        */\r
-       private boolean isEqual(Object referenceType, Object object) {\r
-               boolean equal = false;\r
-               if (referenceType instanceof Boolean) {\r
-                       if ((Boolean)referenceType.equals((Boolean)object)) {\r
-                               equal = true;\r
-                       } else {\r
-                               equal = false;\r
-                       }\r
-               } else {\r
-                       // This can only be a String in our cases so far. Needs reimplementation in case this is not always the case.\r
-                       if (referenceType.equals(CdmUtils.Nz((String)object))) {\r
-                               equal = true;\r
-                       } else {\r
-                               equal = false;\r
-                       }\r
-               }\r
-               return equal;\r
-       }\r
-\r
-       /**\r
-        * Parse the text and calculate errors\r
-        * \r
-        */\r
-       public void parseAndCalculateErrors(){\r
-               removeListener();\r
-               parseHandler.parse();\r
-               addListener();\r
-               calculateErrors();\r
-       }\r
-\r
-       /**\r
-        * @return the taxonBase\r
-        */\r
-       public T getTaxonBase() {\r
-               return taxonBase;\r
-       }\r
-       \r
-       public TaxonNameBase getName(){\r
-               return getTaxonBase().getName();\r
-       }\r
-       \r
-       /* (non-Javadoc)\r
-        * @see eu.etaxonomy.taxeditor.editor.GroupedComposite#dispose()\r
-        */\r
-       @Override\r
-       public void dispose() {\r
-               super.dispose();\r
-               //this.removeFocusListener(nameCompositeFocusListener);\r
-       }\r
-\r
-       public void persistName(){\r
-               if(isDirty()){\r
-                       logger.warn("Found dirty composite: " + this + ". Name: " + textViewer.getTextWidget().getText());\r
-                       taxonBase.setName(parseHandler.parseAndResolveDuplicates());\r
-                       \r
-                       getTaxonBase().setTitleCache((getTaxonBase().generateTitle()));\r
-\r
-               }\r
-       }\r
-}
\ No newline at end of file
similarity index 63%
rename from taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/AcceptedNameComposite.java
rename to taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/AcceptedNameContainer.java
index 6aba7b15a331224a1db65c2fe1e3d18f2a9e217d..ba85f2c2a92819af5fb151d87e36e743181ed5d6 100644 (file)
@@ -10,40 +10,41 @@ package eu.etaxonomy.taxeditor.editor.name;
 \r
 import org.apache.log4j.Logger;\r
 import org.eclipse.swt.graphics.Font;\r
-import org.eclipse.swt.widgets.Composite;\r
 \r
 import eu.etaxonomy.cdm.model.taxon.Taxon;\r
+import eu.etaxonomy.taxeditor.editor.EditorUtil;\r
+import eu.etaxonomy.taxeditor.preference.Resources;\r
 \r
 /**\r
  * @author p.ciardelli\r
  * @created 13.01.2009\r
  * @version 1.0\r
  */\r
-public class AcceptedNameComposite extends AbstractNameComposite<Taxon> {\r
+public class AcceptedNameContainer extends AbstractGroupedContainer<Taxon> {\r
        @SuppressWarnings("unused")\r
        private static final Logger logger = Logger\r
-                       .getLogger(AcceptedNameComposite.class);\r
+                       .getLogger(AcceptedNameContainer.class);\r
        \r
-       public AcceptedNameComposite(TaxonNameEditor editor, Composite groupComposite) {\r
-               super(editor, groupComposite, editor.getTaxon());\r
+       public AcceptedNameContainer(TaxonNameEditor editor, AbstractGroup group) {\r
+               super(editor, group, editor.getTaxon());\r
        }\r
 \r
 \r
        public void initializeComposite(){\r
-//             setIsDraggable(false);\r
                setIcon(ACCEPTED_ICON);\r
                setFont(getViewerFont());\r
                setIndent(ACCEPTED_INDENT);\r
                \r
-               initTextViewer(getEditorTaxon());\r
+               initTextViewer();\r
        }\r
        \r
        @Override\r
        protected Font getViewerFont() {\r
-               return getAcceptedFont();\r
+               return EditorUtil.getFont(Resources.ACCEPTED_TAXON_FONT);\r
        }\r
 \r
 \r
+       \r
        @Override\r
        protected void updateNonEditableInfo() {\r
                // not needed\r
similarity index 55%
rename from taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/ConceptComposite.java
rename to taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/ConceptContainer.java
index f3e9feb24caa0697d5a99c30d18146531964eb9e..60c29b6599b0d750f8627d58ef677f8bf2ac33f4 100644 (file)
@@ -9,32 +9,28 @@
 \r
 package eu.etaxonomy.taxeditor.editor.name;\r
 \r
-import org.eclipse.core.commands.operations.IUndoableOperation;\r
 import org.eclipse.swt.graphics.Font;\r
-import org.eclipse.swt.widgets.Composite;\r
 \r
-import eu.etaxonomy.cdm.model.name.HomotypicalGroup;\r
 import eu.etaxonomy.cdm.model.taxon.Taxon;\r
 import eu.etaxonomy.cdm.model.taxon.TaxonRelationship;\r
 import eu.etaxonomy.cdm.model.taxon.TaxonRelationshipType;\r
 import eu.etaxonomy.taxeditor.editor.EditorUtil;\r
-import eu.etaxonomy.taxeditor.operations.ChangeConceptRelationshipTypeOperation;\r
-import eu.etaxonomy.taxeditor.operations.ChangeConceptToSynonymOperation;\r
+import eu.etaxonomy.taxeditor.preference.Resources;\r
 \r
 /**\r
  * @author p.ciardelli\r
  * @created 26.01.2009\r
  * @version 1.0\r
  */\r
-public class ConceptComposite extends AbstractNameComposite<Taxon> {\r
+public class ConceptContainer extends AbstractGroupedContainer<Taxon> {\r
        \r
        private TaxonRelationshipType relationshipType;\r
        \r
                \r
-       private ConceptComposite(TaxonNameEditor editor, Composite parent,\r
+       private ConceptContainer(TaxonNameEditor editor, AbstractGroup group,\r
                        Taxon relatedTaxon, TaxonRelationshipType relationshipType, \r
                        boolean acceptedTaxonIsFromTaxon) {\r
-               super(editor, parent, relatedTaxon);\r
+               super(editor, group, relatedTaxon);\r
 \r
                // FIXME the acceptedTaxonIsFromTaxon is never used and \r
                // I can't remember what is was used for in the first place\r
@@ -56,7 +52,7 @@ public class ConceptComposite extends AbstractNameComposite<Taxon> {
                \r
                showSec();\r
                                \r
-               initTextViewer(getTaxonBase());\r
+               initTextViewer();\r
        }\r
        \r
        private void showRelationshipType() {\r
@@ -75,15 +71,15 @@ public class ConceptComposite extends AbstractNameComposite<Taxon> {
                }\r
        }\r
 \r
-       public static ConceptComposite getNewInstance(TaxonNameEditor editor, Composite parent, TaxonRelationship relationship){\r
+       public static ConceptContainer getNewInstance(TaxonNameEditor editor, AbstractGroup group, TaxonRelationship relationship){\r
 \r
                TaxonRelationshipType relationshipType = relationship.getType();\r
                \r
                if (relationship.getToTaxon().equals(editor.getTaxon())) {\r
-                       return new ConceptComposite (editor, parent\r
+                       return new ConceptContainer (editor, group\r
                                        relationship.getFromTaxon(), relationshipType, false);\r
                } else {\r
-                       return new ConceptComposite (editor, parent\r
+                       return new ConceptContainer (editor, group\r
                                        relationship.getToTaxon(), relationshipType, true);\r
                } \r
        }\r
@@ -93,7 +89,7 @@ public class ConceptComposite extends AbstractNameComposite<Taxon> {
         */\r
        @Override\r
        protected Font getViewerFont() {\r
-               return getConceptFont();\r
+               return EditorUtil.getFont(Resources.CONCEPT_FONT);\r
        }\r
 \r
        public Taxon getRelatedTaxon() {\r
@@ -106,34 +102,6 @@ public class ConceptComposite extends AbstractNameComposite<Taxon> {
                textViewer.setShowSecError(getTaxonBase());\r
        }\r
        \r
-       public Object getData () {\r
-               return getRelatedTaxon();\r
-       }\r
-       \r
-       public boolean setParent(Composite parent) {\r
-               boolean doSetParent = false;\r
-               \r
-               if (parent instanceof MisappliedGroupComposite) {\r
-                       IUndoableOperation operation = new ChangeConceptRelationshipTypeOperation("change to misapplication", \r
-                                       editor.getUndoContext(), getEditorTaxon(), getTaxonBase(), TaxonRelationshipType.MISAPPLIED_NAME_FOR(), editor); //$NON-NLS-1$\r
-                       EditorUtil.executeOperation(operation);\r
-                       \r
-                       doSetParent = true;\r
-               }\r
-               \r
-               if (parent instanceof HomotypicalGroupComposite) {\r
-                       HomotypicalGroup homotypicalGroup = \r
-                               ((HomotypicalGroupComposite)parent).getGroup();\r
-                       IUndoableOperation operation = new ChangeConceptToSynonymOperation\r
-                                       ("change concept to synonym", editor.getUndoContext(), getEditorTaxon(), getTaxonBase(), homotypicalGroup, editor);\r
-                       EditorUtil.executeOperation(operation);\r
-               \r
-                       doSetParent = true;\r
-               }\r
-               \r
-               return doSetParent;\r
-       }\r
-\r
        @Override\r
        protected void updateNonEditableInfo() {\r
                showSec();\r
diff --git a/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/ConceptGroup.java b/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/ConceptGroup.java
new file mode 100644 (file)
index 0000000..a34c6af
--- /dev/null
@@ -0,0 +1,37 @@
+/**\r
+* Copyright (C) 2007 EDIT\r
+* European Distributed Institute of Taxonomy \r
+* http://www.e-taxonomy.eu\r
+* \r
+* The contents of this file are subject to the Mozilla Public License Version 1.1\r
+* See LICENSE.TXT at the top of this package for the full license terms.\r
+*/\r
+\r
+package eu.etaxonomy.taxeditor.editor.name;\r
+\r
+import eu.etaxonomy.cdm.model.common.CdmBase;\r
+import eu.etaxonomy.cdm.model.taxon.Taxon;\r
+\r
+/**\r
+ * @author p.ciardelli\r
+ * @created 21.01.2009\r
+ * @version 1.0\r
+ */\r
+public class ConceptGroup extends AbstractGroup<Taxon> {\r
+\r
+       public ConceptGroup(TaxonNameEditor editor) {\r
+               super(editor);\r
+       }\r
+       \r
+       @Override\r
+       public void redraw() {\r
+               // TODO Auto-generated method stub\r
+               \r
+       }\r
+\r
+       public boolean onComplete() {\r
+               // TODO Auto-generated method stub\r
+               return false;\r
+       }\r
+\r
+}\r
diff --git a/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/ConceptGroupComposite.java b/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/ConceptGroupComposite.java
deleted file mode 100644 (file)
index ce46bec..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-/**\r
-* Copyright (C) 2007 EDIT\r
-* European Distributed Institute of Taxonomy \r
-* http://www.e-taxonomy.eu\r
-* \r
-* The contents of this file are subject to the Mozilla Public License Version 1.1\r
-* See LICENSE.TXT at the top of this package for the full license terms.\r
-*/\r
-\r
-package eu.etaxonomy.taxeditor.editor.name;\r
-\r
-import org.eclipse.swt.widgets.Composite;\r
-\r
-import eu.etaxonomy.taxeditor.editor.GroupComposite;\r
-\r
-/**\r
- * @author p.ciardelli\r
- * @created 21.01.2009\r
- * @version 1.0\r
- */\r
-public class ConceptGroupComposite extends GroupComposite {\r
-\r
-       public ConceptGroupComposite(TaxonNameEditor editor, Composite parent) {\r
-               super(editor,parent);\r
-       }\r
-}\r
diff --git a/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/ContainerFactory.java b/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/ContainerFactory.java
new file mode 100644 (file)
index 0000000..72d58d3
--- /dev/null
@@ -0,0 +1,257 @@
+/**
+ * 
+ */
+package eu.etaxonomy.taxeditor.editor.name;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.log4j.Logger;
+
+import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper;
+import eu.etaxonomy.cdm.model.name.HomotypicalGroup;
+import eu.etaxonomy.cdm.model.taxon.Synonym;
+import eu.etaxonomy.cdm.model.taxon.Taxon;
+import eu.etaxonomy.cdm.model.taxon.TaxonBase;
+import eu.etaxonomy.cdm.model.taxon.TaxonRelationship;
+import eu.etaxonomy.cdm.model.taxon.TaxonRelationshipType;
+
+/**
+ * @author n.hoffmann
+ *
+ */
+public class ContainerFactory {
+       
+       private static final Logger logger = Logger.getLogger(ContainerFactory.class);
+
+       public static final int ACCEPTED = 1;
+       public static final int SYNONYM = 2;
+       public static final int MISAPPLICATION = 3;
+       public static final int CONCEPT = 4;
+       
+       private static ContainerFactory instance = new ContainerFactory();
+       
+       private ContainerFactory(){}
+       
+       public static synchronized ContainerFactory getInstance(){
+               return instance;
+       }
+
+       public void createAcceptedTaxonsHomotypicGroup(TaxonNameEditor taxonNameEditor) {
+               Taxon taxon = taxonNameEditor.getTaxon();
+                               
+               // Draw homotypic group synonyms
+               HomotypicalGroup homotypicGroup = (HomotypicalGroup) HibernateProxyHelper.deproxy(taxon.getHomotypicGroup());
+               List<Synonym> homotypicSynonyms = homotypicGroup.getSynonymsInGroup(taxon.getSec());
+               
+               HomotypicalSynonymGroup group = taxonNameEditor.getHomotypicSynonymGroup();
+               
+               // check if the taxon has changed
+               if(group != null && ! taxon.getHomotypicGroup().equals(group.getGroup()) ){
+                       group.removeAllContainers();
+                       group.clear();
+                       group = null;
+               }
+               
+               // first run
+               if(group == null){
+                       HomotypicalSynonymGroup homotypicalSynonymGroup = new HomotypicalSynonymGroup(taxonNameEditor, homotypicGroup);
+                       taxonNameEditor.setHomotypicSynonymGroup(homotypicalSynonymGroup);
+                       AcceptedNameContainer acceptedNameContainer = new AcceptedNameContainer(taxonNameEditor, homotypicalSynonymGroup);
+                       taxonNameEditor.setAcceptedNameContainer(acceptedNameContainer);
+                       for(Synonym synonym : homotypicSynonyms){
+                               createContainerFactoryMethod(SYNONYM, homotypicalSynonymGroup, synonym);
+                       }
+               }
+               // subsequent runs
+               else{
+                       fillGroup(group, homotypicSynonyms, ACCEPTED);
+               }
+       }
+
+       public void createHeterotypicSynonymGroups(TaxonNameEditor taxonNameEditor) {
+               Taxon taxon = taxonNameEditor.getTaxon();
+               
+               List<HomotypicalGroup> homotypicalGroups = taxon.getHeterotypicSynonymyGroups();
+               
+               // reatins a reference to the homotypical group widgets
+               Map<HomotypicalGroup, HomotypicalSynonymGroup> retainedGroups = taxonNameEditor.getHeterotypicSynonymGroupsMap();
+               
+               taxonNameEditor.clearHeterotypicSynonymGroups();
+               
+               // iterate over taxas synonymy groups
+               for (HomotypicalGroup homotypicalGroup : homotypicalGroups) {
+                       HomotypicalGroup homotypicalGroupDeproxied = (HomotypicalGroup) HibernateProxyHelper.deproxy(homotypicalGroup);
+                       
+                       HomotypicalSynonymGroup group;
+                       if(retainedGroups.containsKey(homotypicalGroupDeproxied)){
+                               group = retainedGroups.get(homotypicalGroupDeproxied);
+                               retainedGroups.remove(homotypicalGroupDeproxied);
+                       }else{
+                               group = new HomotypicalSynonymGroup(taxonNameEditor, homotypicalGroupDeproxied);
+                       }
+                       
+                       createHeterotypicSynonymGroup(taxonNameEditor, group);
+                       taxonNameEditor.addHeterotypicSynonymGroup(group);
+               }
+               
+               // remove all groups that did not match
+               for(AbstractGroup group : retainedGroups.values()){
+                       group.clear();
+               }
+       }
+       
+       public void createMisapplicationGroup(TaxonNameEditor taxonNameEditor) {
+               Taxon taxon = taxonNameEditor.getTaxon();
+               
+               List<TaxonBase> content = new ArrayList<TaxonBase>(taxon.getMisappliedNames());
+               
+               if(content.size() == 0 && taxonNameEditor.getMisappliedGroup() != null){
+                       taxonNameEditor.getMisappliedGroup().clear();
+                       taxonNameEditor.setMisapplicationsGroup(null);
+               }else{
+                       AbstractGroup group = getMisappliedGroup(taxonNameEditor);
+                       fillGroup(group, content, MISAPPLICATION);
+               }
+       }
+       
+       public void createConceptGroup(TaxonNameEditor taxonNameEditor) {
+               Taxon taxon = taxonNameEditor.getTaxon();
+               
+               Set<TaxonRelationship> filteredTaxonRelations = new HashSet<TaxonRelationship>();
+               
+               for (TaxonRelationship relationship : taxon.getTaxonRelations()) {
+                       if (! relationship.getType().equals(TaxonRelationshipType.MISAPPLIED_NAME_FOR()) ||
+                                        relationship.getType().equals(TaxonRelationshipType.TAXONOMICALLY_INCLUDED_IN())) {
+                               filteredTaxonRelations.add(relationship);
+                       }
+               }
+               
+               if(filteredTaxonRelations.size() == 0 && taxonNameEditor.getConceptGroup() != null){
+                       taxonNameEditor.getConceptGroup().clear();
+                       taxonNameEditor.setConceptGroup(null);
+               }else{
+                       ConceptGroup group = getConceptGroup(taxonNameEditor);
+                       
+                       // reatain old container
+                       List<AbstractGroupedContainer<Taxon>> groupedContainers = group.getGroupedContainers();
+                       
+                       group.removeAllContainers();
+                       
+                       // Draw concept relation elements
+                       for (TaxonRelationship relationship : filteredTaxonRelations) {
+                               ConceptContainer.getNewInstance(group.getNameEditor(), group, relationship);
+                       }       
+               }
+       }
+       
+       
+       public void fillGroup(AbstractGroup group, List<? extends TaxonBase> content, int mode){
+               if(content == null || (mode != ACCEPTED && content.size() == 0)){
+                       return;
+               }
+               
+               AbstractGroupedContainer[] retainedContainers = (AbstractGroupedContainer[]) group.getGroupedContainers().toArray(new AbstractGroupedContainer[0]);
+               
+               group.clearContainers();
+               
+               if(retainedContainers.length > 0 && retainedContainers[0] instanceof AcceptedNameContainer){
+                       group.add(retainedContainers[0]);
+                       retainedContainers[0] = null;
+               }
+               
+               for(TaxonBase taxonBase : content){
+                       AbstractGroupedContainer existingContainer = null;
+                       int i = 0;
+                       for(AbstractGroupedContainer container : retainedContainers){
+                               if(container != null && taxonBase.equals(container.getData())){
+                                       existingContainer = container;
+                                       retainedContainers[i] = null;                                           
+                               }
+                               i++;
+                       }
+                       if(existingContainer != null){
+                               group.add(existingContainer);
+                       }else{
+                               createContainerFactoryMethod(mode == ACCEPTED ? SYNONYM : mode, group, taxonBase);
+                       }       
+               }       
+                       
+               // delete all container that were not used
+               for(AbstractGroupedContainer container : retainedContainers){
+                       if(container != null){
+                               group.deleteContainer(container);
+                       }
+               }
+       }
+       
+       public AbstractGroupedContainer createContainerFactoryMethod(int mode, AbstractGroup group, TaxonBase taxonBase){
+               switch(mode){
+               case ACCEPTED:
+                       return new AcceptedNameContainer(group.getNameEditor(), group);
+               case SYNONYM:
+                       return new SynonymContainer(group.getNameEditor(), group, (Synonym) taxonBase);
+               case MISAPPLICATION:
+                       return new MisapplicationContainer(group.getNameEditor(), group, (Taxon) taxonBase);
+               case CONCEPT:
+                       return null;
+               }
+               return null;
+       }
+       
+       public void createHeterotypicSynonymGroup(TaxonNameEditor taxonNameEditor, HomotypicalSynonymGroup group) {
+               Taxon taxon = taxonNameEditor.getTaxon();
+               
+               List<AbstractGroupedContainer<Synonym>> groupedContainers = group.getGroupedContainers();
+               
+               List<Synonym> heterotypicSynonyms = group.getGroup().getSynonymsInGroup(taxon.getSec());
+               
+               fillGroup(group, heterotypicSynonyms, SYNONYM);
+       }
+       
+       /**********************************************************************************/
+       
+       
+
+       
+       private MisappliedGroup getMisappliedGroup(TaxonNameEditor editor) {
+               if(editor.getMisappliedGroup() == null){
+                       // Create the group composite
+                       editor.setMisapplicationsGroup(new MisappliedGroup(editor));
+               }
+               
+               MisappliedGroup misappliedGroup = editor.getMisappliedGroup();
+               
+               // Put the group composite before concept group composite, if any
+               if (editor.getConceptGroup() != null) {
+                       editor.getMisappliedGroup().getControl().moveAbove(editor.getConceptGroup().getControl());
+               }
+               
+               return misappliedGroup;
+       }
+       
+       
+       private ConceptGroup getConceptGroup(TaxonNameEditor editor) {
+               if(editor.getConceptGroup() == null){
+                       // Create the group composite
+                       editor.setConceptGroup(new ConceptGroup(editor));
+               }
+               
+               ConceptGroup conceptGroup = editor.getConceptGroup();
+               
+               // Put the group composite after misapplied group composite, if any
+               if (editor.getMisappliedGroup() != null) {
+                       editor.getConceptGroup().getControl().moveBelow(editor.getMisappliedGroup().getControl());
+               }
+               
+               return conceptGroup;
+
+       }
+
+
+
+
+}
similarity index 94%
rename from taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/EditorAnnotation.java
rename to taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/EditorAnnotation.java
index 5191d5980115d486206fd4ba2c3e907a543d784c..b24902eeb07c84b32407ef3ae65ec5a1099bf7fe 100644 (file)
@@ -1,4 +1,4 @@
-package eu.etaxonomy.taxeditor.editor;\r
+package eu.etaxonomy.taxeditor.editor.name;\r
 \r
 import org.apache.log4j.Logger;\r
 import org.eclipse.core.resources.IMarker;\r
diff --git a/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/HomotypicalGroupComposite.java b/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/HomotypicalGroupComposite.java
deleted file mode 100644 (file)
index 22bfe62..0000000
+++ /dev/null
@@ -1,36 +0,0 @@
-/**\r
-* Copyright (C) 2007 EDIT\r
-* European Distributed Institute of Taxonomy \r
-* http://www.e-taxonomy.eu\r
-* \r
-* The contents of this file are subject to the Mozilla Public License Version 1.1\r
-* See LICENSE.TXT at the top of this package for the full license terms.\r
-*/\r
-\r
-package eu.etaxonomy.taxeditor.editor.name;\r
-\r
-import org.eclipse.swt.widgets.Composite;\r
-\r
-import eu.etaxonomy.cdm.model.name.HomotypicalGroup;\r
-import eu.etaxonomy.taxeditor.editor.GroupComposite;\r
-\r
-/**\r
- * @author p.ciardelli\r
- * @created 13.01.2009\r
- * @version 1.0\r
- */\r
-public class HomotypicalGroupComposite extends GroupComposite {\r
-\r
-       private HomotypicalGroup group;\r
-       \r
-       public HomotypicalGroupComposite(TaxonNameEditor editor, Composite parent, HomotypicalGroup group) {\r
-               \r
-               super(editor, parent);\r
-               \r
-               this.group = group;\r
-       }\r
-       \r
-       public HomotypicalGroup getGroup() {\r
-               return group;\r
-       }\r
-}\r
diff --git a/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/HomotypicalSynonymGroup.java b/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/HomotypicalSynonymGroup.java
new file mode 100644 (file)
index 0000000..2eab587
--- /dev/null
@@ -0,0 +1,46 @@
+/**\r
+* Copyright (C) 2007 EDIT\r
+* European Distributed Institute of Taxonomy \r
+* http://www.e-taxonomy.eu\r
+* \r
+* The contents of this file are subject to the Mozilla Public License Version 1.1\r
+* See LICENSE.TXT at the top of this package for the full license terms.\r
+*/\r
+\r
+package eu.etaxonomy.taxeditor.editor.name;\r
+\r
+import java.util.List;\r
+\r
+import eu.etaxonomy.cdm.model.name.HomotypicalGroup;\r
+import eu.etaxonomy.cdm.model.taxon.Synonym;\r
+\r
+/**\r
+ * @author p.ciardelli\r
+ * @created 13.01.2009\r
+ * @version 1.0\r
+ */\r
+public class HomotypicalSynonymGroup extends AbstractGroup {\r
+\r
+       private HomotypicalGroup group;\r
+       \r
+       public HomotypicalSynonymGroup(TaxonNameEditor editor, HomotypicalGroup group) {\r
+               super(editor);\r
+               this.group = group;\r
+       }\r
+       \r
+       public HomotypicalGroup getGroup() {\r
+               return group;\r
+       }\r
+\r
+       @Override\r
+       public void redraw() {\r
+               List<Synonym> synonyms = getGroup().getSynonymsInGroup(getNameEditor().getTaxon().getSec());\r
+               \r
+               ContainerFactory.getInstance().fillGroup(this, synonyms, ContainerFactory.SYNONYM);\r
+       }\r
+\r
+       public boolean onComplete() {\r
+               // TODO Auto-generated method stub\r
+               return false;\r
+       }\r
+}\r
similarity index 95%
rename from taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/LineBreakListener.java
rename to taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/LineBreakListener.java
index 07a12f33bd4835e06be065082f315f3470749f56..9c911783d32c7945d0eb6ce16cc9f0adbb74bd95 100644 (file)
@@ -7,7 +7,7 @@
 * See LICENSE.TXT at the top of this package for the full license terms.\r
 */\r
 \r
-package eu.etaxonomy.taxeditor.editor;\r
+package eu.etaxonomy.taxeditor.editor.name;\r
 \r
 import java.util.ArrayList;\r
 import java.util.Collection;\r
similarity index 95%
rename from taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/LineWrapSquigglesStrategy.java
rename to taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/LineWrapSquigglesStrategy.java
index f2dbb0e3b14b39305f886c2b70f17f205864c364..1961ddcf3f94ab465538d3b9cca85a1ee851f232 100644 (file)
@@ -7,7 +7,7 @@
 * See LICENSE.TXT at the top of this package for the full license terms.\r
 */\r
 \r
-package eu.etaxonomy.taxeditor.editor;\r
+package eu.etaxonomy.taxeditor.editor.name;\r
 \r
 import org.eclipse.jface.text.source.Annotation;\r
 import org.eclipse.jface.text.source.AnnotationPainter.SquigglesStrategy;\r
similarity index 94%
rename from taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/LineWrapSupport.java
rename to taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/LineWrapSupport.java
index 845f9598015d79a7f4eeb240c200592d3d97380f..845b636dd6f02de1e4f48169ad971ee9067ce945 100644 (file)
@@ -7,7 +7,7 @@
 * See LICENSE.TXT at the top of this package for the full license terms.\r
 */\r
 \r
-package eu.etaxonomy.taxeditor.editor;\r
+package eu.etaxonomy.taxeditor.editor.name;\r
 \r
 import org.apache.log4j.Logger;\r
 import org.eclipse.jface.text.TextViewer;\r
similarity index 52%
rename from taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/MisapplicationComposite.java
rename to taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/MisapplicationContainer.java
index 1de135dc33c7f775facc0db80fb2ab569ded6682..843a48df8a467620b55b66d2693976665f7aea8d 100644 (file)
@@ -9,24 +9,21 @@
 \r
 package eu.etaxonomy.taxeditor.editor.name;\r
 \r
-import org.eclipse.core.commands.operations.IUndoableOperation;\r
 import org.eclipse.swt.graphics.Font;\r
-import org.eclipse.swt.widgets.Composite;\r
 \r
-import eu.etaxonomy.cdm.model.name.HomotypicalGroup;\r
 import eu.etaxonomy.cdm.model.taxon.Taxon;\r
 import eu.etaxonomy.taxeditor.editor.EditorUtil;\r
-import eu.etaxonomy.taxeditor.operations.ChangeConceptToSynonymOperation;\r
+import eu.etaxonomy.taxeditor.preference.Resources;\r
 \r
 /**\r
  * @author p.ciardelli\r
  * @created 13.01.2009\r
  * @version 1.0\r
  */\r
-public class MisapplicationComposite extends AbstractNameComposite<Taxon> {\r
+public class MisapplicationContainer extends AbstractGroupedContainer<Taxon> {\r
        \r
-       public MisapplicationComposite(TaxonNameEditor editor, Composite parent, Taxon misappliedName) {\r
-               super(editor, parent, misappliedName);\r
+       public MisapplicationContainer(TaxonNameEditor editor, AbstractGroup group, Taxon misappliedName) {\r
+               super(editor, group, misappliedName);\r
        }\r
        \r
 \r
@@ -42,7 +39,7 @@ public class MisapplicationComposite extends AbstractNameComposite<Taxon> {
                \r
                showSec();              \r
                \r
-               initTextViewer(getMisappliedName());\r
+               initTextViewer();\r
        }\r
 \r
        private void showSec() {\r
@@ -61,29 +58,10 @@ public class MisapplicationComposite extends AbstractNameComposite<Taxon> {
        public Taxon getMisappliedName() {\r
                return getTaxonBase();\r
        }\r
-               \r
-       public boolean setParent(Composite parent) {\r
-\r
-               boolean doSetParent = false;    \r
-\r
-               // Has this been moved to a HomotypicalGroup?\r
-               if (parent instanceof HomotypicalGroupComposite) {\r
-                       \r
-                       HomotypicalGroup homotypicalGroup = \r
-                                       ((HomotypicalGroupComposite)parent).getGroup();\r
-                       \r
-                       IUndoableOperation operation = new ChangeConceptToSynonymOperation\r
-                                       ("change misapplication to synonym", editor.getUndoContext(), getEditorTaxon(), getMisappliedName(), homotypicalGroup, editor);\r
-                       EditorUtil.executeOperation(operation);\r
-                       \r
-                       doSetParent = true;\r
-               }\r
-               return doSetParent;\r
-       }\r
 \r
        @Override\r
        protected Font getViewerFont() {\r
-               return getMisapplicationFont();\r
+               return EditorUtil.getFont(Resources.MISAPPLIEDNAME_FONT);\r
        }\r
        \r
        protected void calculateErrors() {\r
@@ -92,10 +70,6 @@ public class MisapplicationComposite extends AbstractNameComposite<Taxon> {
                textViewer.setShowSecError(getMisappliedName());\r
        }\r
        \r
-       public Object getData () {\r
-               return getMisappliedName();\r
-       }\r
-\r
 \r
        @Override\r
        protected void updateNonEditableInfo() {\r
diff --git a/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/MisappliedGroup.java b/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/MisappliedGroup.java
new file mode 100644 (file)
index 0000000..c443664
--- /dev/null
@@ -0,0 +1,38 @@
+/**\r
+* Copyright (C) 2007 EDIT\r
+* European Distributed Institute of Taxonomy \r
+* http://www.e-taxonomy.eu\r
+* \r
+* The contents of this file are subject to the Mozilla Public License Version 1.1\r
+* See LICENSE.TXT at the top of this package for the full license terms.\r
+*/\r
+\r
+package eu.etaxonomy.taxeditor.editor.name;\r
+\r
+import java.util.ArrayList;\r
+import java.util.List;\r
+\r
+import eu.etaxonomy.cdm.model.taxon.Taxon;\r
+\r
+/**\r
+ * @author p.ciardelli\r
+ * @created 13.01.2009\r
+ * @version 1.0\r
+ */\r
+public class MisappliedGroup extends AbstractGroup<Taxon> {\r
+\r
+       public MisappliedGroup(TaxonNameEditor editor) {\r
+               super(editor);\r
+       }\r
+\r
+       @Override\r
+       public void redraw() {\r
+               List<Taxon> misapplications = new ArrayList<Taxon>(editor.getTaxon().getMisappliedNames());\r
+               ContainerFactory.getInstance().fillGroup(this, misapplications, ContainerFactory.MISAPPLICATION);\r
+       }\r
+\r
+       public boolean onComplete() {\r
+               // TODO Auto-generated method stub\r
+               return false;\r
+       }\r
+}\r
diff --git a/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/MisappliedGroupComposite.java b/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/MisappliedGroupComposite.java
deleted file mode 100644 (file)
index 074c264..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
-/**\r
-* Copyright (C) 2007 EDIT\r
-* European Distributed Institute of Taxonomy \r
-* http://www.e-taxonomy.eu\r
-* \r
-* The contents of this file are subject to the Mozilla Public License Version 1.1\r
-* See LICENSE.TXT at the top of this package for the full license terms.\r
-*/\r
-\r
-package eu.etaxonomy.taxeditor.editor.name;\r
-\r
-import org.eclipse.swt.widgets.Composite;\r
-\r
-import eu.etaxonomy.taxeditor.editor.GroupComposite;\r
-\r
-/**\r
- * @author p.ciardelli\r
- * @created 13.01.2009\r
- * @version 1.0\r
- */\r
-public class MisappliedGroupComposite extends GroupComposite {\r
-\r
-       public MisappliedGroupComposite(TaxonNameEditor editor, Composite parent) {\r
-               super(editor, parent);\r
-       }\r
-\r
-}\r
diff --git a/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/NameEditorDragListener.java b/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/NameEditorDragListener.java
new file mode 100644 (file)
index 0000000..fd0755c
--- /dev/null
@@ -0,0 +1,50 @@
+/**
+ * 
+ */
+package eu.etaxonomy.taxeditor.editor.name;
+
+import org.apache.log4j.Logger;
+import org.eclipse.swt.dnd.DND;
+import org.eclipse.swt.dnd.DragSourceAdapter;
+import org.eclipse.swt.dnd.DragSourceEvent;
+
+import eu.etaxonomy.cdm.model.common.ICdmBase;
+import eu.etaxonomy.taxeditor.editor.CdmDataTransfer;
+
+/**
+ * @author n.hoffmann
+ *
+ */
+public class NameEditorDragListener extends DragSourceAdapter {
+       
+       private static final Logger logger = Logger.getLogger(NameEditorDragListener.class);
+       
+       private AbstractGroupedContainer container;
+               
+       public NameEditorDragListener(AbstractGroupedContainer container){
+               this.container = container;
+       }
+       
+       public void dragFinished(DragSourceEvent event) {
+               if(!event.doit)
+                       return;
+               if(event.detail == DND.DROP_MOVE){
+                       logger.warn("drag finished");
+                       container.remove();
+               }
+               
+       };
+       
+       @Override
+       public void dragSetData(DragSourceEvent event) {
+               ICdmBase[] cdmBaseObjects = new ICdmBase[]{(ICdmBase) container.getData()};
+               if(CdmDataTransfer.getInstance().isSupportedType(event.dataType)){
+                       event.data = cdmBaseObjects;
+               }
+       }
+       
+       @Override
+       public void dragStart(DragSourceEvent event) {
+               event.doit = container.getData() != null;
+       }
+}
diff --git a/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/NameEditorDragSourceEffect.java b/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/NameEditorDragSourceEffect.java
new file mode 100644 (file)
index 0000000..13bcf5e
--- /dev/null
@@ -0,0 +1,32 @@
+/**
+ * 
+ */
+package eu.etaxonomy.taxeditor.editor.name;
+
+import org.eclipse.swt.dnd.DragSourceEffect;
+import org.eclipse.swt.dnd.DragSourceEvent;
+import org.eclipse.swt.widgets.Control;
+
+/**
+ * @author n.hoffmann
+ *
+ */
+public class NameEditorDragSourceEffect extends DragSourceEffect {
+
+       public NameEditorDragSourceEffect(Control control) {
+               super(control);
+       }
+       
+       @Override
+       public void dragStart(DragSourceEvent event) {
+               // TODO Auto-generated method stub
+               super.dragStart(event);
+       }
+
+       @Override
+       public void dragFinished(DragSourceEvent event) {
+               // TODO Auto-generated method stub
+               super.dragFinished(event);
+       }
+       
+}
diff --git a/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/NameEditorDropTargetEffect.java b/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/NameEditorDropTargetEffect.java
new file mode 100644 (file)
index 0000000..12c6861
--- /dev/null
@@ -0,0 +1,46 @@
+/**
+ * 
+ */
+package eu.etaxonomy.taxeditor.editor.name;
+
+import org.eclipse.swt.dnd.DropTargetEffect;
+import org.eclipse.swt.dnd.DropTargetEvent;
+import org.eclipse.swt.widgets.Control;
+
+import eu.etaxonomy.taxeditor.editor.EditorUtil;
+import eu.etaxonomy.taxeditor.editor.IDropTargetable;
+import eu.etaxonomy.taxeditor.preference.Resources;
+
+/**
+ * @author n.hoffmann
+ *
+ */
+public class NameEditorDropTargetEffect extends DropTargetEffect {
+
+       public NameEditorDropTargetEffect(Control control) {
+               super(control);
+       }
+       
+       public void dragEnter(DropTargetEvent dropTargetEvent) {
+               
+               
+               
+               if(dropTargetEvent.widget instanceof IDropTargetable){
+                       ((IDropTargetable) dropTargetEvent.widget).dragEntered();
+               }
+               
+//             if(! EditorUtil.getActiveMultiPageTaxonEditor().equals(editor.getMultiPageTaxonEditor())){
+//                     editor.getMultiPageTaxonEditor().setFocus();
+//             }
+       }
+       
+       public void dragLeave(DropTargetEvent dropTargetEvent) {
+               
+               
+               
+               if(dropTargetEvent.widget instanceof Control){
+                       ((Control) dropTargetEvent.widget).setBackground(EditorUtil.getColor(Resources.COLOR_COMPOSITE_BACKGROUND));
+               }
+       }
+       
+}
diff --git a/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/NameEditorDropTargetListener.java b/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/NameEditorDropTargetListener.java
new file mode 100644 (file)
index 0000000..1e69c7e
--- /dev/null
@@ -0,0 +1,135 @@
+/**
+ * 
+ */
+package eu.etaxonomy.taxeditor.editor.name;
+
+import org.apache.log4j.Logger;
+import org.eclipse.core.commands.operations.IUndoableOperation;
+import org.eclipse.swt.dnd.DropTargetAdapter;
+import org.eclipse.swt.dnd.DropTargetEvent;
+
+import eu.etaxonomy.cdm.model.common.ICdmBase;
+import eu.etaxonomy.cdm.model.name.HomotypicalGroup;
+import eu.etaxonomy.cdm.model.taxon.Synonym;
+import eu.etaxonomy.cdm.model.taxon.Taxon;
+import eu.etaxonomy.cdm.model.taxon.TaxonBase;
+import eu.etaxonomy.cdm.model.taxon.TaxonRelationshipType;
+import eu.etaxonomy.taxeditor.editor.EditorUtil;
+import eu.etaxonomy.taxeditor.editor.IDropTargetable;
+import eu.etaxonomy.taxeditor.operations.AbstractPostOperation;
+import eu.etaxonomy.taxeditor.operations.ChangeConceptRelationshipTypeOperation;
+import eu.etaxonomy.taxeditor.operations.ChangeConceptToSynonymOperation;
+import eu.etaxonomy.taxeditor.operations.ChangeHomotypicGroupOperation;
+import eu.etaxonomy.taxeditor.operations.ChangeSynonymToMisapplicationOperation;
+
+/**
+ * @author n.hoffmann
+ *
+ */
+public class NameEditorDropTargetListener extends DropTargetAdapter {
+               
+       private static final Logger logger = Logger.getLogger(NameEditorDropTargetListener.class);
+       
+       private TaxonNameEditor editor;
+
+       private IDropTargetable target;
+
+       public NameEditorDropTargetListener(IDropTargetable target){
+               this.target = target;
+               editor = target.getNameEditor();
+       }
+       
+       public void dragEnter(DropTargetEvent dropTargetEvent) {
+               target.dragEntered();
+               
+//             if(! EditorUtil.getActiveMultiPageTaxonEditor().equals(editor.getMultiPageTaxonEditor())){
+//                     editor.getMultiPageTaxonEditor().setFocus();
+//             }
+       }
+       
+       public void dragLeave(DropTargetEvent dropTargetEvent) {
+               target.dragLeft();
+       }
+       
+       public void drop(DropTargetEvent event) {
+               
+               TaxonBase taxonBase = getDroppedTaxonBase(event);
+               
+               if (taxonBase != null) {
+                       // Execute operations at end of drag event
+                       AbstractPostOperation operation = createOperation(taxonBase);
+                       
+                       
+                       // Execute operation if it has been initiated
+                       if (operation == null) {
+                               logger.warn("User unsuccessfully tried to drop: " + taxonBase.getClass());
+                       } else {
+                               EditorUtil.executeOperation(operation);
+                       }
+               }
+       }
+       
+       private AbstractPostOperation createOperation(TaxonBase taxonBase) {
+               
+               
+               if(taxonBase instanceof Synonym){
+                       Synonym synonym = (Synonym) taxonBase;
+                       
+                       if(target instanceof HomotypicalSynonymGroup){
+                               HomotypicalGroup homotypicalGroup = ((HomotypicalSynonymGroup) target).getGroup();
+                               
+                               return new ChangeHomotypicGroupOperation("Change Homotypical Group", editor.getUndoContext(), 
+                                               editor.getTaxon(), synonym, homotypicalGroup, target);
+                       }
+                       else if(target instanceof MisappliedGroup){
+                               return new ChangeSynonymToMisapplicationOperation("Change Synonym to Misapplication", editor.getUndoContext(), 
+                                               editor.getTaxon(), synonym, target);
+                       }
+                       else if(target instanceof TaxonNameEditor){
+                               return new ChangeHomotypicGroupOperation("Change Homotypical Group", editor.getUndoContext(), 
+                                               editor.getTaxon(), synonym, null, target);
+                       }
+                       
+               }else if(taxonBase instanceof Taxon){
+                       Taxon concept = (Taxon) taxonBase;
+                       
+                       if(target instanceof HomotypicalSynonymGroup){
+                               HomotypicalGroup homotypicalGroup = ((HomotypicalSynonymGroup) target).getGroup();
+                               
+                               return new ChangeConceptToSynonymOperation("Change to Synonym", editor.getUndoContext(), 
+                                               editor.getTaxon(), concept, homotypicalGroup, target);
+                       }
+                       else if(target instanceof MisappliedGroup ){
+                               return new ChangeConceptRelationshipTypeOperation("Change", editor.getUndoContext(), 
+                                               editor.getTaxon(), concept, TaxonRelationshipType.MISAPPLIED_NAME_FOR(), target);
+                       }
+               }
+
+               
+               return null;
+       }
+
+       @Override
+       public void dropAccept(DropTargetEvent event) {
+               // pass
+       }
+
+       private HomotypicalGroup getHomotypicalGroup() {
+               if(target instanceof HomotypicalSynonymGroup){
+                       return ((HomotypicalSynonymGroup) target).getGroup();
+               }
+               return null;
+       }       
+       
+       private TaxonBase getDroppedTaxonBase(DropTargetEvent dropTargetEvent){
+               if(dropTargetEvent.data instanceof ICdmBase[]){
+               
+                       ICdmBase[] cdmBaseObjects = (ICdmBase[]) dropTargetEvent.data;
+                       
+                       if(cdmBaseObjects[0] instanceof TaxonBase){
+                               return (TaxonBase) cdmBaseObjects[0];
+                       }
+               }
+               return null;
+       }
+}
index b83b1bacfe398a2aa041727eab39b8196570960e..399de9942e5d5d6cfc30213eb5b76d646f0787ab 100644 (file)
@@ -28,6 +28,7 @@ import org.eclipse.jface.text.source.SourceViewer;
 import org.eclipse.swt.SWT;\r
 import org.eclipse.swt.graphics.Color;\r
 import org.eclipse.swt.graphics.Image;\r
+import org.eclipse.swt.widgets.Canvas;\r
 import org.eclipse.swt.widgets.Composite;\r
 import org.eclipse.swt.widgets.Control;\r
 import org.eclipse.swt.widgets.Display;\r
@@ -47,9 +48,7 @@ import org.eclipse.ui.texteditor.IWorkbenchActionDefinitionIds;
 import eu.etaxonomy.cdm.model.name.TaxonNameBase;\r
 import eu.etaxonomy.cdm.model.taxon.Taxon;\r
 import eu.etaxonomy.cdm.strategy.parser.ParserProblem;\r
-import eu.etaxonomy.taxeditor.editor.EditorAnnotation;\r
 import eu.etaxonomy.taxeditor.editor.EditorUtil;\r
-import eu.etaxonomy.taxeditor.editor.LineWrapSquigglesStrategy;\r
 import eu.etaxonomy.taxeditor.editor.ViewerConfiguration;\r
 import eu.etaxonomy.taxeditor.preference.Resources;\r
 \r
@@ -76,9 +75,22 @@ public class NameViewer extends SourceViewer {
                                \r
                setBackground(EditorUtil.getColor(Resources.COLOR_COMPOSITE_BACKGROUND));\r
                                \r
+               Canvas canvas = (Canvas) getControl();\r
+               TableWrapLayout layout = (TableWrapLayout) canvas.getLayout();\r
+               layout.topMargin = 0;\r
+               layout.rightMargin = 0;\r
+               layout.bottomMargin = 0;\r
+               layout.leftMargin = 0;\r
+               layout.verticalSpacing = 10;\r
+               layout.horizontalSpacing = 0;\r
+               \r
+               canvas.setLayout(layout);\r
+               \r
                // Lay out the viewer's widgets\r
-               getControl().setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB));\r
                TableWrapData twdata = new TableWrapData(TableWrapData.FILL_GRAB);\r
+               getControl().setLayoutData(twdata);\r
+               \r
+               twdata = new TableWrapData(TableWrapData.FILL_GRAB);\r
                getTextWidget().setLayoutData(twdata);\r
                getTextWidget().setLineSpacing(5);\r
                \r
@@ -104,6 +116,7 @@ public class NameViewer extends SourceViewer {
        }\r
        \r
        public void setBackground(Color color) {\r
+               \r
                // Set background color of ruler\r
                ruler.getControl().setBackground(color);\r
 \r
diff --git a/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/SynonymComposite.java b/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/SynonymComposite.java
deleted file mode 100644 (file)
index 27127af..0000000
+++ /dev/null
@@ -1,123 +0,0 @@
-/**\r
-* Copyright (C) 2007 EDIT\r
-* European Distributed Institute of Taxonomy \r
-* http://www.e-taxonomy.eu\r
-* \r
-* The contents of this file are subject to the Mozilla Public License Version 1.1\r
-* See LICENSE.TXT at the top of this package for the full license terms.\r
-*/\r
-\r
-package eu.etaxonomy.taxeditor.editor.name;\r
-\r
-import org.apache.log4j.Logger;\r
-import org.eclipse.core.commands.operations.IUndoableOperation;\r
-import org.eclipse.swt.graphics.Font;\r
-import org.eclipse.swt.widgets.Composite;\r
-\r
-import eu.etaxonomy.cdm.model.name.HomotypicalGroup;\r
-import eu.etaxonomy.cdm.model.name.TaxonNameBase;\r
-import eu.etaxonomy.cdm.model.taxon.Synonym;\r
-import eu.etaxonomy.taxeditor.editor.EditorUtil;\r
-import eu.etaxonomy.taxeditor.operations.ChangeHomotypicGroupOperation;\r
-import eu.etaxonomy.taxeditor.operations.ChangeSynonymToMisapplicationOperation;\r
-\r
-/**\r
- * @author p.ciardelli\r
- * @created 13.01.2009\r
- * @version 1.0\r
- */\r
-public class SynonymComposite extends AbstractNameComposite<Synonym> {\r
-       @SuppressWarnings("unused")\r
-       private static final Logger logger = Logger\r
-                       .getLogger(SynonymComposite.class);\r
-       \r
-       public SynonymComposite(TaxonNameEditor editor, Composite parent, Synonym synonym) {\r
-               super(editor, parent, synonym);\r
-       }\r
-       \r
-       /* (non-Javadoc)\r
-        * @see eu.etaxonomy.taxeditor.editor.name.NameComposite#initializeComposite()\r
-        */\r
-       @Override\r
-       protected void initializeComposite() {\r
-               setIsDraggable(true);\r
-               setFont(getViewerFont());\r
-               setIndent(SYNONYM_INDENT);\r
-               \r
-               TaxonNameBase name = getSynonym().getName();\r
-               \r
-               if(name == null){\r
-                       logger.error("Synonym with a null name detected. This should never happen.");\r
-               }\r
-               \r
-               if (isHomotypic()) {\r
-                       if (name.isGroupsBasionym()) {\r
-                               setIcon(HOMOTYPIC_SYNONYM_ORIGINAL_COMBINATION_ICON);\r
-                       } else {\r
-                               setIcon(HOMOTYPIC_SYNONYM_ICON);\r
-                       }       \r
-               } else {\r
-                       if (name.isGroupsBasionym()) {\r
-                               setIcon(HETEROTYPIC_SYNONYM_ORIGINAL_COMBINATION_ICON);\r
-                       } else {\r
-                               setIcon(HETEROTYPIC_SYNONYM_ICON);\r
-                       }\r
-               }\r
-               \r
-               initTextViewer(getSynonym());\r
-       }\r
-       \r
-       private boolean isHomotypic() {\r
-               HomotypicalGroup group = getSynonym().getHomotypicGroup();\r
-               return group.equals(getEditorTaxon().getHomotypicGroup()); \r
-       }\r
-       \r
-       public Synonym getSynonym() {\r
-               return getTaxonBase();\r
-       }\r
-\r
-       public boolean setParent(Composite parent) {\r
-\r
-               boolean doSetParent = false;                    \r
-                       \r
-               // Has this been moved to the misapplied names group?\r
-               if (parent instanceof MisappliedGroupComposite) {\r
-                       IUndoableOperation operation = new ChangeSynonymToMisapplicationOperation\r
-                                       ("change to misapplication", editor.getUndoContext(), getEditorTaxon(), getSynonym(), editor); //$NON-NLS-1$\r
-                       EditorUtil.executeOperation(operation);\r
-                       \r
-                       doSetParent = true;\r
-               }\r
-\r
-               // Has this been moved to a HomotypicalGroup?\r
-               if (parent instanceof HomotypicalGroupComposite) {\r
-                       \r
-                       HomotypicalGroup homotypicalGroup = \r
-                                       ((HomotypicalGroupComposite)parent).getGroup();\r
-                       \r
-                       // Make sure we are not dropping synonym on its own group\r
-                       if (!homotypicalGroup.equals(getSynonym().getHomotypicGroup())) {\r
-                               IUndoableOperation operation = new ChangeHomotypicGroupOperation\r
-                                               ("change type", editor.getUndoContext(), getEditorTaxon(), getSynonym(), homotypicalGroup, editor); //$NON-NLS-1$\r
-                               EditorUtil.executeOperation(operation);\r
-                               \r
-                               doSetParent = true;\r
-                       }\r
-               }\r
-               return doSetParent;\r
-       }\r
-               \r
-\r
-       protected Font getViewerFont() {\r
-               return getSynonymFont();\r
-       }\r
-       \r
-       public Object getData () {\r
-               return getSynonym();\r
-       }\r
-\r
-       @Override\r
-       protected void updateNonEditableInfo() {\r
-               // not needed\r
-       }\r
-}
\ No newline at end of file
diff --git a/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/SynonymContainer.java b/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/SynonymContainer.java
new file mode 100644 (file)
index 0000000..ed84b7e
--- /dev/null
@@ -0,0 +1,85 @@
+/**\r
+* Copyright (C) 2007 EDIT\r
+* European Distributed Institute of Taxonomy \r
+* http://www.e-taxonomy.eu\r
+* \r
+* The contents of this file are subject to the Mozilla Public License Version 1.1\r
+* See LICENSE.TXT at the top of this package for the full license terms.\r
+*/\r
+\r
+package eu.etaxonomy.taxeditor.editor.name;\r
+\r
+import org.apache.log4j.Logger;\r
+import org.eclipse.swt.graphics.Font;\r
+\r
+import eu.etaxonomy.cdm.model.name.HomotypicalGroup;\r
+import eu.etaxonomy.cdm.model.name.TaxonNameBase;\r
+import eu.etaxonomy.cdm.model.taxon.Synonym;\r
+import eu.etaxonomy.taxeditor.editor.EditorUtil;\r
+import eu.etaxonomy.taxeditor.preference.Resources;\r
+\r
+/**\r
+ * @author p.ciardelli\r
+ * @created 13.01.2009\r
+ * @version 1.0\r
+ */\r
+public class SynonymContainer extends AbstractGroupedContainer<Synonym> {\r
+       @SuppressWarnings("unused")\r
+       private static final Logger logger = Logger\r
+                       .getLogger(SynonymContainer.class);\r
+       \r
+       public SynonymContainer(TaxonNameEditor editor, AbstractGroup group, Synonym synonym) {\r
+               super(editor, group, synonym);\r
+       }\r
+       \r
+       /* (non-Javadoc)\r
+        * @see eu.etaxonomy.taxeditor.editor.name.NameComposite#initializeComposite()\r
+        */\r
+       @Override\r
+       protected void initializeComposite() {\r
+               setIsDraggable(true);\r
+               setFont(getViewerFont());\r
+               setIndent(SYNONYM_INDENT);\r
+               \r
+               TaxonNameBase name = getSynonym().getName();\r
+               \r
+               if(name == null){\r
+                       logger.error("Synonym with a null name detected. This should never happen.");\r
+               }\r
+               \r
+               if (isHomotypic()) {\r
+                       if (name.isGroupsBasionym()) {\r
+                               setIcon(HOMOTYPIC_SYNONYM_ORIGINAL_COMBINATION_ICON);\r
+                       } else {\r
+                               setIcon(HOMOTYPIC_SYNONYM_ICON);\r
+                       }       \r
+               } else {\r
+                       if (name.isGroupsBasionym()) {\r
+                               setIcon(HETEROTYPIC_SYNONYM_ORIGINAL_COMBINATION_ICON);\r
+                       } else {\r
+                               setIcon(HETEROTYPIC_SYNONYM_ICON);\r
+                       }\r
+               }\r
+               \r
+               initTextViewer();\r
+       }\r
+       \r
+       private boolean isHomotypic() {\r
+               HomotypicalGroup group = getSynonym().getHomotypicGroup();\r
+               return group.equals(editor.getTaxon().getHomotypicGroup()); \r
+       }\r
+       \r
+       public Synonym getSynonym() {\r
+               return getTaxonBase();\r
+       }\r
+               \r
+\r
+       protected Font getViewerFont() {\r
+               return EditorUtil.getFont(Resources.SYNONYM_FONT);\r
+       }\r
+\r
+       @Override\r
+       protected void updateNonEditableInfo() {\r
+               // not needed\r
+       }\r
+}
\ No newline at end of file
index 2ce55d14cf767e19a262b7e8233380995092236f..87fcb31ea94a5ce000dcb66c76762b80bedf757f 100644 (file)
@@ -18,8 +18,6 @@ import java.util.Set;
 \r
 import org.apache.log4j.Logger;\r
 import org.eclipse.core.commands.operations.IUndoContext;\r
-import org.eclipse.core.commands.operations.IUndoableOperation;\r
-import org.eclipse.core.runtime.Assert;\r
 import org.eclipse.core.runtime.IAdaptable;\r
 import org.eclipse.core.runtime.IProgressMonitor;\r
 import org.eclipse.core.runtime.OperationCanceledException;\r
@@ -31,19 +29,15 @@ import org.eclipse.jface.viewers.ISelectionProvider;
 import org.eclipse.jface.viewers.StructuredSelection;\r
 import org.eclipse.swt.dnd.DND;\r
 import org.eclipse.swt.dnd.DropTarget;\r
-import org.eclipse.swt.dnd.DropTargetAdapter;\r
-import org.eclipse.swt.dnd.DropTargetEvent;\r
 import org.eclipse.swt.dnd.Transfer;\r
 import org.eclipse.swt.widgets.Composite;\r
-import org.eclipse.swt.widgets.Control;\r
-import org.eclipse.swt.widgets.Event;\r
-import org.eclipse.swt.widgets.Listener;\r
 import org.eclipse.swt.widgets.Menu;\r
 import org.eclipse.ui.IEditorInput;\r
 import org.eclipse.ui.IEditorSite;\r
 import org.eclipse.ui.ISelectionListener;\r
 import org.eclipse.ui.ISelectionService;\r
 import org.eclipse.ui.IWorkbenchPart;\r
+import org.eclipse.ui.IWorkbenchPartReference;\r
 import org.eclipse.ui.PartInitException;\r
 import org.eclipse.ui.forms.ManagedForm;\r
 import org.eclipse.ui.forms.widgets.FormToolkit;\r
@@ -56,23 +50,18 @@ import eu.etaxonomy.cdm.api.conversation.IConversationEnabled;
 import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper;\r
 import eu.etaxonomy.cdm.model.common.CdmBase;\r
 import eu.etaxonomy.cdm.model.name.HomotypicalGroup;\r
-import eu.etaxonomy.cdm.model.taxon.Synonym;\r
 import eu.etaxonomy.cdm.model.taxon.Taxon;\r
 import eu.etaxonomy.cdm.model.taxon.TaxonBase;\r
-import eu.etaxonomy.cdm.model.taxon.TaxonRelationship;\r
-import eu.etaxonomy.cdm.model.taxon.TaxonRelationshipType;\r
 import eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeMap;\r
 import eu.etaxonomy.taxeditor.editor.CdmDataTransfer;\r
-import eu.etaxonomy.taxeditor.editor.CompositeBorderDecorator;\r
 import eu.etaxonomy.taxeditor.editor.EditorUtil;\r
-import eu.etaxonomy.taxeditor.editor.GroupComposite;\r
-import eu.etaxonomy.taxeditor.editor.GroupedComposite;\r
+import eu.etaxonomy.taxeditor.editor.IDropTargetable;\r
 import eu.etaxonomy.taxeditor.editor.IMultiPageTaxonEditorPage;\r
 import eu.etaxonomy.taxeditor.editor.MultiPageTaxonEditor;\r
 import eu.etaxonomy.taxeditor.editor.SimpleSelectionProvider;\r
+import eu.etaxonomy.taxeditor.model.IPartChangeListener;\r
 import eu.etaxonomy.taxeditor.model.IPartContentHasDetails;\r
-import eu.etaxonomy.taxeditor.operations.ChangeConceptToSynonymOperation;\r
-import eu.etaxonomy.taxeditor.operations.ChangeHomotypicGroupOperation;\r
+import eu.etaxonomy.taxeditor.model.TaxeditorPartService;\r
 import eu.etaxonomy.taxeditor.operations.IPostOperationEnabled;\r
 import eu.etaxonomy.taxeditor.preference.Resources;\r
 \r
@@ -82,107 +71,74 @@ import eu.etaxonomy.taxeditor.preference.Resources;
  * @version 1.0\r
  * @author n.hoffmann\r
  */\r
-public class TaxonNameEditor extends EditorPart implements IMultiPageTaxonEditorPage, IAdaptable, IConversationEnabled, IPostOperationEnabled, IPartContentHasDetails\r
-               , ISelectionListener {\r
+public class TaxonNameEditor extends EditorPart implements IMultiPageTaxonEditorPage, IAdaptable, IConversationEnabled, IPostOperationEnabled, IPartContentHasDetails, IPartChangeListener\r
+               , ISelectionListener, IDropTargetable {\r
        \r
        private static final Logger logger = Logger.getLogger(TaxonNameEditor.class);\r
        \r
+       public class Tupel{\r
+               \r
+               public HomotypicalGroup homotypicalGroup;\r
+               public HomotypicalSynonymGroup group;\r
+\r
+               public Tupel(HomotypicalGroup homotypicalGroup, HomotypicalSynonymGroup group){\r
+                       this.homotypicalGroup = homotypicalGroup;\r
+                       this.group = group;\r
+               }\r
+               \r
+       }\r
+       \r
+       public static final String ID = "eu.etaxonomy.taxeditor.taxonNameEditor";\r
+       \r
        private Taxon taxon;\r
        \r
-       protected ManagedForm managedForm;\r
-       protected ScrolledForm scrolledForm; \r
-       protected Composite parent;\r
-       protected IPostSelectionProvider provider;\r
+       private ManagedForm managedForm;\r
+       private ScrolledForm scrolledForm; \r
+       private Composite parent;\r
+       private IPostSelectionProvider provider;\r
        \r
-       protected MultiPageTaxonEditor editor;\r
+       private MultiPageTaxonEditor editor;\r
        \r
-       protected GroupedComposite selectedObject;\r
-\r
-       protected Composite partComposite;\r
-       protected GroupedComposite firstGroupedComposite;\r
-\r
-       private Object selectedData;\r
+       private AbstractGroupedContainer selectedObject;\r
+       \r
+       private AcceptedNameContainer acceptedNameContainer;\r
        \r
-       protected ConversationHolder conversation;\r
+       private ConversationHolder conversation;\r
 \r
        private MenuManager menuManager;\r
 \r
        private Menu menu;\r
-\r
-       /**\r
-        * The object that was affected by last operation.\r
-        */\r
-       private CdmBase objectAffectedByLastOperation;\r
-\r
-       private boolean isRedrawing;\r
        \r
-       private static final String ID = "eu.etaxonomy.taxeditor.taxonNameEditor";\r
-\r
-       private Map<HomotypicalGroup, HomotypicalGroupComposite> homotypicGroupComposites;\r
+       private List<Tupel> heterotypicSynonymGroupTupel = new ArrayList<Tupel>();\r
 \r
-       private MisappliedGroupComposite misappliedGroupComposite;\r
+       private MisappliedGroup misappliedGroup;\r
 \r
-       private ConceptGroupComposite conceptGroupComposite;\r
+       private ConceptGroup conceptGroup;\r
 \r
+       \r
        private DropTarget target;\r
        \r
        private ISelectionService selectionService;\r
+\r
+       private ContainerFactory containerFactory;\r
+\r
+       private HomotypicalSynonymGroup homotypicalSynonymGroup;\r
+\r
+       private AbstractGroupedContainer objectAffectedByLastOperation;\r
        \r
        public TaxonNameEditor(MultiPageTaxonEditor editor){\r
                this.editor = editor;\r
                conversation = editor.getConversationHolder();\r
+               \r
+               containerFactory = ContainerFactory.getInstance();\r
        }\r
 \r
-       public IUndoContext getUndoContext() {\r
-               return editor.getUndoContext();\r
-       }\r
        \r
-       protected void setSelection(TaxonBase taxonBase){\r
-               Set<AbstractNameComposite<TaxonBase>> nameComposites = getNameComposites();\r
-               \r
-               if(nameComposites == null){\r
-                       return;\r
-               }\r
-               \r
-               for(AbstractNameComposite nameComposite : nameComposites){\r
-                       if(nameComposite.getTaxonBase().equals(taxonBase)){\r
-                               setSelection(nameComposite);\r
-                       }\r
-               }\r
-       }\r
        \r
-       /**\r
-        * \r
-        * \r
-        * @param composite\r
-        */\r
-       protected void setSelection(GroupedComposite composite) {\r
-               \r
-                       // Unpaint last selection - last selection will only be unpainted\r
-                       //      when something else on this page is selected\r
-                       if (this.selectedObject instanceof GroupedComposite) {\r
-                               GroupedComposite groupedComposite = ((GroupedComposite) this.selectedObject);\r
-                               groupedComposite.unpaintBorder();\r
-                               groupedComposite.setBackground(EditorUtil.getColor(Resources.COLOR_COMPOSITE_BACKGROUND));\r
-                       }\r
-                       \r
-                       // Set the selection to this editor's selected object\r
-                       this.selectedObject = composite;\r
-                       \r
-                       if (composite instanceof Composite) {\r
-                               ((GroupedComposite) composite).setBackground(EditorUtil.getColor(Resources.COLOR_COMPOSITE_SELECTED));\r
-                               this.selectedData = ((Composite) composite).getData();\r
-                       }\r
-                       \r
-                       // set selection only if it was not set before          \r
-                       if(composite != selectedObject){\r
-                               selectedObject.setFocus();\r
-                       }\r
-                       provider.setSelection(new StructuredSelection(selectedObject.getData()));\r
-               \r
+       public IUndoContext getUndoContext() {\r
+               return editor.getUndoContext();\r
        }\r
 \r
-\r
        /* (non-Javadoc)\r
         * @see org.eclipse.ui.part.WorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite)\r
         */\r
@@ -190,9 +146,9 @@ public class TaxonNameEditor extends EditorPart implements IMultiPageTaxonEditor
                selectionService = getSite().getWorkbenchWindow().getSelectionService();\r
                selectionService.addSelectionListener(this);\r
                \r
-               this.partComposite = composite;\r
-               \r
                createManagedForm(composite);\r
+               \r
+               TaxeditorPartService.getInstance().addListener(TaxeditorPartService.PART_ACTIVATED, this);\r
        }\r
        \r
        protected void createManagedForm(Composite composite) {\r
@@ -202,13 +158,15 @@ public class TaxonNameEditor extends EditorPart implements IMultiPageTaxonEditor
                                firePropertyChange(PROP_DIRTY);\r
                        }\r
                        public boolean setInput(Object input) {\r
-                               if (input instanceof GroupedComposite) {\r
-                                       setSelection((GroupedComposite)input);\r
+                               if (input instanceof AbstractGroupedContainer) {\r
+                                       selectedObject = (AbstractGroupedContainer) input;\r
+                                       provider.setSelection(new StructuredSelection(selectedObject.getData()));\r
                                }\r
                                return super.setInput(input); \r
                        }\r
                };\r
                \r
+               \r
                scrolledForm = managedForm.getForm();\r
                parent = scrolledForm.getBody();\r
                \r
@@ -216,67 +174,46 @@ public class TaxonNameEditor extends EditorPart implements IMultiPageTaxonEditor
                menuManager = new MenuManager();\r
                ISelectionProvider selectionProvider = getSite().getSelectionProvider();\r
                getSite().registerContextMenu(TaxonNameEditor.ID, menuManager, selectionProvider);\r
-               \r
-               menu = menuManager.createContextMenu(parent);\r
-               scrolledForm.setMenu(menu);\r
                                \r
                parent.setData(taxon);\r
                \r
-               parent.setLayout(new TableWrapLayout());                \r
-               parent.setBackground(EditorUtil.getColor(Resources.COLOR_COMPOSITE_BACKGROUND));\r
+               TableWrapLayout layout = new TableWrapLayout();\r
+               layout.leftMargin = 0;\r
+               layout.rightMargin = 0;\r
+               layout.topMargin = 0;\r
+               layout.bottomMargin = 0;\r
                \r
-               Taxon taxon = (Taxon) HibernateProxyHelper.deproxy(getTaxon());\r
+               layout.verticalSpacing = 0;\r
+               layout.horizontalSpacing = 0;\r
                \r
-               firstGroupedComposite = createAcceptedTaxon();\r
-                               \r
-               // Draw homotypic group synonyms\r
-               HomotypicalGroup homotypicGroupOfAcceptedTaxon = (HomotypicalGroup) HibernateProxyHelper.deproxy(taxon.getHomotypicGroup());\r
-               \r
-               if (homotypicGroupOfAcceptedTaxon != null) {\r
-                       List<Synonym> homotypicSynonyms = homotypicGroupOfAcceptedTaxon.getSynonymsInGroup(taxon.getSec());\r
-                       for (Synonym synonym : homotypicSynonyms) {\r
-                               createSynonym(synonym);\r
-                       }\r
-               }\r
+               parent.setLayout(layout);       \r
+               parent.setBackground(EditorUtil.getColor(Resources.COLOR_COMPOSITE_BACKGROUND));\r
                \r
-               // Draw heterotypic synonym groups\r
-               List<HomotypicalGroup> heterotypicSynonymGroups = taxon.getHeterotypicSynonymyGroups();\r
-               for (HomotypicalGroup homotypicalGroup : heterotypicSynonymGroups) {\r
-                                                       \r
-                       List<Synonym> heterotypicSynonyms = homotypicalGroup.\r
-                                       getSynonymsInGroup(taxon.getSec());\r
-                       for (Synonym synonym : heterotypicSynonyms) {\r
-                                createSynonym(synonym);\r
-                       }\r
-               }\r
+               createNameComposites();\r
                \r
-               // Draw misapplied name elements\r
-               for(Taxon misappliedName : taxon.getMisappliedNames()){\r
-                       createMisappliedName(misappliedName);\r
-               }               \r
-\r
-               // Draw concept relation elements\r
-               Set<TaxonRelationship> taxonRelations = taxon.getTaxonRelations();\r
-               for (TaxonRelationship relationship : taxonRelations) {\r
-                       \r
-                       if (relationship.getType().equals(TaxonRelationshipType.MISAPPLIED_NAME_FOR()) ||\r
-                                       relationship.getType().equals(TaxonRelationshipType.TAXONOMICALLY_INCLUDED_IN())) {\r
-                               continue;\r
-                       }\r
-                                                       \r
-                       createConcept(relationship);\r
-               }               \r
-                       \r
                createDragSupport();\r
                \r
                setFocus();\r
-\r
-               // Redraw composite\r
-               composite.layout();\r
        }\r
        \r
+       protected void createNameComposites(){\r
+               containerFactory.createAcceptedTaxonsHomotypicGroup(this);\r
+                               \r
+               containerFactory.createHeterotypicSynonymGroups(this);\r
+               \r
+               containerFactory.createMisapplicationGroup(this);\r
+               \r
+               containerFactory.createConceptGroup(this);\r
+               \r
+               for(AbstractGroupedContainer container : getGroupedContainers()){\r
+                       container.setMenu(getMenu());\r
+               }\r
+               // Redraw composite\r
+               managedForm.reflow(true);\r
+       }\r
+\r
        public Taxon getTaxon() {\r
-               return taxon;\r
+               return (Taxon) HibernateProxyHelper.deproxy(taxon);\r
        }\r
        \r
        public void setDirty() {\r
@@ -290,88 +227,7 @@ public class TaxonNameEditor extends EditorPart implements IMultiPageTaxonEditor
         */\r
        @Override\r
        public void setFocus(){\r
-//             logger.warn("Setting focus to name editor.");\r
-               Object selection;\r
-               \r
-               if(selectedData == null){\r
-                       selection = (objectAffectedByLastOperation == null) ? null : objectAffectedByLastOperation;\r
-               }else{\r
-                       selection = (objectAffectedByLastOperation == null) ? selectedData : objectAffectedByLastOperation;\r
-               }               \r
-                               \r
-               // make selection by setting focus to the previosuly selected composite or to the accepted \r
-               // taxons composite if nothing was selected before\r
-               if (selection == null){\r
-                       firstGroupedComposite.setFocus();\r
-               } else {\r
-                       selectedData = selection;\r
-                       \r
-                       for (GroupedComposite composite : getGroupedComposites()) {\r
-                               if (selectedData.equals(composite.getData())) {\r
-                                       ((GroupedComposite) composite).setFocus();\r
-                                       break;\r
-                               }                                       \r
-                       }\r
-               }\r
-               \r
-               // reset\r
-               objectAffectedByLastOperation = null;\r
-       }\r
-       \r
-       /**\r
-        * This method returns all <code>GroupedComposite</code> controls currently attached to this editor.\r
-        * \r
-        * @return a <code>List</code> of <code>GroupedComposite</code> controls.\r
-        */\r
-       public List<GroupedComposite> getGroupedComposites(){\r
-               return getGroupedCompositesRecursively(scrolledForm.getBody(), new ArrayList<GroupedComposite>());\r
-       }\r
-\r
-       \r
-       /**\r
-        * Recursively traverse the composite hierarchy and collect all <code>GroupedComposite</code> controls.\r
-        * \r
-        * @param composite the composite to start recursing from\r
-        * @param groupedComposites a <code>List</code> the found composites are stored in \r
-        * @return a <code>List</code> containing all found <code>GroupedComposite</code> controls\r
-        */\r
-       private List<GroupedComposite> getGroupedCompositesRecursively(Composite composite, List<GroupedComposite> groupedComposites){\r
-               if(composite == null || composite.isDisposed()){\r
-                       return null;\r
-               }\r
-               \r
-               for(Control child : composite.getChildren()){\r
-                       if(child instanceof GroupedComposite){\r
-                               groupedComposites.add((GroupedComposite) child);\r
-                       }else if(child instanceof Composite){\r
-                               getGroupedCompositesRecursively((Composite) child, groupedComposites);\r
-                       }\r
-               }\r
-               return groupedComposites;\r
-       }\r
-       \r
-       /**\r
-        * @return\r
-        */\r
-       public List<GroupComposite> getGroupComposites() {\r
-               return getGroupCompositesRecursively(scrolledForm.getBody(), new ArrayList<GroupComposite>());\r
-       }\r
-       \r
-       /**\r
-        * Recursively traverse the composite hierarchy and collect all <code>GroupComposite</code> controls.\r
-        * \r
-        * @param composite the composite to start recursing from\r
-        * @param groupComposites a <code>List</code> the found composites are stored in \r
-        * @return a <code>List</code> containing all found <code>GroupComposite</code> controls\r
-        */\r
-       private List<GroupComposite> getGroupCompositesRecursively(Composite composite, List<GroupComposite> groupComposites){\r
-               for(Control child : composite.getChildren()){\r
-                       if(child instanceof GroupComposite){\r
-                               groupComposites.add((GroupComposite) child);\r
-                               getGroupCompositesRecursively((Composite) child, groupComposites);\r
-                       }\r
-               }\r
-               return groupComposites;\r
+               getSelectedObject().setSelected();\r
        }\r
        \r
        public void setInput(IEditorInput input){\r
@@ -410,23 +266,27 @@ public class TaxonNameEditor extends EditorPart implements IMultiPageTaxonEditor
         */\r
        public boolean redraw(boolean focus) {\r
                \r
-               isRedrawing = true;\r
-               \r
-               this.selectedObject = null;\r
-               managedForm.getForm().dispose();\r
-               this.resetGroupComposites();\r
-               createManagedForm(partComposite);\r
-               \r
-               setFocus();\r
-               \r
-               isRedrawing = false;\r
-               \r
-               return true;\r
+               createNameComposites();\r
+\r
+               if(focus){\r
+                       setFocus();\r
+               }\r
                \r
+               return true;            \r
        }\r
 \r
-       public boolean isRedrawing() {\r
-               return isRedrawing;\r
+       private AbstractGroupedContainer getContainerForData(CdmBase data) {\r
+               if(data == null && (selectedObject != null && ! selectedObject.getControl().isDisposed())){\r
+                       return selectedObject;\r
+               }\r
+               \r
+               List<AbstractGroupedContainer> groupedContainers = getGroupedContainers();\r
+               for(AbstractGroupedContainer container : groupedContainers){\r
+                       if(container.getData().equals(data)){\r
+                               return container;\r
+                       }\r
+               }\r
+               return acceptedNameContainer;\r
        }\r
        \r
        public MultiPageTaxonEditor getMultiPageTaxonEditor() {\r
@@ -440,20 +300,23 @@ public class TaxonNameEditor extends EditorPart implements IMultiPageTaxonEditor
         */\r
        public boolean postOperation(CdmBase objectAffectedByOperation) {\r
                \r
-               if (isRedrawing) {\r
-                       return false;\r
-               }\r
-               \r
-               if (objectAffectedByOperation == null && selectedData instanceof CdmBase) {\r
-                       this.objectAffectedByLastOperation = (CdmBase) selectedData;    \r
-               } else {\r
-                       this.objectAffectedByLastOperation = objectAffectedByOperation;\r
-               }\r
                editor.changed(objectAffectedByOperation);\r
-               return redraw();        \r
+               \r
+               redraw(false);\r
+               \r
+               objectAffectedByLastOperation = getContainerForData(objectAffectedByOperation);\r
+               \r
+               return true;\r
        }\r
        \r
 \r
+       private CdmBase getSelectedData() {\r
+               if(selectedObject != null){\r
+                       return selectedObject.getData();\r
+               }\r
+               return null;\r
+       }\r
+\r
        /**\r
         * @return the managedForm\r
         */\r
@@ -461,7 +324,7 @@ public class TaxonNameEditor extends EditorPart implements IMultiPageTaxonEditor
                return managedForm;\r
        }\r
        \r
-       public Composite getTopLevelComposite() {\r
+       public Composite getControl() {\r
                return this.getManagedForm().getForm().getBody();\r
        }\r
        \r
@@ -470,56 +333,21 @@ public class TaxonNameEditor extends EditorPart implements IMultiPageTaxonEditor
         * @return the menu\r
         */\r
        public Menu getMenu() {\r
-               return menu;\r
-       }\r
-\r
-       /**\r
-        * @return the firstGroupedComposite\r
-        */\r
-       public GroupedComposite getFirstGroupedComposite() {\r
-               return firstGroupedComposite;\r
-       }\r
-       \r
-       /**\r
-        * \r
-        */\r
-       public void navigateToNextMember() {\r
-               try{\r
-                       List<GroupedComposite> composites = getGroupedCompositesRecursively(scrolledForm.getBody(), new ArrayList<GroupedComposite>());\r
-                       \r
-                       for(int i = 0; i < composites.size(); i++){\r
-                               if(selectedData == composites.get(i).getData()){\r
-                                       selectedData = composites.get(i+1).getData();\r
-                                       break;\r
-                               }\r
+               if(menu == null || menu.isDisposed()){\r
+                       if(menu != null && menu.isDisposed()){\r
+                               logger.error("Creating new Menu because it was disposed. This should not have happened");\r
                        }\r
-                       setFocus();\r
-               }catch(IndexOutOfBoundsException e){}\r
-       }\r
-       \r
-       /**\r
-        * \r
-        */\r
-       public void navigateToPreviousMember() {\r
-               try{\r
-                       List<GroupedComposite> composites = getGroupedCompositesRecursively(scrolledForm.getBody(), new ArrayList<GroupedComposite>());\r
-                       \r
-                       for(int i = 0; i < composites.size(); i++){\r
-                               if(selectedData == composites.get(i).getData()){\r
-                                       selectedData = composites.get(i-1).getData();\r
-                                       break;\r
-                               }\r
-                       }\r
-                       setFocus();\r
-               }catch(IndexOutOfBoundsException e){}\r
+                       menu = menuManager.createContextMenu(parent);\r
+               }\r
+               return menu;\r
        }\r
 \r
        /**\r
         * @return true if there are empty names\r
         */\r
        public boolean checkForEmptyNames() {\r
-               for(AbstractNameComposite nameComposite : getNameComposites()){\r
-                       if(nameComposite.getName() == null || nameComposite.getName().getTitleCache().equals("")){\r
+               for(AbstractGroupedContainer container : getGroupedContainers()){\r
+                       if(container.getName() == null || container.getName().getTitleCache().equals("")){\r
                                MessageDialog.openWarning(EditorUtil.getShell(), "No Name Specified", "An attempt was made to save a taxon or synonym with " +\r
                                "an empty name. Operation was cancelled.");\r
                                return true;\r
@@ -531,28 +359,28 @@ public class TaxonNameEditor extends EditorPart implements IMultiPageTaxonEditor
        @Override\r
        public void doSave(IProgressMonitor monitor) {\r
 \r
-               // Start the main progress monitor. The number of steps is set to the number of objects to be saved.\r
-        IProgressMonitor newMonitor = EditorUtil.startMainMonitor(monitor,"Saving", getNameComposites().size());\r
+               monitor.beginTask("Saving names", getGroupedContainers().size());\r
 \r
         try {\r
                        // check for empty names\r
-                       for(AbstractNameComposite nameComposite : getNameComposites()){\r
-//                             newMonitor.subTask("- step X");\r
-                               nameComposite.persistName();\r
+                       for(AbstractGroupedContainer container : getGroupedContainers()){\r
+                               \r
+                               monitor.subTask("Saving composite: " + container.getTaxonBase().getTitleCache());\r
+                               container.persistName();\r
                                \r
                                // In case the progress monitor was canceled throw an exception.\r
-                               if (newMonitor.isCanceled()) {\r
+                               if (monitor.isCanceled()) {\r
                        throw new OperationCanceledException();\r
                    }\r
                                \r
                                // Otherwise declare this step as done.\r
-                   newMonitor.worked(1);\r
+                               monitor.worked(1);\r
                        }\r
         }\r
         finally {\r
                \r
                // Stop the progress monitor.\r
-            newMonitor.done();\r
+               monitor.done();\r
         }\r
                \r
        }\r
@@ -591,96 +419,43 @@ public class TaxonNameEditor extends EditorPart implements IMultiPageTaxonEditor
                // Listen for names being dragged outside of existing homotypic groups -\r
                //  user wants to create a new group\r
                Transfer[] types = new Transfer[] {CdmDataTransfer.getInstance()};\r
-               int operations = DND.DROP_MOVE | DND.DROP_COPY | DND.DROP_DEFAULT;\r
+               int operations = DND.DROP_MOVE;\r
                if(target == null){\r
                        target = new DropTarget(parent, operations);\r
                        target.setTransfer(types);\r
-                       target.addDropListener(new NameEditorDropTargetListener());\r
+                       target.addDropListener(new NameEditorDropTargetListener(this));\r
                }               \r
        }\r
 \r
-       public AcceptedNameComposite getAcceptedName() {\r
-               if(firstGroupedComposite instanceof AcceptedNameComposite){\r
-                       return (AcceptedNameComposite) firstGroupedComposite;\r
-               }\r
-               throw new RuntimeException("The accepted name should always reside in firstGroupedComposite");\r
+       public AcceptedNameContainer getAcceptedNameContainer() {\r
+               return acceptedNameContainer;\r
        }\r
-\r
-       /**\r
-        * @return\r
-        */\r
-       private Map<HomotypicalGroup, HomotypicalGroupComposite> getHomotypicGroups() {\r
-               if(homotypicGroupComposites == null){\r
-                       homotypicGroupComposites = new HashMap<HomotypicalGroup, HomotypicalGroupComposite>();\r
-               }\r
-               return homotypicGroupComposites;\r
-       }\r
-       \r
-       public HomotypicalGroupComposite getHomotypicGroup(HomotypicalGroup group) {\r
-               return getHomotypicGroups().get(group);\r
-       }\r
-\r
        \r
-       public Composite getMisappliedGroup() {\r
-               if (misappliedGroupComposite == null) {\r
-                       misappliedGroupComposite = createMisappliedGroup();\r
+       public HomotypicalSynonymGroup getSynonymGroup(HomotypicalGroup homotypicalGroup) {\r
+               if(getHomotypicSynonymGroup() != null && getHomotypicSynonymGroup().getGroup().equals(homotypicalGroup)){\r
+                       return getHomotypicSynonymGroup();\r
                }\r
-               return misappliedGroupComposite;\r
-       }\r
-\r
-       \r
-       public Composite getMisappliedName(Taxon misappliedName) {\r
-               for(Control child : getMisappliedGroup().getChildren()){\r
-                       if(child instanceof MisapplicationComposite){\r
-                               return (MisapplicationComposite) child;\r
-                       }\r
-               }\r
-               return null;\r
-       }\r
-\r
-       \r
-       public Composite getSynonym(Synonym synonym) {\r
-                               \r
-               GroupComposite groupComposite = getHomotypicGroup(synonym.getHomotypicGroup());\r
                \r
-               for (Control child : groupComposite.getChildren()){\r
-                       if(child instanceof SynonymComposite \r
-                                       && synonym.equals(((SynonymComposite) child).getSynonym())){\r
-                               return (SynonymComposite) child;\r
+               for(Tupel tupel : heterotypicSynonymGroupTupel){\r
+                       if(tupel.homotypicalGroup.equals(homotypicalGroup)){\r
+                               return tupel.group;\r
                        }\r
                }\r
                \r
                return null;\r
        }\r
-\r
-       \r
-       public Composite getConceptGroup() {\r
-               if (conceptGroupComposite == null) {\r
-                       conceptGroupComposite = createConceptGroup();\r
-               }\r
-               return conceptGroupComposite;\r
-       }\r
-\r
        \r
-       public Composite getConcept(Taxon relatedConcept) {\r
-               for (Control child : getConceptGroup().getChildren()){\r
-                       if(child instanceof ConceptComposite \r
-                                       && relatedConcept.equals \r
-                                       (((ConceptComposite) child).getRelatedTaxon())){\r
-                               return (ConceptComposite) child;\r
-                       }\r
-               }\r
-\r
-               return null;\r
+       public ConceptGroup getConceptGroup() {\r
+               return conceptGroup;\r
        }\r
        \r
        /**\r
         * @return a Set containing all composites that have been edited\r
         */\r
-       public Set<AbstractNameComposite<TaxonBase>> getDirtyNames(){\r
-               Set<AbstractNameComposite<TaxonBase>> dirtyNames = new HashSet<AbstractNameComposite<TaxonBase>>();\r
+       public Set<AbstractGroupedContainer> getDirtyNames(){\r
+               Set<AbstractGroupedContainer> dirtyNames = new HashSet<AbstractGroupedContainer>();\r
                \r
-               for(AbstractNameComposite composite : getNameComposites()){\r
+               for(AbstractGroupedContainer composite : getGroupedContainers()){\r
                        if(composite.isDirty()){\r
                                dirtyNames.add(composite);\r
                        }\r
@@ -689,129 +464,32 @@ public class TaxonNameEditor extends EditorPart implements IMultiPageTaxonEditor
                return dirtyNames;\r
        }\r
        \r
-       public Set<AbstractNameComposite<TaxonBase>> getNameComposites(){\r
-               Set<AbstractNameComposite<TaxonBase>> nameComposites = new HashSet<AbstractNameComposite<TaxonBase>>();\r
-               \r
-               List<GroupedComposite> groupedComposites = getGroupedComposites();\r
+       public List<AbstractGroupedContainer> getGroupedContainers(){\r
+               List<AbstractGroupedContainer> groupedComposites = new ArrayList<AbstractGroupedContainer>();\r
                \r
-               if(groupedComposites == null){\r
-                       return null;\r
+               for(AbstractGroup group : getAllGroups()){\r
+                       groupedComposites.addAll(group.getGroupedContainers());\r
                }\r
                \r
-               for(GroupedComposite composite : groupedComposites){\r
-                       if(composite instanceof AbstractNameComposite){\r
-                               nameComposites.add((AbstractNameComposite) composite);\r
-                       }\r
-               }\r
-               \r
-               return nameComposites;\r
-       }\r
-       \r
-       /***********************************************************************/\r
-       \r
-       private GroupedComposite createAcceptedTaxon() {\r
-               // Create a homotypic group composite for the accepted taxon\r
-               HomotypicalGroup group = (HomotypicalGroup) HibernateProxyHelper.deproxy(getTaxon().getHomotypicGroup());\r
-               Assert.isNotNull(group, "Taxon does not have a homotypic group");\r
-               \r
-               createHomotypicalGroup(group);\r
-               \r
-               // Create a name composite for the accepted taxon\r
-               return new AcceptedNameComposite(this, getHomotypicGroup(group));\r
+               return groupedComposites;\r
        }\r
        \r
-       private HomotypicalGroupComposite createHomotypicalGroup(HomotypicalGroup group) {\r
-\r
-               // Create the group composite\r
-               HomotypicalGroupComposite groupComposite = new HomotypicalGroupComposite(this, getTopLevelComposite(), group);\r
-               \r
-               groupComposite.setData(FormToolkit.KEY_DRAW_BORDER, FormToolkit.TEXT_BORDER);\r
-               getManagedForm().getToolkit().paintBordersFor(groupComposite.getParent());\r
+       public List<AbstractGroup> getAllGroups(){\r
+               List<AbstractGroup> allGroups = new ArrayList<AbstractGroup>();\r
                \r
-               getHomotypicGroups().put(group, groupComposite);\r
+               allGroups.add(getHomotypicSynonymGroup());\r
                \r
-               return groupComposite;\r
-       }\r
-\r
-\r
-       private Composite createSynonym(Synonym synonym) {              \r
-               // Get the synonym's homotypical group\r
-               HomotypicalGroup group = (HomotypicalGroup) HibernateProxyHelper.deproxy(synonym.getHomotypicGroup());\r
-               Assert.isNotNull(group, "Synonym does not have a homotypic group");\r
-               \r
-               // If the group doesn't yet have a composite, create one and add it to the repository\r
-               HomotypicalGroupComposite groupComposite = getHomotypicGroup(group);\r
-               if (groupComposite == null) {\r
-                       groupComposite = createHomotypicalGroup(group);\r
-               }\r
+               allGroups.addAll(getHeterotypicSynonymGroups());\r
                                \r
-               // Create a synonym composite in the homotypical group\r
-               Composite synonymComposite = new SynonymComposite(this, groupComposite, synonym);\r
-                               \r
-               return synonymComposite;\r
-       }\r
-       \r
-       public Composite createMisappliedName(Taxon misappliedName) {\r
-               \r
-               // If there is no composite for misapplied names, \r
-               //      create one and add it to the repository\r
-               Composite groupComposite = getMisappliedGroup();\r
-               \r
-               // Create the name's composite\r
-               Composite composite = new MisapplicationComposite(this, groupComposite, misappliedName);\r
-               \r
-               return composite;\r
-       }\r
-       \r
-       \r
-       public MisappliedGroupComposite createMisappliedGroup() {\r
-               // Create the group composite\r
-               misappliedGroupComposite = new MisappliedGroupComposite(this, this.getTopLevelComposite());\r
-               misappliedGroupComposite.addFocusListener(new CompositeBorderDecorator(misappliedGroupComposite, this.getManagedForm()));\r
-               \r
-               // Put the group composite before concept group composite, if any\r
-               if (conceptGroupComposite != null) {\r
-                       misappliedGroupComposite.moveAbove(conceptGroupComposite);\r
+               if(misappliedGroup != null){\r
+                       allGroups.add(misappliedGroup);\r
                }\r
                \r
-               return misappliedGroupComposite;\r
-       }\r
-       \r
-       \r
-       public Composite createConcept(TaxonRelationship relationship) {        \r
-               // If there is no composite for misapplied names, \r
-               //      create one and add it to the repository\r
-               Composite groupComposite = this.getConceptGroup();\r
-               \r
-               // Create the name's composite\r
-               Composite composite = ConceptComposite.getNewInstance(this, groupComposite, relationship);\r
-                               \r
-               return composite;\r
-       }\r
-\r
-       \r
-       public ConceptGroupComposite createConceptGroup() {\r
-               // Create the group composite\r
-               conceptGroupComposite = new ConceptGroupComposite(this, this.getTopLevelComposite());\r
-               conceptGroupComposite.addFocusListener(new CompositeBorderDecorator(conceptGroupComposite, this.getManagedForm()));\r
-               \r
-               // Put the group composite after misapplied group composite, if any\r
-               if (misappliedGroupComposite != null) {\r
-                       conceptGroupComposite.moveBelow(misappliedGroupComposite);\r
+               if(conceptGroup != null){\r
+                       allGroups.add(conceptGroup);\r
                }\r
                \r
-               return conceptGroupComposite;\r
-\r
-       }\r
-\r
-       /* (non-Javadoc)\r
-        * @see eu.etaxonomy.taxeditor.editor.AbstractTaxonEditor#resetGroupComposites()\r
-        */\r
-       protected void resetGroupComposites() {\r
-               conceptGroupComposite = null;\r
-               misappliedGroupComposite = null;\r
-               homotypicGroupComposites = null;\r
-               target = null;\r
+               return allGroups;\r
        }\r
 \r
        /* (non-Javadoc)\r
@@ -819,7 +497,7 @@ public class TaxonNameEditor extends EditorPart implements IMultiPageTaxonEditor
         */\r
        @Override\r
        public boolean isDirty() {\r
-               return false;\r
+               return editor.isDirty();\r
        }\r
        \r
        /* (non-Javadoc)\r
@@ -838,80 +516,176 @@ public class TaxonNameEditor extends EditorPart implements IMultiPageTaxonEditor
                return false;\r
        }\r
        \r
-       private class NameEditorDropTargetListener extends DropTargetAdapter{\r
-               private GroupedComposite composite;\r
+       /*\r
+        * (non-Javadoc)\r
+        * @see org.eclipse.ui.ISelectionListener#selectionChanged(org.eclipse.ui.IWorkbenchPart, org.eclipse.jface.viewers.ISelection)\r
+        */\r
+       public void selectionChanged(IWorkbenchPart part, ISelection selection) {\r
+               \r
+       }\r
 \r
-               public void drop(DropTargetEvent event) {\r
-                       Assert.isTrue(event.data instanceof CdmBase);\r
-                       \r
-                       composite = (GroupedComposite) getNameComposite(event.data);\r
-                       if (composite != null && composite.getDragSource() != null) {\r
-                               // Execute operations at end of drag event\r
-                               composite.getDragSource().addListener(DND.DragEnd, new DragListener());\r
-                       }\r
-               }       \r
+       public void removeContainer(AbstractGroupedContainer container) {\r
+               container.remove();\r
+       }\r
+\r
+       public void addCompositeForTaxonBase(TaxonBase taxonBase, IDropTargetable target) {\r
                \r
-               private class DragListener implements Listener{\r
-                       public void handleEvent(Event event) {\r
-                               IUndoableOperation operation = null;\r
-                               \r
-                               // Synonym being dropped\r
-                               if(composite instanceof SynonymComposite){\r
-                                       Synonym synonym = ((SynonymComposite)composite).getSynonym();\r
-                                       operation = new ChangeHomotypicGroupOperation\r
-                                                       ("change type", getUndoContext(), \r
-                                                                       getTaxon(), synonym, HomotypicalGroup.NewInstance(), TaxonNameEditor.this);\r
-                               }\r
-                               \r
-                               // Misapplied name being dropped\r
-                               if(composite instanceof MisapplicationComposite){\r
-                                               Taxon misapplication = ((MisapplicationComposite)composite).getMisappliedName();\r
-                                               operation = new ChangeConceptToSynonymOperation\r
-                                                               ("change misapplied name to synonym", getUndoContext(), \r
-                                                                               getTaxon(), misapplication, HomotypicalGroup.NewInstance(), TaxonNameEditor.this);                                      \r
-                               }\r
-                               \r
-                               // Execute operation if it has been initiated\r
-                               if (operation == null) {\r
-                                       logger.warn("User unsuccessfully tried to drop " + composite.getClass());\r
-                               } else {\r
-                                       EditorUtil.executeOperation(operation);\r
-                               }\r
-                       }\r
+//             if(target instanceof AbstractGroup){\r
+//                     ((AbstractGroup) target).redraw();\r
+//             }else if(target instanceof TaxonNameEditor){\r
+//                     if(taxonBase instanceof Synonym){\r
+//                             Synonym synonym = (Synonym) taxonBase;\r
+//                             HomotypicalSynonymGroup group = new HomotypicalSynonymGroup(this, synonym.getHomotypicGroup());\r
+//                             ContainerFactory.getInstance().createHeterotypicSynonymGroup(this, group);\r
+//                     }\r
+//             }\r
+               \r
+//             if(taxonBase instanceof Synonym && target instanceof HomotypicalSynonymGroup){\r
+//                     new SynonymContainer(this, (HomotypicalSynonymGroup) target, (Synonym) taxonBase);\r
+//             }else if(taxonBase instanceof Synonym && target instanceof TaxonNameEditor){\r
+//                     Synonym synonym = (Synonym) taxonBase;\r
+//                     HomotypicalSynonymGroup group = new HomotypicalSynonymGroup(this, synonym.getHomotypicGroup());\r
+//                     \r
+//                     new SynonymContainer(this, group, (Synonym) taxonBase);\r
+//             }\r
+               \r
+               \r
+               \r
+//             else if(target instanceof MisappliedGroup){\r
+//                     Taxon taxon = (Taxon) taxonBase;\r
+//                     \r
+//                     if (taxon.isMisapplication()){\r
+//                             containerFactory.createMisapplication(this, taxon);\r
+//                     }else if(! taxon.equals(this.taxon)){\r
+//                             throw new RuntimeException("Unsupported operands");\r
+//                     }\r
+//             }\r
+       }\r
+\r
+       public TaxonNameEditor getNameEditor() {\r
+               return this;\r
+       }\r
+\r
+       public AbstractGroupedContainer getSelectedObject(){\r
+               if(selectedObject == null){\r
+                       return acceptedNameContainer;\r
+               }else{\r
+                       return selectedObject;\r
                }\r
        }\r
+       \r
+       public void dragEntered() {\r
+               // TODO change this\r
+               getControl().setBackground(EditorUtil.getColor(Resources.COLOR_DRAG_ENTER));\r
+       }\r
+\r
+       public void dragLeft() {\r
+               getControl().setBackground(EditorUtil.getColor(Resources.COLOR_COMPOSITE_BACKGROUND));\r
+       }\r
+\r
+       public void setConceptGroup(ConceptGroup conceptGroup) {\r
+               this.conceptGroup = conceptGroup;\r
+       }\r
+\r
+       public void setMisapplicationsGroup(MisappliedGroup misappliedGroup) {\r
+               this.misappliedGroup = misappliedGroup;\r
+       }\r
 \r
        /*\r
         * (non-Javadoc)\r
-        * @see org.eclipse.ui.ISelectionListener#selectionChanged(org.eclipse.ui.IWorkbenchPart, org.eclipse.jface.viewers.ISelection)\r
+        * @see eu.etaxonomy.taxeditor.editor.IMultiPageTaxonEditorPage#isRedrawing()\r
         */\r
-       public void selectionChanged(IWorkbenchPart part, ISelection selection) {\r
-               \r
+       public boolean isRedrawing() {\r
+               return false;\r
        }\r
 \r
-       public AbstractNameComposite getSelectedNameComposite(){\r
-               if(selectedObject instanceof AbstractNameComposite)\r
-                       return (AbstractNameComposite) selectedObject;\r
-               return null;\r
+       public FormToolkit getToolkit() {\r
+               return managedForm.getToolkit();\r
+       }\r
+\r
+       public List<HomotypicalSynonymGroup> getHeterotypicSynonymGroups(){\r
+               List<HomotypicalSynonymGroup> list = new ArrayList<HomotypicalSynonymGroup>(heterotypicSynonymGroupTupel.size());\r
+               \r
+               for(Tupel tupel : heterotypicSynonymGroupTupel){\r
+                       list.add(tupel.group);\r
+               }\r
+               \r
+               return list;\r
        }\r
        \r
-       public AbstractNameComposite getNameComposite(Object data){\r
-               if(data instanceof TaxonBase){\r
-                       for (AbstractNameComposite composite : getNameComposites()){\r
-                               if(composite.getData() == data){\r
-                                       return composite;\r
-                               }\r
-                       }\r
+       public Map<HomotypicalGroup, HomotypicalSynonymGroup> getHeterotypicSynonymGroupsMap(){\r
+               Map<HomotypicalGroup, HomotypicalSynonymGroup> map = new HashMap<HomotypicalGroup, HomotypicalSynonymGroup>(heterotypicSynonymGroupTupel.size());\r
+               \r
+               for(Tupel tupel : heterotypicSynonymGroupTupel){\r
+                       map.put(tupel.homotypicalGroup, tupel.group);\r
                }\r
-               return null;\r
+               \r
+               return map;\r
        }\r
        \r
-       public TaxonBase getSelectedData() {\r
-               if(selectedData instanceof TaxonBase){\r
-                       return (TaxonBase) selectedData;\r
-               }else{\r
-                       logger.error("Selected data is not an instance of TaxonBase, but: " + selectedData.getClass().getName());\r
+       public void clearHeterotypicSynonymGroups(){\r
+               heterotypicSynonymGroupTupel.clear();\r
+       }\r
+\r
+       public void addHeterotypicSynonymGroup(HomotypicalSynonymGroup group) {\r
+               heterotypicSynonymGroupTupel.add(new Tupel(group.getGroup(), group));\r
+       }\r
+       \r
+       public void removeHeterotypicSynonymGroup(HomotypicalGroup group) {\r
+               Tupel shouldBeRemoved = null;\r
+               for(Tupel tupel : heterotypicSynonymGroupTupel){\r
+                       if(tupel.group.equals(group)){\r
+                               shouldBeRemoved = tupel;\r
+                               break;\r
+                       }                       \r
+               }\r
+               \r
+               if(shouldBeRemoved != null){\r
+                       heterotypicSynonymGroupTupel.remove(shouldBeRemoved);\r
                }\r
-               return null;\r
        }\r
+\r
+\r
+\r
+       public HomotypicalSynonymGroup getHomotypicSynonymGroup() {\r
+               return homotypicalSynonymGroup;\r
+       }\r
+\r
+\r
+\r
+       public void setHomotypicSynonymGroup(\r
+                       HomotypicalSynonymGroup homotypicalSynonymGroup) {\r
+               this.homotypicalSynonymGroup = homotypicalSynonymGroup;\r
+       }\r
+\r
+       public void setAcceptedNameContainer(\r
+                       AcceptedNameContainer acceptedNameContainer) {\r
+               this.acceptedNameContainer = acceptedNameContainer;             \r
+       }\r
+\r
+       public MisappliedGroup getMisappliedGroup() {\r
+               return misappliedGroup;\r
+       }\r
+\r
+       // TODO not very useful at the moment\r
+       public boolean isActive(){\r
+               \r
+               \r
+               IWorkbenchPart activePart = EditorUtil.getActivePart();\r
+               return editor.equals(activePart);\r
+       }\r
+\r
+       public boolean onComplete() {\r
+               objectAffectedByLastOperation.setSelected();\r
+               return true;\r
+       }\r
+\r
+\r
+\r
+       public void partChanged(Integer eventType, IWorkbenchPartReference partRef) {\r
+               if(! partRef.getPart(false).equals(editor)){\r
+                       getSelectedObject().colorSelected(AbstractGroupedContainer.SELECTED_NO_FOCUS);\r
+               }\r
+       }\r
+\r
 }
\ No newline at end of file
index 2bc6c024fbe321e6d6b720313b88088d5a604019..ba579b38e519eb2cfe45a08266a6599db63a8566 100644 (file)
@@ -13,6 +13,7 @@ import org.eclipse.core.commands.ExecutionEvent;
 import org.eclipse.core.commands.ExecutionException;\r
 import org.eclipse.core.commands.IHandler;\r
 import org.eclipse.core.commands.common.NotDefinedException;\r
+import org.eclipse.swt.widgets.Display;\r
 import org.eclipse.ui.PartInitException;\r
 import org.eclipse.ui.handlers.HandlerUtil;\r
 \r
@@ -55,13 +56,13 @@ public class ChangeAcceptedTaxonToSynonymHandler extends AbstractHandler
                List<UUID> excludeTaxa = new ArrayList<UUID>();\r
                excludeTaxa.add(oldAcceptedTaxonNode.getUuid());\r
                TaxonNode newAcceptedTaxonNode = FilteredTaxonNodeSelectionDialog.selectTaxonNode(HandlerUtil.getActiveShell(event), "Choose the accepted taxon", excludeTaxa, null);\r
-               \r
-               newAcceptedTaxonNodeUuid = newAcceptedTaxonNode.getUuid();\r
-               \r
+\r
                if (newAcceptedTaxonNode == null) {\r
                        return null;\r
                }\r
                \r
+               newAcceptedTaxonNodeUuid = newAcceptedTaxonNode.getUuid();\r
+                               \r
                try {\r
                        operation = new ChangeAcceptedTaxonToSynonymOperation(event.getCommand().getName(), \r
                                                                        editor.getUndoContext(), oldAcceptedTaxonNode, newAcceptedTaxonNode, this, editor);\r
@@ -79,19 +80,31 @@ public class ChangeAcceptedTaxonToSynonymHandler extends AbstractHandler
         * @see eu.etaxonomy.taxeditor.operations.IPostOperationEnabled#postOperation(eu.etaxonomy.cdm.model.common.CdmBase)\r
         */\r
        public boolean postOperation(CdmBase objectAffectedByOperation) {\r
-               EditorUtil.close(editor.getMultiPageTaxonEditor());\r
-               \r
-               try {\r
-                       MultiPageTaxonEditor possibleOpenEditor = (MultiPageTaxonEditor) EditorUtil.findEditorByTaxonNodeUuid(newAcceptedTaxonNodeUuid);\r
-                       if(possibleOpenEditor != null){\r
-                               EditorUtil.close(possibleOpenEditor);\r
+               Display.getDefault().asyncExec(new Runnable(){\r
+\r
+                       public void run() {\r
+                               EditorUtil.close(editor.getMultiPageTaxonEditor());\r
+                               \r
+                               try {\r
+                                       MultiPageTaxonEditor possibleOpenEditor = (MultiPageTaxonEditor) EditorUtil.findEditorByTaxonNodeUuid(newAcceptedTaxonNodeUuid);\r
+                                       if(possibleOpenEditor != null){\r
+                                               EditorUtil.close(possibleOpenEditor);\r
+                                       }\r
+                                       EditorUtil.openTaxonNode(newAcceptedTaxonNodeUuid);\r
+                               } catch (PartInitException e) {\r
+                                       logger.error(e);\r
+                                       throw new RuntimeException(e);\r
+                               }\r
                        }\r
-                       EditorUtil.openTaxonNode(newAcceptedTaxonNodeUuid);\r
-               } catch (PartInitException e) {\r
-                       logger.error(e);\r
-                       throw new RuntimeException(e);\r
-               }\r
+                       \r
+               });\r
+               \r
                \r
                return true;\r
+       }\r
+\r
+       public boolean onComplete() {\r
+               // TODO Auto-generated method stub\r
+               return false;\r
        }       \r
 }
\ No newline at end of file
index 60b5c8a0ca11ed838d7bf66d3fff5dc601deccc2..2e128836e04757708eb6df72cccc957af65030fc 100644 (file)
@@ -16,8 +16,6 @@ import org.eclipse.core.commands.ExecutionEvent;
 import org.eclipse.core.commands.ExecutionException;
 import org.eclipse.core.commands.IHandler;
 import org.eclipse.core.commands.common.NotDefinedException;
-import org.eclipse.core.commands.operations.IUndoableOperation;
-import org.eclipse.jface.viewers.ISelection;
 import org.eclipse.swt.widgets.Event;
 
 import eu.etaxonomy.cdm.model.taxon.Taxon;
@@ -25,6 +23,7 @@ import eu.etaxonomy.cdm.model.taxon.TaxonRelationshipType;
 import eu.etaxonomy.taxeditor.editor.EditorUtil;
 import eu.etaxonomy.taxeditor.editor.Page;
 import eu.etaxonomy.taxeditor.editor.name.TaxonNameEditor;
+import eu.etaxonomy.taxeditor.operations.AbstractPostOperation;
 import eu.etaxonomy.taxeditor.operations.ChangeConceptRelationshipTypeOperation;
 
 /**
@@ -48,7 +47,7 @@ public class ChangeConceptRelationshipTypeHandler extends AbstractHandler
                
                TaxonRelationshipType type = (TaxonRelationshipType) ((Event)event.getTrigger()).data;
                
-               IUndoableOperation operation;
+               AbstractPostOperation operation;
                try {
                        operation = new ChangeConceptRelationshipTypeOperation(event.getCommand().getName(), 
                                                                                editor.getUndoContext(), editor.getTaxon(), selectedElement, type, editor);
index a17f85625b809b2b028d1895ac0933412a7112b5..557dde14699fe09a1b1296a0b69017e0e11fb955 100644 (file)
@@ -17,11 +17,9 @@ import org.apache.log4j.Logger;
 import org.eclipse.core.commands.AbstractHandler;
 import org.eclipse.core.commands.ExecutionEvent;
 import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.commands.operations.IUndoableOperation;
 import org.eclipse.jface.viewers.StructuredSelection;
 import org.eclipse.swt.widgets.Shell;
 import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorPart;
 import org.eclipse.ui.PartInitException;
 import org.eclipse.ui.handlers.HandlerUtil;
 
@@ -34,6 +32,7 @@ import eu.etaxonomy.taxeditor.dialogs.filteredSelection.FilteredTaxonNodeSelecti
 import eu.etaxonomy.taxeditor.editor.EditorUtil;
 import eu.etaxonomy.taxeditor.editor.MultiPageTaxonEditor;
 import eu.etaxonomy.taxeditor.editor.TaxonEditorInput;
+import eu.etaxonomy.taxeditor.operations.AbstractPostOperation;
 import eu.etaxonomy.taxeditor.operations.ChangeSynonymToAcceptedTaxonOperation;
 import eu.etaxonomy.taxeditor.operations.IPostOperationEnabled;
 
@@ -89,7 +88,7 @@ public class ChangeSynonymToAcceptedTaxonHandler extends AbstractHandler impleme
                        // apply confirmation dialog
                        
                        // FIXME with this implementation we can not create a taxonNode that is a direct child of the classification node
-                       IUndoableOperation operation = new ChangeSynonymToAcceptedTaxonOperation("Change synonym to accepted taxon", EditorUtil.getUndoContext(), 
+                       AbstractPostOperation operation = new ChangeSynonymToAcceptedTaxonOperation("Change synonym to accepted taxon", EditorUtil.getUndoContext(), 
                                        taxon, newParentNode, synonym, null, this, editor); //$NON-NLS-1$
                        EditorUtil.executeOperation(operation);
                }
@@ -120,7 +119,7 @@ public class ChangeSynonymToAcceptedTaxonHandler extends AbstractHandler impleme
                                 *  CdmStore.getTaxonService().getTaxonNodeByUuid(taxonNodeUuid);
                                 *  doesn't work yet.
                                 */
-                               IEditorPart newEditor = EditorUtil.openTaxonNode(newNode.getUuid());
+                               EditorUtil.openTaxonNode(newNode.getUuid());
                                
                        } catch (PartInitException e) {
                                // TODO Auto-generated catch block
@@ -129,4 +128,9 @@ public class ChangeSynonymToAcceptedTaxonHandler extends AbstractHandler impleme
                }
                return true;
        }
+
+       public boolean onComplete() {
+               // TODO Auto-generated method stub
+               return false;
+       }
 }
index 897c114f863b9fc0f349f91fc79f8ba640f81731..aa596b27b32557c03120c9570d0fef81d4f16c72 100644 (file)
@@ -16,7 +16,6 @@ import org.eclipse.core.commands.ExecutionEvent;
 import org.eclipse.core.commands.ExecutionException;
 import org.eclipse.core.commands.IHandler;
 import org.eclipse.core.commands.common.NotDefinedException;
-import org.eclipse.core.commands.operations.IUndoableOperation;
 import org.eclipse.swt.widgets.Event;
 
 import eu.etaxonomy.cdm.model.taxon.Synonym;
@@ -26,6 +25,7 @@ import eu.etaxonomy.cdm.model.taxon.TaxonRelationshipType;
 import eu.etaxonomy.taxeditor.editor.EditorUtil;
 import eu.etaxonomy.taxeditor.editor.Page;
 import eu.etaxonomy.taxeditor.editor.name.TaxonNameEditor;
+import eu.etaxonomy.taxeditor.operations.AbstractPostOperation;
 import eu.etaxonomy.taxeditor.operations.ChangeConceptRelationshipTypeOperation;
 import eu.etaxonomy.taxeditor.operations.ChangeSynonymToConceptOperation;
 
@@ -50,7 +50,7 @@ public class ChangeToConceptRelationHandler extends AbstractHandler implements
                
                TaxonRelationshipType type = (TaxonRelationshipType) ((Event)event.getTrigger()).data;
                
-               IUndoableOperation operation;
+               AbstractPostOperation operation;
                try {
                        if(taxonBase instanceof Synonym){
                                Synonym synonym = (Synonym) taxonBase;
index d5642c7336d12533de9953a1664cc99b3f0741f2..794b5c990dd464c5b70fac98971ba6697afcf232 100644 (file)
@@ -16,7 +16,6 @@ import org.eclipse.core.commands.ExecutionEvent;
 import org.eclipse.core.commands.ExecutionException;
 import org.eclipse.core.commands.IHandler;
 import org.eclipse.core.commands.common.NotDefinedException;
-import org.eclipse.core.commands.operations.IUndoableOperation;
 
 import eu.etaxonomy.cdm.model.taxon.Synonym;
 import eu.etaxonomy.cdm.model.taxon.Taxon;
@@ -24,6 +23,7 @@ import eu.etaxonomy.cdm.model.taxon.TaxonRelationshipType;
 import eu.etaxonomy.taxeditor.editor.EditorUtil;
 import eu.etaxonomy.taxeditor.editor.Page;
 import eu.etaxonomy.taxeditor.editor.name.TaxonNameEditor;
+import eu.etaxonomy.taxeditor.operations.AbstractPostOperation;
 import eu.etaxonomy.taxeditor.operations.ChangeConceptRelationshipTypeOperation;
 import eu.etaxonomy.taxeditor.operations.ChangeSynonymToMisapplicationOperation;
 
@@ -46,7 +46,7 @@ public class ChangeToMisapplicationHandler extends AbstractHandler implements
 
                Object selectedElement = EditorUtil.getSelection(event).getFirstElement();
                
-               IUndoableOperation operation = null;
+               AbstractPostOperation operation = null;
                try {
                        if(selectedElement instanceof Taxon){
                                operation = new ChangeConceptRelationshipTypeOperation(event.getCommand().getName(), 
index c14181785af3e128b6c72ca5446630ab6667dca8..6a76669f66e40436a85a4d7f21a36e5a4f3eaf07 100644 (file)
@@ -16,12 +16,12 @@ import org.eclipse.core.commands.ExecutionEvent;
 import org.eclipse.core.commands.ExecutionException;
 import org.eclipse.core.commands.IHandler;
 import org.eclipse.core.commands.common.NotDefinedException;
-import org.eclipse.core.commands.operations.IUndoableOperation;
 
 import eu.etaxonomy.cdm.model.taxon.Taxon;
 import eu.etaxonomy.taxeditor.editor.EditorUtil;
 import eu.etaxonomy.taxeditor.editor.Page;
 import eu.etaxonomy.taxeditor.editor.name.TaxonNameEditor;
+import eu.etaxonomy.taxeditor.operations.AbstractPostOperation;
 import eu.etaxonomy.taxeditor.operations.ChangeConceptToSynonymOperation;
 
 /**
@@ -43,7 +43,7 @@ public class ChangeToSynonymHandler extends AbstractHandler implements
 
                Taxon concept  = (Taxon) EditorUtil.getSelection(event).getFirstElement();
                
-               IUndoableOperation operation;
+               AbstractPostOperation operation;
                try {
                        operation = new ChangeConceptToSynonymOperation(event.getCommand().getName(), 
                                        editor.getUndoContext(), editor.getTaxon(), concept, null, editor);
index 4222dce33c2a1dc80ecdce8a2d189da9a45ae3a2..ae1fcb7bf397711a9787a2b399d26cd2b4ca2adb 100644 (file)
@@ -15,7 +15,6 @@ import org.eclipse.core.commands.AbstractHandler;
 import org.eclipse.core.commands.ExecutionEvent;
 import org.eclipse.core.commands.ExecutionException;
 import org.eclipse.core.commands.common.NotDefinedException;
-import org.eclipse.core.commands.operations.IUndoableOperation;
 import org.eclipse.swt.widgets.Event;
 
 import eu.etaxonomy.cdm.model.name.TaxonNameBase;
@@ -24,6 +23,7 @@ import eu.etaxonomy.cdm.model.taxon.TaxonRelationshipType;
 import eu.etaxonomy.taxeditor.editor.EditorUtil;
 import eu.etaxonomy.taxeditor.editor.Page;
 import eu.etaxonomy.taxeditor.editor.name.TaxonNameEditor;
+import eu.etaxonomy.taxeditor.operations.AbstractPostOperation;
 import eu.etaxonomy.taxeditor.operations.CreateConceptRelationOperation;
 import eu.etaxonomy.taxeditor.parser.ParseHandler;
 
@@ -48,7 +48,7 @@ public class CreateConceptRelationHandler extends AbstractHandler {
                
                TaxonRelationshipType type = (TaxonRelationshipType) ((Event)event.getTrigger()).data;
                
-               IUndoableOperation operation;
+               AbstractPostOperation operation;
                try {
                        operation = new CreateConceptRelationOperation(event.getCommand().getName(), 
                                        editor.getUndoContext(), editor.getTaxon(), concept, type, editor);
index b32de3bb318d2a018e2172cfef23a5bab16dfcd4..adc3781cab638b066c7212d5c4169f960d22d52d 100644 (file)
@@ -15,12 +15,12 @@ import org.eclipse.core.commands.ExecutionEvent;
 import org.eclipse.core.commands.ExecutionException;\r
 import org.eclipse.core.commands.IHandler;\r
 import org.eclipse.core.commands.common.NotDefinedException;\r
-import org.eclipse.core.commands.operations.IUndoableOperation;\r
 \r
 import eu.etaxonomy.cdm.model.name.TaxonNameBase;\r
 import eu.etaxonomy.taxeditor.editor.EditorUtil;\r
 import eu.etaxonomy.taxeditor.editor.Page;\r
 import eu.etaxonomy.taxeditor.editor.name.TaxonNameEditor;\r
+import eu.etaxonomy.taxeditor.operations.AbstractPostOperation;\r
 import eu.etaxonomy.taxeditor.operations.CreateSynonymInNewGroupOperation;\r
 import eu.etaxonomy.taxeditor.parser.ParseHandler;\r
 \r
@@ -43,7 +43,7 @@ public class CreateHeterotypicSynonymHandler extends AbstractHandler implements
                \r
                TaxonNameBase newSynonymName = ParseHandler.createEmptyName();\r
                \r
-               IUndoableOperation operation;\r
+               AbstractPostOperation operation;\r
                try {\r
                        operation = new CreateSynonymInNewGroupOperation(event.getCommand().getName(), \r
                                        editor.getUndoContext(), editor.getTaxon(), newSynonymName, editor);\r
index 254f1ba8a9da9c69e3b0a0b7c58b9868feefca77..f66f33dbbbd5a523b1840cac87959dac1ac0463d 100644 (file)
@@ -15,7 +15,6 @@ import org.eclipse.core.commands.ExecutionEvent;
 import org.eclipse.core.commands.ExecutionException;\r
 import org.eclipse.core.commands.IHandler;\r
 import org.eclipse.core.commands.common.NotDefinedException;\r
-import org.eclipse.core.commands.operations.IUndoableOperation;\r
 \r
 import eu.etaxonomy.cdm.model.name.HomotypicalGroup;\r
 import eu.etaxonomy.cdm.model.name.TaxonNameBase;\r
@@ -23,9 +22,9 @@ import eu.etaxonomy.cdm.model.taxon.Taxon;
 import eu.etaxonomy.taxeditor.editor.EditorUtil;\r
 import eu.etaxonomy.taxeditor.editor.Page;\r
 import eu.etaxonomy.taxeditor.editor.name.TaxonNameEditor;\r
+import eu.etaxonomy.taxeditor.operations.AbstractPostOperation;\r
 import eu.etaxonomy.taxeditor.operations.CreateSynonymInExistingHomotypicalGroupOperation;\r
 import eu.etaxonomy.taxeditor.parser.ParseHandler;\r
-import eu.etaxonomy.taxeditor.parser.ParseHandler;\r
 \r
 /**\r
  * @author n.hoffmann\r
@@ -47,7 +46,7 @@ public class CreateHomotypicSynonymHandler extends AbstractHandler implements
                HomotypicalGroup group = taxon.getHomotypicGroup();\r
                TaxonNameBase newSynonymName = ParseHandler.createEmptyName();\r
                \r
-               IUndoableOperation operation;\r
+               AbstractPostOperation operation;\r
                try {\r
                        operation = new CreateSynonymInExistingHomotypicalGroupOperation(event.getCommand().getName(), \r
                                        editor.getUndoContext(), taxon, group, newSynonymName, editor);\r
index 2e2dec21157aaa437cdd37c492127e782759a879..bfaa5b4fbf87fda0f412301a8a731b7532d5be49 100644 (file)
@@ -15,7 +15,6 @@ import org.eclipse.core.commands.AbstractHandler;
 import org.eclipse.core.commands.ExecutionEvent;
 import org.eclipse.core.commands.ExecutionException;
 import org.eclipse.core.commands.common.NotDefinedException;
-import org.eclipse.core.commands.operations.IUndoableOperation;
 
 import eu.etaxonomy.cdm.model.name.TaxonNameBase;
 import eu.etaxonomy.cdm.model.taxon.Taxon;
@@ -23,6 +22,7 @@ import eu.etaxonomy.cdm.model.taxon.TaxonRelationshipType;
 import eu.etaxonomy.taxeditor.editor.EditorUtil;
 import eu.etaxonomy.taxeditor.editor.Page;
 import eu.etaxonomy.taxeditor.editor.name.TaxonNameEditor;
+import eu.etaxonomy.taxeditor.operations.AbstractPostOperation;
 import eu.etaxonomy.taxeditor.operations.CreateConceptRelationOperation;
 import eu.etaxonomy.taxeditor.parser.ParseHandler;
 
@@ -48,7 +48,7 @@ public class CreateMisapplicationHandler extends AbstractHandler {
                
                TaxonRelationshipType type = TaxonRelationshipType.MISAPPLIED_NAME_FOR();
                
-               IUndoableOperation operation;
+               AbstractPostOperation operation;
                try {
                        operation = new CreateConceptRelationOperation(event.getCommand().getName(), 
                                        editor.getUndoContext(), editor.getTaxon(), concept, type, editor);
index 99573d1f2eb85d96883b2f8a0491555e9a11ea52..a36a6167103f6e5ba6354f4b3ec5d915ec5a75fe 100644 (file)
@@ -16,7 +16,6 @@ import org.eclipse.core.commands.ExecutionEvent;
 import org.eclipse.core.commands.ExecutionException;
 import org.eclipse.core.commands.IHandler;
 import org.eclipse.core.commands.common.NotDefinedException;
-import org.eclipse.core.commands.operations.IUndoableOperation;
 import org.eclipse.jface.viewers.ISelection;
 import org.eclipse.jface.viewers.StructuredSelection;
 import org.eclipse.ui.handlers.HandlerUtil;
@@ -26,8 +25,8 @@ import eu.etaxonomy.cdm.model.name.TaxonNameBase;
 import eu.etaxonomy.cdm.model.taxon.Synonym;
 import eu.etaxonomy.taxeditor.editor.EditorUtil;
 import eu.etaxonomy.taxeditor.editor.Page;
-import eu.etaxonomy.taxeditor.editor.name.SynonymComposite;
 import eu.etaxonomy.taxeditor.editor.name.TaxonNameEditor;
+import eu.etaxonomy.taxeditor.operations.AbstractPostOperation;
 import eu.etaxonomy.taxeditor.operations.CreateSynonymInExistingHomotypicalGroupOperation;
 import eu.etaxonomy.taxeditor.parser.ParseHandler;
 
@@ -62,7 +61,7 @@ public class CreateSynonymInHomotypicalGroupHandler extends AbstractHandler
                
                TaxonNameBase newSynonymName = ParseHandler.createEmptyName();
                
-               IUndoableOperation operation;
+               AbstractPostOperation operation;
                
                try {
                        operation = new CreateSynonymInExistingHomotypicalGroupOperation(event.getCommand().getName(), editor.getUndoContext(),
index c33afd20d92335e8dd2c495d86bff7b58a76009a..e78986a103c77aa5cfad57685a930d3760203a4f 100644 (file)
@@ -14,15 +14,14 @@ import org.eclipse.core.commands.ExecutionEvent;
 import org.eclipse.core.commands.ExecutionException;\r
 import org.eclipse.core.commands.IHandler;\r
 import org.eclipse.core.commands.common.NotDefinedException;\r
-import org.eclipse.core.commands.operations.IUndoableOperation;\r
-import org.eclipse.jface.viewers.ISelection;\r
-import org.eclipse.jface.viewers.IStructuredSelection;\r
 \r
 import eu.etaxonomy.cdm.model.taxon.Synonym;\r
 import eu.etaxonomy.cdm.model.taxon.Taxon;\r
 import eu.etaxonomy.taxeditor.editor.EditorUtil;\r
 import eu.etaxonomy.taxeditor.editor.Page;\r
 import eu.etaxonomy.taxeditor.editor.name.TaxonNameEditor;\r
+import eu.etaxonomy.taxeditor.operations.AbstractPostOperation;\r
+import eu.etaxonomy.taxeditor.operations.DeleteConceptRelationOperation;\r
 import eu.etaxonomy.taxeditor.operations.DeleteMisapplicationOperation;\r
 import eu.etaxonomy.taxeditor.operations.DeleteSynonymOperation;\r
 \r
@@ -43,7 +42,7 @@ public class DeleteTaxonBaseHandler extends AbstractHandler implements IHandler
                                \r
                Object selectedElement = EditorUtil.getSelection(event).getFirstElement();\r
                \r
-               IUndoableOperation operation = null;\r
+               AbstractPostOperation operation = null;\r
                String commandName = null;\r
                \r
                \r
@@ -59,18 +58,18 @@ public class DeleteTaxonBaseHandler extends AbstractHandler implements IHandler
                if(selectedElement instanceof Synonym){\r
                        operation = new DeleteSynonymOperation(commandName, editor.getUndoContext(), editor.getTaxon(), (Synonym) selectedElement, editor);\r
                }\r
-               \r
                // misapplication\r
-               if(selectedElement instanceof Taxon && ((Taxon) selectedElement).isMisappliedName()){\r
+               else if(selectedElement instanceof Taxon && ((Taxon) selectedElement).isMisappliedName()){\r
                        operation = new DeleteMisapplicationOperation(commandName, editor.getUndoContext(), editor\r
                                        .getTaxon(), (Taxon) selectedElement, editor);\r
                }\r
-               \r
                // concept relation\r
-               // TODO\r
-//             if(selectedElement instanceof Taxon && ((Taxon) selectedElement).isRelatedConcept()){\r
-//                     operation = new DeleteConceptRelationOperation(commandName, editor.getUndoContext(), editor.getTaxon(), (Taxon) selectedElement, editor);\r
-//             }\r
+               else if(selectedElement instanceof Taxon && ((Taxon) selectedElement).isRelatedConcept()){\r
+                       operation = new DeleteConceptRelationOperation(commandName, editor.getUndoContext(), editor.getTaxon(), (Taxon) selectedElement, editor);\r
+               }\r
+               else {\r
+                       throw new IllegalArgumentException("Element has to be Synonym, Misapplication or Concept");\r
+               }\r
                                \r
                EditorUtil.executeOperation(operation);\r
                \r
index 67f5d413eed4fbbf8e287f1e7657143561613fb1..efc91904c46a4fdfea64b650974e0416d563901f 100644 (file)
@@ -94,6 +94,6 @@ public class NameEditorMenuPropertyTester extends org.eclipse.core.expressions.P
        }
 
        private boolean isAccepted(Object selectedElement) {
-               return (selectedElement instanceof Taxon) ? true : false;
+               return (selectedElement instanceof Taxon  && ! ((Taxon) selectedElement).isRelatedConcept() && ! ((Taxon) selectedElement).isMisapplication()) ? true : false;
        }
 }
index 00ebb799b74fcf10d8cf678241af900f0410f47b..8ea686dab2047406fbed6ff6164ed9661d090312 100644 (file)
@@ -16,15 +16,14 @@ import org.eclipse.core.commands.ExecutionEvent;
 import org.eclipse.core.commands.ExecutionException;
 import org.eclipse.core.commands.IHandler;
 import org.eclipse.core.commands.common.NotDefinedException;
-import org.eclipse.core.commands.operations.IUndoableOperation;
 import org.eclipse.jface.viewers.IStructuredSelection;
 import org.eclipse.ui.handlers.HandlerUtil;
 
-import eu.etaxonomy.cdm.model.taxon.Synonym;
 import eu.etaxonomy.cdm.model.taxon.TaxonBase;
 import eu.etaxonomy.taxeditor.editor.EditorUtil;
 import eu.etaxonomy.taxeditor.editor.Page;
 import eu.etaxonomy.taxeditor.editor.name.TaxonNameEditor;
+import eu.etaxonomy.taxeditor.operations.AbstractPostOperation;
 import eu.etaxonomy.taxeditor.operations.RemoveHomotypicalGroupBasionymOperation;
 
 /**
@@ -47,7 +46,7 @@ public class RemoveBasionymHandler extends AbstractHandler implements IHandler {
                
                TaxonBase selectedTaxonBase = (TaxonBase) selection.getFirstElement();
 
-               IUndoableOperation operation;
+               AbstractPostOperation operation;
                
                try {
                        operation = new RemoveHomotypicalGroupBasionymOperation(event.getCommand().getName(), editor.getUndoContext(),
index fd8d7d59de1c1f33d3c2345e73b03495488c44cb..d0e52618bcb36de4aa5851b6e12092f16d6ba85f 100644 (file)
@@ -16,7 +16,6 @@ import org.eclipse.core.commands.ExecutionEvent;
 import org.eclipse.core.commands.ExecutionException;
 import org.eclipse.core.commands.IHandler;
 import org.eclipse.core.commands.common.NotDefinedException;
-import org.eclipse.core.commands.operations.IUndoableOperation;
 import org.eclipse.jface.viewers.IStructuredSelection;
 import org.eclipse.ui.handlers.HandlerUtil;
 
@@ -24,6 +23,7 @@ import eu.etaxonomy.cdm.model.taxon.TaxonBase;
 import eu.etaxonomy.taxeditor.editor.EditorUtil;
 import eu.etaxonomy.taxeditor.editor.Page;
 import eu.etaxonomy.taxeditor.editor.name.TaxonNameEditor;
+import eu.etaxonomy.taxeditor.operations.AbstractPostOperation;
 import eu.etaxonomy.taxeditor.operations.ChangeHomotypicalGroupBasionymOperation;
 
 /**
@@ -46,7 +46,7 @@ public class SetBasionymHandler extends AbstractHandler implements IHandler {
                                
                TaxonBase selectedTaxonBase = (TaxonBase) selection.getFirstElement();
 
-               IUndoableOperation operation;
+               AbstractPostOperation operation;
                
                try {
                        operation = new ChangeHomotypicalGroupBasionymOperation(event.getCommand().getName(), editor.getUndoContext(),
index ae8dec957356254c9792b4bf2cb183b24feef172..97846669cdcb966bf9e08513a6864894f5a3f6d5 100644 (file)
@@ -72,7 +72,6 @@ public abstract class AbstractCdmDataViewer extends Viewer implements IPropertyC
                        }
                };
                
-               
                createFormFactory();
                
                formFactory.addPropertyChangeListener(this);
index 0de9b1d201a406e9cde25b975335f45dde7f21c7..b52b111404d948bb495bb2ca7dc814342ba184b5 100644 (file)
@@ -62,7 +62,6 @@ public abstract class AbstractCdmViewPart extends ViewPart implements ISelection
                selectionService.addSelectionListener(this);
                
                pageBook = new PageBook(parent, SWT.NULL);
-               
                createViewerComposite(pageBook);
                createViewer(viewerComposite);
                
index 316b5956b0b530995b6a1dc80df7634cad459824..00cde7b37b43b7508732b2dd900a14f7cc305d92 100644 (file)
@@ -17,6 +17,7 @@ import org.eclipse.ui.forms.SectionPart;
 
 import eu.etaxonomy.cdm.model.common.VersionableEntity;
 import eu.etaxonomy.cdm.model.taxon.TaxonBase;
+import eu.etaxonomy.taxeditor.editor.name.AbstractGroupedContainer;
 import eu.etaxonomy.taxeditor.forms.AbstractFormSection;
 import eu.etaxonomy.taxeditor.forms.ICdmFormElement;
 import eu.etaxonomy.taxeditor.section.ITaxonDetailSection;
@@ -40,6 +41,9 @@ public class CdmSectionPart<T extends VersionableEntity> extends SectionPart imp
        
        @Override
        public boolean setFormInput(Object input) {
+               if(input instanceof AbstractGroupedContainer){
+                       input = ((AbstractGroupedContainer) input).getData();
+               }
                if(input instanceof VersionableEntity){
                        logger.trace("Setting input for section: " + formSection.getClass().getSimpleName());
                        if((input instanceof TaxonBase) && (formSection instanceof ITaxonDetailSection)){
index 7aa2359c81f638c57071cddf4b5b551873be01a9..e002e615c1c32bec637f82bec345e08641db106b 100644 (file)
@@ -202,4 +202,11 @@ public class DescriptiveViewPart extends AbstractCdmViewPart implements IPartCon
        protected Object getInitialInput() {
                return getEditor().getEditorInput();
        }
+
+
+
+       public boolean onComplete() {
+               // TODO Auto-generated method stub
+               return false;
+       }
 }
index 1e650d8f4cd36ea0ca8eb3acfc8606344a41d9d2..1ab22c0b4518541bde91c47dbc56a9f2342dedac 100644 (file)
@@ -13,7 +13,6 @@ import org.eclipse.core.commands.AbstractHandler;
 import org.eclipse.core.commands.ExecutionEvent;\r
 import org.eclipse.core.commands.ExecutionException;\r
 import org.eclipse.core.commands.common.NotDefinedException;\r
-import org.eclipse.core.commands.operations.IUndoableOperation;\r
 import org.eclipse.ui.IEditorInput;\r
 import org.eclipse.ui.IEditorPart;\r
 import org.eclipse.ui.IWorkbenchPart;\r
@@ -23,6 +22,7 @@ import org.eclipse.ui.handlers.HandlerUtil;
 import eu.etaxonomy.cdm.model.taxon.Taxon;\r
 import eu.etaxonomy.taxeditor.editor.EditorUtil;\r
 import eu.etaxonomy.taxeditor.editor.TaxonEditorInput;\r
+import eu.etaxonomy.taxeditor.operations.AbstractPostOperation;\r
 import eu.etaxonomy.taxeditor.operations.CreateTaxonDescriptionOperation;\r
 import eu.etaxonomy.taxeditor.operations.IPostOperationEnabled;\r
 \r
@@ -50,7 +50,7 @@ public class AddDescriptionHandler extends AbstractHandler {
                IEditorInput input = editor.getEditorInput();\r
                if (input instanceof TaxonEditorInput) {\r
                        Taxon taxon = ((TaxonEditorInput) input).getTaxon();    \r
-                       IUndoableOperation operation;\r
+                       AbstractPostOperation operation;\r
                        try {\r
                                // TODO use undo context specific to editor\r
                                operation = new CreateTaxonDescriptionOperation(event.getCommand().getName(), \r
index 0018ed35c68d600af4bde4566556e8ff81500580..e056329dc6e1872ffe00f97203c632ddcea696d6 100644 (file)
@@ -15,7 +15,6 @@ import org.eclipse.core.commands.AbstractHandler;
 import org.eclipse.core.commands.ExecutionEvent;
 import org.eclipse.core.commands.ExecutionException;
 import org.eclipse.core.commands.common.NotDefinedException;
-import org.eclipse.core.commands.operations.IUndoableOperation;
 import org.eclipse.jface.viewers.ISelection;
 import org.eclipse.jface.viewers.TreePath;
 import org.eclipse.jface.viewers.TreeSelection;
@@ -32,6 +31,7 @@ import eu.etaxonomy.cdm.model.description.TaxonDescription;
 import eu.etaxonomy.cdm.model.taxon.Taxon;
 import eu.etaxonomy.taxeditor.editor.EditorUtil;
 import eu.etaxonomy.taxeditor.editor.TaxonEditorInput;
+import eu.etaxonomy.taxeditor.operations.AbstractPostOperation;
 import eu.etaxonomy.taxeditor.operations.CreateDescriptionElementOperation;
 import eu.etaxonomy.taxeditor.operations.IPostOperationEnabled;
 
@@ -69,7 +69,7 @@ public class CreateDescriptionElementHandler extends AbstractHandler {
                        
                                Feature feature = (Feature) ((Event)event.getTrigger()).data;
                                
-                               IUndoableOperation operation = null;
+                               AbstractPostOperation operation = null;
                                try {
                                        // TODO use undo context specific to editor
                                        operation = new CreateDescriptionElementOperation(event.getCommand().getName(), 
index a2714f08cf25750837d38693aa0414116393d044..fb70b065a645acf30777f89567e0fca784f77534 100644 (file)
 
 package eu.etaxonomy.taxeditor.editor.view.descriptive.handler;
 
-import java.util.Iterator;
-
 import org.apache.log4j.Logger;
 import org.eclipse.core.commands.AbstractHandler;
 import org.eclipse.core.commands.ExecutionEvent;
 import org.eclipse.core.commands.ExecutionException;
 import org.eclipse.core.commands.common.NotDefinedException;
 import org.eclipse.core.commands.operations.IUndoContext;
-import org.eclipse.core.commands.operations.IUndoableOperation;
 import org.eclipse.jface.viewers.IStructuredSelection;
 import org.eclipse.jface.viewers.TreePath;
 import org.eclipse.jface.viewers.TreeSelection;
@@ -29,6 +26,7 @@ import eu.etaxonomy.cdm.model.description.DescriptionElementBase;
 import eu.etaxonomy.cdm.model.description.TaxonDescription;
 import eu.etaxonomy.cdm.model.media.Media;
 import eu.etaxonomy.taxeditor.editor.EditorUtil;
+import eu.etaxonomy.taxeditor.operations.AbstractPostOperation;
 import eu.etaxonomy.taxeditor.operations.DeleteDescriptionElementOperation;
 import eu.etaxonomy.taxeditor.operations.DeleteMediaOperation;
 import eu.etaxonomy.taxeditor.operations.DeleteTaxonDescriptionOperation;
@@ -59,7 +57,7 @@ public class DeleteDescriptionHandler extends AbstractHandler {
                        
                        for(Object object : selection.toArray()){
                                
-                               IUndoableOperation operation = null;
+                               AbstractPostOperation operation = null;
                                
                                if(object instanceof TaxonDescription){
                                        operation = new DeleteTaxonDescriptionOperation(label, undoContext, (TaxonDescription) object, postOperationEnabled);
index d2b15f0b5c842ba8a8277b2eee76377a91ac11e7..370fb880aeb894e0cf4dd0b4fd73921833b97079 100644 (file)
 package eu.etaxonomy.taxeditor.editor.view.detail;
 
 import org.apache.log4j.Logger;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IContributionItem;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.IToolBarManager;
 import org.eclipse.jface.viewers.ISelection;
 import org.eclipse.jface.viewers.IStructuredSelection;
 import org.eclipse.jface.viewers.Viewer;
 import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.IActionBars;
 import org.eclipse.ui.IWorkbenchPart;
 import org.eclipse.ui.part.EditorPart;
 
-import eu.etaxonomy.cdm.model.common.AnnotatableEntity;
 import eu.etaxonomy.cdm.model.common.CdmBase;
-import eu.etaxonomy.cdm.model.description.DescriptionElementBase;
 import eu.etaxonomy.taxeditor.editor.EditorUtil;
 import eu.etaxonomy.taxeditor.editor.MultiPageTaxonEditor;
 import eu.etaxonomy.taxeditor.editor.Page;
@@ -99,7 +92,7 @@ public class DetailsViewPart extends AbstractCdmViewPart implements IPartContent
                        MultiPageTaxonEditor editor = (MultiPageTaxonEditor) part;
                        if(editor != null){
                                TaxonNameEditor page = (TaxonNameEditor) editor.getPage(Page.NAME);
-                               page.getSelectedNameComposite().refresh();
+                               page.getSelectedObject().refresh();
                        }       
                }
        }
@@ -120,7 +113,7 @@ public class DetailsViewPart extends AbstractCdmViewPart implements IPartContent
 
        @Override
        protected Object getInitialInput() {
-               return selectionService.getSelection();
+               return ((IStructuredSelection) selectionService.getSelection()).getFirstElement();
        }
        
        @Override
@@ -128,4 +121,9 @@ public class DetailsViewPart extends AbstractCdmViewPart implements IPartContent
                super.dispose();
                selectionService.removePostSelectionListener(this);
        }
+
+       public boolean onComplete() {
+               // TODO Auto-generated method stub
+               return false;
+       }
 }
index 1d9e48ae9e26a035ce968949f5756ca568507f76..154e32a474b6e434ae9be1975e38b1d9676a85a7 100644 (file)
@@ -17,8 +17,6 @@ import org.eclipse.swt.SWT;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.ui.forms.widgets.Section;
 
-import eu.etaxonomy.cdm.api.conversation.ConversationHolder;
-import eu.etaxonomy.cdm.api.conversation.IConversationEnabled;
 import eu.etaxonomy.cdm.model.agent.Person;
 import eu.etaxonomy.cdm.model.agent.Team;
 import eu.etaxonomy.cdm.model.agent.TeamOrPersonBase;
@@ -29,18 +27,17 @@ import eu.etaxonomy.cdm.model.name.NonViralName;
 import eu.etaxonomy.cdm.model.occurrence.DerivedUnitBase;
 import eu.etaxonomy.cdm.model.reference.ReferenceBase;
 import eu.etaxonomy.cdm.model.taxon.TaxonBase;
-import eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeMap;
 import eu.etaxonomy.taxeditor.editor.EditorUtil;
 import eu.etaxonomy.taxeditor.editor.MultiPageTaxonEditor;
 import eu.etaxonomy.taxeditor.editor.Page;
-import eu.etaxonomy.taxeditor.editor.name.AbstractNameComposite;
+import eu.etaxonomy.taxeditor.editor.name.AbstractGroupedContainer;
 import eu.etaxonomy.taxeditor.editor.name.TaxonNameEditor;
 import eu.etaxonomy.taxeditor.editor.view.AbstractCdmDataViewer;
 import eu.etaxonomy.taxeditor.editor.view.AbstractCdmViewPart;
 import eu.etaxonomy.taxeditor.forms.AbstractFormSection;
-import eu.etaxonomy.taxeditor.forms.RootElement;
 import eu.etaxonomy.taxeditor.forms.CdmFormFactory.DetailType;
 import eu.etaxonomy.taxeditor.forms.CdmFormFactory.EntityDetailType;
+import eu.etaxonomy.taxeditor.forms.RootElement;
 
 /**
  * @author n.hoffmann
@@ -71,7 +68,7 @@ public class DetailsViewer extends AbstractCdmDataViewer {
 
        private ISelection selection;
 
-       private AbstractNameComposite sourceNameComposite;
+       private AbstractGroupedContainer sourceContainer;
        
        /**
         * @param parent
@@ -94,9 +91,9 @@ public class DetailsViewer extends AbstractCdmDataViewer {
                                MultiPageTaxonEditor editor = EditorUtil.getActiveMultiPageTaxonEditor();
                                if(editor != null){
                                        TaxonNameEditor page = (TaxonNameEditor) editor.getPage(Page.NAME);
-                                       for(AbstractNameComposite nameComposite : page.getNameComposites()){
-                                               if(nameComposite.getTaxonBase() == getInput()){
-                                                       sourceNameComposite = nameComposite;
+                                       for(AbstractGroupedContainer container : page.getGroupedContainers()){
+                                               if(container.getData() == getInput()){
+                                                       sourceContainer = container;
                                                }
                                        }
                                }                               
index c8b49960e426e8c34120ad5dc33cd3adf0b59ee4..68b525e22208238af9899ddae04e2559aea3fc93 100644 (file)
@@ -107,4 +107,9 @@ public class MediaViewPart extends AbstractCdmViewPart implements IPartContentHa
        protected Object getInitialInput() {
                return getEditor().getEditorInput();
        }
+
+       public boolean onComplete() {
+               // TODO Auto-generated method stub
+               return false;
+       }
 }
index 95790d693e40b984a82b25065564a57017078251..a415dbf91f7f20278a653396f2765deb504e7389 100644 (file)
@@ -8,7 +8,6 @@ import org.eclipse.core.commands.AbstractHandler;
 import org.eclipse.core.commands.ExecutionEvent;\r
 import org.eclipse.core.commands.ExecutionException;\r
 import org.eclipse.core.commands.common.NotDefinedException;\r
-import org.eclipse.core.commands.operations.IUndoableOperation;\r
 import org.eclipse.ui.IEditorInput;\r
 import org.eclipse.ui.IEditorPart;\r
 import org.eclipse.ui.IWorkbenchPart;\r
@@ -18,6 +17,7 @@ import org.eclipse.ui.handlers.HandlerUtil;
 import eu.etaxonomy.cdm.model.taxon.Taxon;\r
 import eu.etaxonomy.taxeditor.editor.EditorUtil;\r
 import eu.etaxonomy.taxeditor.editor.TaxonEditorInput;\r
+import eu.etaxonomy.taxeditor.operations.AbstractPostOperation;\r
 import eu.etaxonomy.taxeditor.operations.CreateTaxonDescriptionOperation;\r
 import eu.etaxonomy.taxeditor.operations.IPostOperationEnabled;\r
 \r
@@ -43,7 +43,7 @@ public class AddImageGalleryHandler extends AbstractHandler {
                IEditorInput input = editor.getEditorInput();\r
                if (input instanceof TaxonEditorInput) {\r
                        Taxon taxon = ((TaxonEditorInput) input).getTaxon();    \r
-                       IUndoableOperation operation;\r
+                       AbstractPostOperation operation;\r
                        try {\r
                                // TODO use undo context specific to editor\r
                                operation = new CreateTaxonDescriptionOperation(event.getCommand().getName(), \r
index c7a0f71ed3336ff60c22f54af1da06f707b28457..98112dc340a376f373343ced1695754981cc7670 100644 (file)
@@ -8,7 +8,6 @@ import org.eclipse.core.commands.AbstractHandler;
 import org.eclipse.core.commands.ExecutionEvent;\r
 import org.eclipse.core.commands.ExecutionException;\r
 import org.eclipse.core.commands.common.NotDefinedException;\r
-import org.eclipse.core.commands.operations.IUndoableOperation;\r
 import org.eclipse.jface.viewers.ISelection;\r
 import org.eclipse.jface.viewers.TreePath;\r
 import org.eclipse.jface.viewers.TreeSelection;\r
@@ -22,6 +21,7 @@ import eu.etaxonomy.cdm.model.description.DescriptionBase;
 import eu.etaxonomy.cdm.model.taxon.Taxon;\r
 import eu.etaxonomy.taxeditor.editor.EditorUtil;\r
 import eu.etaxonomy.taxeditor.editor.TaxonEditorInput;\r
+import eu.etaxonomy.taxeditor.operations.AbstractPostOperation;\r
 import eu.etaxonomy.taxeditor.operations.AddMediaToImageGalleryOperation;\r
 import eu.etaxonomy.taxeditor.operations.IPostOperationEnabled;\r
 \r
@@ -62,7 +62,7 @@ public class CreateMediaHandler extends AbstractHandler {
                                        }\r
                                }\r
                                \r
-                               IUndoableOperation operation = null;\r
+                               AbstractPostOperation operation = null;\r
                                try {\r
                                        // TODO use undo context specific to editor\r
                                        operation = new AddMediaToImageGalleryOperation(event.getCommand().getName(), \r
index 21575f8c41f386266a68b83ca12cc3822596835b..d26b414b07f96e581fdfb8a8a8af579b22917065 100644 (file)
@@ -8,7 +8,6 @@ import org.eclipse.core.commands.AbstractHandler;
 import org.eclipse.core.commands.ExecutionEvent;
 import org.eclipse.core.commands.ExecutionException;
 import org.eclipse.core.commands.common.NotDefinedException;
-import org.eclipse.core.commands.operations.IUndoableOperation;
 import org.eclipse.jface.viewers.ISelection;
 import org.eclipse.jface.viewers.TreePath;
 import org.eclipse.jface.viewers.TreeSelection;
@@ -23,6 +22,7 @@ import eu.etaxonomy.cdm.model.media.ImageFile;
 import eu.etaxonomy.cdm.model.taxon.Taxon;
 import eu.etaxonomy.taxeditor.editor.EditorUtil;
 import eu.etaxonomy.taxeditor.editor.TaxonEditorInput;
+import eu.etaxonomy.taxeditor.operations.AbstractPostOperation;
 import eu.etaxonomy.taxeditor.operations.IPostOperationEnabled;
 import eu.etaxonomy.taxeditor.operations.RemoveImageFromDescriptionElementOperation;
 
@@ -63,7 +63,7 @@ public class DeleteMediaHandler extends AbstractHandler {
                                }
                                ImageFile image = (ImageFile) paths[0].getLastSegment();
                                
-                               IUndoableOperation operation = null;
+                               AbstractPostOperation operation = null;
                                try {
                                        // TODO use undo context specific to editor
                                        operation = new RemoveImageFromDescriptionElementOperation(event.getCommand().getName(), 
index e9e3a977a7ddaea81e6173b197cbed5d4ca77881..c3de05de82ac6f63db943e7d791e8e0999035082 100644 (file)
@@ -13,7 +13,6 @@ import org.eclipse.core.commands.AbstractHandler;
 import org.eclipse.core.commands.ExecutionEvent;\r
 import org.eclipse.core.commands.ExecutionException;\r
 import org.eclipse.core.commands.common.NotDefinedException;\r
-import org.eclipse.core.commands.operations.IUndoableOperation;\r
 import org.eclipse.jface.viewers.ISelection;\r
 import org.eclipse.jface.viewers.TreePath;\r
 import org.eclipse.jface.viewers.TreeSelection;\r
@@ -29,6 +28,7 @@ import eu.etaxonomy.cdm.model.taxon.Taxon;
 import eu.etaxonomy.taxeditor.editor.EditorUtil;\r
 import eu.etaxonomy.taxeditor.editor.TaxonEditorInput;\r
 import eu.etaxonomy.taxeditor.editor.view.descriptive.handler.CreateDescriptionElementHandler;\r
+import eu.etaxonomy.taxeditor.operations.AbstractPostOperation;\r
 import eu.etaxonomy.taxeditor.operations.IPostOperationEnabled;\r
 import eu.etaxonomy.taxeditor.operations.MoveMediaInListOperation;\r
 \r
@@ -69,7 +69,7 @@ public class MoveImageDownInListHandler extends AbstractHandler {
                                        }\r
                                }                               \r
                                Media media = (Media) paths[0].getLastSegment();\r
-                               IUndoableOperation operation = null;\r
+                               AbstractPostOperation operation = null;\r
                                try {\r
                                        // TODO use undo context specific to editor\r
                                        operation = new MoveMediaInListOperation(event.getCommand().getName(), \r
index aebc5072671c27a01a729ed7611751f23ea3e115..190eda9bc4d0e801aa0acb408260021f22d942e0 100644 (file)
@@ -29,6 +29,7 @@ import eu.etaxonomy.cdm.model.taxon.Taxon;
 import eu.etaxonomy.taxeditor.editor.EditorUtil;\r
 import eu.etaxonomy.taxeditor.editor.TaxonEditorInput;\r
 import eu.etaxonomy.taxeditor.editor.view.descriptive.handler.CreateDescriptionElementHandler;\r
+import eu.etaxonomy.taxeditor.operations.AbstractPostOperation;\r
 import eu.etaxonomy.taxeditor.operations.IPostOperationEnabled;\r
 import eu.etaxonomy.taxeditor.operations.MoveMediaInListOperation;\r
 \r
@@ -68,7 +69,7 @@ public class MoveImageUpInListHandler extends AbstractHandler {
                                        }\r
                                }                               \r
                                Media media = (Media) paths[0].getLastSegment();\r
-                               IUndoableOperation operation = null;\r
+                               AbstractPostOperation operation = null;\r
                                try {\r
                                        // TODO use undo context specific to editor\r
                                        operation = new MoveMediaInListOperation(event.getCommand().getName(), \r
index ec2c50a3a8ab0e4bb9cefb828a77fdbe6394d279..7e312f3080dca4cb73e42e398052c4e34569135a 100644 (file)
@@ -86,7 +86,13 @@ public class SupplementalDataViewPart extends AbstractCdmViewPart {
 
        @Override
        protected Object getInitialInput() {
-               return ((TaxonEditorInput) getEditor().getEditorInput()).getTaxon();
+               return ((IStructuredSelection) selectionService.getSelection()).getFirstElement();
+       }
+
+
+       public boolean onComplete() {
+               // TODO Auto-generated method stub
+               return false;
        }
        
        
index 0c2601e0d38659334b0f77030c16169f0d80034f..bb2a356456ee5e8e491f75578959a983ed8e263e 100644 (file)
@@ -23,6 +23,7 @@ import eu.etaxonomy.cdm.model.common.AnnotatableEntity;
 import eu.etaxonomy.cdm.model.common.IdentifiableEntity;
 import eu.etaxonomy.cdm.model.common.VersionableEntity;
 import eu.etaxonomy.cdm.model.media.IdentifiableMediaEntity;
+import eu.etaxonomy.taxeditor.editor.name.AbstractGroupedContainer;
 import eu.etaxonomy.taxeditor.editor.view.AbstractCdmDataViewer;
 import eu.etaxonomy.taxeditor.editor.view.AbstractCdmViewPart;
 import eu.etaxonomy.taxeditor.editor.view.detail.DetailsViewer;
@@ -86,22 +87,30 @@ public class SupplementalDataViewer extends AbstractCdmDataViewer implements ISe
        @Override
        protected void showParts() {
                
-               if(getInput() instanceof IdentifiableMediaEntity){
+               Object input;
+               
+               if(getInput() instanceof AbstractGroupedContainer){
+                       input = ((AbstractGroupedContainer) getInput()).getData();
+               }else{
+                       input = getInput();
+               }
+               
+               if(input instanceof IdentifiableMediaEntity){
                        if(currentViewPart != VIEW_PART.IdentifiableMediaEntity){
                                currentViewPart = VIEW_PART.IdentifiableMediaEntity;
                                createIdentifiableMediaSections(rootElement);
                        }
-               }else if(getInput() instanceof IdentifiableEntity){
+               }else if(input instanceof IdentifiableEntity){
                        if(currentViewPart != VIEW_PART.IdentifiableEntity){
                                currentViewPart = VIEW_PART.IdentifiableEntity;
                                createIdentifiableSections(rootElement);
                        }
-               }else if(getInput() instanceof AnnotatableEntity){
+               }else if(input instanceof AnnotatableEntity){
                        if(currentViewPart != VIEW_PART.AnnotatableEntity){
                                currentViewPart = VIEW_PART.AnnotatableEntity;
                                createAnnotationSections(rootElement);
                        }
-               }else if(getInput() instanceof VersionableEntity){
+               }else if(input instanceof VersionableEntity){
                        if(currentViewPart != VIEW_PART.VersionableEntity){
                                currentViewPart = VIEW_PART.VersionableEntity;
                                createHeadlineSection(rootElement);
index 7eb6541c1fbedd488e72eaa5018a706ed1c3e0cb..af99df81fc8254e5b8095d2891806917a3daccfe 100644 (file)
@@ -723,7 +723,7 @@ public class CdmFormFactory extends FormToolkit{
 
                public void dispose() {
                        if (boldFont != null) {
-                               FormFonts.getInstance().markFinished(boldFont);
+                               FormFonts.getInstance().markFinished(boldFont, getColors().getDisplay());
                                boldFont = null;
                        }
                }
index 9c1da89178cb67e0c948535e5143a7a2dc8a8b9e..69727c01a7ed4038997a2167ebdab5228d3df754 100644 (file)
@@ -121,7 +121,7 @@ public class TextWithLabelElement extends AbstractCdmFormElement implements Modi
        }
 
        public void setIrrelevant(boolean irrelevant) {
-               String colorId = irrelevant ? Resources.COLOR_COMPOSITE_IRRELEVANT : Resources.COLOR_COMPOSITE_BACKGROUND;
+               String colorId = irrelevant ? Resources.COLOR_COMPOSITE_IRRELEVANT : Resources.COLOR_COMPOSITE_BACKGROUND;
                
                Color color = EditorUtil.getColor(colorId);
                text.setBackground(color);
index 2fee4bfe745c2103e1434d5c5959acbb294ee023..b62b8f291a6aa057ce2e94dae0664ef0747a0517 100644 (file)
          version="0.0.0"
          unpack="false"/>
 
-   <plugin
-         id="org.eclipse.core.resources.compatibility"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         fragment="true"
-         unpack="false"/>
-
    <plugin
          id="org.eclipse.core.runtime"
          download-size="0"
          version="0.0.0"
          unpack="false"/>
 
-   <plugin
-         id="org.eclipse.pde.source"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
    <plugin
          id="org.eclipse.swt"
          download-size="0"
          version="0.0.0"
          unpack="false"/>
 
-   <plugin
-         id="org.junit4"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"/>
-
    <plugin
          id="org.eclipse.update.core.win32"
          os="win32"
          version="0.0.0"
          unpack="false"/>
 
-   <plugin
-         id="org.eclipse.equinox.p2.exemplarysetup"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
    <plugin
          id="org.eclipse.equinox.simpleconfigurator"
          download-size="0"
          fragment="true"
          unpack="false"/>
 
+   <plugin
+         id="org.junit"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"/>
+
+   <plugin
+         id="org.eclipse.compare"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
+   <plugin
+         id="org.eclipse.ltk.core.refactoring"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
+   <plugin
+         id="org.eclipse.ltk.ui.refactoring"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
+   <plugin
+         id="org.eclipse.team.core"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
+   <plugin
+         id="org.eclipse.team.ui"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
 </feature>
index e71eaa31e750d9096db3061558d85bd8f984a761..0f43273733d73a1e7f7e333fb63de7e9da0a70d8 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <?pde version="3.5"?>
 
-<product name="%productName" id="eu.etaxonomy.taxeditor.application.product" application="eu.etaxonomy.taxeditor.application.application" version="2.1.2.qualifier" useFeatures="true" includeLaunchers="true">
+<product name="%productName" uid="eu.etaxonomy.taxeditor" id="eu.etaxonomy.taxeditor.application.product" application="eu.etaxonomy.taxeditor.application.application" version="2.1.2.qualifier" useFeatures="true" includeLaunchers="true">
 
    <aboutInfo>
       <text>
index 7de422b5b48dadb0590dcf10552bc906dc24153d..b22685b18416fa8bb14c4c2ade2464ad8ca44538 100644 (file)
    <extension
          point="org.eclipse.ui.navigator.navigatorContent">
       <navigatorContent
-            contentProvider="eu.etaxonomy.taxeditor.navigation.navigator.TaxonomicTreeContentProvider"
+            contentProvider="eu.etaxonomy.taxeditor.navigation.navigator.ClassificationContentProvider"
             id="eu.etaxonomy.taxeditor.navigation.taxonomictreecontent"
-            labelProvider="eu.etaxonomy.taxeditor.navigation.navigator.TaxonomicTreeLabelProvider"
+            labelProvider="eu.etaxonomy.taxeditor.navigation.navigator.ClassificationLabelProvider"
             name="Taxonomic Tree">
          <triggerPoints>
             <instanceof
             contentProvider="eu.etaxonomy.taxeditor.navigation.navigator.SynonymContentProvider"
             id="eu.etaxonomy.taxeditor.navigation.synonymcontent"
             labelProvider="eu.etaxonomy.taxeditor.navigation.navigator.SynonymLabelProvider"
-            name="Synonyms"
+            name="Synonyms (experimental)"
             priority="highest">
          <triggerPoints>
             <and>
index c0634673b1f035381ea474cb0479cec997c4c45a..9c4fc0c1ffa9022e0c1213e617db82f010856827 100644 (file)
@@ -20,7 +20,9 @@ import org.eclipse.core.commands.common.NotDefinedException;
 import org.eclipse.core.commands.operations.IUndoContext;
 import org.eclipse.core.commands.operations.UndoContext;
 import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.swt.widgets.Display;
 import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.IEditorPart;
 import org.eclipse.ui.IEditorReference;
 import org.eclipse.ui.IWorkbenchWindow;
 import org.eclipse.ui.PartInitException;
@@ -170,17 +172,24 @@ public class NavigationUtil extends AbstractUtility{
         * @param element
         * @param parentElement
         */
-       public static void selectInNavigator(Object element, Object parentElement) {
-               TaxonNavigator navigator = showNavigator();
-               if (navigator != null) {
-                       CommonViewer viewer = navigator.getCommonViewer();
-                       if (viewer != null) {
-                               if (parentElement != null) {
-                                       viewer.setExpandedState(parentElement, true);
+       public static void selectInNavigator(final Object element, final Object parentElement) {
+               Display.getDefault().asyncExec(new Runnable(){
+
+                       public void run() {
+                               TaxonNavigator navigator = showNavigator();
+
+                               if (navigator != null) {
+                                       CommonViewer viewer = navigator.getCommonViewer();
+                                       if (viewer != null) {
+                                               if (parentElement != null) {
+                                                       viewer.setExpandedState(parentElement, true);
+                                               }
+                                               viewer.setSelection(new StructuredSelection((TaxonNode) element));
+                                       }
                                }
-                               viewer.setSelection(new StructuredSelection((TaxonNode) element));
                        }
-               }
+                       
+               });
        }
 
        /**
@@ -245,4 +254,8 @@ public class NavigationUtil extends AbstractUtility{
        public static TaxonNavigator getNavigator(boolean restore) {
                return (TaxonNavigator) getView(TaxonNavigator.ID, restore);
        }
+
+       public static Set<IEditorPart> getOpenEditors() {
+               return EditorUtil.getOpenEditors();
+       }
 }
\ No newline at end of file
index a52d9b1b9a78c9d0e7feccf3fc7481eaa3344dc4..9e7d04c4ba0700588dcd2c38c1593ac9102cedac 100644 (file)
@@ -11,6 +11,7 @@ import org.eclipse.core.runtime.IPath;
 import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.jface.dialogs.ProgressMonitorDialog;
 import org.eclipse.jface.operation.IRunnableWithProgress;
+import org.eclipse.swt.widgets.Display;
 import org.eclipse.ui.IEditorInput;
 import org.eclipse.ui.IEditorPart;
 import org.eclipse.ui.IMemento;
@@ -114,7 +115,6 @@ public class StateManager implements IContextListener {
                        return;
                }
                
-               ProgressMonitorDialog progressMonitorDialog = new ProgressMonitorDialog(NavigationUtil.getShell());
                IRunnableWithProgress runnable = new IRunnableWithProgress() {
                        
                        public void run(IProgressMonitor monitor) throws InvocationTargetException,
@@ -142,7 +142,7 @@ public class StateManager implements IContextListener {
                };
                
                try {
-                       progressMonitorDialog.run(false, true, runnable);
+                       NavigationUtil.run(false, true, runnable);
                } catch (InvocationTargetException e) {
                        logger.error("InvocationTargetException when trying to restore open editors", e);
                } catch (InterruptedException e) {
index 2da2c6cd94c53a80f9d561dc268cda81d541226b..94e2e84bda69a7d58eb1d3f8bd4dbee1cdec9cba 100644 (file)
@@ -20,7 +20,6 @@ import org.eclipse.core.commands.ExecutionEvent;
 import org.eclipse.core.commands.ExecutionException;
 import org.eclipse.core.commands.IHandler;
 import org.eclipse.core.commands.common.NotDefinedException;
-import org.eclipse.core.commands.operations.IUndoableOperation;
 import org.eclipse.core.runtime.IStatus;
 import org.eclipse.core.runtime.Status;
 import org.eclipse.jface.dialogs.MessageDialog;
@@ -36,6 +35,7 @@ import eu.etaxonomy.cdm.model.taxon.TaxonNode;
 import eu.etaxonomy.taxeditor.editor.TaxonEditorInput;
 import eu.etaxonomy.taxeditor.navigation.NavigationUtil;
 import eu.etaxonomy.taxeditor.navigation.navigator.TaxonNavigator;
+import eu.etaxonomy.taxeditor.operations.AbstractPostOperation;
 import eu.etaxonomy.taxeditor.operations.DeleteTreeNodeOperation;
 
 /**
@@ -72,7 +72,7 @@ public class DeleteTreeNodeHandler extends AbstractHandler implements IHandler{
                                treeNodes.add((ITreeNode) object);
                }
                        
-               IUndoableOperation operation = null;
+               AbstractPostOperation operation = null;
                try {
                        operation = new DeleteTreeNodeOperation(event.getCommand().getName(), NavigationUtil.getUndoContext(), treeNodes, taxonNavigator, taxonNavigator);
                        
index 0977cfdd6611fc4f92f1802b5be13c5c6718fd2a..d1afd841e1c1ba8947d4204aee489e1f2676af14 100644 (file)
@@ -15,9 +15,14 @@ import org.eclipse.core.commands.AbstractHandler;
 import org.eclipse.core.commands.ExecutionEvent;
 import org.eclipse.core.commands.ExecutionException;
 import org.eclipse.core.commands.IHandler;
+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.ISelection;
 import org.eclipse.jface.viewers.StructuredSelection;
 import org.eclipse.jface.wizard.WizardDialog;
+import org.eclipse.swt.widgets.Display;
 import org.eclipse.ui.handlers.HandlerUtil;
 
 import eu.etaxonomy.cdm.model.common.CdmBase;
@@ -42,7 +47,7 @@ public class EditHandler extends AbstractHandler implements IHandler{
                ISelection selection = HandlerUtil.getCurrentSelection(event);//navigator.getSelection();
                
                if(selection instanceof StructuredSelection){
-                       StructuredSelection structuredSelection = (StructuredSelection) selection;
+                       final StructuredSelection structuredSelection = (StructuredSelection) selection;
                        
                        if(structuredSelection.size() == 1 && structuredSelection.getFirstElement() instanceof TaxonomicTree){
                                
@@ -51,15 +56,31 @@ public class EditHandler extends AbstractHandler implements IHandler{
                                
                        }
                        else{
-                               for(Object selectedObject : structuredSelection.toArray()){
+
+                               Job job = new Job("Opening editor") {
                                        
-                                       if(selectedObject instanceof CdmBase){
-                                               // let the openEditor() method handle everything from now on
-                                               NavigationUtil.openEditor((CdmBase) selectedObject);
-                                       }else{
-                                               throw new IllegalArgumentException("selectedObject is not of type CdmBase");
+                                       @Override
+                                       protected IStatus run(IProgressMonitor monitor) {
+                                               for(final Object selectedObject : structuredSelection.toArray()){
+                                                       
+                                                       if(selectedObject instanceof CdmBase){
+                                                               // let the openEditor() method handle everything from now on
+                                                               Display.getDefault().asyncExec(new Runnable(){
+
+                                                                       public void run() {
+                                                                               NavigationUtil.openEditor((CdmBase) selectedObject);
+                                                                       }
+                                                                       
+                                                               });
+                                                       }else{
+                                                               throw new IllegalArgumentException("selectedObject is not of type CdmBase");
+                                                       }
+                                               }
+                                               return Status.OK_STATUS;
                                        }
-                               }
+                               };
+                               
+                               job.schedule();
                        }
                }
                
index 1ff407e31f602f9d5bd5f079fb3030423c1fa5b0..def5fe20abdcc17ed0b0521a70634e22bb0beb6c 100644 (file)
@@ -20,10 +20,8 @@ import org.apache.log4j.Logger;
 import org.eclipse.core.commands.AbstractHandler;
 import org.eclipse.core.commands.ExecutionEvent;
 import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.commands.operations.IUndoableOperation;
 import org.eclipse.jface.dialogs.MessageDialog;
 import org.eclipse.jface.viewers.TreeSelection;
-import org.eclipse.ui.PartInitException;
 import org.eclipse.ui.handlers.HandlerUtil;
 
 import eu.etaxonomy.cdm.model.common.CdmBase;
@@ -31,6 +29,7 @@ import eu.etaxonomy.cdm.model.taxon.TaxonNode;
 import eu.etaxonomy.taxeditor.dialogs.filteredSelection.FilteredTaxonNodeSelectionDialog;
 import eu.etaxonomy.taxeditor.navigation.NavigationUtil;
 import eu.etaxonomy.taxeditor.navigation.navigator.TaxonNavigator;
+import eu.etaxonomy.taxeditor.operations.AbstractPostOperation;
 import eu.etaxonomy.taxeditor.operations.IPostOperationEnabled;
 import eu.etaxonomy.taxeditor.operations.MoveTaxonOperation;
 
@@ -78,7 +77,7 @@ public class MoveTaxonHandler extends AbstractHandler implements IPostOperationE
                                return null;
                        }
                        
-                       IUndoableOperation operation = new MoveTaxonOperation
+                       AbstractPostOperation operation = new MoveTaxonOperation
                                        ("Move taxon to new parent", NavigationUtil.getUndoContext(), 
                                                        taxonNodes, parentTaxonNode, this, taxonNavigator); //$NON-NLS-1$
                        NavigationUtil.executeOperation(operation);
@@ -94,4 +93,9 @@ public class MoveTaxonHandler extends AbstractHandler implements IPostOperationE
        public boolean postOperation(CdmBase objectAffectedByOperation) {
                return true;
        }
+
+       public boolean onComplete() {
+               // TODO Auto-generated method stub
+               return false;
+       }
 }
\ No newline at end of file
@@ -14,16 +14,14 @@ import org.apache.log4j.Logger;
 import org.eclipse.jface.viewers.ITreeContentProvider;
 import org.eclipse.jface.viewers.Viewer;
 
-import eu.etaxonomy.cdm.model.taxon.TaxonomicTree;
-
 /**
  * @author n.hoffmann
  * @created 17.06.2009
  * @version 1.0
  */
-public class TaxonomicTreeContentProvider implements ITreeContentProvider {
+public class ClassificationContentProvider implements ITreeContentProvider {
        private static final Logger logger = Logger
-                       .getLogger(TaxonomicTreeContentProvider.class);
+                       .getLogger(ClassificationContentProvider.class);
 
        /* (non-Javadoc)
         * @see org.eclipse.jface.viewers.ITreeContentProvider#getChildren(java.lang.Object)
@@ -32,11 +30,7 @@ public class TaxonomicTreeContentProvider implements ITreeContentProvider {
                if (parentElement instanceof Root) {
                        return ((Root) parentElement).getParentBeans().toArray();
                }
-               
-//             if(parentElement instanceof TaxonomicTree) {
-//                     return ((TaxonomicTree) parentElement).getRootNodes().toArray();
-//             }
-               
+
                return new Object[0];
        }
 
similarity index 94%
rename from taxeditor-navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/navigator/TaxonomicTreeLabelProvider.java
rename to taxeditor-navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/navigator/ClassificationLabelProvider.java
index 4e10da8fedfff41fdb8f4f2813a53e5e9441d23d..63ea758ca49432ff4cd66931802e00b5a8b50bf3 100644 (file)
@@ -25,10 +25,10 @@ import eu.etaxonomy.cdm.model.taxon.TaxonomicTree;
  * @created 17.06.2009
  * @version 1.0
  */
-public class TaxonomicTreeLabelProvider extends ColumnLabelProvider 
+public class ClassificationLabelProvider extends ColumnLabelProvider 
 implements ILabelProvider, IDescriptionProvider, IStyledLabelProvider {
        private static final Logger logger = Logger
-                       .getLogger(TaxonomicTreeLabelProvider.class);
+                       .getLogger(ClassificationLabelProvider.class);
        
        /* (non-Javadoc)
         * @see org.eclipse.jface.viewers.ColumnLabelProvider#getImage(java.lang.Object)
index 736db100a0edf750af1b579aece4b6bd151199e6..739e5f48055b045d77611deaaeb5a7827f6bf4d3 100644 (file)
@@ -109,7 +109,6 @@ public class TaxonNavigator extends CommonNavigator implements IPostOperationEna
         */\r
        public void restore(final IMemento memento) {\r
                \r
-               ProgressMonitorDialog progressMonitorDialog = new ProgressMonitorDialog(NavigationUtil.getShell());\r
                IRunnableWithProgress runnable = new IRunnableWithProgress() {\r
                        \r
                        public void run(IProgressMonitor monitor) throws InvocationTargetException,\r
@@ -162,7 +161,7 @@ public class TaxonNavigator extends CommonNavigator implements IPostOperationEna
                };\r
                \r
                try {\r
-                       progressMonitorDialog.run(false, true, runnable);\r
+                       NavigationUtil.run(false, true, runnable);\r
                } catch (InvocationTargetException e) {\r
                        logger.error("InvocationTargetException when trying to restore navigator", e);\r
                } catch (InterruptedException e) {\r
@@ -337,7 +336,13 @@ public class TaxonNavigator extends CommonNavigator implements IPostOperationEna
                                logger.error("An exception occured while trying to open a selection", e);\r
                        }\r
                }\r
-               // Pass the double click up to the super-class so it can expand/collapse trees\r
-               super.handleDoubleClick(anEvent);\r
+               // If the double click is passed up to the super-class it will expand/collapse trees.\r
+               // We do not want that\r
+               //super.handleDoubleClick(anEvent);\r
+       }\r
+\r
+       public boolean onComplete() {\r
+               // TODO Auto-generated method stub\r
+               return false;\r
        }\r
 }
\ No newline at end of file
index c7c7e5d7050fe44480b5a7e686ad87eacbf77b1a..a22f79024e3146521d169655ae3bd7da792e5861 100644 (file)
@@ -13,16 +13,24 @@ import java.util.HashSet;
 import java.util.Set;
 
 import org.apache.log4j.Logger;
+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.swt.widgets.Display;
+import org.eclipse.ui.IEditorPart;
 
 import eu.etaxonomy.cdm.model.common.CdmBase;
 import eu.etaxonomy.cdm.model.name.TaxonNameBase;
-import eu.etaxonomy.cdm.model.taxon.Synonym;
+import eu.etaxonomy.cdm.model.taxon.ITreeNode;
 import eu.etaxonomy.cdm.model.taxon.Taxon;
 import eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeEvent;
-import eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeMap;
 import eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeEvent.EventType;
+import eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeMap;
+import eu.etaxonomy.taxeditor.editor.TaxonEditorInput;
 import eu.etaxonomy.taxeditor.model.AbstractDataChangeBehaviour;
 import eu.etaxonomy.taxeditor.model.IDataChangeBehavior;
+import eu.etaxonomy.taxeditor.navigation.NavigationUtil;
 
 /**
  * @author n.hoffmann
@@ -54,19 +62,47 @@ public class TaxonNavigatorDataChangeBehavior extends AbstractDataChangeBehaviou
                
                for(CdmDataChangeEvent event : events.getAllEvents()){
                        EventType eventType = event.getEventType();
-                       // react on everything except load
-                       if(eventType == EventType.INSERT || eventType == EventType.UPDATE || eventType == EventType.DELETE){
-                               relevant = true;
-                               CdmBase entity = event.getEntity();
-                               if((entity instanceof TaxonNameBase)
-                                               || (entity instanceof Taxon)
-                                               || (entity instanceof Synonym)){
-                                       staleObjects.add(entity);
+                       CdmBase eventEntity = event.getEntity();
+                       
+                       // all tree node changes are relevant
+                       if((eventType == EventType.INSERT || eventType == EventType.DELETE || eventType == EventType.UPDATE) 
+                                       && event.getEntity() instanceof ITreeNode){
+                               return true;
+                       }
+                       
+                       // name updates of the accepted taxon of open editors are relevant
+                       if(eventType == EventType.UPDATE){
+                               TaxonNameBase name = null;
+                               if(eventEntity instanceof TaxonNameBase){
+                                       name = (TaxonNameBase) eventEntity;
+                               }else if(eventEntity instanceof Taxon){
+                                       name = ((Taxon) eventEntity).getName();
+                               }else{
+                                       continue;
+                               }
+                               
+                               Set<IEditorPart> openEditors = NavigationUtil.getOpenEditors();
+                               for(IEditorPart editor : openEditors){
+                                       
+                                       if(name.equals(((TaxonEditorInput) editor.getEditorInput()).getTaxon().getName())){
+                                               return true;
+                                       }
                                }
                        }
+                       
+                       
+//                     if(eventType == EventType.UPDATE){
+//                             relevant = true;
+//                             CdmBase entity = event.getEntity();
+//                             if((entity instanceof TaxonNameBase)
+//                                             || (entity instanceof Taxon)
+//                                             || (entity instanceof Synonym)){
+//                                     staleObjects.add(entity);
+//                             }
+//                     }
                }
                
-               return relevant;
+               return false;
                
                // @deprecated
                // react on everything except load
@@ -87,25 +123,47 @@ public class TaxonNavigatorDataChangeBehavior extends AbstractDataChangeBehaviou
        public void reactOnDataChange(CdmDataChangeMap events) {
                if(isRelevant(events)){
 
-                       // FIXME @see #1365             
-                       
-                       source.getConversationHolder().bind();
+                       final Display display = Display.getCurrent();
+                       Job job = new Job("Updating Taxon Navigator") {
+                               
+                               @Override
+                               protected IStatus run(IProgressMonitor monitor) {
+                                       monitor.beginTask("Updating Taxon Navigator", 3);
+                                       source.getConversationHolder().bind();
+                                       monitor.worked(1);
+                                       
+                                       // clear the session completely
+                                       monitor.subTask("Clearing Taxon Navigators session");
+                                       source.getConversationHolder().clear();
+                                       // FIXME completely clearing the session is a brute force approach. 
+//                                     // It would be much more elegant to clear only those elements that have been changed.
+//                                     // I could not get that to work but we should consider workin on this because we might
+//                                     // run into serious performance issues, especially when it comes to large trees
+                                       //
+                                       // at least, we moved this to a job so it can run in a background thred
+                                       // seems to improve the situation but not sure if final solution
+                                       monitor.worked(1);
+                                       
+                                       monitor.subTask("Refreshing viewer");
+                                       
+                                       display.asyncExec(new Runnable() {
+                                           public void run() {
+                                               source.refresh();
+                                           }
+                                       });
+                                       
+                                       
+                                       
+                                       monitor.worked(1);
+                                       logger.info("DataStore update caused a refresh of the taxonomic tree");
+                                       monitor.done();
+                                       return Status.OK_STATUS;
+                               }
+                       };
                        
-                       // clear the session completely
-                       source.getConversationHolder().clear();
+                       job.setPriority(Job.SHORT);
+                       job.schedule();
                        
-                       // FIXME completely clearing the session is a brute force approach. 
-                       // It would be much more elegant to clear only those elements that have been changed.
-                       // I could not get that to work but we should consider workin on this because we might
-                       // run into serious performance issues, especially when it comes to large trees
-                       //
-                       // detach all changed objects from the session cache so that they have to be reloaded 
-//                     for (CdmBase staleObject : staleObjects){
-//                             source.getConversationHolder().evict(staleObject);
-//                     }
-                                               
-                       source.refresh();                       
-                       logger.info("DataStore update caused a refresh of the taxonomic tree");
                }
        }
 }
index 4ec2d6001ae73c2e7e83d85c9f3640c2550ab337..4869460eee947657ab94e8bec5f0dc279c685c33 100644 (file)
@@ -46,7 +46,10 @@ public class TaxonNodeContentProvider implements ITreeContentProvider {
        }\r
 \r
        public boolean hasChildren(Object element) {\r
-               return this.getChildren(element).length > 0;\r
+               if(element instanceof TaxonNode){\r
+                       return ((TaxonNode) element).getCountChildren() > 0;\r
+               }\r
+               return getChildren(element).length > 0;\r
        }\r
 \r
        public Object[] getElements(Object inputElement) {\r
index 0c9ec4c0e1715b08790ae5780dd15ba29116e44c..778a90a5d931f38611f0a5729b427374567bc9d6 100644 (file)
@@ -16,7 +16,6 @@ import java.util.Set;
 \r
 import org.apache.log4j.Logger;\r
 import org.eclipse.core.commands.operations.IUndoContext;\r
-import org.eclipse.core.commands.operations.IUndoableOperation;\r
 import org.eclipse.core.runtime.IStatus;\r
 import org.eclipse.core.runtime.Status;\r
 import org.eclipse.jface.dialogs.MessageDialog;\r
@@ -32,6 +31,7 @@ import eu.etaxonomy.cdm.model.common.CdmBase;
 import eu.etaxonomy.cdm.model.taxon.ITreeNode;\r
 import eu.etaxonomy.cdm.model.taxon.TaxonNode;\r
 import eu.etaxonomy.taxeditor.navigation.NavigationUtil;\r
+import eu.etaxonomy.taxeditor.operations.AbstractPostOperation;\r
 import eu.etaxonomy.taxeditor.operations.IPostOperationEnabled;\r
 import eu.etaxonomy.taxeditor.operations.MoveTaxonOperation;\r
 \r
@@ -149,7 +149,7 @@ public class TaxonNodeDropAdapterAssistant extends CommonDropAdapterAssistant im
                        return Status.CANCEL_STATUS;\r
                }\r
 \r
-               IUndoableOperation operation = new MoveTaxonOperation\r
+               AbstractPostOperation operation = new MoveTaxonOperation\r
                                ("Move Taxon", workspaceUndoContext, taxonNodes, targetITreeNode, this, taxonNavigator);\r
                NavigationUtil.executeOperation(operation);     \r
                \r
@@ -163,4 +163,9 @@ public class TaxonNodeDropAdapterAssistant extends CommonDropAdapterAssistant im
        public boolean postOperation(CdmBase objectAffectedByOperation) {\r
                return true;\r
        }\r
+\r
+       public boolean onComplete() {\r
+               // TODO Auto-generated method stub\r
+               return false;\r
+       }\r
 }\r
index f37b99b09b2086e31045532e5c161a99399f29f5..3b24289913350c5b605b2631299dad2aeb5c18ad 100644 (file)
@@ -11,7 +11,6 @@
 package eu.etaxonomy.taxeditor.wizard;
 
 import org.apache.log4j.Logger;
-import org.eclipse.core.commands.operations.AbstractOperation;
 import org.eclipse.jface.viewers.IStructuredSelection;
 import org.eclipse.jface.wizard.Wizard;
 import org.eclipse.ui.INewWizard;
@@ -20,6 +19,7 @@ import org.eclipse.ui.IWorkbench;
 import eu.etaxonomy.cdm.model.taxon.TaxonomicTree;
 import eu.etaxonomy.taxeditor.navigation.NavigationUtil;
 import eu.etaxonomy.taxeditor.navigation.navigator.TaxonNavigator;
+import eu.etaxonomy.taxeditor.operations.AbstractPostOperation;
 import eu.etaxonomy.taxeditor.operations.SaveTaxonomicTreeOperation;
 
 /**
@@ -65,7 +65,7 @@ public class ClassificationWizard extends Wizard implements INewWizard {
                TaxonNavigator taxonNavigator;
                taxonNavigator = (TaxonNavigator) NavigationUtil.showView(TaxonNavigator.ID);
                
-               AbstractOperation operation = new SaveTaxonomicTreeOperation("Save Classification", 
+               AbstractPostOperation operation = new SaveTaxonomicTreeOperation("Save Classification", 
                                NavigationUtil.getUndoContext(), page.getClassification(),
                                taxonNavigator, taxonNavigator);
                NavigationUtil.executeOperation(operation);
index d4ee6c81f8590b1e04331ed81a4a9fd6415639f5..1959ddd7f9a2e440ddbf45887113af3c3ef13971 100644 (file)
@@ -4,7 +4,6 @@
 package eu.etaxonomy.taxeditor.wizard;
 
 import org.apache.log4j.Logger;
-import org.eclipse.core.commands.operations.AbstractOperation;
 import org.eclipse.jface.viewers.IStructuredSelection;
 import org.eclipse.jface.viewers.StructuredSelection;
 import org.eclipse.jface.wizard.Wizard;
@@ -16,6 +15,7 @@ import eu.etaxonomy.cdm.model.taxon.ITreeNode;
 import eu.etaxonomy.cdm.model.taxon.TaxonNode;
 import eu.etaxonomy.taxeditor.navigation.NavigationUtil;
 import eu.etaxonomy.taxeditor.navigation.navigator.TaxonNavigator;
+import eu.etaxonomy.taxeditor.operations.AbstractPostOperation;
 import eu.etaxonomy.taxeditor.operations.CreateTaxonNodeOperation;
 import eu.etaxonomy.taxeditor.operations.IPostOperationEnabled;
 
@@ -67,7 +67,7 @@ public class NewTaxonNodeWizard extends Wizard implements INewWizard, IPostOpera
                if(page.getTaxonName() == null || page.getTaxonName().getFullTitleCache().length() == 0){
                        openEmptyEditor = true;
                }else{                  
-                       AbstractOperation operation = new CreateTaxonNodeOperation("Create Taxon", 
+                       AbstractPostOperation operation = new CreateTaxonNodeOperation("Create Taxon", 
                                        NavigationUtil.getUndoContext(), page.getParentNode(), page.getTaxonName(), this, taxonNavigator);
                        NavigationUtil.executeOperation(operation);
        
@@ -119,4 +119,9 @@ public class NewTaxonNodeWizard extends Wizard implements INewWizard, IPostOpera
                
                return true;
        }
+
+       public boolean onComplete() {
+               // TODO Auto-generated method stub
+               return false;
+       }
 }
index 003f4c9814c76cafc5eec0368329936d43785f40..43ebed11e8a3315116743f90122b458ca10f5d05 100644 (file)
                label="Global Text Color"
                value="0,0,0">
          </colorDefinition>
+         <colorDefinition
+               categoryId="eu.etaxonomy.taxeditor.preferences.themeElementCategory"
+               id="eu.etaxonomy.taxeditor.preferences.colorDefinition.colorCompositeBackground"
+               label="Global Color Composite Background"
+               value="255,255,255">
+         </colorDefinition>
          <colorDefinition
                categoryId="eu.etaxonomy.taxeditor.preferences.themeElementCategory"
                id="eu.etaxonomy.taxeditor.preferences.colorDefinition.colorCompositeIrrelevant"
          </themeElementCategory>
          <colorDefinition
                categoryId="eu.etaxonomy.taxeditor.preferences.themeElementCategory.nameEditor"
-               id="eu.etaxonomy.taxeditor.preferences.colorDefinition.nameEditor.colorCompositeBackground"
-               label="Composite Background"
-               value="250, 250, 250">
+               id="eu.etaxonomy.taxeditor.preferences.colorDefinition.nameEditor.colorContainerBackground"
+               label="Container Background"
+               value="220, 220, 220">
+         </colorDefinition>
+         <colorDefinition
+               categoryId="eu.etaxonomy.taxeditor.preferences.themeElementCategory.nameEditor"
+               id="eu.etaxonomy.taxeditor.preferences.colorDefinition.nameEditor.colorContainerSelectedFocus"
+               label="Container Selected Focus"
+               value="181,213,255">
          </colorDefinition>
          <colorDefinition
                categoryId="eu.etaxonomy.taxeditor.preferences.themeElementCategory.nameEditor"
-               id="eu.etaxonomy.taxeditor.preferences.colorDefinition.nameEditor.colorCompositeSelected"
-               label="Composite Selected"
+               id="eu.etaxonomy.taxeditor.preferences.colorDefinition.nameEditor.colorContainerSelected"
+               label="Container Selected"
                value="210, 210, 210">
          </colorDefinition>
+         <colorDefinition
+               categoryId="eu.etaxonomy.taxeditor.preferences.themeElementCategory.nameEditor"
+               id="eu.etaxonomy.taxeditor.preferences.colorDefinition.nameEditor.colorContainerDragEnter"
+               label="Container Drag Enter"
+               value="185,255,133">
+         </colorDefinition>
          <fontDefinition
                categoryId="eu.etaxonomy.taxeditor.preferences.themeElementCategory.nameEditor"
                id="eu.etaxonomy.taxeditor.preferences.fontDefinition.nameEditor.accepted"
index d62fc28f5e0bc213de3263b4e2a83398f40c04ea..105237af10a10d170cccef4d98f49f0c4d3635e7 100644 (file)
@@ -15,26 +15,29 @@ import java.lang.reflect.InvocationTargetException;
 import org.apache.log4j.Logger;
 import org.eclipse.core.commands.ExecutionException;
 import org.eclipse.core.commands.operations.IOperationHistory;
-import org.eclipse.core.commands.operations.IUndoableOperation;
+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.OperationCanceledException;
 import org.eclipse.core.runtime.Status;
 import org.eclipse.core.runtime.SubProgressMonitor;
+import org.eclipse.core.runtime.jobs.ISchedulingRule;
 import org.eclipse.jface.action.IStatusLineManager;
 import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.dialogs.MessageDialogWithToggle;
 import org.eclipse.jface.operation.IRunnableWithProgress;
 import org.eclipse.jface.resource.ColorRegistry;
 import org.eclipse.jface.resource.FontRegistry;
+import org.eclipse.jface.window.ApplicationWindow;
 import org.eclipse.swt.graphics.Color;
 import org.eclipse.swt.graphics.Font;
+import org.eclipse.swt.widgets.Display;
 import org.eclipse.swt.widgets.Shell;
 import org.eclipse.ui.IViewPart;
 import org.eclipse.ui.IViewReference;
 import org.eclipse.ui.IWorkbench;
 import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchPart;
 import org.eclipse.ui.PartInitException;
 import org.eclipse.ui.PlatformUI;
 import org.eclipse.ui.ide.undo.WorkspaceUndoUtil;
@@ -42,6 +45,8 @@ import org.eclipse.ui.progress.IProgressService;
 import org.eclipse.ui.themes.ITheme;
 import org.eclipse.ui.themes.IThemeManager;
 
+import eu.etaxonomy.taxeditor.operations.AbstractPostOperation;
+import eu.etaxonomy.taxeditor.operations.IPostOperationEnabled;
 import eu.etaxonomy.taxeditor.store.internal.TaxeditorStorePlugin;
 
 /**
@@ -63,10 +68,22 @@ public abstract class AbstractUtility {
        }
        
        public static IWorkbenchPage getActivePage(){
+               
                return TaxeditorStorePlugin.getDefault().getWorkbench()
                        .getActiveWorkbenchWindow().getActivePage();
        }
        
+       public static IWorkbenchPart getActivePart(){
+               return getActivePage().getActivePart();
+       }
+       
+       public static ApplicationWindow getWorkbenchWindow(){
+               if(TaxeditorStorePlugin.getDefault().getWorkbench().getWorkbenchWindowCount() > 1){
+                       throw new IllegalStateException("More than one workbench window");
+               }
+               return (ApplicationWindow) TaxeditorStorePlugin.getDefault().getWorkbench().getWorkbenchWindows()[0];
+       }
+       
        public static IViewPart showView(String id){
                try {
                        return PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().showView(id);
@@ -145,54 +162,102 @@ public abstract class AbstractUtility {
                warningDialog("Not yet implemented", "This functionality is not yet implemented.");
        }
        
-       public static void informationDialog(String title, String message){
-               MessageDialog.openInformation(getShell(), title, message);
+       public static void informationDialog(final String title, final String message){
+               Display.getDefault().asyncExec(new Runnable(){
+
+                       public void run() {
+                               MessageDialog.openInformation(getShell(), title, message);
+                       }
+               });
        }
        
-       public static void warningDialog(String title, String message){
-               MessageDialog.openWarning(getShell(), title, message);
+       public static void warningDialog(final String title, final String message){
+               Display.getDefault().asyncExec(new Runnable(){
+
+                       public void run() {
+                               MessageDialog.openWarning(getShell(), title, message);
+                       }
+               });
        }
        
-       public static void errorDialog(String title, String message){
-               MessageDialog.openError(getShell(), title, message);
+       public static void errorDialog(final String title, final String message){
+               Display.getDefault().asyncExec(new Runnable(){
+
+                       public void run() {
+                               MessageDialog.openError(getShell(), title, message);
+                       }
+               });
        }
 
        public static boolean confirmDialog(String title, String message) {
                return MessageDialog.openQuestion(getShell(), title, message);
        }
        
-       public static IStatus executeOperation(IUndoableOperation operation){
+       public static IStatus executeOperation(final AbstractPostOperation operation){
                if(getOperationHistory() == null){
                        throw new IllegalArgumentException("There is no operation history for this context");
                }
                
-               // Start the main progress monitor.
-        IProgressMonitor newMonitor = startMainMonitor(getMonitor(),operation.getLabel(), 100);
-
-               // Check whether operation was canceled and do some steps.
-        workedChecked(newMonitor, 10);
-
-        try {
-                       IStatus status = getOperationHistory().execute(operation, newMonitor,
-                                       WorkspaceUndoUtil.getUIInfoAdapter(getShell()));
-
-                       // Check whether operation was canceled and do some steps.
-                       workedChecked(newMonitor, 30);
-
-               String statusString = status.equals(Status.OK_STATUS) ? "completed" : "cancelled";
-                       setStatusLine(operation.getLabel() + " " + statusString + ".");
-
-               return status;
-               } catch (ExecutionException e) {
-                       logger.error("Error executing operation: " + operation.getLabel(), e);
-                       errorDialog("Error executing operation: " + operation.getLabel(), "Please refer to the error log.");
+               final IAdaptable uiInfoAdapter = WorkspaceUndoUtil.getUIInfoAdapter(getShell());
+               
+               
+               
+               IRunnableWithProgress runnable = new IRunnableWithProgress() {
+                       
+                       public void run(IProgressMonitor monitor) throws InvocationTargetException,
+                                       InterruptedException {
+                               monitor.beginTask(operation.getLabel(), 100);
+                               IStatus status;
+                               try {
+                                       status = getOperationHistory().execute(operation, monitor, uiInfoAdapter);
+                               } catch (ExecutionException e) {
+                                       throw new RuntimeException(e);
+                               }
+                               monitor.done();
+                       String statusString = status.equals(Status.OK_STATUS) ? "completed" : "cancelled";
+                               setStatusLine(operation.getLabel() + " " + statusString + ".");
+                               
+                       }
+               };
+               
+               try {
+                       runInUI(runnable, null);
+               } catch (InvocationTargetException e) {
+                       throw new RuntimeException(e);
+               } catch (InterruptedException e) {
+                       throw new RuntimeException(e);
                }
-        finally {
-               
-               // Stop the progress monitor.
-            newMonitor.done();
-        }
-               return null;
+               
+//             // Start the main progress monitor.
+//        IProgressMonitor newMonitor = startMainMonitor(getMonitor(),operation.getLabel(), 100);
+//
+//             // Check whether operation was canceled and do some steps.
+//        workedChecked(newMonitor, 10);
+//
+//        try {
+//                     IStatus status = getOperationHistory().execute(operation, newMonitor,
+//                                     WorkspaceUndoUtil.getUIInfoAdapter(getShell()));
+//
+//                     // Check whether operation was canceled and do some steps.
+//                     workedChecked(newMonitor, 30);
+//
+//             String statusString = status.equals(Status.OK_STATUS) ? "completed" : "cancelled";
+//                     setStatusLine(operation.getLabel() + " " + statusString + ".");
+//
+//             return status;
+//             } catch (ExecutionException e) {
+//                     logger.error("Error executing operation: " + operation.getLabel(), e);
+//                     errorDialog("Error executing operation: " + operation.getLabel(), "Please refer to the error log.");
+//             }
+//        finally {
+//             
+//             // Stop the progress monitor.
+//            newMonitor.done();
+//        }
+               
+               IPostOperationEnabled postOperationEnabled = operation.getPostOperationEnabled();
+               postOperationEnabled.onComplete();
+               return Status.OK_STATUS;
        }
        
        public static IOperationHistory getOperationHistory(){
@@ -200,8 +265,15 @@ public abstract class AbstractUtility {
                                                        getOperationSupport().getOperationHistory();
        }
        
-       public static void setStatusLine(String message) {
-               statusLineManager.setMessage(message);
+       public static void setStatusLine(final String message) {
+               Display.getDefault().asyncExec(new Runnable(){
+
+                       public void run() {
+                               statusLineManager.setMessage(message);
+                       }
+                       
+               });
+               
        }
        
        protected static IProgressMonitor getMonitor() {
@@ -262,30 +334,24 @@ public abstract class AbstractUtility {
         * Present a progress dialog to the user. This dialog will block the UI
         * 
         * @param runnable an implementation of {@link IRunnableWithProgress}
+        * @throws InterruptedException 
+        * @throws InvocationTargetException 
         */
-       public static void busyCursorWhile(IRunnableWithProgress runnable){
-               IWorkbench workbench = PlatformUI.getWorkbench();
-               IProgressService progressService = workbench.getProgressService();
-               try {
-                       progressService.busyCursorWhile(runnable);
-               } catch (InvocationTargetException e) {
-                       logger.error("InvocationTargetException while running busy cursor", e);
-               } catch (InterruptedException e) {
-                       logger.error("InterruptedException while running busy cursor", e);
-               }
+       public static void busyCursorWhile(IRunnableWithProgress runnable) throws InvocationTargetException, InterruptedException{
+               getProgressService().busyCursorWhile(runnable);
+       }
+       
+       public static void runInUI(IRunnableWithProgress runnable, ISchedulingRule rule) throws InvocationTargetException, InterruptedException{
+               getProgressService().runInUI(getWorkbenchWindow(), runnable, rule);             
+       }
+       
+       public static void run(boolean fork, boolean cancelable, IRunnableWithProgress runnable) throws InvocationTargetException, InterruptedException{
+               getProgressService().run(fork, cancelable, runnable);
        }
        
-       public static void runAsynchroneously(IRunnableWithProgress runnable){
+       public static IProgressService getProgressService(){
                IWorkbench workbench = PlatformUI.getWorkbench();
-               IProgressService progressService = workbench.getProgressService();
-               
-               try {
-                       progressService.run(true, false, runnable);
-               } catch (InvocationTargetException e) {
-                       logger.error("InvocationTargetException while running busy cursor", e);
-               } catch (InterruptedException e) {
-                       logger.error("InterruptedException while running busy cursor", e);
-               }
+               return workbench.getProgressService();
        }
 
 }
diff --git a/taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/model/IPartChangeListener.java b/taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/model/IPartChangeListener.java
new file mode 100644 (file)
index 0000000..d374e7b
--- /dev/null
@@ -0,0 +1,16 @@
+/**
+ * 
+ */
+package eu.etaxonomy.taxeditor.model;
+
+import org.eclipse.ui.IWorkbenchPartReference;
+
+/**
+ * @author n.hoffmann
+ *
+ */
+public interface IPartChangeListener {
+       
+       public void partChanged(Integer eventType, IWorkbenchPartReference partRef);
+       
+}
diff --git a/taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/model/TaxeditorPartService.java b/taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/model/TaxeditorPartService.java
new file mode 100644 (file)
index 0000000..6d384f4
--- /dev/null
@@ -0,0 +1,111 @@
+/**
+ * 
+ */
+package eu.etaxonomy.taxeditor.model;
+
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+import org.eclipse.ui.IPartListener2;
+import org.eclipse.ui.IPartService;
+import org.eclipse.ui.IWorkbenchPartReference;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author n.hoffmann
+ *
+ */
+public class TaxeditorPartService implements IPartListener2{
+
+       public static final int PART_ACTIVATED = 10;
+       public static final int PART_BROUGHT_TO_TOP = 20;
+       public static final int PART_CLOSED = 30;
+       public static final int PART_DEAVTICATED = 40;
+       public static final int PART_HIDDEN = 50;
+       public static final int PART_INPUT_CHANGED = 60;
+       public static final int PART_OPENED = 70;
+       public static final int PART_VISIBLE = 80;
+       
+       public static TaxeditorPartService instance = new TaxeditorPartService();
+       
+       private IPartService partService;
+       
+       private Map<Integer, Set<IPartChangeListener>> listenerMap = new HashMap<Integer, Set<IPartChangeListener>>();
+       
+       private TaxeditorPartService() {
+               partService = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getPartService();
+               partService.addPartListener(this);
+       }
+       
+       public static TaxeditorPartService getInstance(){
+               return instance;
+       }
+       
+       public void addListener(Integer eventType, IPartChangeListener listener){
+               Set<IPartChangeListener> partChangeListeners = listenerMap.get(eventType);
+               
+               if(partChangeListeners == null){
+                       partChangeListeners = new HashSet<IPartChangeListener>();
+                       listenerMap.put(eventType, partChangeListeners);
+               }
+               
+               partChangeListeners.add(listener);
+       }
+       
+       public void removeListener(Integer eventType, IPartChangeListener listener){
+               Set<IPartChangeListener> partChangeListeners = listenerMap.get(eventType);
+               
+               if(partChangeListeners == null){
+                       return;
+               }
+               
+               partChangeListeners.remove(listener);
+       }
+       
+       private void notifyListeners(Integer eventType, IWorkbenchPartReference partRef){
+               Set<IPartChangeListener> partChangeListeners = listenerMap.get(eventType);
+               
+               if(partChangeListeners == null){
+                       return;
+               }
+               
+               for(IPartChangeListener listener : partChangeListeners){
+                       listener.partChanged(eventType, partRef);
+               }
+       }
+       
+
+       public void partActivated(IWorkbenchPartReference partRef) {
+               notifyListeners(PART_ACTIVATED, partRef);
+       }
+
+       public void partBroughtToTop(IWorkbenchPartReference partRef) {
+               notifyListeners(PART_BROUGHT_TO_TOP, partRef);
+       }
+
+       public void partClosed(IWorkbenchPartReference partRef) {
+               notifyListeners(PART_CLOSED, partRef);
+       }
+
+       public void partDeactivated(IWorkbenchPartReference partRef) {
+               notifyListeners(PART_DEAVTICATED, partRef);
+       }
+
+       public void partOpened(IWorkbenchPartReference partRef) {
+               notifyListeners(PART_OPENED, partRef);
+       }
+
+       public void partHidden(IWorkbenchPartReference partRef) {
+               notifyListeners(PART_HIDDEN, partRef);
+       }
+
+       public void partVisible(IWorkbenchPartReference partRef) {
+               notifyListeners(PART_VISIBLE, partRef);
+       }
+
+       public void partInputChanged(IWorkbenchPartReference partRef) {
+               notifyListeners(PART_INPUT_CHANGED, partRef);
+       }
+}
index 40ac2d9de53bea00211b058760fc86446c2d8b6e..be63c61d942395ba49120eb8c9061c30debbba12 100644 (file)
@@ -35,7 +35,7 @@ public abstract class AbstractPostOperation extends AbstractOperation {
        /**\r
         * \r
         */\r
-       protected IPostOperationEnabled postOperationEnabled;\r
+       private IPostOperationEnabled postOperationEnabled;\r
        \r
        /** \r
         * A reference to the taxon the concrete operation is working on \r
@@ -133,4 +133,8 @@ public abstract class AbstractPostOperation extends AbstractOperation {
                }\r
                return Status.OK_STATUS;\r
        }\r
+       \r
+       public IPostOperationEnabled getPostOperationEnabled() {\r
+               return postOperationEnabled;\r
+       }\r
 }\r
index 78e0396c7f696116cb412bd2ccf389d35e99f150..ee0a52b34069b16433d41278bc9feef3f930e49a 100644 (file)
@@ -63,7 +63,7 @@ public class ChangeConceptToSynonymOperation extends
                this.oldRelationshipType = taxonRelationship.getType();\r
                \r
                this.concept = concept;\r
-               this.homotypicalGroup = homotypicalGroup;\r
+               this.homotypicalGroup = homotypicalGroup != null ? homotypicalGroup : HomotypicalGroup.NewInstance();\r
        }\r
 \r
        /* (non-Javadoc)\r
@@ -81,7 +81,7 @@ public class ChangeConceptToSynonymOperation extends
                monitor.worked(20);\r
         \r
                // Add name to new homotypic group\r
-               HomotypicalGroup.NewInstance().addTypifiedName(synonymName);\r
+               homotypicalGroup.addTypifiedName(synonymName);\r
                monitor.worked(40);\r
                \r
         // Create a new synonym for the taxon\r
index 2492a9ac498094e59b4ed0858111f6bab837ce6b..2c099fbc9a461f001e04693a5ab18da8460023df 100644 (file)
@@ -20,6 +20,7 @@ import org.eclipse.core.runtime.OperationCanceledException;
 import eu.etaxonomy.cdm.model.name.HomotypicalGroup;\r
 import eu.etaxonomy.cdm.model.name.TaxonNameBase;\r
 import eu.etaxonomy.cdm.model.taxon.Synonym;\r
+import eu.etaxonomy.cdm.model.taxon.SynonymRelationshipType;\r
 import eu.etaxonomy.cdm.model.taxon.Taxon;\r
 import eu.etaxonomy.taxeditor.store.StoreUtil;\r
 \r
@@ -60,7 +61,7 @@ public class ChangeHomotypicGroupOperation extends AbstractPostOperation {
                }\r
                \r
                this.oldHomotypicalGroup = synonym.getHomotypicGroup();\r
-               this.newHomotypicalGroup = newHomotypicalGroup;\r
+               this.newHomotypicalGroup = newHomotypicalGroup != null ? newHomotypicalGroup : HomotypicalGroup.NewInstance();\r
        }\r
 \r
        /* (non-Javadoc)\r
@@ -69,9 +70,9 @@ public class ChangeHomotypicGroupOperation extends AbstractPostOperation {
        @Override\r
        public IStatus execute(IProgressMonitor monitor, IAdaptable info)\r
                        throws ExecutionException {\r
-\r
+               \r
        // Get synonym name\r
-               TaxonNameBase<?, ?> synonymName = this.synonym.getName();\r
+               TaxonNameBase<?, ?> synonymName = synonym.getName();\r
                monitor.worked(20);\r
         \r
                // TODO pass in homotypical group's taxon in case we are dragging from one editor to another\r
@@ -82,6 +83,19 @@ public class ChangeHomotypicGroupOperation extends AbstractPostOperation {
 \r
                newHomotypicalGroup.addTypifiedName(synonymName);\r
                \r
+               if(! synonym.getAcceptedTaxa().contains(taxon)){\r
+                       for(Taxon acceptedTaxon : synonym.getAcceptedTaxa()){\r
+                               acceptedTaxon.removeSynonym(synonym);\r
+                       }\r
+                       \r
+                       SynonymRelationshipType type = SynonymRelationshipType.HETEROTYPIC_SYNONYM_OF();\r
+                       if(newHomotypicalGroup.getTypifiedNames().contains(taxon.getName())){\r
+                               type = SynonymRelationshipType.HOMOTYPIC_SYNONYM_OF();\r
+                       }\r
+                       \r
+                       taxon.addSynonym(synonym, type);\r
+               }\r
+               \r
                // Redraw editor if it exists\r
                return postExecute(synonym);\r
        }\r
index 873a0d570a2fcf55acc9ce39c824844c40a27e67..415e7d0b29a28b86c5fa44ae734f40647d613203 100644 (file)
@@ -23,6 +23,7 @@ import eu.etaxonomy.cdm.model.taxon.Synonym;
 import eu.etaxonomy.cdm.model.taxon.SynonymRelationshipType;\r
 import eu.etaxonomy.cdm.model.taxon.Taxon;\r
 import eu.etaxonomy.cdm.model.taxon.TaxonRelationshipType;\r
+import eu.etaxonomy.taxeditor.store.CdmStore;\r
 import eu.etaxonomy.taxeditor.store.StoreUtil;\r
 \r
 /**\r
@@ -53,6 +54,7 @@ public class ChangeSynonymToMisapplicationOperation extends AbstractPostOperatio
 \r
                // make misapplied name with synonym name\r
                misapplication = Taxon.NewInstance(synonymName, null);\r
+               CdmStore.getTaxonService().saveOrUpdate(misapplication);\r
                monitor.worked(20);\r
                \r
                // store synonymRelationshipType for later undo operations\r
index 5dbb6ef3ca2e046688d05fda6b0987960af2ad6b..bb01608ad853af699470f0a64e1adf013caa91a9 100644 (file)
@@ -32,4 +32,11 @@ public interface IPostOperationEnabled {
         * @return true the method executed succesfully
         */
        public boolean postOperation(CdmBase objectAffectedByOperation);
+       
+       /**
+        * This method will get called after the execution took place and occasional cleanups 
+        * were performed. This is typically the last thing to happen.
+        * @return
+        */
+       public boolean onComplete();
 }
index 63ce860acdeec30d00e71fae7ba88abe9a2a9585..de22172a286f48a69da2ce5d6636ca62d1cde87b 100644 (file)
@@ -36,8 +36,11 @@ public interface Resources {
        /* ***************************************************************************************
        COLORS
        ************************************************************************************** */
-       public static final String COLOR_COMPOSITE_BACKGROUND = "eu.etaxonomy.taxeditor.preferences.colorDefinition.nameEditor.colorCompositeBackground";
-       public static final String COLOR_COMPOSITE_SELECTED = "eu.etaxonomy.taxeditor.preferences.colorDefinition.nameEditor.colorCompositeSelected";
+       public static final String COLOR_CONTROL_BACKGROUND = "eu.etaxonomy.taxeditor.preferences.colorDefinition.nameEditor.colorContainerBackground";
+       public static final String COLOR_CONTROL_SELECTED = "eu.etaxonomy.taxeditor.preferences.colorDefinition.nameEditor.colorContainerSelected";
+       public static final String COLOR_CONTROL_SELECTED_FOCUS = "eu.etaxonomy.taxeditor.preferences.colorDefinition.nameEditor.colorContainerSelectedFocus";
+       
+       public static final String COLOR_COMPOSITE_BACKGROUND = "eu.etaxonomy.taxeditor.preferences.colorDefinition.colorCompositeBackground";
        public static final String COLOR_COMPOSITE_IRRELEVANT = "eu.etaxonomy.taxeditor.preferences.colorDefinition.colorCompositeIrrelevant";
        
        public static final String SEARCH_VIEW_FOREGROUND = "eu.etaxonomy.taxeditor.preferences.colorDefinition.searchView.foreground";
@@ -48,5 +51,7 @@ public interface Resources {
        public static final String COLOR_TEXT_DISABLED = "eu.etaxonomy.taxeditor.preferences.colorDefinition.textDisabled";
        public static final String COLOR_TEXT_DISABLED_BACKGROUND = "eu.etaxonomy.taxeditor.preferences.colorDefinition.textBackgroundDisabled";
        
+       public static final String COLOR_DRAG_ENTER = "eu.etaxonomy.taxeditor.preferences.colorDefinition.nameEditor.colorContainerDragEnter";
+       
        
 }
index 410fffd54974c146c8f69badfba8cae0d74b7ae3..36ec394b60303ecfb6b6b6366f64d17af5667b0b 100644 (file)
@@ -15,9 +15,13 @@ import java.util.List;
 
 import org.apache.log4j.Logger;
 import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
 import org.eclipse.core.runtime.ListenerList;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.Job;
 import org.eclipse.jface.dialogs.ProgressMonitorDialog;
 import org.eclipse.jface.operation.IRunnableWithProgress;
+import org.eclipse.swt.widgets.Display;
 import org.springframework.core.io.ClassPathResource;
 import org.springframework.core.io.Resource;
 import org.springframework.security.authentication.ProviderManager;
@@ -162,7 +166,6 @@ public class CdmStore{
                        if (datasource.testConnection()) {
                                cdmDatasource = datasource;
                                
-                               ProgressMonitorDialog progressMonitorDialog = new ProgressMonitorDialog(StoreUtil.getShell());
                                IRunnableWithProgress runnable = new IRunnableWithProgress() {
                                        
                                        public void run(IProgressMonitor monitor) throws InvocationTargetException,
@@ -175,7 +178,7 @@ public class CdmStore{
                                                }
                                                message += "'" + cdmDatasource.getName() + "'";
                                                
-                                               monitor.beginTask("Establishing connection to" + message, 10);
+                                               monitor.beginTask("Establishing connection to" + message + ". \nThis might take  while.", 10);
                                                // TODO get real feedback from CDMStore initialisation process
                                                monitor.worked(3);
                                                
@@ -185,7 +188,7 @@ public class CdmStore{
                                        }
                                };
                                
-                               progressMonitorDialog.run(false, false, runnable);
+                               StoreUtil.run(false, false, runnable);
                                
                                if (!getCommonService().isDatabaseSchemaCompatible()) {
                                        close();
index 938d995e317e857744771aadffc9c847f4e9148b..fc5438caa2d0a1fb64d6c220a6396f21e1c5a04b 100644 (file)
@@ -15,11 +15,11 @@ import org.eclipse.core.commands.AbstractHandler;
 import org.eclipse.core.commands.ExecutionEvent;
 import org.eclipse.core.commands.ExecutionException;
 import org.eclipse.core.commands.common.NotDefinedException;
-import org.eclipse.core.commands.operations.IUndoableOperation;
 import org.eclipse.jface.viewers.StructuredSelection;
 import org.eclipse.ui.handlers.HandlerUtil;
 
 import eu.etaxonomy.cdm.model.common.User;
+import eu.etaxonomy.taxeditor.operations.AbstractPostOperation;
 import eu.etaxonomy.taxeditor.operations.ToggleUserEnablementOperation;
 import eu.etaxonomy.taxeditor.store.StoreUtil;
 import eu.etaxonomy.taxeditor.user.view.UserManagerView;
@@ -47,7 +47,7 @@ public class ToggleUserEnablementHandler extends AbstractHandler {
                        // TODO refresh the list -> set postOperationEnabled to the real deal
                        UserManagerView userManagerView = (UserManagerView) HandlerUtil.getActivePart(event);
                        
-                       IUndoableOperation operation = null;
+                       AbstractPostOperation operation = null;
                        try {
                                operation = new ToggleUserEnablementOperation(event.getCommand().getName(), 
                                                        StoreUtil.getUndoContext(), user, userManagerView, userManagerView);
index 385b3027d73866f2ea77ea627afb77d43129186c..c95c2cbe49df294ab0922209af0523e58d71c52f 100644 (file)
@@ -186,5 +186,10 @@ public class UserManagerView extends ViewPart implements IConversationEnabled, I
                }
                return true;
        }
+
+       public boolean onComplete() {
+               // TODO Auto-generated method stub
+               return false;
+       }
        
 }
index fb244985da2b0a9e3743238192f0fe2c8ba2372d..c440b4ed1e74e9eeb0644985f090ca5ec71ccc1b 100644 (file)
@@ -16,6 +16,7 @@ import org.eclipse.core.runtime.Status;
 import org.eclipse.jface.wizard.Wizard;
 
 import eu.etaxonomy.cdm.model.common.User;
+import eu.etaxonomy.taxeditor.operations.AbstractPostOperation;
 import eu.etaxonomy.taxeditor.operations.CreateUserOperation;
 import eu.etaxonomy.taxeditor.operations.EditUserOperation;
 import eu.etaxonomy.taxeditor.store.StoreUtil;
@@ -66,7 +67,7 @@ public class UserWizard extends Wizard {
        @Override
        public boolean performFinish() {
                
-               IUndoableOperation operation;
+               AbstractPostOperation operation;
                if(createMode){
                        operation = new CreateUserOperation("Create User", 
                                        StoreUtil.getUndoContext(), page.getUser(), view, view);
index 0de1d2c104d697543ca0177aa2fedbb8ee8c393c..df1f58cb8a399ee94b80f6ba0b5424aae4d2502f 100644 (file)
@@ -17,7 +17,7 @@ import org.eclipse.core.commands.ExecutionException;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
-import eu.etaxonomy.cdm.model.common.CdmBase;
+import eu.etaxonomy.cdm.model.common.ICdmBase;
 import eu.etaxonomy.cdm.model.name.HomotypicalGroup;
 import eu.etaxonomy.cdm.model.name.NonViralName;
 import eu.etaxonomy.cdm.model.taxon.Synonym;
@@ -101,7 +101,7 @@ public class ChangeConceptToSynonymOperationTest extends AbstractTaxeditorOperat
        }
 
        /**
-        * Test method for {@link eu.etaxonomy.taxeditor.operations.AbstractPostOperation#postExecute(CdmBase)}.
+        * Test method for {@link eu.etaxonomy.taxeditor.operations.AbstractPostOperation#postExecute(ICdmBase)}.
         */
        @Test
        public void testPostExecute() {
index 7cf7262449e0f75ad649bdb9964db6aa46485e61..ea58288d79951e03d97ba29774cef57efd0d0034 100644 (file)
@@ -16,7 +16,7 @@ import org.eclipse.core.commands.ExecutionException;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
-import eu.etaxonomy.cdm.model.common.CdmBase;
+import eu.etaxonomy.cdm.model.common.ICdmBase;
 import eu.etaxonomy.cdm.model.name.HomotypicalGroup;
 import eu.etaxonomy.cdm.model.name.NonViralName;
 import eu.etaxonomy.cdm.model.taxon.Synonym;
@@ -100,7 +100,7 @@ public class ChangeHomotypicGroupOperationTest extends AbstractTaxeditorOperatio
        }
 
        /**
-        * Test method for {@link eu.etaxonomy.taxeditor.operations.AbstractPostOperation#postExecute(CdmBase)}.
+        * Test method for {@link eu.etaxonomy.taxeditor.operations.AbstractPostOperation#postExecute(ICdmBase)}.
         */
        @Test
        public void testPostExecute() {
index db78ca076d2f84b2a40368a0e5811d92830ccfaa..7352ca5181f0e8f4b34e81babef4a22a54b2f059 100644 (file)
@@ -15,7 +15,7 @@ import org.eclipse.core.commands.ExecutionException;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
-import eu.etaxonomy.cdm.model.common.CdmBase;
+import eu.etaxonomy.cdm.model.common.ICdmBase;
 import eu.etaxonomy.cdm.model.name.HomotypicalGroup;
 import eu.etaxonomy.cdm.model.taxon.Synonym;
 import eu.etaxonomy.cdm.model.taxon.Taxon;
@@ -83,7 +83,7 @@ public class ChangeHomotypicalGroupBasionymOperationTest extends AbstractTaxedit
        }
 
        /**
-        * Test method for {@link eu.etaxonomy.taxeditor.operations.AbstractPostOperation#postExecute(CdmBase)}.
+        * Test method for {@link eu.etaxonomy.taxeditor.operations.AbstractPostOperation#postExecute(ICdmBase)}.
         */
        @Test
        public void testPostExecute() {
index 791249529a1b74f36ac76d58de46b8271f8633f3..3a5647e08e6bfd4781720600345e39681831fced 100644 (file)
@@ -17,7 +17,7 @@ import org.eclipse.core.commands.ExecutionException;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
-import eu.etaxonomy.cdm.model.common.CdmBase;
+import eu.etaxonomy.cdm.model.common.ICdmBase;
 import eu.etaxonomy.cdm.model.name.NonViralName;
 import eu.etaxonomy.cdm.model.taxon.Synonym;
 import eu.etaxonomy.cdm.model.taxon.SynonymRelationshipType;
@@ -97,7 +97,7 @@ public class ChangeSynonymToConceptOperationTest extends AbstractTaxeditorOperat
        }
 
        /**
-        * Test method for {@link eu.etaxonomy.taxeditor.operations.AbstractPostOperation#postExecute(CdmBase)}.
+        * Test method for {@link eu.etaxonomy.taxeditor.operations.AbstractPostOperation#postExecute(ICdmBase)}.
         */
        @Test
        public void testPostExecute() {
index 4e7e93f181eb7cb095baefa962f940fbcaa563da..97e2f90111453a1131bf0980178efb185dbdc38f 100644 (file)
@@ -16,7 +16,7 @@ import org.junit.Assert;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
-import eu.etaxonomy.cdm.model.common.CdmBase;
+import eu.etaxonomy.cdm.model.common.ICdmBase;
 import eu.etaxonomy.cdm.model.name.NonViralName;
 import eu.etaxonomy.cdm.model.taxon.Synonym;
 import eu.etaxonomy.cdm.model.taxon.SynonymRelationshipType;
@@ -95,7 +95,7 @@ public class ChangeSynonymToMisapplicationOperationTest extends AbstractTaxedito
        }
 
        /**
-        * Test method for {@link eu.etaxonomy.taxeditor.operations.AbstractPostOperation#postExecute(CdmBase)}.
+        * Test method for {@link eu.etaxonomy.taxeditor.operations.AbstractPostOperation#postExecute(ICdmBase)}.
         */
        @Test
        public void testPostExecute() {
index 39ddf6668f694722a321441bb73f26fc37e1eb6f..056b456b5778e2a6ddd49b1ba0582817ea3e3f4f 100644 (file)
@@ -16,7 +16,7 @@ import org.junit.Assert;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
-import eu.etaxonomy.cdm.model.common.CdmBase;
+import eu.etaxonomy.cdm.model.common.ICdmBase;
 import eu.etaxonomy.cdm.model.taxon.Taxon;
 import eu.etaxonomy.cdm.model.taxon.TaxonRelationship;
 import eu.etaxonomy.cdm.model.taxon.TaxonRelationshipType;
@@ -84,7 +84,7 @@ public class CreateConceptRelationOperationTest extends AbstractTaxeditorOperati
        }
 
        /**
-        * Test method for {@link eu.etaxonomy.taxeditor.operations.AbstractPostOperation#postExecute(CdmBase)}.
+        * Test method for {@link eu.etaxonomy.taxeditor.operations.AbstractPostOperation#postExecute(ICdmBase)}.
         */
        @Test
        public void testPostExecute() {
index fcb3219c731b47ff57bdf905d08dbf07d68c8ca2..9e445ae08a3d6a2c232ec4db875e31819b1ec270 100644 (file)
@@ -16,7 +16,7 @@ import org.junit.Assert;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
-import eu.etaxonomy.cdm.model.common.CdmBase;
+import eu.etaxonomy.cdm.model.common.ICdmBase;
 import eu.etaxonomy.cdm.model.taxon.Taxon;
 import eu.etaxonomy.cdm.model.taxon.TaxonRelationshipType;
 import eu.etaxonomy.taxeditor.operations.DeleteConceptRelationOperation;
@@ -85,7 +85,7 @@ public class DeleteConceptRelationOperationTest extends AbstractTaxeditorOperati
        }
 
        /**
-        * Test method for {@link eu.etaxonomy.taxeditor.operations.AbstractPostOperation#postExecute(CdmBase)}.
+        * Test method for {@link eu.etaxonomy.taxeditor.operations.AbstractPostOperation#postExecute(ICdmBase)}.
         */
        @Test
        public void testPostExecute() {
index 3ab373a531a018f6ce67df1ed67060e7e690fb6b..f9826a84d3596c83e910c1d69c7c3342a042518b 100644 (file)
@@ -16,7 +16,7 @@ import org.junit.Assert;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
-import eu.etaxonomy.cdm.model.common.CdmBase;
+import eu.etaxonomy.cdm.model.common.ICdmBase;
 import eu.etaxonomy.cdm.model.taxon.Taxon;
 import eu.etaxonomy.taxeditor.operations.DeleteMisapplicationOperation;
 
@@ -81,7 +81,7 @@ public class DeleteMisapplicationOperationTest extends AbstractTaxeditorOperatio
        }
 
        /**
-        * Test method for {@link eu.etaxonomy.taxeditor.operations.AbstractPostOperation#postExecute(CdmBase)}.
+        * Test method for {@link eu.etaxonomy.taxeditor.operations.AbstractPostOperation#postExecute(ICdmBase)}.
         */
        @Test
        public void testPostExecute() {
index f12beae03265186f0acd975ef028cb67c9c97837..9221af4527b192e9ba77b6bd7c79e3c1b04594f6 100644 (file)
@@ -16,8 +16,8 @@ import org.eclipse.core.commands.ExecutionException;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
-import eu.etaxonomy.cdm.model.common.CdmBase;
 import eu.etaxonomy.cdm.model.common.DefaultTermInitializer;
+import eu.etaxonomy.cdm.model.common.ICdmBase;
 import eu.etaxonomy.cdm.model.description.TaxonDescription;
 import eu.etaxonomy.cdm.model.name.HomotypicalGroup;
 import eu.etaxonomy.cdm.model.name.NonViralName;
@@ -182,7 +182,7 @@ public class SwapSynonymAndAcceptedOperationTest extends AbstractTaxeditorOperat
        }
 
        /**
-        * Test method for {@link eu.etaxonomy.taxeditor.operations.AbstractPostOperation#postExecute(CdmBase)}.
+        * Test method for {@link eu.etaxonomy.taxeditor.operations.AbstractPostOperation#postExecute(ICdmBase)}.
         */
        @Test
        public void testPostExecute() {