From: n.hoffmann Date: Tue, 2 Jun 2009 09:05:16 +0000 (+0000) Subject: Moving editor sources back into trunk X-Git-Tag: rcp.ss-first-working-version~886 X-Git-Url: https://dev.e-taxonomy.eu/gitweb/taxeditor.git/commitdiff_plain/e840942329d0ae8a48ba9f37abcb220e68b7586b Moving editor sources back into trunk --- diff --git a/.gitattributes b/.gitattributes index 8da30dda9..8c684243b 100644 --- a/.gitattributes +++ b/.gitattributes @@ -619,3 +619,420 @@ eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/propertysheet/ eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/propertysheet/type/wizard/NameSearchDialog.java -text eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/propertysheet/type/wizard/TypeDesignationWizard.java -text eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/propertysheet/type/wizard/TypeListWizard.java -text +taxeditor-application/META-INF/MANIFEST.MF -text +taxeditor-application/TaxEditor.product -text +taxeditor-application/build.properties -text +taxeditor-application/icons/256color_16x16.gif -text +taxeditor-application/icons/256color_32x32.gif -text +taxeditor-application/icons/256color_48x48.gif -text +taxeditor-application/icons/edit_16x16.gif -text +taxeditor-application/plugin.properties -text +taxeditor-application/plugin.xml -text +taxeditor-application/plugin_customization.ini -text +taxeditor-application/pom.xml -text +taxeditor-application/splash.bmp -text +taxeditor-application/src/main/java/eu/etaxonomy/taxeditor/Application.java -text +taxeditor-application/src/main/java/eu/etaxonomy/taxeditor/ApplicationActionBarAdvisor.java -text +taxeditor-application/src/main/java/eu/etaxonomy/taxeditor/ApplicationWorkbenchAdvisor.java -text +taxeditor-application/src/main/java/eu/etaxonomy/taxeditor/ApplicationWorkbenchWindowAdvisor.java -text +taxeditor-application/src/main/java/eu/etaxonomy/taxeditor/Perspective.java -text +taxeditor-application/src/main/java/eu/etaxonomy/taxeditor/TaxonomicEditorPlugin.java -text +taxeditor-application/src/main/resources/log4j.properties -text +taxeditor-editor/.settings/org.eclipse.jdt.ui.prefs -text +taxeditor-editor/META-INF/MANIFEST.MF -text +taxeditor-editor/build.properties -text +taxeditor-editor/plugin.properties -text +taxeditor-editor/plugin.xml -text +taxeditor-editor/pom.xml -text +taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/AbstractTaxonEditor.java -text +taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/CompositeBorderDecorator.java -text +taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/ContextMenu.java -text +taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/EditorUtil.java -text +taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/EmptyEditorView.java -text +taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/EmptyTextViewerPrompt.java -text +taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/ErrorAnnotation.java -text +taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/FreeTextElementFactory.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/IFreeTextElementFactory.java -text +taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/IHasPropertySource.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/MenuConstants.java -text +taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/MultiPageTaxonEditor.java -text +taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/MultiPageTaxonEditorDataChangeBehaviour.java -text +taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/Page.java -text +taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/ParseListener.java -text +taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/SelectTaxonDialog.java -text +taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/SimpleSelectionProvider.java -text +taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/TaxonEditorInput.java -text +taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/TaxonEditorInputFactory.java -text +taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/TemporaryTaxon.java -text +taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/UndoView.java -text +taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/ViewerConfiguration.java -text +taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/WarningAnnotation.java -text +taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/WidgetTransfer.java -text +taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/description/CommonNameComposite.java -text +taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/description/DescriptionElementComposite.java -text +taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/description/DescriptionFeatureGroupComposite.java -text +taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/description/DescriptionGroupComposite.java -text +taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/description/DescriptionLabelComposite.java -text +taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/description/DistributionComposite.java -text +taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/description/DistributionDialog.java -text +taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/description/DistributionFeatureGroupComposite.java -text +taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/description/DistributionMapDialog.java -text +taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/description/DynamicFeatureMenu.java -text +taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/description/IDescriptionEditorCompositeRepository.java -text +taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/description/LanguageDialog.java -text +taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/description/TaxonDescriptionEditor.java -text +taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/description/handler/CreateDescriptionElementHandler.java -text +taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/description/handler/DeleteDescriptionElementHandler.java -text +taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/handler/CreateChildTaxonHandler.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/SaveAllHandler.java -text +taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/handler/SaveTaxonHandler.java -text +taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/handler/ShowPropertySheetHandler.java -text +taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/images/GalleryLabelComposite.java -text +taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/images/ImageComposite.java -text +taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/images/ImagesGroupComposite.java -text +taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/images/TaxonHasNoImagesComposite.java -text +taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/images/TaxonImageEditor.java -text +taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/images/handler/CreateImageHandler.java -text +taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/images/handler/DeleteImageHandler.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/AcceptedNameComposite.java -text +taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/BasionymSynonymPropertySource.java -text +taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/CdmParserController.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/INameEditorCompositeRepository.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/MisappliedGroupComposite.java -text +taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/MisappliedNameComposite.java -text +taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/NameComposite.java -text +taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/NameSearchDialog.java -text +taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/NameSelectComposite.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/TaxonNameEditor.java -text +taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/TaxonSearchDialog.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/ChangeConceptRelationshipTypeHandler.java -text +taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/handler/ChangeConceptRelationshipTypeMenu.java -text +taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/handler/ChangeToAcceptedTaxon.java -text +taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/handler/ChangeToConceptRelationHandler.java -text +taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/handler/ChangeToConceptRelationMenu.java -text +taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/handler/ChangeToMisapplicationHandler.java -text +taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/handler/ChangeToSynonymHandler.java -text +taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/handler/CreateConceptRelationHandler.java -text +taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/handler/CreateConceptRelationMenu.java -text +taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/handler/CreateHeterotypicSynonymHandler.java -text +taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/handler/CreateHomotypicSynonymHandler.java -text +taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/handler/CreateMisapplicationHandler.java -text +taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/handler/CreateSynonymInHomotypicalGroupHandler.java -text +taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/handler/DeleteTaxonBaseHandler.java -text +taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/handler/RemoveBasionymHandler.java -text +taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/handler/SetBasionymHandler.java -text +taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/handler/SwapSynonymAndAcceptedHandler.java -text +taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/reference/IReferenceSearch.java -text +taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/reference/ReferenceSearchDialog.java -text +taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/reference/ReferenceSelectComposite.java -text +taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/propertysheet/AbstractEditorPropertySheet.java -text +taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/propertysheet/AnnotationPropertySource.java -text +taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/propertysheet/AnnotationsDialog.java -text +taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/propertysheet/AnnotationsPropertyDescriptor.java -text +taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/propertysheet/CheckboxCellEditor.java -text +taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/propertysheet/CheckboxPropertyDescriptor.java -text +taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/propertysheet/CollectionPropertySource.java -text +taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/propertysheet/CompletionProcessor.java -text +taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/propertysheet/DayValidator.java -text +taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/propertysheet/EditorPropertySheetEntry.java -text +taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/propertysheet/MarkersPropertySource.java -text +taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/propertysheet/PropertySheetUtil.java -text +taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/propertysheet/SourceViewerConfig.java -text +taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/propertysheet/TimePeriodPropertySource.java -text +taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/propertysheet/YearValidator.java -text +taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/propertysheet/description/CommonNamePropertySource.java -text +taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/propertysheet/description/DescriptionElementPropertySource.java -text +taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/propertysheet/description/DistributionPropertySource.java -text +taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/propertysheet/description/TaxonDescriptionPropertySource.java -text +taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/propertysheet/images/ImagePropertySource.java -text +taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/propertysheet/name/AcceptedTaxonPropertySource.java -text +taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/propertysheet/name/BotanicalNamePropertySource.java -text +taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/propertysheet/name/ConceptPropertySource.java -text +taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/propertysheet/name/EditorComboBoxPropertyDescriptor.java -text +taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/propertysheet/name/MisapplicationPropertySource.java -text +taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/propertysheet/name/NameRelationsPropertyDescriptor.java -text +taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/propertysheet/name/NameRelationsPropertySource.java -text +taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/propertysheet/name/NomStatusPropertySource.java -text +taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/propertysheet/name/NomenclaturalAuthorshipPropertySource.java -text +taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/propertysheet/name/NonViralNamePropertySource.java -text +taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/propertysheet/name/ScientificNamePropertySource.java -text +taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/propertysheet/name/SynonymPropertySource.java -text +taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/propertysheet/name/TaxonBasePropertySource.java -text +taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/propertysheet/name/ZoologicalNamePropertySource.java -text +taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/propertysheet/namerelations/wizard/ChooseRelationWizardPage.java -text +taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/propertysheet/namerelations/wizard/ListNameRelationsWizardPage.java -text +taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/propertysheet/namerelations/wizard/NameRelationWizard.java -text +taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/propertysheet/namerelations/wizard/NameRelationsListWizard.java -text +taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/propertysheet/namerelations/wizard/NameRelationshipTemp.java -text +taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/propertysheet/reference/IReferenceSearch.java -text +taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/propertysheet/reference/NomenclaturalReferencePropertySource.java -text +taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/propertysheet/reference/ReferencePropertySource.java -text +taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/propertysheet/reference/ReferenceSearchDescriptor.java -text +taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/propertysheet/reference/ReferenceSearchDialog.java -text +taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/propertysheet/reference/SingleRefTypePropertySource.java -text +taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/propertysheet/type/TypeCollectionPropertySource.java -text +taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/propertysheet/type/TypeDesignationPropertySource.java -text +taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/propertysheet/type/TypePropertyDescriptor.java -text +taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/propertysheet/type/TypePropertySource.java -text +taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/propertysheet/type/wizard/ChooseNameTypeWizardPage.java -text +taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/propertysheet/type/wizard/ChooseSpecimenTypeWizardPage.java -text +taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/propertysheet/type/wizard/ListTypeWizardPage.java -text +taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/propertysheet/type/wizard/NameSearchDialog.java -text +taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/propertysheet/type/wizard/TypeDesignationWizard.java -text +taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/propertysheet/type/wizard/TypeListWizard.java -text +taxeditor-editor/src/main/resources/log4j.properties -text +taxeditor-editor/src/test/java/eu/etaxonomy/taxeditor/editor/Application.java -text +taxeditor-editor/src/test/java/eu/etaxonomy/taxeditor/editor/ApplicationActionBarAdvisor.java -text +taxeditor-editor/src/test/java/eu/etaxonomy/taxeditor/editor/ApplicationWorkbenchAdvisor.java -text +taxeditor-editor/src/test/java/eu/etaxonomy/taxeditor/editor/ApplicationWorkbenchWindowAdvisor.java -text +taxeditor-editor/src/test/java/eu/etaxonomy/taxeditor/editor/Perspective.java -text +taxeditor-editor/src/test/java/eu/etaxonomy/taxeditor/editor/TestOpenHandler.java -text +taxeditor-feature-dependencies/.project -text +taxeditor-feature-dependencies/build.properties -text +taxeditor-feature-dependencies/feature.xml -text +taxeditor-feature/build.properties -text +taxeditor-feature/feature.xml -text +taxeditor-navigation/META-INF/MANIFEST.MF -text +taxeditor-navigation/build.properties -text +taxeditor-navigation/icons/edit_16x16.gif -text +taxeditor-navigation/plugin.xml -text +taxeditor-navigation/pom.xml -text +taxeditor-navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/NavigationUtil.java -text +taxeditor-navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/RecentNamesContributionItem.java -text +taxeditor-navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/handler/CreateChildTaxonHandler.java -text +taxeditor-navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/handler/DeleteTaxonHandler.java -text +taxeditor-navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/handler/EditTaxonHandler.java -text +taxeditor-navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/handler/MoveTaxonHandler.java -text +taxeditor-navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/handler/QuickCreateChildTaxonHandler.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/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 +taxeditor-navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/taxonomictree/TaxonomicTreeContentProvider.java -text +taxeditor-navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/taxonomictree/TaxonomicTreeLabelProvider.java -text +taxeditor-navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/taxonomictree/TaxonomicTreeView.java -text +taxeditor-navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/taxonomictree/TaxonomicTreeViewDataChangeBehaviour.java -text +taxeditor-navigation/src/main/java/log4j.properties -text +taxeditor-navigation/src/test/java/eu/etaxonomy/taxeditor/navigation/Application.java -text +taxeditor-navigation/src/test/java/eu/etaxonomy/taxeditor/navigation/ApplicationActionBarAdvisor.java -text +taxeditor-navigation/src/test/java/eu/etaxonomy/taxeditor/navigation/ApplicationWorkbenchAdvisor.java -text +taxeditor-navigation/src/test/java/eu/etaxonomy/taxeditor/navigation/ApplicationWorkbenchWindowAdvisor.java -text +taxeditor-navigation/src/test/java/eu/etaxonomy/taxeditor/navigation/Perspective.java -text +taxeditor-navigation/src/test/java/log4j.properties -text +taxeditor-navigation/src/test/resources/eu/etaxonomy/cdm/applicationContext-test.xml -text +taxeditor-navigation/src/test/resources/eu/etaxonomy/cdm/defaultApplicationContext.xml -text +taxeditor-navigation/src/test/resources/log4j.properties -text +taxeditor-store/.settings/org.eclipse.jdt.core.prefs -text +taxeditor-store/META-INF/MANIFEST.MF -text +taxeditor-store/build.properties -text +taxeditor-store/icons/256color_16x16.bmp -text +taxeditor-store/icons/256color_32x32.bmp -text +taxeditor-store/icons/256color_48x48.bmp -text +taxeditor-store/icons/EDIT-logo.jpg -text +taxeditor-store/icons/Thumbs.db -text +taxeditor-store/icons/a_no_bg.gif -text +taxeditor-store/icons/accepted.gif -text +taxeditor-store/icons/accepted_small.gif -text +taxeditor-store/icons/add.gif -text +taxeditor-store/icons/add_edit.gif -text +taxeditor-store/icons/add_no_bg.gif -text +taxeditor-store/icons/add_no_bg2.gif -text +taxeditor-store/icons/alt_window_16.gif -text +taxeditor-store/icons/alt_window_32.gif -text +taxeditor-store/icons/autonym_no_bg.gif -text +taxeditor-store/icons/basionym.gif -text +taxeditor-store/icons/basionym_no_bg.gif -text +taxeditor-store/icons/change.gif -text +taxeditor-store/icons/close_view.gif -text +taxeditor-store/icons/concept.gif -text +taxeditor-store/icons/concept_no_bg.gif -text +taxeditor-store/icons/correction_change.gif -text +taxeditor-store/icons/cprj_obj.gif -text +taxeditor-store/icons/db.gif -text +taxeditor-store/icons/delete.gif -text +taxeditor-store/icons/delete_edit.gif -text +taxeditor-store/icons/edit_16x16.gif -text +taxeditor-store/icons/edit_16x16.ico -text +taxeditor-store/icons/error_co.gif -text +taxeditor-store/icons/file_obj.gif -text +taxeditor-store/icons/form_banner.gif -text +taxeditor-store/icons/garland_logo.png -text +taxeditor-store/icons/help_topic.gif -text +taxeditor-store/icons/heterosyn.gif -text +taxeditor-store/icons/heterosyn_no_bg.gif -text +taxeditor-store/icons/heterosyn_original_no_bg.gif -text +taxeditor-store/icons/homonym.gif -text +taxeditor-store/icons/homonym_no_bg.gif -text +taxeditor-store/icons/homosyn.gif -text +taxeditor-store/icons/homosyn_no_bg.gif -text +taxeditor-store/icons/homosyn_original_no_bg.gif -text +taxeditor-store/icons/icon.ico -text +taxeditor-store/icons/icon.png -text +taxeditor-store/icons/large_image.gif -text +taxeditor-store/icons/linkto_help.gif -text +taxeditor-store/icons/misapplied.gif -text +taxeditor-store/icons/misapplied_no_bg.gif -text +taxeditor-store/icons/move.gif -text +taxeditor-store/icons/move_no_bg.gif -text +taxeditor-store/icons/new_child.gif -text +taxeditor-store/icons/newprj_wiz.gif -text +taxeditor-store/icons/open.gif -text +taxeditor-store/icons/orthovariant.gif -text +taxeditor-store/icons/orthovariant_no_bg.gif -text +taxeditor-store/icons/prj_obj.gif -text +taxeditor-store/icons/quick_add.gif -text +taxeditor-store/icons/quickfix_error_obj.gif -text +taxeditor-store/icons/quickfix_warning_obj.gif -text +taxeditor-store/icons/rel_no_bg.gif -text +taxeditor-store/icons/repsyn.gif -text +taxeditor-store/icons/repsyn_no_bg.gif -text +taxeditor-store/icons/sample.gif -text +taxeditor-store/icons/save.gif -text +taxeditor-store/icons/save_edit.gif -text +taxeditor-store/icons/swap.gif -text +taxeditor-store/icons/swap2.gif -text +taxeditor-store/icons/tax_to_syn.gif -text +taxeditor-store/icons/text.gif -text +taxeditor-store/icons/th_horizontal.gif -text +taxeditor-store/icons/th_vertical.gif -text +taxeditor-store/icons/undo.gif -text +taxeditor-store/icons/unknown.gif -text +taxeditor-store/icons/unknown_no_bg.gif -text +taxeditor-store/icons/warn_tsk.gif -text +taxeditor-store/plugin.xml -text +taxeditor-store/pom.xml -text +taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/handler/ShowDataSourceViewHandler.java -text +taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/CdmStore.java -text +taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/StoreUtil.java -text +taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/datasource/CdmDataSourceRepository.java -text +taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/datasource/handler/AbstractDataSourceHandler.java -text +taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/datasource/handler/ChangeConnectionHandler.java -text +taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/datasource/handler/CreateDataSourceHandler.java -text +taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/datasource/handler/DeleteDataSourceHandler.java -text +taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/datasource/handler/EditDataSourceHandler.java -text +taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/datasource/view/CdmDataSourceContentProvider.java -text +taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/datasource/view/CdmDataSourceLabelProvider.java -text +taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/datasource/view/CdmDataSourceView.java -text +taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/datasource/wizard/CdmDataSourceCredentialsWizardPage.java -text +taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/datasource/wizard/CdmDataSourceH2WizardPage.java -text +taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/datasource/wizard/CdmDataSourceMySQLWizardPage.java -text +taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/datasource/wizard/CdmDataSourceWizard.java -text +taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/datasource/wizard/CdmDataSourceWizardPage.java -text +taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/internal/TaxeditorStorePlugin.java -text +taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/model/AbstractDataChangeBehaviour.java -text +taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/model/AbstractUtility.java -text +taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/model/DataChangeBridge.java -text +taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/model/DescriptionUtil.java -text +taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/model/IDataChangeBehavior.java -text +taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/model/ImageResources.java -text +taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/model/ImagesUtil.java -text +taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/model/IterableSynonymyList.java -text +taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/model/LanguageUtil.java -text +taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/model/NameRelationsUtil.java -text +taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/model/NameUtil.java -text +taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/model/ReferenceUtil.java -text +taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/model/Resources.java -text +taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/model/SynonymUtil.java -text +taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/model/TaxonTransfer.java -text +taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/model/TaxonUtil.java -text +taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/model/TimeUtil.java -text +taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/model/UriDialog.java -text +taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/operations/AbstractPersistentPostOperation.java -text +taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/operations/AbstractPostOperation.java -text +taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/operations/ChangeConceptRelationshipTypeOperation.java -text +taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/operations/ChangeConceptToSynonymOperation.java -text +taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/operations/ChangeHomotypicGroupOperation.java -text +taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/operations/ChangeHomotypicalGroupBasionymOperation.java -text +taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/operations/ChangeSynonymToConceptOperation.java -text +taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/operations/ChangeSynonymToHomotypicalGroupBasionymOperation.java -text +taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/operations/ChangeSynonymToMisapplicationOperation.java -text +taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/operations/ChangeSynonymToTaxonOperation.java -text +taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/operations/ChangeTaxonToSynonymOperation.java -text +taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/operations/CreateChildTaxonOperation.java -text +taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/operations/CreateConceptRelationOperation.java -text +taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/operations/CreateDescriptionElementOperation.java -text +taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/operations/CreateImageOperation.java -text +taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/operations/CreateMisapplicationOperation.java -text +taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/operations/CreateSynonymInExisitingHomotypicalGroupOperation.java -text +taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/operations/CreateSynonymInNewGroupOperation.java -text +taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/operations/DeleteConceptRelationOperation.java -text +taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/operations/DeleteDescriptionElementOperation.java -text +taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/operations/DeleteImageOperation.java -text +taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/operations/DeleteMisapplicationOperation.java -text +taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/operations/DeleteSynonymOperation.java -text +taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/operations/DeleteTaxonOperation.java -text +taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/operations/IPostOperationEnabled.java -text +taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/operations/MoveTaxonOperation.java -text +taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/operations/RemoveHomotypicalGroupBasionymOperation.java -text +taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/operations/SwapSynonymAndAcceptedOperation.java -text +taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/parser/CdmParserUtil.java -text +taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/preference/CdmPreferences.java -text +taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/preference/DescriptionPreferences.java -text +taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/preference/FeaturePreferences.java -text +taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/preference/InitNomenclaturalCodePrefDialog.java -text +taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/preference/InitializeDbPreferences.java -text +taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/preference/NomenclaturalCodePreferences.java -text +taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/preference/PreferencesUtil.java -text +taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/preference/RankMenuPreferences.java -text +taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/preference/TaxonomicPreferences.java -text +taxeditor-store/src/main/resources/eu/etaxonomy/cdm/defaultApplicationContext.xml -text +taxeditor-store/src/main/resources/log4j.properties -text +taxeditor-store/src/test/java/eu/etaxonomy/taxeditor/store/CdmStoreTest.java -text +taxeditor-store/src/test/java/eu/etaxonomy/taxeditor/store/NameProtectTitleCacheTest.java -text +taxeditor-store/src/test/java/eu/etaxonomy/taxeditor/store/operations/AbstractTaxeditorOperationTest.java -text +taxeditor-store/src/test/java/eu/etaxonomy/taxeditor/store/operations/ChangeConceptRelationshipTypeOperationTest.java -text +taxeditor-store/src/test/java/eu/etaxonomy/taxeditor/store/operations/ChangeConceptToSynonymOperationTest.java -text +taxeditor-store/src/test/java/eu/etaxonomy/taxeditor/store/operations/ChangeHomotypicGroupOperationTest.java -text +taxeditor-store/src/test/java/eu/etaxonomy/taxeditor/store/operations/ChangeHomotypicalGroupBasionymOperationTest.java -text +taxeditor-store/src/test/java/eu/etaxonomy/taxeditor/store/operations/ChangeSynonymToConceptOperationTest.java -text +taxeditor-store/src/test/java/eu/etaxonomy/taxeditor/store/operations/ChangeSynonymToHomotypicalGroupBasionymOperationTest.java -text +taxeditor-store/src/test/java/eu/etaxonomy/taxeditor/store/operations/ChangeSynonymToMisapplicationOperationTest.java -text +taxeditor-store/src/test/java/eu/etaxonomy/taxeditor/store/operations/ChangeSynonymToTaxonOperationTest.java -text +taxeditor-store/src/test/java/eu/etaxonomy/taxeditor/store/operations/ChangeTaxonToSynonymOperationTest.java -text +taxeditor-store/src/test/java/eu/etaxonomy/taxeditor/store/operations/CreateConceptRelationOperationTest.java -text +taxeditor-store/src/test/java/eu/etaxonomy/taxeditor/store/operations/CreateDescriptionElementOperationTest.java -text +taxeditor-store/src/test/java/eu/etaxonomy/taxeditor/store/operations/CreateMisapplicationOperationTest.java -text +taxeditor-store/src/test/java/eu/etaxonomy/taxeditor/store/operations/CreateSynonymInExisitingHomotypicalGroupOperationTest.java -text +taxeditor-store/src/test/java/eu/etaxonomy/taxeditor/store/operations/CreateSynonymInNewGroupOperationTest.java -text +taxeditor-store/src/test/java/eu/etaxonomy/taxeditor/store/operations/DeleteConceptRelationOperationTest.java -text +taxeditor-store/src/test/java/eu/etaxonomy/taxeditor/store/operations/DeleteDescriptionElementOperationTest.java -text +taxeditor-store/src/test/java/eu/etaxonomy/taxeditor/store/operations/DeleteMisapplicationOperationTest.java -text +taxeditor-store/src/test/java/eu/etaxonomy/taxeditor/store/operations/DeleteSynonymOperationTest.java -text +taxeditor-store/src/test/java/eu/etaxonomy/taxeditor/store/operations/DeleteTaxonOperationTest.java -text +taxeditor-store/src/test/java/eu/etaxonomy/taxeditor/store/operations/MoveTaxonOperationTest.java -text +taxeditor-store/src/test/java/eu/etaxonomy/taxeditor/store/operations/SwapSynonymAndAcceptedOperationTest.java -text +taxeditor-store/src/test/resources/dbscripts/001_cdm.ddl -text +taxeditor-store/src/test/resources/eu/etaxonomy/cdm/applicationContext-test.xml -text +taxeditor-store/src/test/resources/eu/etaxonomy/cdm/cdm.datasources.xml -text +taxeditor-store/src/test/resources/eu/etaxonomy/cdm/cdmfs.xml -text +taxeditor-store/src/test/resources/eu/etaxonomy/cdm/database/TermsDataSet-with_auditing_info.xml -text +taxeditor-store/src/test/resources/eu/etaxonomy/cdm/database/TermsDataSet.xml -text +taxeditor-store/src/test/resources/eu/etaxonomy/cdm/database/dataset.dtd -text +taxeditor-store/src/test/resources/eu/etaxonomy/taxeditor/store/CdmStoreTest.xml -text +taxeditor-store/src/test/resources/eu/etaxonomy/taxeditor/store/ConcurrentSessionTest.xml -text +taxeditor-store/src/test/resources/log4j.properties -text +taxeditor-store/src/test/resources/unitils.properties -text +taxeditor-updateSite/.project -text +taxeditor-updateSite/artifacts.xml -text +taxeditor-updateSite/content.xml -text +taxeditor-updateSite/index.html -text +taxeditor-updateSite/site.xml -text +taxeditor-updateSite/web/site.css -text +taxeditor-updateSite/web/site.xsl -text diff --git a/.gitignore b/.gitignore index 612cf961a..153b92831 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,16 @@ eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/sandbox +taxeditor-application/.classpath +taxeditor-application/.project +taxeditor-application/target +taxeditor-editor/.classpath +taxeditor-editor/.project +taxeditor-editor/target +taxeditor-feature/.project +taxeditor-navigation/.classpath +taxeditor-navigation/.project +taxeditor-navigation/target +taxeditor-store/.classpath +taxeditor-store/.project +taxeditor-store/target +taxeditor-updateSite/features/*.jar +taxeditor-updateSite/plugins/*.jar diff --git a/taxeditor-application/META-INF/MANIFEST.MF b/taxeditor-application/META-INF/MANIFEST.MF new file mode 100644 index 000000000..52822028c --- /dev/null +++ b/taxeditor-application/META-INF/MANIFEST.MF @@ -0,0 +1,11 @@ +Manifest-Version: 1.0 +Bundle-ManifestVersion: 2 +Bundle-Name: EDIT Taxonomic Editor +Bundle-SymbolicName: eu.etaxonomy.taxeditor.application;singleton:=true +Bundle-Version: 1.1.0 +Bundle-Activator: eu.etaxonomy.taxeditor.TaxonomicEditorPlugin +Bundle-Vendor: EDIT +Export-Package: eu.etaxonomy.taxeditor +Require-Bundle: org.eclipse.ui;bundle-version="3.4.1",org.eclipse.ui.ide;bundle-version="3.4.1",org.eclipse.core.runtime;bundle-version="3.4.0",org.eclipse.core.resources;bundle-version="3.4.1",eu.etaxonomy.cdmLibrary;bundle-version="2.0.0",eu.etaxonomy.taxeditor.store;bundle-version="1.0.0",eu.etaxonomy.taxeditor.editor;bundle-version="1.0.0",eu.etaxonomy.taxeditor.navigation;bundle-version="1.0.0" +Bundle-ActivationPolicy: lazy +Bundle-Localization: plugin diff --git a/taxeditor-application/TaxEditor.product b/taxeditor-application/TaxEditor.product new file mode 100644 index 000000000..c7addffe5 --- /dev/null +++ b/taxeditor-application/TaxEditor.product @@ -0,0 +1,89 @@ + + + + + + + + %productBlurb + + + + + + + + -XstartOnFirstThread -Dorg.eclipse.swt.internal.carbon.smallFonts + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/taxeditor-application/build.properties b/taxeditor-application/build.properties new file mode 100644 index 000000000..3ea0d4295 --- /dev/null +++ b/taxeditor-application/build.properties @@ -0,0 +1,10 @@ +source.. = src/main/java/,\ + src/test/java/,\ + src/main/resources/ +bin.includes = META-INF/,\ + .,\ + plugin.xml,\ + plugin_customization.ini,\ + icons/,\ + plugin.properties,\ + splash.bmp diff --git a/taxeditor-application/icons/256color_16x16.gif b/taxeditor-application/icons/256color_16x16.gif new file mode 100644 index 000000000..4494020f0 Binary files /dev/null and b/taxeditor-application/icons/256color_16x16.gif differ diff --git a/taxeditor-application/icons/256color_32x32.gif b/taxeditor-application/icons/256color_32x32.gif new file mode 100644 index 000000000..200ebf2eb Binary files /dev/null and b/taxeditor-application/icons/256color_32x32.gif differ diff --git a/taxeditor-application/icons/256color_48x48.gif b/taxeditor-application/icons/256color_48x48.gif new file mode 100644 index 000000000..ea2bc3a30 Binary files /dev/null and b/taxeditor-application/icons/256color_48x48.gif differ diff --git a/taxeditor-application/icons/edit_16x16.gif b/taxeditor-application/icons/edit_16x16.gif new file mode 100644 index 000000000..d857c6c71 Binary files /dev/null and b/taxeditor-application/icons/edit_16x16.gif differ diff --git a/taxeditor-application/plugin.properties b/taxeditor-application/plugin.properties new file mode 100644 index 000000000..f25ebcb7d --- /dev/null +++ b/taxeditor-application/plugin.properties @@ -0,0 +1,2 @@ +productName=EDIT Taxonomic Editor +productBlurb= \ No newline at end of file diff --git a/taxeditor-application/plugin.xml b/taxeditor-application/plugin.xml new file mode 100644 index 000000000..84e51a5ec --- /dev/null +++ b/taxeditor-application/plugin.xml @@ -0,0 +1,212 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/taxeditor-application/plugin_customization.ini b/taxeditor-application/plugin_customization.ini new file mode 100644 index 000000000..5c5a62a76 --- /dev/null +++ b/taxeditor-application/plugin_customization.ini @@ -0,0 +1,5 @@ +org.eclipse.ui/SHOW_PROGRESS_ON_STARTUP = true +org.eclipse.ui/SHOW_TRADITIONAL_STYLE_TABS=false +org.eclipse.ui/DOCK_PERSPECTIVE_BAR=top-right +org.eclipse.ui/SHOW_TEXT_ON_PERSPECTIVE_BAR=true + diff --git a/taxeditor-application/pom.xml b/taxeditor-application/pom.xml new file mode 100644 index 000000000..66e6b0f1c --- /dev/null +++ b/taxeditor-application/pom.xml @@ -0,0 +1,32 @@ + + + + eu.etaxonomy + taxeditor-parent + 1.0 + + + 4.0.0 + eu.etaxonomy + taxeditor-application + jar + 1.0 + Application + All plugins are combined into this application. + http://dev.e-taxonomy.eu/trac/wiki/TaxonomicEditor + + + eu.etaxonomy + taxeditor-store + + + eu.etaxonomy + taxeditor-navigation + + + eu.etaxonomy + taxeditor-editor + + + diff --git a/taxeditor-application/splash.bmp b/taxeditor-application/splash.bmp new file mode 100644 index 000000000..f7fafc457 Binary files /dev/null and b/taxeditor-application/splash.bmp differ diff --git a/taxeditor-application/src/main/java/eu/etaxonomy/taxeditor/Application.java b/taxeditor-application/src/main/java/eu/etaxonomy/taxeditor/Application.java new file mode 100644 index 000000000..96016ec0a --- /dev/null +++ b/taxeditor-application/src/main/java/eu/etaxonomy/taxeditor/Application.java @@ -0,0 +1,45 @@ +package eu.etaxonomy.taxeditor; + +import org.eclipse.equinox.app.IApplication; +import org.eclipse.equinox.app.IApplicationContext; +import org.eclipse.swt.widgets.Display; +import org.eclipse.ui.IWorkbench; +import org.eclipse.ui.PlatformUI; + +/** + * This class controls all aspects of the application's execution + */ +public class Application implements IApplication { + + /* (non-Javadoc) + * @see org.eclipse.equinox.app.IApplication#start(org.eclipse.equinox.app.IApplicationContext) + */ + public Object start(IApplicationContext context) { + Display display = PlatformUI.createDisplay(); + try { + int returnCode = PlatformUI.createAndRunWorkbench(display, new ApplicationWorkbenchAdvisor()); + if (returnCode == PlatformUI.RETURN_RESTART) { + return IApplication.EXIT_RESTART; + } + return IApplication.EXIT_OK; + } finally { + display.dispose(); + } + } + + /* (non-Javadoc) + * @see org.eclipse.equinox.app.IApplication#stop() + */ + public void stop() { + final IWorkbench workbench = PlatformUI.getWorkbench(); + if (workbench == null) + return; + final Display display = workbench.getDisplay(); + display.syncExec(new Runnable() { + public void run() { + if (!display.isDisposed()) + workbench.close(); + } + }); + } +} diff --git a/taxeditor-application/src/main/java/eu/etaxonomy/taxeditor/ApplicationActionBarAdvisor.java b/taxeditor-application/src/main/java/eu/etaxonomy/taxeditor/ApplicationActionBarAdvisor.java new file mode 100644 index 000000000..dc82904c1 --- /dev/null +++ b/taxeditor-application/src/main/java/eu/etaxonomy/taxeditor/ApplicationActionBarAdvisor.java @@ -0,0 +1,37 @@ +package eu.etaxonomy.taxeditor; + +import org.eclipse.jface.action.IMenuManager; +import org.eclipse.ui.IWorkbenchWindow; +import org.eclipse.ui.actions.ActionFactory.IWorkbenchAction; +import org.eclipse.ui.application.ActionBarAdvisor; +import org.eclipse.ui.application.IActionBarConfigurer; + +import eu.etaxonomy.taxeditor.editor.EditorUtil; +import eu.etaxonomy.taxeditor.navigation.NavigationUtil; + +/** + * An action bar advisor is responsible for creating, adding, and disposing of + * the actions added to a workbench window. Each window will be populated with + * new actions. + */ +public class ApplicationActionBarAdvisor extends ActionBarAdvisor { + + // Actions - important to allocate these only in makeActions, and then use + // them + // in the fill methods. This ensures that the actions aren't recreated + // when fillActionBars is called with FILL_PROXY. + private IWorkbenchAction exitAction; + + public ApplicationActionBarAdvisor(IActionBarConfigurer configurer) { + super(configurer); + } + + protected void makeActions(final IWorkbenchWindow window) { + NavigationUtil.setStatusLineManager(getActionBarConfigurer().getStatusLineManager()); + EditorUtil.setStatusLineManager(getActionBarConfigurer().getStatusLineManager()); + } + + protected void fillMenuBar(IMenuManager menuBar) { + } + +} diff --git a/taxeditor-application/src/main/java/eu/etaxonomy/taxeditor/ApplicationWorkbenchAdvisor.java b/taxeditor-application/src/main/java/eu/etaxonomy/taxeditor/ApplicationWorkbenchAdvisor.java new file mode 100644 index 000000000..e6b110225 --- /dev/null +++ b/taxeditor-application/src/main/java/eu/etaxonomy/taxeditor/ApplicationWorkbenchAdvisor.java @@ -0,0 +1,58 @@ +package eu.etaxonomy.taxeditor; + +import org.eclipse.ui.application.IWorkbenchConfigurer; +import org.eclipse.ui.application.IWorkbenchWindowConfigurer; +import org.eclipse.ui.application.WorkbenchAdvisor; +import org.eclipse.ui.application.WorkbenchWindowAdvisor; + +public class ApplicationWorkbenchAdvisor extends WorkbenchAdvisor { + + private static final String PERSPECTIVE_ID = Perspective.ID; + + public WorkbenchWindowAdvisor createWorkbenchWindowAdvisor( + IWorkbenchWindowConfigurer configurer) { + return new ApplicationWorkbenchWindowAdvisor(configurer); + } + + public String getInitialWindowPerspectiveId() { + return PERSPECTIVE_ID; + } + + public void initialize(IWorkbenchConfigurer configurer) { + super.initialize(configurer); + + // Remembers the user's view layout, window size, window location etc. + // for the next time application is started + configurer.setSaveAndRestore(true); + } + + +// public void initialize(IWorkbenchConfigurer configurer) { +// +// WorkbenchAdapterBuilder.registerAdapters(); +// +// final String ICONS_PATH = "icons/full/"; +// final String PATH_OBJECT = ICONS_PATH + "obj16/"; +// Bundle ideBundle = Platform.getBundle(IDEWorkbenchPlugin.IDE_WORKBENCH); +// declareWorkbenchImage(configurer, ideBundle, +// IDE.SharedImages.IMG_OBJ_PROJECT, PATH_OBJECT + "prj_obj.gif", +// true); +// declareWorkbenchImage(configurer, ideBundle, +// IDE.SharedImages.IMG_OBJ_PROJECT_CLOSED, PATH_OBJECT +// + "cprj_obj.gif", true); +// +// } +// +// private void declareWorkbenchImage(IWorkbenchConfigurer configurer_p, +// Bundle ideBundle, String symbolicName, String path, boolean shared) { +// URL url = ideBundle.getEntry(path); +// ImageDescriptor desc = ImageDescriptor.createFromURL(url); +// configurer_p.declareImage(symbolicName, desc, shared); +// } +// +// public IAdaptable getDefaultPageInput() { +// IWorkspace workspace = ResourcesPlugin.getWorkspace(); +// return workspace.getRoot(); +// } + +} diff --git a/taxeditor-application/src/main/java/eu/etaxonomy/taxeditor/ApplicationWorkbenchWindowAdvisor.java b/taxeditor-application/src/main/java/eu/etaxonomy/taxeditor/ApplicationWorkbenchWindowAdvisor.java new file mode 100644 index 000000000..5bcf6fc0f --- /dev/null +++ b/taxeditor-application/src/main/java/eu/etaxonomy/taxeditor/ApplicationWorkbenchWindowAdvisor.java @@ -0,0 +1,110 @@ +package eu.etaxonomy.taxeditor; + +import org.apache.log4j.Logger; +import org.eclipse.jface.dialogs.Dialog; +import org.eclipse.jface.dialogs.MessageDialog; +import org.eclipse.swt.graphics.Point; +import org.eclipse.swt.widgets.Shell; +import org.eclipse.ui.IPartListener; +import org.eclipse.ui.IPartListener2; +import org.eclipse.ui.IWorkbenchPartReference; +import org.eclipse.ui.application.ActionBarAdvisor; +import org.eclipse.ui.application.IActionBarConfigurer; +import org.eclipse.ui.application.IWorkbenchWindowConfigurer; +import org.eclipse.ui.application.WorkbenchWindowAdvisor; + +import eu.etaxonomy.taxeditor.editor.EditorUtil; +import eu.etaxonomy.taxeditor.editor.MultiPageTaxonEditor; +import eu.etaxonomy.taxeditor.store.preference.InitNomenclaturalCodePrefDialog; +import eu.etaxonomy.taxeditor.store.preference.PreferencesUtil; + +public class ApplicationWorkbenchWindowAdvisor extends WorkbenchWindowAdvisor { + private static final Logger logger = Logger.getLogger(ApplicationWorkbenchWindowAdvisor.class); + + private IPartListener2 propertySheetListener; + + public ApplicationWorkbenchWindowAdvisor(IWorkbenchWindowConfigurer configurer) { + super(configurer); + } + + public ActionBarAdvisor createActionBarAdvisor( + IActionBarConfigurer configurer) { + return new ApplicationActionBarAdvisor(configurer); + } + + public void preWindowOpen() { + IWorkbenchWindowConfigurer configurer = getWindowConfigurer(); + configurer.setInitialSize(new Point(963, 637)); + configurer.setShowCoolBar(true); + configurer.setShowStatusLine(true); + configurer.setShowPerspectiveBar(true); + configurer.setTitle("EDIT Taxonomic Editor"); + } + + public void postWindowOpen() { + checkNomenclaturalCode(); + +// setPropertySheetListener(); + } + +// /** +// * +// */ +// private void setPropertySheetListener() { +// propertySheetListener = new IPartListener2() { +// +// public void partActivated(IWorkbenchPartReference partRef) { +// if (partRef.getId().equals(MultiPageTaxonEditor.ID)) { +// EditorUtil.showPropertySheet(); +// } +// } +// +// public void partOpened(IWorkbenchPartReference partRef) { +//// if (partRef.getId().equals(MultiPageTaxonEditor.ID)) { +//// EditorUtil.showPropertySheet(); +//// } +// } +// +// public void partClosed(IWorkbenchPartReference partRef) { +//// if (partRef.getId().equals(MultiPageTaxonEditor.ID)) { +//// EditorUtil.checkHidePropertySheet(); +//// } +// } +// +// public void partBroughtToTop(IWorkbenchPartReference partRef) {} +// +// public void partDeactivated(IWorkbenchPartReference partRef) { +// EditorUtil.checkHidePropertySheet(); +// } +// +// public void partHidden(IWorkbenchPartReference partRef) {} +// +// public void partInputChanged(IWorkbenchPartReference partRef) {} +// +// public void partVisible(IWorkbenchPartReference partRef) {} +// +// }; +//// getWindowConfigurer().getWindow().getActivePage().addPartListener(propertySheetListener); +// } + + private void checkNomenclaturalCode() { + + // First time Editor is opened, no nomenclatural code has been set + if (PreferencesUtil.getPreferredNomenclaturalCode() == null) { + + Shell shell = TaxonomicEditorPlugin.getDefault().getWorkbench() + .getActiveWorkbenchWindow().getShell(); + + // Query user re: preferred nom. code + Dialog dialog = new InitNomenclaturalCodePrefDialog(shell); + int returnCode = dialog.open(); + + // Short message confirming user's choice + String code = PreferencesUtil.getPreferredNomenclaturalCodeAsString(); + MessageDialog.openInformation(shell, "Nomenclatural code set", + "The following has been set as your preferred nomenclatural code:\n\n\t" + + code + "\n\nYou can change the nomenclatural code at any time in the \"Preferences\" menu."); + } + } +} + \ No newline at end of file diff --git a/taxeditor-application/src/main/java/eu/etaxonomy/taxeditor/Perspective.java b/taxeditor-application/src/main/java/eu/etaxonomy/taxeditor/Perspective.java new file mode 100644 index 000000000..df83183e1 --- /dev/null +++ b/taxeditor-application/src/main/java/eu/etaxonomy/taxeditor/Perspective.java @@ -0,0 +1,25 @@ +package eu.etaxonomy.taxeditor; + +import org.eclipse.ui.IFolderLayout; +import org.eclipse.ui.IPageLayout; +import org.eclipse.ui.IPerspectiveFactory; + +import eu.etaxonomy.taxeditor.navigation.taxonomictree.TaxonomicTreeView; + +public class Perspective implements IPerspectiveFactory { + + public static final String ID = "eu.etaxonomy.taxeditor.application.perspective"; + + /* (non-Javadoc) + * @see org.eclipse.ui.IPerspectiveFactory#createInitialLayout(org.eclipse.ui.IPageLayout) + */ + public void createInitialLayout(IPageLayout layout) { + IFolderLayout navigationFolder = layout.createFolder("searchResults", IPageLayout.LEFT, 0.25f, + layout.getEditorArea()); + + // Note: ":*" is what allows us to call multiple searchResultView's with unique secondaryIds; + // this can only be done here, with a placeholder, not in plugin.xml + navigationFolder.addPlaceholder("eu.etaxonomy.taxeditor.navigation.search.searchResultView:*"); + navigationFolder.addView(TaxonomicTreeView.ID); + } +} \ No newline at end of file diff --git a/taxeditor-application/src/main/java/eu/etaxonomy/taxeditor/TaxonomicEditorPlugin.java b/taxeditor-application/src/main/java/eu/etaxonomy/taxeditor/TaxonomicEditorPlugin.java new file mode 100644 index 000000000..376499890 --- /dev/null +++ b/taxeditor-application/src/main/java/eu/etaxonomy/taxeditor/TaxonomicEditorPlugin.java @@ -0,0 +1,52 @@ +package eu.etaxonomy.taxeditor; + +import org.apache.log4j.Logger; +import org.eclipse.ui.plugin.AbstractUIPlugin; +import org.osgi.framework.BundleContext; + +/** + * The activator class controls the plug-in life cycle + */ +public class TaxonomicEditorPlugin extends AbstractUIPlugin { + private static final Logger logger = Logger + .getLogger(TaxonomicEditorPlugin.class); + + // The plug-in ID + public static final String PLUGIN_ID = "eu.etaxonomy.taxeditor.application"; + + // The shared instance + private static TaxonomicEditorPlugin plugin; + + /** + * The constructor + */ + public TaxonomicEditorPlugin() { + } + + /* + * (non-Javadoc) + * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext) + */ + public void start(BundleContext context) throws Exception { + super.start(context); + plugin = this; + } + + /* + * (non-Javadoc) + * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext) + */ + public void stop(BundleContext context) throws Exception { + plugin = null; + super.stop(context); + } + + /** + * Returns the shared instance + * + * @return the shared instance + */ + public static TaxonomicEditorPlugin getDefault() { + return plugin; + } +} diff --git a/taxeditor-application/src/main/resources/log4j.properties b/taxeditor-application/src/main/resources/log4j.properties new file mode 100644 index 000000000..c7c943eb9 --- /dev/null +++ b/taxeditor-application/src/main/resources/log4j.properties @@ -0,0 +1,29 @@ +### ************ APPENDER ***********************************### + +### direct log messages to stdout ### +log4j.appender.stdout=org.apache.log4j.ConsoleAppender +log4j.appender.stdout.Target=System.out +log4j.appender.stdout.layout=org.apache.log4j.PatternLayout +log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n + +### direct messages to file hibernate.log ### +log4j.appender.file=org.apache.log4j.FileAppender +log4j.appender.file.File=taxeditor.log +log4j.appender.file.layout=org.apache.log4j.PatternLayout +log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n + +### ************* LOG LEVELS *********************************### + +### set log levels - for more verbose logging change 'info' to 'debug' ### +### levels: error, warn, debug, info +log4j.rootLogger=INFO, stdout + +### set directory-specific levels below + +### basic level for editor directory +log4j.logger.eu.etaxonomy.taxeditor.editor = WARN, stdout + +log4j.logger.eu.etaxonomy.taxeditor.editor.handler = DEBUG, stdout + +### log level for conversation handler +#log4j.logger.eu.etaxonomy.cdm.api.application = DEBUG, stdout diff --git a/taxeditor-editor/.settings/org.eclipse.jdt.ui.prefs b/taxeditor-editor/.settings/org.eclipse.jdt.ui.prefs new file mode 100644 index 000000000..ee6f90d5a --- /dev/null +++ b/taxeditor-editor/.settings/org.eclipse.jdt.ui.prefs @@ -0,0 +1,3 @@ +#Mon Apr 20 16:51:59 CEST 2009 +eclipse.preferences.version=1 +org.eclipse.jdt.ui.text.custom_code_templates= diff --git a/taxeditor-editor/META-INF/MANIFEST.MF b/taxeditor-editor/META-INF/MANIFEST.MF new file mode 100644 index 000000000..c4ccc70b1 --- /dev/null +++ b/taxeditor-editor/META-INF/MANIFEST.MF @@ -0,0 +1,40 @@ +Manifest-Version: 1.0 +Bundle-ManifestVersion: 2 +Bundle-Name: %Bundle-Name.0 +Bundle-SymbolicName: eu.etaxonomy.taxeditor.editor;singleton:=true +Bundle-Version: 1.1.0 +Bundle-Activator: eu.etaxonomy.taxeditor.editor.internal.TaxeditorEditorPlugin +Bundle-Vendor: %Bundle-Vendor.0 +Export-Package: eu.etaxonomy.taxeditor.editor, + eu.etaxonomy.taxeditor.editor.description, + eu.etaxonomy.taxeditor.editor.handler, + eu.etaxonomy.taxeditor.editor.images, + eu.etaxonomy.taxeditor.editor.internal, + eu.etaxonomy.taxeditor.editor.name, + eu.etaxonomy.taxeditor.propertysheet, + eu.etaxonomy.taxeditor.propertysheet.description, + eu.etaxonomy.taxeditor.propertysheet.images, + eu.etaxonomy.taxeditor.propertysheet.name, + eu.etaxonomy.taxeditor.propertysheet.namerelations.wizard, + eu.etaxonomy.taxeditor.propertysheet.reference, + eu.etaxonomy.taxeditor.propertysheet.type, + eu.etaxonomy.taxeditor.propertysheet.type.wizard +Require-Bundle: org.eclipse.ui;bundle-version="3.4.1", + org.eclipse.core.runtime;bundle-version="3.4.0", + org.eclipse.core.databinding;bundle-version="1.1.1", + org.eclipse.core.databinding.beans;bundle-version="1.1.1", + org.eclipse.ui.editors;bundle-version="3.4.0", + org.eclipse.jface;bundle-version="3.4.1", + org.eclipse.jface.databinding;bundle-version="1.2.1", + org.eclipse.ui.ide;bundle-version="3.4.1", + org.eclipse.core.resources;bundle-version="3.4.1", + org.eclipse.core.filesystem;bundle-version="1.2.0", + org.eclipse.core.expressions;bundle-version="3.4.0", + org.eclipse.ui.forms;bundle-version="3.3.101", + org.eclipse.jface.text;bundle-version="3.4.1", + eu.etaxonomy.cdmLibrary;bundle-version="2.0.0", + eu.etaxonomy.taxeditor.store;bundle-version="1.0.0" +Bundle-ActivationPolicy: lazy +Bundle-Localization: plugin +Bundle-ClassPath: ., + icons/ diff --git a/taxeditor-editor/build.properties b/taxeditor-editor/build.properties new file mode 100644 index 000000000..87c865cf9 --- /dev/null +++ b/taxeditor-editor/build.properties @@ -0,0 +1,9 @@ +source.. = src/main/java/,\ + src/test/java/ +bin.includes = META-INF/,\ + .,\ + plugin.xml,\ + log4j.properties,\ + plugin.properties,\ + icons/ +src.includes = log4j.properties diff --git a/taxeditor-editor/plugin.properties b/taxeditor-editor/plugin.properties new file mode 100644 index 000000000..090394d59 --- /dev/null +++ b/taxeditor-editor/plugin.properties @@ -0,0 +1,5 @@ +#Properties file for taxeditor-editor +Bundle-Vendor.0 = EDIT +Bundle-Name.0 = EDIT Taxonomic Editor - Editor Bundle +command.name.17 = Set Basionym +command.name.18 = Remove Basionym \ No newline at end of file diff --git a/taxeditor-editor/plugin.xml b/taxeditor-editor/plugin.xml new file mode 100644 index 000000000..9db88268e --- /dev/null +++ b/taxeditor-editor/plugin.xml @@ -0,0 +1,743 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/taxeditor-editor/pom.xml b/taxeditor-editor/pom.xml new file mode 100644 index 000000000..715674e93 --- /dev/null +++ b/taxeditor-editor/pom.xml @@ -0,0 +1,24 @@ + + + + eu.etaxonomy + taxeditor-parent + 1.0 + + + 4.0.0 + eu.etaxonomy + taxeditor-editor + jar + 1.0 + Editor Bundle + http://dev.e-taxonomy.eu/trac/wiki/TaxonomicEditorEditorBundle + + + + eu.etaxonomy + taxeditor-store + + + diff --git a/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/AbstractTaxonEditor.java b/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/AbstractTaxonEditor.java new file mode 100644 index 000000000..5f1b091cf --- /dev/null +++ b/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/AbstractTaxonEditor.java @@ -0,0 +1,463 @@ +/** +* Copyright (C) 2007 EDIT +* European Distributed Institute of Taxonomy +* http://www.e-taxonomy.eu +* +* The contents of this file are subject to the Mozilla Public License Version 1.1 +* See LICENSE.TXT at the top of this package for the full license terms. +*/ + +package eu.etaxonomy.taxeditor.editor; + +import java.util.HashSet; + +import org.apache.log4j.Logger; +import org.eclipse.core.commands.operations.IUndoContext; +import org.eclipse.core.runtime.IAdaptable; +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.jface.action.IMenuManager; +import org.eclipse.jface.action.IStatusLineManager; +import org.eclipse.jface.action.IToolBarManager; +import org.eclipse.jface.action.MenuManager; +import org.eclipse.jface.viewers.ISelectionProvider; +import org.eclipse.jface.viewers.StructuredSelection; +import org.eclipse.swt.SWT; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Control; +import org.eclipse.swt.widgets.Display; +import org.eclipse.swt.widgets.Menu; +import org.eclipse.swt.widgets.Tree; +import org.eclipse.ui.IEditorInput; +import org.eclipse.ui.IEditorSite; +import org.eclipse.ui.PartInitException; +import org.eclipse.ui.forms.ManagedForm; +import org.eclipse.ui.forms.widgets.ScrolledForm; +import org.eclipse.ui.forms.widgets.TableWrapLayout; +import org.eclipse.ui.part.EditorPart; +import org.eclipse.ui.views.properties.IPropertySheetEntry; +import org.eclipse.ui.views.properties.IPropertySheetPage; +import org.eclipse.ui.views.properties.IPropertySource; +import org.eclipse.ui.views.properties.PropertySheetPage; +import org.eclipse.ui.views.properties.PropertySheetSorter; + +import eu.etaxonomy.cdm.api.conversation.ConversationHolder; +import eu.etaxonomy.cdm.api.conversation.IConversationEnabled; +import eu.etaxonomy.cdm.model.common.CdmBase; +import eu.etaxonomy.cdm.model.taxon.Taxon; +import eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeMap; +import eu.etaxonomy.taxeditor.propertysheet.EditorPropertySheetEntry; +import eu.etaxonomy.taxeditor.propertysheet.PropertySheetUtil; +import eu.etaxonomy.taxeditor.store.model.Resources; +import eu.etaxonomy.taxeditor.store.operations.IPostOperationEnabled; + +/** + * The abstract editor for displaying a category of Taxon data, corresponding + * to the tabs ("Name", "Descriptive", etc.) at the bottom of a Taxon view. Implements + * IAdaptable in order to display properties of the objects whose UI elements have focus. + *

+ * Implementing classes can choose to show an object in the property sheet when the + * AbstractTaxonEditor gets focus, by passing the object to the method + * setDefaultPropertySheetObject, for instance, in the methodinit. + *

+ * @author p.ciardelli + * @author n.hoffmann + * @created 10.09.2008 + * @version 1.0 + */ +public abstract class AbstractTaxonEditor extends EditorPart implements IAdaptable, IConversationEnabled, IPostOperationEnabled { + private static final Logger logger = Logger + .getLogger(AbstractTaxonEditor.class); + + protected Taxon taxon; + + /** + * When this EditorPart gets focus, the data structure of + * defaultPropertyObject is displayed in the property sheet. + */ + + protected ManagedForm managedForm; + protected ScrolledForm scrolledForm; + protected Composite parent; + protected ISelectionProvider provider; + + protected MultiPageTaxonEditor editor; + + protected IHasPropertySource selectedObject; + + protected Composite partComposite; + protected GroupedComposite firstGroupedComposite; + + protected Object selectedData; + + protected ConversationHolder conversation; + + private MenuManager menuManager; + + private Menu menu; + + /** + * The object that was affected by last operation. + */ + private CdmBase objectAffectedByLastOperation; + + private boolean isRedrawing; + + protected AbstractTaxonEditor(MultiPageTaxonEditor editor){ + this.editor = editor; + this.conversation = editor.getConversationHolder(); + } + + /* (non-Javadoc) + * @see org.eclipse.ui.part.EditorPart#doSave(org.eclipse.core.runtime.IProgressMonitor) + */ + public void doSave(IProgressMonitor monitor) { + conversation.commit(); + } + + /* (non-Javadoc) + * @see org.eclipse.ui.part.EditorPart#doSaveAs() + */ + public void doSaveAs() {} + + /* (non-Javadoc) + * @see org.eclipse.ui.part.EditorPart#init(org.eclipse.ui.IEditorSite, org.eclipse.ui.IEditorInput) + */ + public void init(IEditorSite site, IEditorInput input) + throws PartInitException { + // bind the session + + + if (!(input instanceof IEditorInput)) + throw new PartInitException( + "Invalid Input: Must be IEditorInput"); + + if (input.getAdapter(Taxon.class) != null) { + taxon = (Taxon) input.getAdapter(Taxon.class); + } else { + throw new PartInitException( + "Invalid Input: Taxon cannot be null"); + } + + setSite(site); + setInput(input); + + this.provider = new SimpleSelectionProvider(); + this.getSite().setSelectionProvider(provider); + + } + + public IUndoContext getUndoContext() { + return editor.getUndoContext(); + } + + /** + * If there is a default property sheet object with a corresponding property source class, + * display it in the property sheet. Otherwise, empty the property sheet with an empty + * StructuredSelection. + * + * @param selectedObject + */ + protected void setSelection(IHasPropertySource selectedObject) { + + // Unpaint last selection - last selection will only be unpainted + // when something else on this page is selected + if (this.selectedObject instanceof GroupedComposite) { + GroupedComposite composite = ((GroupedComposite) this.selectedObject); + composite.unpaintBorder(); + composite.setBackground(Resources.getColor(Resources.COLOR_COMPOSITE_BACKGROUND)); + } + + // Set the selection to this editor's selected object + this.selectedObject = selectedObject; + + // set background on selection TODO wanted to move this to setFocus() on the selectedObject but that doesn't work (infinite loop) +// ((GroupedComposite) selectedObject).setSelected(); + ((GroupedComposite) selectedObject).setBackground(Resources.getColor(Resources.COLOR_COMPOSITE_SELECTED)); + + + if (selectedObject instanceof Composite) { + this.selectedData = ((Composite) selectedObject).getData(); + } + + // Get the selection's property source, pass it to the selection provider + IPropertySource propertySource = null; + if (selectedObject != null) { + propertySource = selectedObject.getPropertySource(); + } + if (propertySource == null) { + provider.setSelection(new StructuredSelection()); + } else { + provider.setSelection(new StructuredSelection(propertySource)); + } + + } + + /* (non-Javadoc) + * @see org.eclipse.ui.part.EditorPart#isDirty() + */ + public boolean isDirty() { + return false; + } + + /* (non-Javadoc) + * @see org.eclipse.ui.part.EditorPart#isSaveAsAllowed() + */ + public boolean isSaveAsAllowed() { + return false; + } + + /* (non-Javadoc) + * @see org.eclipse.ui.part.WorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite) + */ + public void createPartControl(Composite composite) { + + this.partComposite = composite; + + createManagedForm(composite); + } + + protected void createManagedForm(Composite composite) { + + managedForm = new ManagedForm(composite) { + public void dirtyStateChanged() { + firePropertyChange(PROP_DIRTY); + } + public boolean setInput(Object input) { + if (input instanceof IHasPropertySource) { + setSelection((IHasPropertySource)input); + } + return super.setInput(input); + } + }; + scrolledForm = managedForm.getForm(); + parent = scrolledForm.getBody(); + + // register the context menu + menuManager = new MenuManager(); + ISelectionProvider selectionProvider = getSite().getSelectionProvider(); + getSite().registerContextMenu(getID(), menuManager, selectionProvider); + + menu = menuManager.createContextMenu(parent); + scrolledForm.setMenu(menu); + + parent.setData(taxon); + + parent.setLayout(new TableWrapLayout()); + parent.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE)); + } + + @SuppressWarnings("unchecked") + public Object getAdapter(Class type) { + if (type == IPropertySheetPage.class) { + + PropertySheetPage page = new EditorPropertySheetPage(); + + PropertySheetUtil.setPropertySheetPage(page); + + EditorPropertySheetEntry entry = new EditorPropertySheetEntry(taxon, this); + page.setRootEntry(entry); + page.refresh(); + + return page; + } + return super.getAdapter(type); + } + + public Taxon getTaxon() { + return taxon; + } + + public void setDirty() { + managedForm.dirtyStateChanged(); + } + + public void setFocus(){ + + Object selection; + + if(selectedData == null){ + selection = (objectAffectedByLastOperation == null) ? null : objectAffectedByLastOperation; + }else{ + selection = (objectAffectedByLastOperation == null) ? selectedData : objectAffectedByLastOperation; + } + + // make selection + if (selection == null){ + GroupedComposite focusComposite = firstGroupedComposite; + setSelection(focusComposite); + focusComposite.drawBorder(); + } else { + selectedData = selection; + + for (Composite composite : getAllComposites()) { + if (composite instanceof GroupedComposite && selectedData.equals(composite.getData())) { + setSelection((GroupedComposite) composite); + ((GroupedComposite) composite).drawBorder(); + ((GroupedComposite) composite).setSelected(); + break; + } + } + } + + // reset + objectAffectedByLastOperation = null; + } + + protected HashSet getAllComposites(){ + HashSet composites = new HashSet(); + composites.add(parent); + composites.addAll(getComposites(parent)); + return composites; + } + + public void setInput(IEditorInput input){ + this.setInputWithNotify(input); + } + + private HashSet getComposites(Composite composite){ + HashSet composites = new HashSet(); + for(Control child : composite.getChildren()){ + if(child instanceof Composite){ + composites.add((Composite)child); + composites.addAll(getComposites((Composite)child)); + } + } + return composites; + } + + /* + * (non-Javadoc) + * @see eu.etaxonomy.cdm.api.conversation.IConversationEnabled#getConversationHolder() + */ + public ConversationHolder getConversationHolder(){ + return conversation; + } + + /* + * (non-Javadoc) + * @see eu.etaxonomy.cdm.persistence.hibernate.ICdmPostCrudObserver#update(eu.etaxonomy.cdm.persistence.hibernate.CdmCrudEvent) + */ + public void update(CdmDataChangeMap events) { + //redraw(); + } + + /** + * + */ + public boolean redraw() { + + isRedrawing = true; + + this.selectedObject = null; + managedForm.getForm().dispose(); + createManagedForm(partComposite); + + setFocus(); + + isRedrawing = false; + + return true; + + } + + public boolean getIsRedrawing() { + return isRedrawing; + } + + public MultiPageTaxonEditor getMultiPageTaxonEditor() { + return editor; + } + + + /* + * (non-Javadoc) + * @see eu.etaxonomy.taxeditor.store.operations.IPostOperationEnabled#postOperation() + */ + public boolean postOperation(CdmBase objectAffectedByOperation) { + + if (isRedrawing) { + return false; + } + + if (objectAffectedByOperation == null && selectedData instanceof CdmBase) { + this.objectAffectedByLastOperation = (CdmBase) selectedData; + } else { + this.objectAffectedByLastOperation = objectAffectedByOperation; + } + editor.setDirty(); + return redraw(); + } + + + /** + * @return the managedForm + */ + public ManagedForm getManagedForm() { + return managedForm; + } + + public Composite getTopLevelComposite() { + return this.getManagedForm().getForm().getBody(); + } + + /** + * + * @return the ID as defined in plugin.xml + */ + public abstract String getID(); + + /** + * @return the menu + */ + public Menu getMenu() { + return menu; + } + + /** + * @return the firstGroupedComposite + */ + public GroupedComposite getFirstGroupedComposite() { + return firstGroupedComposite; + } + + class EditorPropertySheetPage extends PropertySheetPage { + + EditorPropertySheetPage() { + super(); + + // Override sorter to simply display names as first-in-first-out + setSorter(new PropertySheetSorter() { + public int compare(IPropertySheetEntry entryA, IPropertySheetEntry entryB) { + return 0; + } + public int compareCategories(String categoryA, String categoryB) { + return 0; + } + public void sort(IPropertySheetEntry[] entries) { + // do nothing + } + }); + } + + public void makeContributions(IMenuManager menuManager, + IToolBarManager toolBarManager, IStatusLineManager statusLineManager) { + super.makeContributions(menuManager, toolBarManager, statusLineManager); + + // Remove "Show categories", "Show advanced properties", "Restore default value" + toolBarManager.removeAll(); + menuManager.removeAll(); + } + + public Control getControl() { + Control control = super.getControl(); + + // Save the property sheet tree for easy access as needed + if (!control.isDisposed()) { + if (control instanceof Tree) { + PropertySheetUtil.setPropertySheetTree((Tree) control); + } + } + return control; + } + } +} 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 new file mode 100644 index 000000000..623fc8adf --- /dev/null +++ b/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/CompositeBorderDecorator.java @@ -0,0 +1,99 @@ +/** +* Copyright (C) 2007 EDIT +* European Distributed Institute of Taxonomy +* http://www.e-taxonomy.eu +* +* The contents of this file are subject to the Mozilla Public License Version 1.1 +* See LICENSE.TXT at the top of this package for the full license terms. +*/ + +package eu.etaxonomy.taxeditor.editor; + +import org.eclipse.swt.events.FocusEvent; +import org.eclipse.swt.events.FocusListener; +import org.eclipse.swt.graphics.Color; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.ui.forms.IManagedForm; +import org.eclipse.ui.forms.widgets.FormToolkit; +import org.eclipse.ui.forms.widgets.ScrolledForm; + +/** + * Draws a border on a Composite on an IManagedForm when it gets focus, + * undraws it when the Composite loses focus. + * + * @author p.ciardelli + * + */ +public class CompositeBorderDecorator implements FocusListener { + + private FormToolkit toolkit; + private ScrolledForm scrolledForm; + private Composite borderedComposite; + + /** + * If true, the borderedComposite's border is erased when + * it loses focus. + */ + private boolean doLoseFocus = true; + + public CompositeBorderDecorator(Composite composite, IManagedForm form) { + + this.borderedComposite = composite; + this.toolkit = form.getToolkit(); + this.scrolledForm = form.getForm(); + + // Make sure composite retains its color scheme after being adapted to toolkit + Color backgroundColor = composite.getBackground(); + + toolkit.adapt(composite); + + composite.setBackground(backgroundColor); + + } + + + public void focusGained(FocusEvent e) { + paintBorder(); + } + + + public void focusLost(FocusEvent e) { + if (doLoseFocus) { + unpaintBorder(); + } + } + + public void setBorderedComposite(Composite borderedComposite) { + this.borderedComposite = borderedComposite; + } + + /** + * If this is set to true, border will disappear when focus is lost. + * Otherwise, it will remain until explicitly erased. + * + * @param doLoseFocus + */ + public void setLoseFocus(boolean doLoseFocus) { + this.doLoseFocus = doLoseFocus; + } + + /** + * Removes the border from borderedComposite. + */ + public void unpaintBorder() { + paintBorder(null); + } + + /** + * Adds a border to borderedComposite. + */ + public void paintBorder() { + paintBorder(FormToolkit.TEXT_BORDER); + } + + private void paintBorder(String border) { + borderedComposite.setData(FormToolkit.KEY_DRAW_BORDER, border); + toolkit.paintBordersFor(borderedComposite.getParent()); + scrolledForm.reflow(false); + } +} \ No newline at end of file diff --git a/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/ContextMenu.java b/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/ContextMenu.java new file mode 100644 index 000000000..cd3c98c9c --- /dev/null +++ b/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/ContextMenu.java @@ -0,0 +1,145 @@ +/** +* Copyright (C) 2007 EDIT +* European Distributed Institute of Taxonomy +* http://www.e-taxonomy.eu +* +* The contents of this file are subject to the Mozilla Public License Version 1.1 +* See LICENSE.TXT at the top of this package for the full license terms. +*/ + +package eu.etaxonomy.taxeditor.editor; + +import java.util.ArrayList; +import java.util.List; + +import org.apache.log4j.Logger; +import org.eclipse.jface.action.Action; +import org.eclipse.jface.action.IMenuListener; +import org.eclipse.jface.action.IMenuManager; +import org.eclipse.jface.action.MenuManager; +import org.eclipse.jface.action.Separator; +import org.eclipse.swt.widgets.Control; +import org.eclipse.swt.widgets.Menu; + +/** + * Creates a menu that is opened by right-clicking on a Control. + *

+ * Note that menu items are added anew each time the menu is opened. + *

+ * + * @author p.ciardelli + * @created 26.05.2008 + * @version 1.0 + */ +public class ContextMenu { + private static final Logger logger = Logger.getLogger(ContextMenu.class); + + private Control control; + private Menu menu; + private MenuManager menuManager; + private List actions; + private String label; + + /** + * Constructor for top-level menu items. + * + * @param control + */ + public ContextMenu(Control control) { + this.control = control; + + // TODO rewrite class to override Menu + + createContextMenu(); + } + + public ContextMenu(String label) { + this.label = label; + + createContextMenu(); + } + + public MenuManager getMenuManager() { + return menuManager; + } + + private void createContextMenu() { + if (control != null) { + menuManager = new MenuManager(); + menu = menuManager.createContextMenu(control); + control.setMenu(menu); + } else { + menuManager = new MenuManager(label); + } + + menuManager.setRemoveAllWhenShown(true); + menuManager.addMenuListener(new IMenuListener() { + public void menuAboutToShow(IMenuManager manager) { + for (Object action : getActions()) { + if (action instanceof Action) { + manager.add((Action) action); + } + if (action instanceof Separator) { + manager.add((Separator) action); + } + if (action instanceof MenuManager) { + manager.add((MenuManager) action); + } + } + } + }); + } + + private List getActions() { + if (actions == null) { + actions = new ArrayList(); + } + return actions; + } + + public void addAction(Action action) { + getActions().add(action); + } + + public void removeAction(Action action) { + getActions().remove(action); + } + + public void addSeparator() { + getActions().add(new Separator()); + } + + public void addSubmenu(MenuManager submenu) { + getActions().add(submenu); + } + + public void setMenuManager(MenuManager menuManager){ + if(control == null){ + logger.warn("No control set for context menu"); + }else{ + this.menuManager = menuManager; + menu = menuManager.createContextMenu(control); + control.setMenu(menu); + + menuManager.addMenuListener(new IMenuListener() { + public void menuAboutToShow(IMenuManager manager) { + for (Object action : getActions()) { + if (action instanceof Action) { + manager.add((Action) action); + } + if (action instanceof Separator) { + manager.add((Separator) action); + } + if (action instanceof MenuManager) { + manager.add((MenuManager) action); + } + } + } + }); + } + } + + public Menu getMenu() { + return menu; + } +} \ No newline at end of file diff --git a/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/EditorUtil.java b/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/EditorUtil.java new file mode 100644 index 000000000..51d351315 --- /dev/null +++ b/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/EditorUtil.java @@ -0,0 +1,261 @@ +/** +* Copyright (C) 2007 EDIT +* European Distributed Institute of Taxonomy +* http://www.e-taxonomy.eu +* +* The contents of this file are subject to the Mozilla Public License Version 1.1 +* See LICENSE.TXT at the top of this package for the full license terms. +*/ + +package eu.etaxonomy.taxeditor.editor; + +import java.util.HashSet; +import java.util.Map; +import java.util.Set; +import java.util.UUID; + +import org.apache.log4j.Logger; +import org.eclipse.core.commands.ExecutionException; +import org.eclipse.core.commands.operations.IOperationHistory; +import org.eclipse.core.commands.operations.IUndoContext; +import org.eclipse.core.commands.operations.IUndoableOperation; +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.Status; +import org.eclipse.jface.action.IStatusLineManager; +import org.eclipse.ui.IEditorInput; +import org.eclipse.ui.IEditorPart; +import org.eclipse.ui.IEditorReference; +import org.eclipse.ui.IPageLayout; +import org.eclipse.ui.IViewPart; +import org.eclipse.ui.PartInitException; +import org.eclipse.ui.ide.undo.WorkspaceUndoUtil; + +import eu.etaxonomy.cdm.api.conversation.ConversationHolder; +import eu.etaxonomy.cdm.model.name.TaxonNameBase; +import eu.etaxonomy.cdm.model.taxon.Taxon; +import eu.etaxonomy.taxeditor.editor.description.TaxonDescriptionEditor; +import eu.etaxonomy.taxeditor.editor.internal.TaxeditorEditorPlugin; +import eu.etaxonomy.taxeditor.editor.name.TaxonNameEditor; +import eu.etaxonomy.taxeditor.store.CdmStore; +import eu.etaxonomy.taxeditor.store.model.AbstractUtility; +import eu.etaxonomy.taxeditor.store.preference.PreferencesUtil; + +/** + * @author n.hoffmann + * @created 20.01.2009 + * @version 1.0 + */ +public class EditorUtil extends AbstractUtility{ + private static final Logger logger = Logger.getLogger(EditorUtil.class); + + // TODO I am not quite sure if this is the right approach + private static Map taxonNameEditors; + private static Map taxonDescriptionEditors; + + private static boolean isSaving = false; + + private static IStatusLineManager statusLineManager; + + private static IViewPart view; + + /** + * @param input + * @return + * @throws PartInitException + */ + private static IEditorPart getEditorByInput(IEditorInput input) + throws PartInitException { + for (IEditorReference reference : getActivePage().getEditorReferences()) { + if (reference.getEditorInput().equals(input)) { + IEditorPart editor = reference.getEditor(false); + return editor; + } + } + return null; + } + + public static boolean closeAll() { + for (IEditorPart editor : getOpenEditors()) { + if (!getActivePage().closeEditor(editor, true)) { + return false; + } + } + return true; + } + + /** + * Close the given editor. + * + * @param editor The MultipageTaxonEditor to close. + * @return true on success + */ + public static boolean close(MultiPageTaxonEditor editor) { + return getActivePage().closeEditor(editor, true); + } + + /** + * Opens a new editor window with the given input + * + * @param input + * @param editorId + * @return + * @throws PartInitException + */ + private static IEditorPart open(IEditorInput input, String editorId) + throws PartInitException { + return getActivePage().openEditor(input, editorId); + } + + + /** + * Taxon Editors may be opened by supplying a taxon uuid only. + * Session gets initialised here and is passed to the editor + * + * @param uuid + * @return + * @throws PartInitException + */ + public static IEditorPart open(UUID uuid) throws PartInitException { + IEditorInput input = TaxonEditorInput.NewInstance(uuid); + return open(input, MultiPageTaxonEditor.ID); + } + + /** + * An unitialized taxon is one that hasn't been saved yet. As such, it should appear in neither + * the list of recent names nor in the taxonomic tree when opened. + * + * @param parentTaxon The UUID of the parental taxon or null if this is + * supposed to be a root taxon. + * @return The EditorPart. + * @throws PartInitException + */ + public static IEditorPart openEmpty(UUID parentTaxonUuid) throws PartInitException{ + TaxonEditorInput input = TaxonEditorInput.NewEmptyInstance(parentTaxonUuid); + return open(input, MultiPageTaxonEditor.ID); + } + + + private static boolean redraw(AbstractTaxonEditor editor) { + if(editor == null || editor.redraw()){ + +// if (getActiveEditor().setFocus()) +// getActivePage() + + // Mark editor as changed and unsaved + editor.setDirty(); + return true; + } + return false; + } + + + public static void setSaving(boolean isSaving) { + EditorUtil.isSaving = isSaving; + } + + public static boolean isSaving() { + return isSaving; + } + + /** + * Returns a set of all currently open + * MultiPageTaxonEditors. + * + * @return + */ + public static Set getOpenEditors() { + Set taxonEditors = new HashSet(); + + if(getActivePage() != null){ + for (IEditorReference reference : getActivePage().getEditorReferences()) { + IEditorPart editor = reference.getEditor(false); + if (editor instanceof MultiPageTaxonEditor) { + taxonEditors.add(editor); + } + } + } + + return taxonEditors; + } + + /** + * Returns the currently active taxon editor + * + * @return the taxon editor that has focus + */ + public static MultiPageTaxonEditor getActiveEditor(){ + IEditorPart editorPart = getActivePage().getActiveEditor(); + if(editorPart instanceof MultiPageTaxonEditor){ + MultiPageTaxonEditor editor = (MultiPageTaxonEditor) editorPart; + editor.getConversationHolder().bind(); + return editor; + } + return null; + } + + public static AbstractTaxonEditor getActiveEditorPage(Page page){ + MultiPageTaxonEditor editor = getActiveEditor(); + + return editor.getPage(page); + } + + public static IOperationHistory getOperationHistory() { + return TaxeditorEditorPlugin.getDefault().getWorkbench(). + getOperationSupport().getOperationHistory(); + } + + public static IStatus executeOperation(IUndoableOperation operation){ + try { + IStatus status = getOperationHistory().execute(operation, getMonitor(), + WorkspaceUndoUtil.getUIInfoAdapter(getShell())); + 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); + } + return null; + } + + public static IUndoContext getUndoContext(MultiPageTaxonEditor editor){ + return editor.getUndoContext(); + } + + public static IUndoContext getUndoContext() { + return IOperationHistory.GLOBAL_UNDO_CONTEXT; + } + + private static IProgressMonitor getMonitor() { + statusLineManager.setCancelEnabled(false); + return statusLineManager.getProgressMonitor(); + } + + public static void setStatusLineManager(IStatusLineManager manager) { + statusLineManager = manager; + } + + public static void setStatusLine(String message) { + statusLineManager.setMessage(message); + } + + public static void showPropertySheet() { + if (getActivePage() == null) { + return; + } + try { + view = getActivePage().showView(IPageLayout.ID_PROP_SHEET); + } catch (PartInitException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + public static void checkHidePropertySheet() { + if (getOpenEditors().size() == 0) { + if (view != null && getActivePage() != null) { + getActivePage().hideView(view); + } + } + } +} diff --git a/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/EmptyEditorView.java b/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/EmptyEditorView.java new file mode 100644 index 000000000..4bd009b74 --- /dev/null +++ b/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/EmptyEditorView.java @@ -0,0 +1,56 @@ +package eu.etaxonomy.taxeditor.editor; + +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.swt.SWT; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.ui.IEditorInput; +import org.eclipse.ui.IEditorSite; +import org.eclipse.ui.PartInitException; +import org.eclipse.ui.part.EditorPart; + +public class EmptyEditorView extends EditorPart { + + public static final String ID = "eu.etaxonomy.taxeditor.editor.EmptyEditorView"; //$NON-NLS-1$ + + /** + * Create contents of the editor part + * @param parent + */ + @Override + public void createPartControl(Composite parent) { + Composite container = new Composite(parent, SWT.NONE); + // + } + + @Override + public void setFocus() { + // Set the focus + } + + @Override + public void doSave(IProgressMonitor monitor) { + // Do the Save operation + } + + @Override + public void doSaveAs() { + // Do the Save As operation + } + + @Override + public void init(IEditorSite site, IEditorInput input) + throws PartInitException { + // Initialize the editor part + } + + @Override + public boolean isDirty() { + return false; + } + + @Override + public boolean isSaveAsAllowed() { + return false; + } + +} diff --git a/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/EmptyTextViewerPrompt.java b/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/EmptyTextViewerPrompt.java new file mode 100644 index 000000000..80330b0f2 --- /dev/null +++ b/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/EmptyTextViewerPrompt.java @@ -0,0 +1,135 @@ +/** +* Copyright (C) 2007 EDIT +* European Distributed Institute of Taxonomy +* http://www.e-taxonomy.eu +* +* The contents of this file are subject to the Mozilla Public License Version 1.1 +* See LICENSE.TXT at the top of this package for the full license terms. +*/ + +package eu.etaxonomy.taxeditor.editor; + +import org.apache.log4j.Logger; +import org.eclipse.jface.text.DocumentEvent; +import org.eclipse.jface.text.IDocument; +import org.eclipse.jface.text.IDocumentListener; +import org.eclipse.jface.text.TextViewer; +import org.eclipse.swt.custom.StyledText; +import org.eclipse.swt.events.DisposeEvent; +import org.eclipse.swt.events.DisposeListener; +import org.eclipse.swt.events.FocusEvent; +import org.eclipse.swt.events.FocusListener; +import org.eclipse.swt.graphics.Font; + +import eu.etaxonomy.taxeditor.store.model.Resources; + +/** + * Displays a message such as "Click here to start entering + * data" when document is empty. + * + * @author p.ciardelli + * @created 15.09.2008 + * @version 1.0 + */ +public class EmptyTextViewerPrompt implements IDocumentListener { + private static final Logger logger = Logger + .getLogger(EmptyTextViewerPrompt.class); + + private IDocument document; + private StyledText textControl; + private String prompt; + private FocusListener focusListener = null; + + private Font textFont; + private Font promptFont = Resources.getFont(Resources.FONT_DEFAULT_PROMPT); + + public EmptyTextViewerPrompt(TextViewer textViewer, String prompt) { + + this.document = textViewer.getDocument(); + this.textControl = textViewer.getTextWidget(); + this.prompt = prompt; + + this.textFont = textControl.getFont(); + + documentChanged(null); + } + + /** + * Override prompt's default font. + * + * @param font + */ + public void setPromptFont(Font font) { + this.promptFont = font; + } + + /** + * Adds a focus listener to the textControl, which hides + * the prompt if the cursor is in the textControl, + * and shows it if the cursor is elsewhere. + */ + private void createPrompt() { + + textControl.setFont(promptFont); + document.set(prompt); + + focusListener = new FocusListener() { + + public void focusGained(FocusEvent e) { + if (document.get().equals(prompt)) { + textControl.setFont(textFont); + document.set(""); + } + } + + public void focusLost(FocusEvent e) { + if (document.getLength() == 0) { + textControl.setFont(promptFont); + document.set(prompt); + } + } + + }; + textControl.addFocusListener(focusListener); + textControl.addDisposeListener(new DisposeListener() { + + + public void widgetDisposed(DisposeEvent e) { + focusListener = null; + } + + }); + } + + /** + * Removes focus listener from textControl, turning off + * the showing of prompt. + */ + private void removePrompt() { + if (focusListener != null) { + textControl.removeFocusListener(focusListener); + focusListener = null; + } + } + + /* (non-Javadoc) + * @see org.eclipse.jface.text.IDocumentListener#documentAboutToBeChanged(org.eclipse.jface.text.DocumentEvent) + */ + public void documentAboutToBeChanged(DocumentEvent event) {} + + /* (non-Javadoc) + * @see org.eclipse.jface.text.IDocumentListener#documentChanged(org.eclipse.jface.text.DocumentEvent) + */ + public void documentChanged(DocumentEvent event) { + + if (document.get().equals(prompt)) { + return; + } + + if (document.getLength() == 0) { + createPrompt(); + } else { + removePrompt(); + } + } +} \ No newline at end of file diff --git a/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/ErrorAnnotation.java b/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/ErrorAnnotation.java new file mode 100644 index 000000000..2f45113c1 --- /dev/null +++ b/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/ErrorAnnotation.java @@ -0,0 +1,96 @@ +package eu.etaxonomy.taxeditor.editor; + +import org.eclipse.core.resources.IMarker; +import org.eclipse.jface.text.Position; +import org.eclipse.jface.text.source.Annotation; +import org.eclipse.jface.text.source.IAnnotationPresentation; +import org.eclipse.swt.graphics.GC; +import org.eclipse.swt.graphics.Image; +import org.eclipse.swt.graphics.Point; +import org.eclipse.swt.graphics.RGB; +import org.eclipse.swt.graphics.Rectangle; +import org.eclipse.swt.widgets.Canvas; + +import eu.etaxonomy.taxeditor.store.model.ImageResources; +import eu.etaxonomy.taxeditor.store.model.Resources; + +public class ErrorAnnotation extends Annotation implements IAnnotationPresentation { + private IMarker marker; + private String text; + private int line; + private Position position; + + // error identifiers, images and colors + public static String ERROR_TYPE = "error.type"; + public static Image ERROR_IMAGE = ImageResources.getImage(ImageResources.ACTIVE_DELETE_ICON); + public static final RGB ERROR_RGB = new RGB(255, 0, 0); + + public ErrorAnnotation(IMarker marker) { + this.marker = marker; + } + + public ErrorAnnotation(int line, String text) { + super(ERROR_TYPE, false, text); + this.marker = null; + this.line = line; + this.text = text; + } + + public IMarker getMarker() { + return marker; + } + + public int getLine() { + return line; + } + + public String getText() { + return "Error in the string " + text; + } + + public int getLayer() { + return 3; + } + + public String getType() { + return ERROR_TYPE; + } + + public Position getPosition() { + return position; + } + + public void setPosition(Position position) { + this.position = position; + } + + + public void paint(GC gc, Canvas canvas, Rectangle bounds) { + Point canvasSize= canvas.getSize(); + + int x= 0; + int y= bounds.y; + int w= canvasSize.x; + int h= bounds.height; + + if (y + h > canvasSize.y) + h= canvasSize.y - y; + + if (y < 0) { + h= h + y; + y= 0; + } + + if (h <= 0) + return; + + Image image = ImageResources.getImage(ImageResources.ERROR_ANNOTATION_ICON); + + Rectangle r = image.getBounds(); + + int destX = x + w - r.width; + int destY = y + h - r.height; + + gc.drawImage(image, 0, 0, r.width, r.height, destX, destY, r.width, r.height); + } +} \ No newline at end of file diff --git a/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/FreeTextElementFactory.java b/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/FreeTextElementFactory.java new file mode 100644 index 000000000..f2dc495da --- /dev/null +++ b/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/FreeTextElementFactory.java @@ -0,0 +1,296 @@ +/** +* Copyright (C) 2007 EDIT +* European Distributed Institute of Taxonomy +* http://www.e-taxonomy.eu +* +* The contents of this file are subject to the Mozilla Public License Version 1.1 +* See LICENSE.TXT at the top of this package for the full license terms. +*/ + +package eu.etaxonomy.taxeditor.editor; + +import org.apache.log4j.Logger; +import org.eclipse.core.runtime.Assert; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.ui.forms.widgets.FormToolkit; + +import eu.etaxonomy.cdm.model.description.CommonTaxonName; +import eu.etaxonomy.cdm.model.description.DescriptionElementBase; +import eu.etaxonomy.cdm.model.description.Distribution; +import eu.etaxonomy.cdm.model.description.Feature; +import eu.etaxonomy.cdm.model.description.TaxonDescription; +import eu.etaxonomy.cdm.model.media.ImageFile; +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.TaxonRelationship; +import eu.etaxonomy.taxeditor.editor.description.CommonNameComposite; +import eu.etaxonomy.taxeditor.editor.description.DescriptionElementComposite; +import eu.etaxonomy.taxeditor.editor.description.DescriptionFeatureGroupComposite; +import eu.etaxonomy.taxeditor.editor.description.DescriptionGroupComposite; +import eu.etaxonomy.taxeditor.editor.description.DescriptionLabelComposite; +import eu.etaxonomy.taxeditor.editor.description.DistributionComposite; +import eu.etaxonomy.taxeditor.editor.description.DistributionFeatureGroupComposite; +import eu.etaxonomy.taxeditor.editor.description.TaxonDescriptionEditor; +import eu.etaxonomy.taxeditor.editor.images.GalleryLabelComposite; +import eu.etaxonomy.taxeditor.editor.images.ImageComposite; +import eu.etaxonomy.taxeditor.editor.images.ImagesGroupComposite; +import eu.etaxonomy.taxeditor.editor.images.TaxonHasNoImagesComposite; +import eu.etaxonomy.taxeditor.editor.images.TaxonImageEditor; +import eu.etaxonomy.taxeditor.editor.name.AcceptedNameComposite; +import eu.etaxonomy.taxeditor.editor.name.ConceptComposite; +import eu.etaxonomy.taxeditor.editor.name.ConceptGroupComposite; +import eu.etaxonomy.taxeditor.editor.name.HomotypicalGroupComposite; +import eu.etaxonomy.taxeditor.editor.name.MisappliedGroupComposite; +import eu.etaxonomy.taxeditor.editor.name.MisappliedNameComposite; +import eu.etaxonomy.taxeditor.editor.name.SynonymComposite; +import eu.etaxonomy.taxeditor.editor.name.TaxonNameEditor; + +/** + * @author p.ciardelli + * @created 08.01.2009 + * @version 1.0 + */ +public class FreeTextElementFactory implements IFreeTextElementFactory { + private static final Logger logger = Logger + .getLogger(FreeTextElementFactory.class); + + private static IFreeTextElementFactory factory; + + public static IFreeTextElementFactory getDefault() { + if (factory == null) { + factory = new FreeTextElementFactory(); + } + return factory; + } + + public Composite createAcceptedTaxon(AbstractTaxonEditor editor) { + // Create a homotypic group composite for the accepted taxon + HomotypicalGroup group = editor.getTaxon().getHomotypicGroup(); + Assert.isNotNull(group, "Taxon does not have a homotypic group"); + Composite groupComposite = createHomotypicalGroup(editor, group); + + // Create a name composite for the accepted taxon + Composite acceptedNameComposite = new AcceptedNameComposite(editor, groupComposite); + + // Return the name composite + return acceptedNameComposite; + } + + public Composite createSynonym(TaxonNameEditor editor, Synonym synonym) { + // Get the synonym's homotypic group + HomotypicalGroup group = synonym.getHomotypicGroup(); + Assert.isNotNull(group, "Synonym does not have a homotypic group"); + + // If the group doesn't yet have a composite, create one and add it to the repository + Composite groupComposite = editor.getHomotypicGroup(group); + if (groupComposite == null) { + groupComposite = createHomotypicalGroup(editor, group); + } + + // Create a synonym composite in the homotypical group + Composite synonymComposite = new SynonymComposite(editor, groupComposite, synonym); + + return synonymComposite; + } + + + public Composite createMisappliedName(TaxonNameEditor editor, Taxon misappliedName) { + + // If there is no composite for misapplied names, + // create one and add it to the repository + Composite groupComposite = editor.getMisappliedGroup(); + if (groupComposite == null) { + groupComposite = createMisappliedGroup(editor); + } + + // Create the name's composite + Composite composite = new MisappliedNameComposite(editor, groupComposite, misappliedName); + + return composite; + } + + + public Composite createMisappliedGroup(TaxonNameEditor editor) { + // Create the group composite + Composite groupComposite = new MisappliedGroupComposite(editor, editor.getTopLevelComposite()); + groupComposite.addFocusListener(new CompositeBorderDecorator(groupComposite, editor.getManagedForm())); + + // Put the group composite before concept group composite, if any + Composite conceptGroupComposite = editor.getConceptGroup(); + if (conceptGroupComposite != null) { + groupComposite.moveAbove(conceptGroupComposite); + } + + return groupComposite; + } + + public Composite createHomotypicalGroup(AbstractTaxonEditor editor, HomotypicalGroup group) { + + // Create the group composite + Composite groupComposite = new HomotypicalGroupComposite(editor, editor.getTopLevelComposite(), group); +// groupComposite.addFocusListener(new CompositeBorderDecorator(groupComposite, editor.getManagedForm())); + + groupComposite.setData(FormToolkit.KEY_DRAW_BORDER, FormToolkit.TEXT_BORDER); + editor.getManagedForm().getToolkit().paintBordersFor(groupComposite.getParent()); + + return groupComposite; + } + + public Composite createConcept(TaxonNameEditor editor, TaxonRelationship relationship) { + // If there is no composite for misapplied names, + // create one and add it to the repository + Composite groupComposite = editor.getConceptGroup(); + if (groupComposite == null) { + groupComposite = createConceptGroup(editor); + } + + // Create the name's composite + Composite composite = ConceptComposite.getNewInstance(editor, groupComposite, relationship); + + return composite; + } + + + public Composite createConceptGroup(TaxonNameEditor editor) { + // Create the group composite + Composite groupComposite = new ConceptGroupComposite(editor, editor.getTopLevelComposite()); + groupComposite.addFocusListener(new CompositeBorderDecorator(groupComposite, editor.getManagedForm())); + + // Put the group composite after misapplied group composite, if any + Composite misappliedGroupComposite = editor.getMisappliedGroup(); + if (misappliedGroupComposite != null) { + groupComposite.moveBelow(misappliedGroupComposite); + } + + return groupComposite; + + } + + + /*********************** DESCRIPTION **********************************/ + + public Composite createDescriptionLabel(AbstractTaxonEditor editor, TaxonDescription description) { + + // Create a group composite for the description + Composite groupComposite = createDescriptionGroup(editor, description); + + // Create label composite + Composite labelComposite = + new DescriptionLabelComposite(editor, groupComposite, description); + + // Return the label composite + return labelComposite; + } + + + public Composite createDescriptionElement(TaxonDescriptionEditor editor, TaxonDescription description, + DescriptionElementBase element) { + + // Get the element's feature + Feature feature = element.getFeature(); + Assert.isNotNull(feature, "Element does not have a feature."); + + // If the feature doesn't yet have a composite, create one + Composite groupComposite = editor.getDescriptionFeatureGroup(description, feature); + if (groupComposite == null) { + groupComposite = createDescriptionFeatureGroup(editor, description, feature); + } + + // Create an element composite in the feature group according to its type + Composite elementComposite = null; + if (element.isInstanceOf(CommonTaxonName.class)) { + elementComposite = + new CommonNameComposite(editor, groupComposite, (CommonTaxonName) element); + }else if(element.isInstanceOf(Distribution.class)){ + elementComposite = + new DistributionComposite(editor, groupComposite, (Distribution) element); + } else { + elementComposite = + new DescriptionElementComposite(editor, groupComposite, element); + } + + return elementComposite; + } + + + public Composite createDescriptionGroup(AbstractTaxonEditor editor, + TaxonDescription description) { + // Create the group composite + GroupComposite groupComposite = new DescriptionGroupComposite(editor.getTopLevelComposite(), editor, description); + groupComposite.addFocusListener(new CompositeBorderDecorator(groupComposite, editor.getManagedForm())); +// groupComposite.setDroppable(false); + + return groupComposite; + } + + + public Composite createDescriptionFeatureGroup(TaxonDescriptionEditor editor, + TaxonDescription description, Feature feature) { + + // Description label should be created before adding features + Composite descriptionGroupComposite = editor.getDescriptionGroup(description); + Assert.isNotNull(descriptionGroupComposite, + "Description group must be created - usually by creating its label - before adding features."); + + // Create the group composite + Composite groupComposite; + if(feature.equals(Feature.DISTRIBUTION())){ + groupComposite = new DistributionFeatureGroupComposite + (editor, descriptionGroupComposite, description, feature); + }else{ + groupComposite= new DescriptionFeatureGroupComposite + (editor, descriptionGroupComposite, description, feature); + } + groupComposite.addFocusListener(new CompositeBorderDecorator(groupComposite, editor.getManagedForm())); + + return groupComposite; + } + + /********************* IMAGES *************************/ + + + public Composite createGalleryLabel(AbstractTaxonEditor editor, TaxonDescription imageGallery) { + + // Create a group composite for the description + Composite groupComposite = createDescriptionGroup(editor, imageGallery); + + // Create label composite + Composite labelComposite = + new GalleryLabelComposite(editor, groupComposite, imageGallery); + + // Return the label composite + return labelComposite; + } + + /* (non-Javadoc) + * @see eu.etaxonomy.taxeditor.editor.IFreeTextElementFactory#createImageElement(org.eclipse.ui.forms.ManagedForm, eu.etaxonomy.cdm.model.taxon.Taxon, java.net.URL) + */ + public Composite createImageElement(TaxonImageEditor editor, ImageFile imageFile) { + + // Get the group composite for all images + GroupComposite groupComposite = editor.getImageGroup(); + if (groupComposite == null) { + groupComposite = createImagesGroup(editor); + } + + // Create the image composite + GroupedComposite imageComposite = new ImageComposite(editor, groupComposite, imageFile); + imageComposite.addFocusListener(new CompositeBorderDecorator(imageComposite, editor.getManagedForm())); + + return imageComposite; + } + + /** + * @param taxon + * @param form2 + * @return + */ + private GroupComposite createImagesGroup(AbstractTaxonEditor editor) { + + // Create the group composite + GroupComposite groupComposite = new ImagesGroupComposite(editor.getTopLevelComposite(), editor); + + return groupComposite; + } +} 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 new file mode 100644 index 000000000..f11939a57 --- /dev/null +++ b/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/GroupComposite.java @@ -0,0 +1,126 @@ +/** +* Copyright (C) 2007 EDIT +* European Distributed Institute of Taxonomy +* http://www.e-taxonomy.eu +* +* The contents of this file are subject to the Mozilla Public License Version 1.1 +* See LICENSE.TXT at the top of this package for the full license terms. +*/ + +package eu.etaxonomy.taxeditor.editor; + +import org.apache.log4j.Logger; +import org.eclipse.swt.SWT; +import org.eclipse.swt.dnd.DND; +import org.eclipse.swt.dnd.DropTarget; +import org.eclipse.swt.dnd.DropTargetAdapter; +import org.eclipse.swt.dnd.DropTargetEvent; +import org.eclipse.swt.dnd.DropTargetListener; +import org.eclipse.swt.dnd.Transfer; +import org.eclipse.swt.graphics.Color; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Event; +import org.eclipse.swt.widgets.Listener; +import org.eclipse.ui.forms.widgets.TableWrapData; +import org.eclipse.ui.forms.widgets.TableWrapLayout; + +import eu.etaxonomy.cdm.model.taxon.Taxon; +import eu.etaxonomy.taxeditor.store.model.Resources; + +/** + * @author p.ciardelli + * @created 25.06.2008 + * @version 1.0 + */ +public class GroupComposite extends Composite { + private static final Logger logger = Logger.getLogger(GroupComposite.class); + + protected AbstractTaxonEditor editor; + protected Taxon taxon; + + private DropTarget target; + private DropTargetListener dropListener; + + public GroupComposite(Composite parent) { + super(parent, SWT.NONE); + + // Graphic layout of composite + this.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB)); + this.setLayout(new TableWrapLayout()); + Color groupBackgroundColor = Resources. + getColor(Resources.COLOR_COMPOSITE_BACKGROUND); + this.setBackground(groupBackgroundColor); + + // Drop functionality + this.setDroppable(true); + } + + public GroupComposite(AbstractTaxonEditor editor, Composite parent){ + this(parent); + this.editor = editor; + this.taxon = editor.getTaxon(); + } + + public void setDroppable(boolean droppable) { + if (droppable) { + Transfer[] types = new Transfer[] {WidgetTransfer.getInstance()}; + int operations = DND.DROP_MOVE | DND.DROP_COPY | DND.DROP_DEFAULT; + target = new DropTarget(this, operations); + target.setTransfer(types); + dropListener = new DropTargetAdapter() { + + public void dragEnter(DropTargetEvent event) { + GroupComposite.this.notifyListeners(SWT.FocusIn, null); + } + + public void dragLeave(DropTargetEvent event) { + GroupComposite.this.notifyListeners(SWT.FocusOut, null); + } + + public void drop(DropTargetEvent event) { + + if (event.data instanceof GroupedComposite) { + + final GroupedComposite composite = (GroupedComposite) event.data; + if (composite.getDragSource() != null) { + + // Make sure composite is not being dropped onto its current parent + if ( ! composite.getParent().equals(GroupComposite.this)) { + + // Change parent at end of drag event + composite.getDragSource().addListener(DND.DragEnd, new Listener() { + + public void handleEvent(Event event) { + composite.setParent(GroupComposite.this); + } + }); + } + } + } + } + }; + target.addDropListener(dropListener); + } else { + if (dropListener != null) { + target.removeDropListener(dropListener); + } + } + } + + public void dispose() { + + if (target != null) { + target.removeDropListener(dropListener); + target.dispose(); + } + + super.dispose(); + } + + /** + * @return the taxon + */ + public Taxon getTaxon() { + return taxon; + } +} 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 new file mode 100644 index 000000000..027a301c8 --- /dev/null +++ b/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/GroupCompositeLabel.java @@ -0,0 +1,47 @@ +/** +* Copyright (C) 2007 EDIT +* European Distributed Institute of Taxonomy +* http://www.e-taxonomy.eu +* +* The contents of this file are subject to the Mozilla Public License Version 1.1 +* See LICENSE.TXT at the top of this package for the full license terms. +*/ + +package eu.etaxonomy.taxeditor.editor; + +import org.apache.log4j.Logger; +import org.eclipse.swt.SWT; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Label; +import org.eclipse.ui.forms.widgets.TableWrapData; +import org.eclipse.ui.forms.widgets.TableWrapLayout; + +/** + * @author p.ciardelli + * @created 10.09.2008 + * @version 1.0 + */ +public class GroupCompositeLabel extends Composite { + private static final Logger logger = Logger + .getLogger(GroupCompositeLabel.class); + + public GroupCompositeLabel(Composite parent, String labelText) { + super(parent, SWT.NONE); + + // TODO move to group composite? + + TableWrapLayout tableWrapLayout = new TableWrapLayout(); + tableWrapLayout.horizontalSpacing = 1; + tableWrapLayout.rightMargin = 10; + tableWrapLayout.leftMargin = 10; + tableWrapLayout.bottomMargin = 1; + tableWrapLayout.topMargin = 1; + tableWrapLayout.verticalSpacing = 1; + setLayout(tableWrapLayout); + setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB, TableWrapData.MIDDLE)); + + // Add the label + final Label label = new Label(this, SWT.NONE); + label.setText(labelText.toUpperCase()); + } +} 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 new file mode 100644 index 000000000..afc8f7943 --- /dev/null +++ b/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/GroupedComposite.java @@ -0,0 +1,633 @@ +/** + * Copyright (C) 2007 EDIT + * European Distributed Institute of Taxonomy + * http://www.e-taxonomy.eu + * + * The contents of this file are subject to the Mozilla Public License Version 1.1 + * See LICENSE.TXT at the top of this package for the full license terms. + */ + +package eu.etaxonomy.taxeditor.editor; + +import org.apache.log4j.Logger; +import org.eclipse.core.runtime.Assert; +import org.eclipse.jface.dialogs.Dialog; +import org.eclipse.jface.text.IDocument; +import org.eclipse.jface.text.TextViewer; +import org.eclipse.jface.window.DefaultToolTip; +import org.eclipse.swt.SWT; +import org.eclipse.swt.custom.StyledText; +import org.eclipse.swt.dnd.DND; +import org.eclipse.swt.dnd.DragSource; +import org.eclipse.swt.dnd.DragSourceAdapter; +import org.eclipse.swt.dnd.DragSourceEvent; +import org.eclipse.swt.dnd.DragSourceListener; +import org.eclipse.swt.dnd.Transfer; +import org.eclipse.swt.events.ControlAdapter; +import org.eclipse.swt.events.ControlEvent; +import org.eclipse.swt.events.ControlListener; +import org.eclipse.swt.events.FocusAdapter; +import org.eclipse.swt.events.FocusEvent; +import org.eclipse.swt.events.FocusListener; +import org.eclipse.swt.events.MouseAdapter; +import org.eclipse.swt.events.MouseEvent; +import org.eclipse.swt.graphics.Color; +import org.eclipse.swt.graphics.Font; +import org.eclipse.swt.graphics.GC; +import org.eclipse.swt.graphics.Image; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Control; +import org.eclipse.swt.widgets.Label; +import org.eclipse.swt.widgets.Menu; +import org.eclipse.ui.forms.IManagedForm; +import org.eclipse.ui.forms.widgets.TableWrapData; +import org.eclipse.ui.forms.widgets.TableWrapLayout; + +import eu.etaxonomy.cdm.model.taxon.Taxon; +import eu.etaxonomy.taxeditor.editor.name.NameViewer; +import eu.etaxonomy.taxeditor.store.model.Resources; + +/** + * Formats GroupedComposite with cosmetic and layout properties specific to the + * Editor. This should be used to maintain a consistent look and feel for all Editor + * freetext area components, such as DescriptionElementComposite. + *

+ * Requires an IManagedForm, whose input is set to the contents + * of {@link #getData()} when the GroupedComposite gets focus, i.e. to + * populate the property sheet with the data. + *

+ *

+ * The IManagedForm is also required to have a Taxon in its + * own getData(). + *

+ *

+ * The IManagedForm can also used for drawing borders by calling the method + * createBorderSupport(). + *

+ * @author p.ciardelli + * @created 02.06.2008 + * @version 1.0 + */ +abstract public class GroupedComposite extends Composite implements IHasPropertySource { + private static final Logger logger = Logger.getLogger(GroupedComposite.class); + + protected AbstractTaxonEditor editor; + + protected NameViewer textViewer; + protected IManagedForm managedForm; + private Label nonEditableInfoLabel; + private DefaultToolTip nonEditableInfoHover; + + private Color defaultGroupBackgroundColor = Resources.getColor(Resources.COLOR_COMPOSITE_BACKGROUND); + + protected Taxon taxon; + + private CompositeBorderDecorator borderDecorator; + private FocusListener focusListener; + private LineBreakListener lineBreakListener; + private ParseListener parseListener; + + private String emptyViewerPrompt; + + public GroupedComposite(AbstractTaxonEditor editor, Composite parent){ + super(parent, SWT.NONE); + + this.editor = editor; + this.managedForm = editor.getManagedForm(); + + Object formData = managedForm.getForm().getBody().getData(); + Assert.isTrue(formData instanceof Taxon, + "Managed form must have a Taxon in its data field."); + taxon = (Taxon) formData; + + createControl(); + } + + protected void createControl() { + setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB)); + TableWrapLayout layout = new TableWrapLayout(); + layout.leftMargin = 0; + layout.topMargin = 0; + layout.bottomMargin = 0; + layout.verticalSpacing = 0; + setLayout(layout); + + setBackground(defaultGroupBackgroundColor); + } + + protected void createLineWrapSupport() { + if (textViewer instanceof NameViewer) { + new LineWrapSupport(textViewer, managedForm); + } else { + logger.warn("Can't create line wrap support because textViewer has not been initialized."); + } + } + + public Taxon getTaxon() { + return taxon; + } + + protected void createTextViewer() { + textViewer = new NameViewer(this); + + focusListener = new FocusAdapter() { + public void focusGained(FocusEvent e) { + setFocus(); + } + }; + + textViewer.getTextWidget().addFocusListener(focusListener); + + MouseAdapter mouseListener = new MouseAdapter() { + public void mouseDown(MouseEvent e) { + setFocus(); + } + }; + this.addMouseListener(mouseListener); + textViewer.getRulerControl().addMouseListener(mouseListener); + } + + /** + * @param icon + */ + public void setIcon(Image icon) { + if (textViewer instanceof NameViewer) { + textViewer.setIcon(icon); + } else { + logger.warn("Can't set icon because textViewer has not been initialized."); + } + } + + /** + * @param indent + */ + public void setIndent(int indent) { + if (getLayout() instanceof TableWrapLayout) { + TableWrapLayout layout = ((TableWrapLayout) getLayout()); + layout.leftMargin = indent; + this.setLayout(layout); + } else { + logger.warn("Couldn't indent - composite's layout must be TableWrapLayout."); + } + } + + /* (non-Javadoc) + * @see org.eclipse.swt.widgets.Composite#setFocus() + */ + public boolean setFocus() { + setSelection(); + return true; + } + + /** + * Set background on selection and the cursor to EOL + * I wanted to move this to setFocus() but that leads to an infinite loop + */ + public void setSelected(){ + setBackground(Resources.getColor(Resources.COLOR_COMPOSITE_SELECTED)); + if(textViewer != null){ + textViewer.setCursorToEOL(); + } + } + + /** + * + */ + protected void setSelection() { + managedForm.setInput(this); + } + + /** + * + */ + @Override + public void setBackground(Color color) { + super.setBackground(color); + if(textViewer != null){ + textViewer.setBackground(color); + } + } + + /* (non-Javadoc) + * @see org.eclipse.swt.widgets.Control#setFont(org.eclipse.swt.graphics.Font) + */ + public void setFont(Font font) { + if (textViewer != null) { + textViewer.getTextWidget().setFont(font); + } else { + logger.warn("Can't set font because textViewer has not been initalized."); + } + } + + public TextViewer getTextViewer() { + return textViewer; + } + + /** + * If textViewer has already been set, it will show a + * prompt along the lines of "Click here to start entering data" + * when empty. + * + * @param prompt + */ + public void createEmptyViewerPrompt(final String prompt) { + + emptyViewerPrompt = prompt; + + Assert.isNotNull(textViewer); +// new EmptyTextViewerPrompt(getTextViewer(), prompt); + + final StyledText textControl = textViewer.getTextWidget(); + final IDocument document = textViewer.getDocument(); + final Font promptFont = Resources + .getFont(Resources.FONT_DEFAULT_PROMPT); + setFocusListener(new FocusListener() { + + + public void focusGained(FocusEvent e) { + if (document.get().equals(prompt)) { + textControl.setFont(getViewerFont()); + document.set(""); + } + } + + + public void focusLost(FocusEvent e) { + if (document.getLength() == 0) { + initEmptyText(); + } + } + + }); + textControl.addFocusListener(getFocusListener()); + + if (document.getLength() == 0) { + textControl.setFont(promptFont); + document.set(prompt); + } + } + + abstract protected Font getViewerFont(); + + protected void initEmptyText() { + textViewer.getTextWidget().setFont( + Resources + .getFont(Resources.FONT_DEFAULT_PROMPT)); + + textViewer.getDocument().set(getEmptyTextPrompt()); + textViewer.setCursorToEOL(); + } + + protected String getEmptyTextPrompt() { + if (emptyViewerPrompt == null) { + emptyViewerPrompt = "Click to edit"; + } + return emptyViewerPrompt; + } + + private void setFocusListener(FocusListener focusListener) { + this.focusListener = focusListener; + } + + private FocusListener getFocusListener() { + return focusListener; + } + + /** + * + */ + public void createBorderSupport() { + + if (textViewer == null) { + logger.warn("Could not create border support - getTextViewer() returned null."); + } else { + borderDecorator = new CompositeBorderDecorator( + textViewer.getTextWidget(), managedForm); + borderDecorator.setLoseFocus(false); + textViewer.getTextWidget().addFocusListener(borderDecorator); + } + } + + protected void setBorderDecorator(CompositeBorderDecorator borderDecorator) { + this.borderDecorator = borderDecorator; + } + + protected CompositeBorderDecorator getBorderDecorator() { + return borderDecorator; + } + + public void drawBorder() { + if (borderDecorator != null) { + borderDecorator.paintBorder(); + } + } + + /** + * @param isDirty + */ + protected void setDirty(boolean isDirty) { + managedForm.dirtyStateChanged(); + } + + protected ContextMenu createContextMenu() { + if (textViewer != null) { + ContextMenu contextMenu = new ContextMenu(textViewer.getRulerControl()); + textViewer.getTextWidget().setMenu(contextMenu.getMenu()); + return contextMenu; + } else { + logger.warn("Can't create menu because textViewer has not been initalized."); + return null; + } + } + + public void setMenu (Menu menu) { + super.setMenu(menu); + + if (textViewer != null) { + textViewer.getRulerControl().setMenu(menu); + textViewer.getTextWidget().setMenu(menu); + } + } + + public void unpaintBorder() { + if (borderDecorator != null) { + borderDecorator.unpaintBorder(); + } + } + + private Control draggableControl; + private DragSource dragSource; + + protected void setDraggableControl(Control control) { + draggableControl = control; + } + + public DragSource getDragSource() { + return dragSource; + } + + public void setIsDraggable(boolean draggable) { + + if (draggable) { + + if (dragSource != null) { + // Already initialized + return; + } + + if (draggableControl == null) { + throw new NullPointerException( + "Draggable control must be set to add draggability"); + } + + Transfer[] types = new Transfer[] { WidgetTransfer.getInstance() }; + int operations = DND.DROP_MOVE | DND.DROP_COPY | DND.DROP_LINK; + + dragSource = new DragSource(draggableControl, operations); + dragSource.setTransfer(types); + dragSource.addDragListener(dragSourceListener); + + } else { + dragSource = null; + } + } + + /** + * Drag listener which passes the Composite as the data in a drag event. + */ + DragSourceListener dragSourceListener = new DragSourceAdapter() { + + public void dragStart(DragSourceEvent event) { + if (textViewer != null) { + textViewer.getTextWidget().setFocus(); + } + event.doit = true; + } + + public void dragSetData(DragSourceEvent event) { + WidgetTransfer.getInstance().setWidget(GroupedComposite.this); + } + }; + + private String nonEditableText; + ControlListener nonEditableResizeListener = new ControlAdapter() { + + int width = 0; + + public void controlResized(ControlEvent e) { + if (nonEditableInfoLabel.getBounds().width == width) { + return; + } + width = nonEditableInfoLabel.getBounds().width; + if (nonEditableInfoLabel.getBounds().width > 0) { + nonEditableInfoLabel.setText( + Dialog.shortenText(nonEditableText.toUpperCase(), + nonEditableInfoLabel)); + } + } + }; + + private String nonEditableHoverText; + + private LabelEllipsisListener nonEditableLabelEllipsisListener; + + /** + * nonEditableInfo is a label displayed underneath a GroupedComposite's + * input field. For instance, NameComposites display things like name relations, + * sec. references, etc. here. + * + * @param info + */ + public void setNonEditableInfo(String info) { + // TODO non editable info should only be drawn once, when everything else is drawn + info = info.toUpperCase(); + if (nonEditableInfoLabel == null) { + nonEditableText = info; + nonEditableHoverText = info; + + nonEditableInfoLabel = new Label(this, SWT.NONE); + TableWrapData layoutData = new TableWrapData(TableWrapData.FILL_GRAB, TableWrapData.TOP); + // Set indent to viewer ruler's width + if (textViewer != null && textViewer.getRulerControl() != null) { + // TODO right justify + layoutData.indent = NameViewer.RULER_WIDTH; + } + nonEditableInfoLabel.setLayoutData(layoutData); + + + + nonEditableLabelEllipsisListener = new LabelEllipsisListener(nonEditableInfoLabel) { + @Override + public String getLabelText() { + return nonEditableText.toUpperCase(); + } + }; + nonEditableInfoLabel.addControlListener(nonEditableLabelEllipsisListener); + + nonEditableInfoHover = new DefaultToolTip(nonEditableInfoLabel); + nonEditableInfoHover.setRespectDisplayBounds(true); + + } else { + nonEditableText += ", " + info; + nonEditableHoverText += "\n" + info; + + } + nonEditableInfoHover.setText(nonEditableHoverText); + } + + /** + * If the user entering text requires parsing, call this method and override + * the method parse(). + */ + protected void createParser() { + if (textViewer != null) { + parseListener = new ParseListener() { + @Override + public void parse(String text) { + GroupedComposite.this.parse(text); + } + }; + textViewer.getTextWidget().addModifyListener(parseListener); + } else { + logger.warn("Can't create parser because textViewer has not been initalized."); + } + } + + /** + * Supposed to be overridden in implementing classes + * + * @param text + */ + protected void parse(String text) { + logger.warn("No parse method defined for this composite."); + } + + /** + * If the user hitting carriage return should cause something to happen - + * i.e. the creation of a new composite - call this method and override + * the method handleSplitText(). + */ + protected void createLineBreakListener() { + if (textViewer != null) { + lineBreakListener = new LineBreakListener() { + @Override + public void handleSplitText(String text) { + GroupedComposite.this.handleSplitText(text); + } + }; + + textViewer.getTextWidget().addVerifyListener(lineBreakListener); + textViewer.getTextWidget().addKeyListener(lineBreakListener); + } else { + logger.warn("Can't create line break listener because textViewer has not been initalized."); + } + } + + /** + * Supposed to be overridden in implementing classes + * + * @param text + */ + protected void handleSplitText(String text) { + logger.warn("No handleSplitText method defined for this composite."); + } + + /* (non-Javadoc) + * @see eu.etaxonomy.taxeditor.editor.name.GroupedComposite#dispose() + */ + public void dispose () { + + if (dragSource != null) { + dragSource.removeDragListener(dragSourceListener); + } + + if (textViewer != null) { + StyledText textWidget = textViewer.getTextWidget(); + + if (focusListener != null) { + textWidget.removeFocusListener(focusListener); + } + + if (parseListener != null) { + textWidget.removeModifyListener(parseListener); + } + + if (lineBreakListener != null) { + textWidget.removeVerifyListener(lineBreakListener); + textWidget.removeKeyListener(lineBreakListener); + } + + if (borderDecorator != null) { + textWidget.removeFocusListener(borderDecorator); + } + } + + if (nonEditableInfoLabel != null && nonEditableLabelEllipsisListener != null) { + nonEditableInfoLabel.removeControlListener(nonEditableLabelEllipsisListener); + } + + super.dispose(); + } + + public static final String ELLIPSIS = "..."; + + /** + * @param textValue + * @param control + * @return + * @see org.eclipse.jface.dialogs.Dialog#shortenText(String, Control) + */ + public static String shortenText(String textValue, Control control) { + if (textValue == null) { + return null; + } + GC gc = new GC(control); + int maxWidth = control.getBounds().width; + int maxExtent = gc.textExtent(textValue).x; + if (maxExtent < maxWidth) { + gc.dispose(); + return textValue; + } + int length = textValue.length(); + int charsToClip = Math.round(0.95f*length * (1 - ((float)maxWidth/maxExtent))); + + int end = length - charsToClip; + while (end > 0) { + String s1 = textValue.substring(0, end); + String s = s1 + ELLIPSIS; + int l = gc.textExtent(s).x; + if (l < maxWidth) { + gc.dispose(); + return s; + } + end--; + } + gc.dispose(); + return textValue; + + } + + abstract class LabelEllipsisListener extends ControlAdapter { + + private Label label; + int width = 0; + + LabelEllipsisListener(Label label) { + this.label = label; + } + + abstract public String getLabelText(); + + public void controlResized(ControlEvent e) { + if (label.getBounds().width == width) { + return; + } + width = label.getBounds().width; + if (label.getBounds().width > 0) { + label.setText( +// Dialog.shortenText(getLabelText(), label)); + shortenText(getLabelText(), label)); + } + } + } +} \ No newline at end of file diff --git a/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/IFreeTextElementFactory.java b/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/IFreeTextElementFactory.java new file mode 100644 index 000000000..f63684a34 --- /dev/null +++ b/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/IFreeTextElementFactory.java @@ -0,0 +1,65 @@ +/** +* Copyright (C) 2007 EDIT +* European Distributed Institute of Taxonomy +* http://www.e-taxonomy.eu +* +* The contents of this file are subject to the Mozilla Public License Version 1.1 +* See LICENSE.TXT at the top of this package for the full license terms. +*/ + +package eu.etaxonomy.taxeditor.editor; + +import org.eclipse.swt.widgets.Composite; + +import eu.etaxonomy.cdm.model.description.DescriptionElementBase; +import eu.etaxonomy.cdm.model.description.Feature; +import eu.etaxonomy.cdm.model.description.TaxonDescription; +import eu.etaxonomy.cdm.model.media.ImageFile; +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.TaxonRelationship; +import eu.etaxonomy.taxeditor.editor.description.TaxonDescriptionEditor; +import eu.etaxonomy.taxeditor.editor.images.TaxonImageEditor; +import eu.etaxonomy.taxeditor.editor.name.TaxonNameEditor; + +/** + * @author p.ciardelli + * @created 08.01.2009 + * @version 1.0 + */ +public interface IFreeTextElementFactory { + + /* Taxon name editor elements */ + public Composite createAcceptedTaxon(AbstractTaxonEditor editor); + + public Composite createSynonym(TaxonNameEditor editor, Synonym synonym); + + public Composite createMisappliedName(TaxonNameEditor editor, Taxon misappliedName); + + public Composite createHomotypicalGroup(AbstractTaxonEditor editor, HomotypicalGroup group); + + public Composite createMisappliedGroup(TaxonNameEditor editor); + + public Composite createConceptGroup(TaxonNameEditor editor); + + public Composite createConcept(TaxonNameEditor editor, TaxonRelationship relationship); + + + /* Taxon description editor elements */ + public Composite createDescriptionLabel(AbstractTaxonEditor editor, TaxonDescription description); + + public Composite createDescriptionGroup(AbstractTaxonEditor editor, TaxonDescription description); + + public Composite createDescriptionElement(TaxonDescriptionEditor editor, TaxonDescription description, DescriptionElementBase element); + + public Composite createDescriptionFeatureGroup(TaxonDescriptionEditor editor, TaxonDescription description, Feature feature); + + + /* Taxon images editor elements */ + public Composite createGalleryLabel(AbstractTaxonEditor editor, TaxonDescription imageGallery); + + public Composite createImageElement(TaxonImageEditor editor, ImageFile imageFile); + + +} diff --git a/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/IHasPropertySource.java b/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/IHasPropertySource.java new file mode 100644 index 000000000..1172880bb --- /dev/null +++ b/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/IHasPropertySource.java @@ -0,0 +1,21 @@ +/** +* Copyright (C) 2007 EDIT +* European Distributed Institute of Taxonomy +* http://www.e-taxonomy.eu +* +* The contents of this file are subject to the Mozilla Public License Version 1.1 +* See LICENSE.TXT at the top of this package for the full license terms. +*/ + +package eu.etaxonomy.taxeditor.editor; + +import org.eclipse.ui.views.properties.IPropertySource; + +/** + * @author p.ciardelli + * @created 21.11.2008 + * @version 1.0 + */ +public interface IHasPropertySource { + public IPropertySource getPropertySource(); +} diff --git a/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/LineBreakListener.java b/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/LineBreakListener.java new file mode 100644 index 000000000..0f63607cd --- /dev/null +++ b/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/LineBreakListener.java @@ -0,0 +1,122 @@ +/** +* Copyright (C) 2007 EDIT +* European Distributed Institute of Taxonomy +* http://www.e-taxonomy.eu +* +* The contents of this file are subject to the Mozilla Public License Version 1.1 +* See LICENSE.TXT at the top of this package for the full license terms. +*/ + +package eu.etaxonomy.taxeditor.editor; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Scanner; + +import org.apache.log4j.Logger; +import org.eclipse.swt.custom.StyledText; +import org.eclipse.swt.events.KeyEvent; +import org.eclipse.swt.events.KeyListener; +import org.eclipse.swt.events.VerifyEvent; +import org.eclipse.swt.events.VerifyListener; + +/** + * Checks text entered into a StyledText widget for line breaks, sends + * split text to abstract method handleSplitText(). + *

+ * VerifyListener interface methods break up the text into lines. Each line is sent individually + * to the handleSplitText() method when the KeyListener interface method keyReleased() is called. + * This is because if the StyledText widget is disposed before the key is released, an SWT + * exception occurs. + *

+ * The listener should be set on the StyledText widget as follows: + *

+ * 		StyledText styledText = new SourceViewer().getTextWidget();			
+ *		LineBreakListener lineBreakListener = new LineBreakListener() {
+ *			public void handleSplitText(String text) {
+ *				... some operation ...
+ *			}
+ *		};
+ *		
+ *		styledText.addVerifyListener(lineBreakListener);
+ *		styledText.addKeyListener(lineBreakListener);
+ * 
+ * + * @author p.ciardelli + * @created 19.05.2008 + * @version 1.0 + */ +public abstract class LineBreakListener implements VerifyListener, KeyListener { + private static final Logger logger = Logger + .getLogger(LineBreakListener.class); + + Collection splitTexts; + + /** + * Checks for 3 conditions of name viewer text: + * 1) no line breaks in text + * 2) line break at the end of the text + * 3) line break in the middle of the text + * + * @see org.eclipse.swt.events.VerifyListener#verifyText(org.eclipse.swt.events.VerifyEvent) + */ + public void verifyText(VerifyEvent e) { + + String verifyText = e.text; + + StyledText styledText = (StyledText) e.widget; + String widgetText = styledText.getText(); + int cursorPosition = styledText.getCaretOffset(); + + // If no line break in verifyText, Parse text normally + if (!verifyText.contains(System.getProperty("line.separator"))) { + return; + } + + // Don't add verifyText without further processing + e.doit = false; + + // Initialize split text collection + splitTexts = new ArrayList(); + + // If user has entered return at the end of the line, + // make a new, empty synonym + if (widgetText.length() == cursorPosition && + verifyText.equals(System.getProperty("line.separator"))) { + splitTexts.add(""); + return; + } + + // Concatenate old and new texts + String textForSplitting = widgetText.substring(0, cursorPosition) + + verifyText + + widgetText.substring(cursorPosition); + + // Split on line breaks + Scanner scanner = new Scanner( textForSplitting ); + scanner.useDelimiter (System.getProperty("line.separator")); + + // Put first string into name viewer + styledText.setText(scanner.next()); + + // Start new synonyms with the rest + while (scanner.hasNext()) { + splitTexts.add(scanner.next()); + } + } + + + public void keyPressed(KeyEvent e) {} + + + public void keyReleased(KeyEvent e) { + if (splitTexts != null) { + for (String text : splitTexts) { + handleSplitText(text); + } + splitTexts = null; + } + } + + abstract public void handleSplitText(String text); +} \ No newline at end of file diff --git a/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/LineWrapSquigglesStrategy.java b/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/LineWrapSquigglesStrategy.java new file mode 100644 index 000000000..4280a4c85 --- /dev/null +++ b/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/LineWrapSquigglesStrategy.java @@ -0,0 +1,176 @@ +/** +* Copyright (C) 2007 EDIT +* European Distributed Institute of Taxonomy +* http://www.e-taxonomy.eu +* +* The contents of this file are subject to the Mozilla Public License Version 1.1 +* See LICENSE.TXT at the top of this package for the full license terms. +*/ + +package eu.etaxonomy.taxeditor.editor; + +import org.apache.log4j.Logger; +import org.eclipse.jface.text.source.Annotation; +import org.eclipse.jface.text.source.AnnotationPainter.SquigglesStrategy; +import org.eclipse.swt.SWT; +import org.eclipse.swt.custom.StyledText; +import org.eclipse.swt.graphics.Color; +import org.eclipse.swt.graphics.GC; +import org.eclipse.swt.graphics.Point; + +/** + * Adds ability to draw multiline squiggles when a StyledText + * contains line-wrapping. + * + * @author p.ciardelli + * @created 21.11.2008 + * @version 1.0 + */ +public class LineWrapSquigglesStrategy extends SquigglesStrategy { + private static final Logger logger = Logger + .getLogger(LineWrapSquigglesStrategy.class); + + public static final String ID = "linewrap_squigglesstrategy"; + + private GC gc; + + private Color color; + + private int lineHeight; + + private int baseline; + + private StyledText textWidget; + + private int offset; + + /* (non-Javadoc) + * @see org.eclipse.jface.text.source.AnnotationPainter$SquigglesStrategy#draw(org.eclipse.jface.text.source.Annotation, org.eclipse.swt.graphics.GC, org.eclipse.swt.custom.StyledText, int, int, org.eclipse.swt.graphics.Color) + */ + public void draw(Annotation annotation, GC gc, StyledText textWidget, int offset, int length, Color color) { + + this.gc = gc; + this.color = color; + this.textWidget = textWidget; + this.offset = offset; + + if (gc != null) { + + if (length < 1) + return; + + baseline = textWidget.getBaseline(offset); + lineHeight = textWidget.getLineHeight(offset); + + Point right = null; + int offsetNewline = offset; + int end = offset + length; + + // Go through the length one character at a time + for (int i = offset; i <= end; i++) { + + // If the y of the current offset is different from that of the last offset, + // we are on a new line + if (right != null && textWidget.getLocationAtOffset(i).y > right.y) { + + // Draw a line of squigglies + drawPolyline(offsetNewline, right); + + // Save offset of line break + offsetNewline = i; + } + + // Get x,y position in case the next char is on a new line + right = textWidget.getLocationAtOffset(i); + + } + + // Draw the last line of squigglies + drawPolyline(offsetNewline, right); + + } else { + textWidget.redrawRange(offset, length, true); + } + } + + /** + * Draws a squiggly line from the offset offsetNewline to + * the x,y coordinates at right. + * + * @param offsetNewline + * @param right + */ + private void drawPolyline(int offsetNewline, Point right) { + + // Get offset at last line break + Point left = textWidget.getLocationAtOffset(offsetNewline); + + // Prevent solitary red dot from appearing at EOL + if (left.equals(right)) { + return; + } + + // Only start drawing from 0 if not on the first line + if (offsetNewline != offset) { + + // Offset.x is at the end of the first letter of the new line, not at 0 + left.x = 0; + } + + int[] polyline= computePolyline(left, right, baseline, lineHeight); + + gc.setLineWidth(0); // NOTE: 0 means width is 1 but with optimized performance + gc.setLineStyle(SWT.LINE_SOLID); + gc.setForeground(color); + gc.drawPolyline(polyline); + } + + /** + * Copied verbatim from {@link org.eclipse.jface.text.source.AnnotationPainter$SquigglesStrategy} + * + * @see org.eclipse.jface.text.source.AnnotationPainter$SquigglesStrategy + * + * @param left + * @param right + * @param baseline + * @param lineHeight + * @return + */ + private int[] computePolyline(Point left, Point right, int baseline, int lineHeight) { + + final int WIDTH= 4; // must be even + final int HEIGHT= 2; // can be any number + + int peaks= (right.x - left.x) / WIDTH; + if (peaks == 0 && right.x - left.x > 2) + peaks= 1; + + int leftX= left.x; + + // compute (number of point) * 2 + int length= ((2 * peaks) + 1) * 2; + if (length < 0) + return new int[0]; + + int[] coordinates= new int[length]; + + // cache peeks' y-coordinates + int top= left.y + Math.min(baseline + 1, lineHeight - HEIGHT - 1); + int bottom= top + HEIGHT; + + // populate array with peek coordinates + for (int i= 0; i < peaks; i++) { + int index= 4 * i; + coordinates[index]= leftX + (WIDTH * i); + coordinates[index+1]= bottom; + coordinates[index+2]= coordinates[index] + WIDTH/2; + coordinates[index+3]= top; + } + + // the last down flank is missing + coordinates[length-2]= Math.min(Math.max(0, right.x - 1), left.x + (WIDTH * peaks)); + coordinates[length-1]= bottom; + + return coordinates; + } +} diff --git a/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/LineWrapSupport.java b/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/LineWrapSupport.java new file mode 100644 index 000000000..d7af8b5a1 --- /dev/null +++ b/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/LineWrapSupport.java @@ -0,0 +1,85 @@ +/** +* Copyright (C) 2007 EDIT +* European Distributed Institute of Taxonomy +* http://www.e-taxonomy.eu +* +* The contents of this file are subject to the Mozilla Public License Version 1.1 +* See LICENSE.TXT at the top of this package for the full license terms. +*/ + +package eu.etaxonomy.taxeditor.editor; + +import org.apache.log4j.Logger; +import org.eclipse.jface.text.TextViewer; +import org.eclipse.swt.custom.StyledText; +import org.eclipse.swt.events.ModifyEvent; +import org.eclipse.swt.events.ModifyListener; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.ui.forms.IManagedForm; +import org.eclipse.ui.forms.widgets.ScrolledForm; + +/** + * Checks whether the ScrolledForm a TextViewer is on needs to be + * redrawn because of a new line break or the removal of an existing + * one ... + *

+ * ... in theory, anyway. Until I figure out how to detect a word wrap, + * the ScrolledForm is redrawn with every modify event. + * + * @author p.ciardelli + * @created 19.05.2008 + * @version 1.0 + */ +public class LineWrapSupport { + private static final Logger logger = Logger + .getLogger(LineWrapSupport.class); + + ModifyListener listener = new LineWrapListener(); + int lineCount; + + private StyledText textWidget; + private ScrolledForm scrolledForm; + + private TextViewer viewer; + + public LineWrapSupport(TextViewer viewer, IManagedForm form) { + + if (viewer == null) { + throw new IllegalArgumentException( + "The provided TextViewer object is null."); + } + + this.viewer = viewer; + + textWidget = viewer.getTextWidget(); + textWidget.addModifyListener(listener); + + this.lineCount = textWidget.getLinePixel(textWidget.getLineCount()); + this.scrolledForm = form.getForm(); + } + + /** + * Redraws the scrolledForm if a line wrap is detected. + */ + private void checkLineCount() { + + boolean lineWrapDetected = true; + if (lineWrapDetected ) { + scrolledForm.getBody().layout(); + } + } + + /** + * Calls checkLineCount() on a modify event. + * + * @author p.ciardelli + * @created 21.05.2008 + * @version 1.0 + */ + class LineWrapListener implements ModifyListener { + + public void modifyText(ModifyEvent e) { + checkLineCount(); + } + } +} \ No newline at end of file diff --git a/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/MenuConstants.java b/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/MenuConstants.java new file mode 100644 index 000000000..768052b22 --- /dev/null +++ b/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/MenuConstants.java @@ -0,0 +1,55 @@ +/** +* Copyright (C) 2007 EDIT +* European Distributed Institute of Taxonomy +* http://www.e-taxonomy.eu +* +* The contents of this file are subject to the Mozilla Public License Version 1.1 +* See LICENSE.TXT at the top of this package for the full license terms. +*/ + +package eu.etaxonomy.taxeditor.editor; + +import org.apache.log4j.Logger; +import org.eclipse.jface.action.MenuManager; + +/** + * @author n.hoffmann + * @created 03.02.2009 + * @version 1.0 + */ +public class MenuConstants { + private static final Logger logger = Logger.getLogger(MenuConstants.class); + + /** + * + * @return + * @deprecated this should all take place in plugin.xml + */ + public static final MenuManager EDITOR_TAXON_MENU(){ + MenuManager taxonEditorMenu = new MenuManager("Taxon"); +// +// taxonEditorMenu.add(new CreateHeterotypicSynonymAction()); +// taxonEditorMenu.add(new CreateSynonymInGroupAction()); +// taxonEditorMenu.add(new Separator()); +// taxonEditorMenu.add(new CreateMisappliedNameAction()); +// +// MenuManager subMenu = new MenuManager("Create concept relation"); +// for (TaxonRelationshipType type : +// CdmSessionDataRepository.getDefault().getConceptRelationshipTypes()) { +// subMenu.add(new CreateConceptRelationAction(type)); +// } +// taxonEditorMenu.add(subMenu); +// taxonEditorMenu.add(new Separator()); +// taxonEditorMenu.add(new MoveTaxonDialogAction()); +// taxonEditorMenu.add(new ChangeTaxonToSynonymAction()); +// taxonEditorMenu.add(new Separator()); +// // TODO is it correct that onlx taxa with rank species may have autonyms? +//// if(taxon.getName().getRank().equals(Rank.SPECIES())){ +//// taxonEditorMenu.add(new CreateAutonymAction()); +//// } +// taxonEditorMenu.add(new CreateTaxonomicallyIncludedTaxonAction()); +// + return taxonEditorMenu; + } + +} diff --git a/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/MultiPageTaxonEditor.java b/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/MultiPageTaxonEditor.java new file mode 100644 index 000000000..cc02caa41 --- /dev/null +++ b/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/MultiPageTaxonEditor.java @@ -0,0 +1,306 @@ +/** +* Copyright (C) 2007 EDIT +* European Distributed Institute of Taxonomy +* http://www.e-taxonomy.eu +* +* The contents of this file are subject to the Mozilla Public License Version 1.1 +* See LICENSE.TXT at the top of this package for the full license terms. +*/ + +package eu.etaxonomy.taxeditor.editor; + +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; +import java.util.ArrayList; +import java.util.List; + +import org.apache.log4j.Logger; +import org.eclipse.core.commands.operations.IUndoContext; +import org.eclipse.core.commands.operations.UndoContext; +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.ui.IEditorInput; +import org.eclipse.ui.IEditorSite; +import org.eclipse.ui.PartInitException; +import org.eclipse.ui.part.MultiPageEditorPart; + +import eu.etaxonomy.cdm.api.conversation.ConversationHolder; +import eu.etaxonomy.cdm.api.conversation.IConversationEnabled; +import eu.etaxonomy.cdm.model.common.CdmBase; +import eu.etaxonomy.cdm.model.name.TaxonNameBase; +import eu.etaxonomy.cdm.model.taxon.Taxon; +import eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeMap; +import eu.etaxonomy.taxeditor.editor.description.TaxonDescriptionEditor; +import eu.etaxonomy.taxeditor.editor.images.TaxonImageEditor; +import eu.etaxonomy.taxeditor.editor.name.TaxonNameEditor; +import eu.etaxonomy.taxeditor.store.model.DataChangeBridge; +import eu.etaxonomy.taxeditor.store.model.IDataChangeBehavior; +import eu.etaxonomy.taxeditor.store.operations.IPostOperationEnabled; + +/** + * + * Generates the tabbed editor with TaxonNameEditor on top and tabs for + * "Descriptions", "Concepts", "Geography", etc. + * + * @author p.ciardelli + * @author n.hoffmann + * @created 15.05.2008 + * @version 1.0 + */ +public class MultiPageTaxonEditor extends MultiPageEditorPart implements IConversationEnabled, IPostOperationEnabled { + private static final Logger logger = Logger.getLogger(MultiPageTaxonEditor.class); + + public static final String ID = "eu.etaxonomy.taxeditor.editor.multipagetaxonview"; + + private Taxon taxon; + private boolean dirty; + + private ConversationHolder conversation; + private IDataChangeBehavior dataChangeBehavior; + private IUndoContext undoContext; + + + public MultiPageTaxonEditor() { + super(); + undoContext = new UndoContext(); + } + + + + @Override + public void dispose() { + super.dispose(); +// EditorUtil.checkHidePropertySheet(); + } + + @Override + protected void createPages() { + + TaxonEditorInput input = (TaxonEditorInput) getEditorInput(); + conversation = input.getConversationHolder(); + conversation.registerForDataStoreChanges(this); + + try { + addPage(Page.NAME.getIndex(), new TaxonNameEditor(this), getEditorInput()); + setPageText(Page.NAME.getIndex(), Page.NAME.getTitle()); + + // TODO lazy create + addPage(Page.DESCRIPTIVE.getIndex(), new TaxonDescriptionEditor(this), getEditorInput()); + setPageText(Page.DESCRIPTIVE.getIndex(), Page.DESCRIPTIVE.getTitle()); + + // TODO lazy create + addPage(Page.IMAGE.getIndex(), new TaxonImageEditor(this), getEditorInput()); + setPageText(Page.IMAGE.getIndex(), Page.IMAGE.getTitle()); + +// EditorUtil.showPropertySheet(); + + } catch (PartInitException e) { + logger.error("Could not create MultiPageTaxonEditor.", e); + } + } + + @Override + public void doSave(IProgressMonitor monitor) { + + if( ! conversation.isBound()){ + conversation.bind(); + } + + // commit the conversation and start a new transaction immediately + conversation.commit(true); + + this.setDirty(false); + } + + private void setDirty(boolean dirty) { + this.dirty = dirty; + firePropertyChange(PROP_DIRTY); + } + + /* (non-Javadoc) + * @see org.eclipse.ui.part.MultiPageEditorPart#isDirty() + */ + public boolean isDirty() { + return dirty; + } + + /** + * Checks whether nested editors are calling firePropertyChange(PROP_DIRTY) + * to signal an edit has taken place before passing property change along to + * super.handlePropertyChange(int propertyId). + */ + /* (non-Javadoc) + * @see org.eclipse.ui.part.MultiPageEditorPart#handlePropertyChange(int) + */ + protected void handlePropertyChange(int propertyId) { + if (propertyId == PROP_DIRTY) { + setDirty(true); + } + super.handlePropertyChange(propertyId); + } + + @Override + public void doSaveAs() {} + + @Override + public boolean isSaveAsAllowed() { + return false; + } + + @Override + public void init(IEditorSite site, IEditorInput input) throws PartInitException { + + if (!(input instanceof IEditorInput)) + throw new PartInitException( + "Invalid Input: Must be IEditorInput"); + + // Get taxon from editor input + if (input.getAdapter(Taxon.class) != null) { + taxon = (Taxon) input.getAdapter(Taxon.class); + } else { + taxon = null; + } + + try { + // Listen for name changes, + // change tab for this taxon editor accordingly + taxon.addPropertyChangeListener("name", + new PropertyChangeListener() { + public void propertyChange(PropertyChangeEvent e) { + setPartName(); + } + }); + } catch (NullPointerException e) { + logger.warn("Caught an NPE while initing an editor. This is most " + + "likely due to the unsuccesful attempt to restore the former " + + "state of the application. We ignore this because the workbench " + + "will simply be reset."); + } + setPartName(); + + super.init(site, input); + } + + /** + * Calls MultiPageEditorPart.setPartName(String partName) + * with text appropriate to the state of the taxon: any taxon that has + * been saved will by necessity have a name to display; a new taxon + * should display "New taxon" in the editor tab. + */ + protected void setPartName() { + + String partName = null; + TaxonNameBase name = taxon.getName(); + + if (name != null) { + partName = name.getTitleCache(); + } + + if (partName == null || partName.equals("")) { + partName = ("New taxon"); + } + + setPartName(partName); + } + + /** + * Editor pages call this in their postOperation to notify the MultiPageTaxonEditor + * of unsaved changes + */ + public void setDirty() { + setDirty(true); + } + + public Taxon getTaxon(){ + return this.taxon; + } + + /* + * (non-Javadoc) + * @see eu.etaxonomy.cdm.api.conversation.IConversationEnabled#getConversationHolder() + */ + public ConversationHolder getConversationHolder() { + return conversation; + } + + public void setConversationHolder(ConversationHolder conversation){ + this.conversation = conversation; + } + + + public IUndoContext getUndoContext() { + return undoContext; + } + + public void setUndoContext(IUndoContext undoContext) { + this.undoContext = undoContext; + } + + @Override + public void setFocus(){ + // bind the conversation + getConversationHolder().bind(); + // pass focus to the active editor page + getActiveEditorPage().setFocus(); + } + + public AbstractTaxonEditor getActiveEditorPage(){ + return (AbstractTaxonEditor) getEditor(getActivePage()); + } + + /* + * (non-Javadoc) + * @see eu.etaxonomy.cdm.persistence.hibernate.ICdmPostCrudObserver#update(eu.etaxonomy.cdm.persistence.hibernate.CdmCrudEvent) + */ + public void update(CdmDataChangeMap events) { + if(dataChangeBehavior == null){ + dataChangeBehavior = new MultiPageTaxonEditorDataChangeBehaviour(this); + } + + DataChangeBridge.handleDataChange(events, dataChangeBehavior); + } + + + /* + * (non-Javadoc) + * @see eu.etaxonomy.taxeditor.store.operations.IPostOperationEnabled#postOperation() + */ + public boolean postOperation(CdmBase objectAffectedByOperation) { + setDirty(true); + + for(AbstractTaxonEditor editor : this.getPages()){ + editor.postOperation(objectAffectedByOperation); + } + logger.warn("postOperation called on MultiPageTaxonEditor. Can you make it more specific?"); + + return false; + } + + /** + * Returns an AbstractTaxonEditor implementation by type + * + * @param page the page type + * @return + */ + public AbstractTaxonEditor getPage(Page page){ + for(AbstractTaxonEditor editor : this.getPages()){ + if(editor.getClass().equals(page.getClazz())){ + return editor; + } + } + return null; + } + + /** + * Return a list of AbstractTaxonEditors registered with this + * MultiPageTaxonEditor. + * + * @return + */ + public List getPages(){ + ArrayList editors = new ArrayList(); + for(int i = 0; i < this.getPageCount(); i++){ + editors.add((AbstractTaxonEditor) this.getEditor(i)); + } + return editors; + } +} \ No newline at end of file diff --git a/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/MultiPageTaxonEditorDataChangeBehaviour.java b/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/MultiPageTaxonEditorDataChangeBehaviour.java new file mode 100644 index 000000000..886f82ea4 --- /dev/null +++ b/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/MultiPageTaxonEditorDataChangeBehaviour.java @@ -0,0 +1,98 @@ +/** +* Copyright (C) 2007 EDIT +* European Distributed Institute of Taxonomy +* http://www.e-taxonomy.eu +* +* The contents of this file are subject to the Mozilla Public License Version 1.1 +* See LICENSE.TXT at the top of this package for the full license terms. +*/ + +package eu.etaxonomy.taxeditor.editor; + +import java.util.Vector; + +import org.apache.log4j.Logger; + +import eu.etaxonomy.cdm.model.name.TaxonNameBase; +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.taxeditor.store.model.AbstractDataChangeBehaviour; +import eu.etaxonomy.taxeditor.store.model.IDataChangeBehavior; + +/** + * Implementation if {@link eu.etaxonomy.taxeditor.store.model.IDataChangeBehaviour} + * for the {@link eu.etaxonomy.taxeditor.editor.MultiPageTaxonEditor}. + * + * TODO make this class a bean and thus configurable by Spring + * + * @author n.hoffmann + * @created 01.04.2009 + * @version 1.0 + */ +public class MultiPageTaxonEditorDataChangeBehaviour extends AbstractDataChangeBehaviour implements + IDataChangeBehavior { + private static final Logger logger = Logger + .getLogger(MultiPageTaxonEditorDataChangeBehaviour.class); + + private MultiPageTaxonEditor source; + + private TaxonEditorInput input; + + public MultiPageTaxonEditorDataChangeBehaviour( + MultiPageTaxonEditor multiPageTaxonEditor) { + source = multiPageTaxonEditor; + } + + /* (non-Javadoc) + * @see eu.etaxonomy.taxeditor.store.model.IDataChangeBehavior#reactOnDataChange() + */ + public void reactOnDataChange(CdmDataChangeMap changeEvents) { + input = (TaxonEditorInput) source.getEditorInput(); + + if(changeEvents.sizeByEventType(EventType.UPDATE) > 0){ + reactOnUpdate(changeEvents.getEvents(EventType.UPDATE)); + } + if(changeEvents.sizeByEventType(EventType.INSERT) > 0){ + reactOnInsert(changeEvents.getEvents(EventType.INSERT)); + } + if(changeEvents.sizeByEventType(EventType.DELETE) > 0){ + reactOnDelete(changeEvents.getEvents(EventType.DELETE)); + } + } + + + @Override + public void reactOnDelete(Vector events){ + for(CdmDataChangeEvent event : events){ + // close open editors + if((event.getEntity() instanceof Taxon) + && input.getTaxon().equals(event.getEntity())){ + EditorUtil.close(source); + logger.debug("Closing open editor for deleted taxon."); + } + } + } + + @Override + public void reactOnUpdate(Vector events){ + + for(CdmDataChangeEvent event : events){ + // update editor title + if((event.getEntity() instanceof TaxonNameBase) + && input.getTaxon().getName().equals(event.getEntity())){ + // set the name of the editor window + source.setPartName(); + logger.debug("Updating title of taxons editor."); + } + + // TODO other stuff to happen + } + } + + @Override + public void reactOnInsert(Vector events){ + + } +} diff --git a/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/Page.java b/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/Page.java new file mode 100644 index 000000000..8e3cc5807 --- /dev/null +++ b/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/Page.java @@ -0,0 +1,48 @@ +// $Id$ +/** +* Copyright (C) 2007 EDIT +* European Distributed Institute of Taxonomy +* http://www.e-taxonomy.eu +* +* The contents of this file are subject to the Mozilla Public License Version 1.1 +* See LICENSE.TXT at the top of this package for the full license terms. +*/ + +package eu.etaxonomy.taxeditor.editor; + +import eu.etaxonomy.taxeditor.editor.description.TaxonDescriptionEditor; +import eu.etaxonomy.taxeditor.editor.images.TaxonImageEditor; +import eu.etaxonomy.taxeditor.editor.name.TaxonNameEditor; + +/** + * @author n.hoffmann + * @created 30.04.2009 + * @version 1.0 + */ +public enum Page { + NAME ("Name", TaxonNameEditor.class, 0), + DESCRIPTIVE ("Descriptive", TaxonDescriptionEditor.class, 1), + IMAGE ("Image", TaxonImageEditor.class, 2); + + private String title; + private Class clazz; + private int index; + + Page(String title, Class clazz, int index){ + this.title = title; + this.clazz = clazz; + this.index = index; + } + + public String getTitle(){ + return this.title; + } + + public Class getClazz(){ + return this.clazz; + } + + public int getIndex(){ + return this.index; + } +} diff --git a/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/ParseListener.java b/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/ParseListener.java new file mode 100644 index 000000000..1829bcd24 --- /dev/null +++ b/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/ParseListener.java @@ -0,0 +1,34 @@ +/** + * Copyright (C) 2007 EDIT + * European Distributed Institute of Taxonomy + * http://www.e-taxonomy.eu + * + * The contents of this file are subject to the Mozilla Public License Version 1.1 + * See LICENSE.TXT at the top of this package for the full license terms. + */ +package eu.etaxonomy.taxeditor.editor; + +import org.apache.log4j.Logger; +import org.eclipse.swt.custom.StyledText; +import org.eclipse.swt.events.ModifyEvent; +import org.eclipse.swt.events.ModifyListener; + +/** + * Passes modified text to the method parse. + * + * @author p.ciardelli + * @created 02.06.2008 + * @version 1.0 + */ +public abstract class ParseListener implements ModifyListener { + private static final Logger logger = Logger + .getLogger(ParseListener.class); + + public void modifyText(ModifyEvent e) { + StyledText widget = (StyledText) e.widget; + String text = widget.getText(); + parse(text); + } + + abstract public void parse(String text); +} diff --git a/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/SelectTaxonDialog.java b/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/SelectTaxonDialog.java new file mode 100644 index 000000000..2b382f375 --- /dev/null +++ b/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/SelectTaxonDialog.java @@ -0,0 +1,378 @@ +/** + * Copyright (C) 2007 EDIT + * European Distributed Institute of Taxonomy + * http://www.e-taxonomy.eu + * + * The contents of this file are subject to the Mozilla Public License Version 1.1 + * See LICENSE.TXT at the top of this package for the full license terms. + */ + +package eu.etaxonomy.taxeditor.editor; + +import java.util.ArrayList; +import java.util.List; + +import org.apache.log4j.Logger; +import org.eclipse.jface.dialogs.Dialog; +import org.eclipse.jface.dialogs.IDialogConstants; +import org.eclipse.jface.viewers.DoubleClickEvent; +import org.eclipse.jface.viewers.IDoubleClickListener; +import org.eclipse.jface.viewers.StructuredSelection; +import org.eclipse.jface.viewers.TableViewer; +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.FocusEvent; +import org.eclipse.swt.events.FocusListener; +import org.eclipse.swt.events.SelectionAdapter; +import org.eclipse.swt.events.SelectionEvent; +import org.eclipse.swt.graphics.Point; +import org.eclipse.swt.layout.FillLayout; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.layout.RowData; +import org.eclipse.swt.layout.RowLayout; +import org.eclipse.swt.widgets.Button; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Control; +import org.eclipse.swt.widgets.Display; +import org.eclipse.swt.widgets.Event; +import org.eclipse.swt.widgets.Group; +import org.eclipse.swt.widgets.Label; +import org.eclipse.swt.widgets.Listener; +import org.eclipse.swt.widgets.Shell; +import org.eclipse.swt.widgets.Text; +import org.eclipse.swt.widgets.TreeItem; + +import eu.etaxonomy.cdm.model.name.TaxonNameBase; +import eu.etaxonomy.cdm.model.taxon.Taxon; +import eu.etaxonomy.taxeditor.store.model.ImageResources; +import eu.etaxonomy.taxeditor.store.model.NameUtil; +import eu.etaxonomy.taxeditor.store.model.Resources; + +/** + * This is a generic dialog that allows the user to choose a taxon via the + * taxonomic tree, recently selected names, or search. + * + * @author p.ciardelli + * @created 27.05.2008 + * @version 1.0 + */ +public class SelectTaxonDialog extends Dialog { + private static final Logger logger = Logger + .getLogger(SelectTaxonDialog.class); + + public static final String TAXON_TO_SYNONYM = "taxon_to_synonym"; + public static final String TAXON_TO_NEW_PARENT = "taxon_to_new_parent"; + + private String dialogType; + private String shellText; + private String descriptionText; + private Text taxonNameText; + + // FIXME no direct dependencies +// private TaxonomicTreeViewer treeViewer; + private Taxon taxon; + private Taxon destinationTaxon; + + private List