From e840942329d0ae8a48ba9f37abcb220e68b7586b Mon Sep 17 00:00:00 2001 From: "n.hoffmann" Date: Tue, 2 Jun 2009 09:05:16 +0000 Subject: [PATCH] Moving editor sources back into trunk --- .gitattributes | 417 ++ .gitignore | 15 + taxeditor-application/META-INF/MANIFEST.MF | 11 + taxeditor-application/TaxEditor.product | 89 + taxeditor-application/build.properties | 10 + .../icons/256color_16x16.gif | Bin 0 -> 1008 bytes .../icons/256color_32x32.gif | Bin 0 -> 1332 bytes .../icons/256color_48x48.gif | Bin 0 -> 1887 bytes taxeditor-application/icons/edit_16x16.gif | Bin 0 -> 981 bytes taxeditor-application/plugin.properties | 2 + taxeditor-application/plugin.xml | 212 + .../plugin_customization.ini | 5 + taxeditor-application/pom.xml | 32 + taxeditor-application/splash.bmp | Bin 0 -> 702424 bytes .../eu/etaxonomy/taxeditor/Application.java | 45 + .../ApplicationActionBarAdvisor.java | 37 + .../ApplicationWorkbenchAdvisor.java | 58 + .../ApplicationWorkbenchWindowAdvisor.java | 110 + .../eu/etaxonomy/taxeditor/Perspective.java | 25 + .../taxeditor/TaxonomicEditorPlugin.java | 52 + .../src/main/resources/log4j.properties | 29 + .../.settings/org.eclipse.jdt.ui.prefs | 3 + taxeditor-editor/META-INF/MANIFEST.MF | 40 + taxeditor-editor/build.properties | 9 + taxeditor-editor/plugin.properties | 5 + taxeditor-editor/plugin.xml | 743 ++ taxeditor-editor/pom.xml | 24 + .../taxeditor/editor/AbstractTaxonEditor.java | 463 ++ .../editor/CompositeBorderDecorator.java | 99 + .../taxeditor/editor/ContextMenu.java | 145 + .../taxeditor/editor/EditorUtil.java | 261 + .../taxeditor/editor/EmptyEditorView.java | 56 + .../editor/EmptyTextViewerPrompt.java | 135 + .../taxeditor/editor/ErrorAnnotation.java | 96 + .../editor/FreeTextElementFactory.java | 296 + .../taxeditor/editor/GroupComposite.java | 126 + .../taxeditor/editor/GroupCompositeLabel.java | 47 + .../taxeditor/editor/GroupedComposite.java | 633 ++ .../editor/IFreeTextElementFactory.java | 65 + .../taxeditor/editor/IHasPropertySource.java | 21 + .../taxeditor/editor/LineBreakListener.java | 122 + .../editor/LineWrapSquigglesStrategy.java | 176 + .../taxeditor/editor/LineWrapSupport.java | 85 + .../taxeditor/editor/MenuConstants.java | 55 + .../editor/MultiPageTaxonEditor.java | 306 + ...ltiPageTaxonEditorDataChangeBehaviour.java | 98 + .../eu/etaxonomy/taxeditor/editor/Page.java | 48 + .../taxeditor/editor/ParseListener.java | 34 + .../taxeditor/editor/SelectTaxonDialog.java | 378 + .../editor/SimpleSelectionProvider.java | 83 + .../taxeditor/editor/TaxonEditorInput.java | 209 + .../editor/TaxonEditorInputFactory.java | 79 + .../taxeditor/editor/TemporaryTaxon.java | 34 + .../etaxonomy/taxeditor/editor/UndoView.java | 100 + .../taxeditor/editor/ViewerConfiguration.java | 31 + .../taxeditor/editor/WarningAnnotation.java | 62 + .../taxeditor/editor/WidgetTransfer.java | 84 + .../description/CommonNameComposite.java | 60 + .../DescriptionElementComposite.java | 124 + .../DescriptionFeatureGroupComposite.java | 56 + .../DescriptionGroupComposite.java | 38 + .../DescriptionLabelComposite.java | 157 + .../description/DistributionComposite.java | 68 + .../description/DistributionDialog.java | 605 ++ .../DistributionFeatureGroupComposite.java | 75 + .../description/DistributionMapDialog.java | 167 + .../description/DynamicFeatureMenu.java | 68 + ...IDescriptionEditorCompositeRepository.java | 33 + .../editor/description/LanguageDialog.java | 214 + .../description/TaxonDescriptionEditor.java | 232 + .../CreateDescriptionElementHandler.java | 110 + .../DeleteDescriptionElementHandler.java | 60 + .../handler/CreateChildTaxonHandler.java | 38 + .../editor/handler/EditNewTaxonHandler.java | 45 + .../editor/handler/SaveAllHandler.java | 51 + .../editor/handler/SaveTaxonHandler.java | 93 + .../handler/ShowPropertySheetHandler.java | 42 + .../editor/images/GalleryLabelComposite.java | 157 + .../editor/images/ImageComposite.java | 170 + .../editor/images/ImagesGroupComposite.java | 33 + .../images/TaxonHasNoImagesComposite.java | 112 + .../editor/images/TaxonImageEditor.java | 125 + .../images/handler/CreateImageHandler.java | 89 + .../images/handler/DeleteImageHandler.java | 74 + .../internal/TaxeditorEditorPlugin.java | 56 + .../editor/name/AcceptedNameComposite.java | 58 + .../name/BasionymSynonymPropertySource.java | 34 + .../editor/name/CdmParserController.java | 112 + .../editor/name/ConceptComposite.java | 129 + .../editor/name/ConceptGroupComposite.java | 26 + .../name/HomotypicalGroupComposite.java | 37 + .../name/INameEditorCompositeRepository.java | 39 + .../editor/name/IterableSynonymyList.java | 110 + .../editor/name/MisappliedGroupComposite.java | 27 + .../editor/name/MisappliedNameComposite.java | 116 + .../taxeditor/editor/name/NameComposite.java | 272 + .../editor/name/NameSearchDialog.java | 282 + .../editor/name/NameSelectComposite.java | 196 + .../taxeditor/editor/name/NameViewer.java | 343 + .../taxeditor/editor/name/RulerWithIcon.java | 631 ++ .../editor/name/SynonymComposite.java | 130 + .../editor/name/TaxonNameEditor.java | 277 + .../editor/name/TaxonSearchDialog.java | 100 + .../AbstractDynamicConceptRelationMenu.java | 58 + .../ChangeConceptRelationshipTypeHandler.java | 67 + .../ChangeConceptRelationshipTypeMenu.java | 33 + .../name/handler/ChangeToAcceptedTaxon.java | 35 + .../ChangeToConceptRelationHandler.java | 80 + .../handler/ChangeToConceptRelationMenu.java | 32 + .../ChangeToMisapplicationHandler.java | 77 + .../name/handler/ChangeToSynonymHandler.java | 65 + .../handler/CreateConceptRelationHandler.java | 56 + .../handler/CreateConceptRelationMenu.java | 32 + .../CreateHeterotypicSynonymHandler.java | 55 + .../CreateHomotypicSynonymHandler.java | 59 + .../handler/CreateMisapplicationHandler.java | 52 + ...reateSynonymInHomotypicalGroupHandler.java | 68 + .../name/handler/DeleteTaxonBaseHandler.java | 87 + .../name/handler/RemoveBasionymHandler.java | 62 + .../name/handler/SetBasionymHandler.java | 62 + .../SwapSynonymAndAcceptedHandler.java | 96 + .../editor/reference/IReferenceSearch.java | 22 + .../reference/ReferenceSearchDialog.java | 270 + .../reference/ReferenceSelectComposite.java | 186 + .../AbstractEditorPropertySheet.java | 34 + .../AnnotationPropertySource.java | 41 + .../propertysheet/AnnotationsDialog.java | 195 + .../AnnotationsPropertyDescriptor.java | 71 + .../propertysheet/CheckboxCellEditor.java | 133 + .../CheckboxPropertyDescriptor.java | 27 + .../CollectionPropertySource.java | 89 + .../propertysheet/CompletionProcessor.java | 110 + .../taxeditor/propertysheet/DayValidator.java | 50 + .../EditorPropertySheetEntry.java | 45 + .../propertysheet/MarkersPropertySource.java | 69 + .../propertysheet/PropertySheetUtil.java | 237 + .../propertysheet/SourceViewerConfig.java | 67 + .../TimePeriodPropertySource.java | 257 + .../propertysheet/YearValidator.java | 41 + .../description/CommonNamePropertySource.java | 99 + .../DescriptionElementPropertySource.java | 277 + .../DistributionPropertySource.java | 76 + .../TaxonDescriptionPropertySource.java | 148 + .../images/ImagePropertySource.java | 122 + .../name/AcceptedTaxonPropertySource.java | 17 + .../name/BotanicalNamePropertySource.java | 58 + .../name/ConceptPropertySource.java | 28 + .../EditorComboBoxPropertyDescriptor.java | 52 + .../name/MisapplicationPropertySource.java | 29 + .../name/NameRelationsPropertyDescriptor.java | 69 + .../name/NameRelationsPropertySource.java | 95 + .../name/NomStatusPropertySource.java | 89 + ...NomenclaturalAuthorshipPropertySource.java | 280 + .../name/NonViralNamePropertySource.java | 600 ++ .../name/ScientificNamePropertySource.java | 344 + .../name/SynonymPropertySource.java | 35 + .../name/TaxonBasePropertySource.java | 213 + .../name/ZoologicalNamePropertySource.java | 56 + .../wizard/ChooseRelationWizardPage.java | 318 + .../wizard/ListNameRelationsWizardPage.java | 238 + .../wizard/NameRelationWizard.java | 59 + .../wizard/NameRelationsListWizard.java | 114 + .../wizard/NameRelationshipTemp.java | 45 + .../reference/IReferenceSearch.java | 22 + .../NomenclaturalReferencePropertySource.java | 70 + .../reference/ReferencePropertySource.java | 1183 +++ .../reference/ReferenceSearchDescriptor.java | 63 + .../reference/ReferenceSearchDialog.java | 270 + .../SingleRefTypePropertySource.java | 64 + .../type/TypeCollectionPropertySource.java | 106 + .../type/TypeDesignationPropertySource.java | 144 + .../type/TypePropertyDescriptor.java | 76 + .../type/TypePropertySource.java | 121 + .../type/wizard/ChooseNameTypeWizardPage.java | 310 + .../wizard/ChooseSpecimenTypeWizardPage.java | 225 + .../type/wizard/ListTypeWizardPage.java | 223 + .../type/wizard/NameSearchDialog.java | 252 + .../type/wizard/TypeDesignationWizard.java | 72 + .../type/wizard/TypeListWizard.java | 127 + .../src/main/resources/log4j.properties | 33 + .../taxeditor/editor/Application.java | 45 + .../editor/ApplicationActionBarAdvisor.java | 44 + .../editor/ApplicationWorkbenchAdvisor.java | 60 + .../ApplicationWorkbenchWindowAdvisor.java | 48 + .../taxeditor/editor/Perspective.java | 28 + .../taxeditor/editor/TestOpenHandler.java | 52 + taxeditor-feature-dependencies/.project | 17 + .../build.properties | 1 + taxeditor-feature-dependencies/feature.xml | 452 ++ taxeditor-feature/build.properties | 1 + taxeditor-feature/feature.xml | 63 + taxeditor-navigation/META-INF/MANIFEST.MF | 26 + taxeditor-navigation/build.properties | 7 + taxeditor-navigation/icons/edit_16x16.gif | Bin 0 -> 981 bytes taxeditor-navigation/plugin.xml | 259 + taxeditor-navigation/pom.xml | 30 + .../taxeditor/navigation/NavigationUtil.java | 159 + .../RecentNamesContributionItem.java | 91 + .../handler/CreateChildTaxonHandler.java | 42 + .../handler/DeleteTaxonHandler.java | 52 + .../navigation/handler/EditTaxonHandler.java | 45 + .../navigation/handler/MoveTaxonHandler.java | 67 + .../handler/QuickCreateChildTaxonHandler.java | 88 + .../handler/ShowTaxonomicTreeViewHandler.java | 42 + .../internal/TaxeditorNavigationPlugin.java | 61 + .../navigation/search/SearchBar.java | 131 + .../search/SearchResultLabelProvider.java | 113 + .../navigation/search/SearchResultView.java | 125 + .../TaxonomicTreeContentProvider.java | 108 + .../TaxonomicTreeLabelProvider.java | 88 + .../taxonomictree/TaxonomicTreeView.java | 372 + .../TaxonomicTreeViewDataChangeBehaviour.java | 68 + .../src/main/java/log4j.properties | 24 + .../taxeditor/navigation/Application.java | 47 + .../ApplicationActionBarAdvisor.java | 50 + .../ApplicationWorkbenchAdvisor.java | 60 + .../ApplicationWorkbenchWindowAdvisor.java | 27 + .../taxeditor/navigation/Perspective.java | 16 + .../src/test/java/log4j.properties | 24 + .../etaxonomy/cdm/applicationContext-test.xml | 66 + .../cdm/defaultApplicationContext.xml | 31 + .../src/test/resources/log4j.properties | 29 + .../.settings/org.eclipse.jdt.core.prefs | 7 + taxeditor-store/META-INF/MANIFEST.MF | 19 + taxeditor-store/build.properties | 6 + taxeditor-store/icons/256color_16x16.bmp | Bin 0 -> 1334 bytes taxeditor-store/icons/256color_32x32.bmp | Bin 0 -> 2102 bytes taxeditor-store/icons/256color_48x48.bmp | Bin 0 -> 2870 bytes taxeditor-store/icons/EDIT-logo.jpg | Bin 0 -> 18879 bytes taxeditor-store/icons/Thumbs.db | Bin 0 -> 101376 bytes taxeditor-store/icons/a_no_bg.gif | Bin 0 -> 144 bytes taxeditor-store/icons/accepted.gif | Bin 0 -> 58 bytes taxeditor-store/icons/accepted_small.gif | Bin 0 -> 39 bytes taxeditor-store/icons/add.gif | Bin 0 -> 172 bytes taxeditor-store/icons/add_edit.gif | Bin 0 -> 318 bytes taxeditor-store/icons/add_no_bg.gif | Bin 0 -> 79 bytes taxeditor-store/icons/add_no_bg2.gif | Bin 0 -> 138 bytes taxeditor-store/icons/alt_window_16.gif | Bin 0 -> 637 bytes taxeditor-store/icons/alt_window_32.gif | Bin 0 -> 1192 bytes taxeditor-store/icons/autonym_no_bg.gif | Bin 0 -> 178 bytes taxeditor-store/icons/basionym.gif | Bin 0 -> 341 bytes taxeditor-store/icons/basionym_no_bg.gif | Bin 0 -> 182 bytes taxeditor-store/icons/change.gif | Bin 0 -> 321 bytes taxeditor-store/icons/close_view.gif | Bin 0 -> 73 bytes taxeditor-store/icons/concept.gif | Bin 0 -> 226 bytes taxeditor-store/icons/concept_no_bg.gif | Bin 0 -> 173 bytes taxeditor-store/icons/correction_change.gif | Bin 0 -> 136 bytes taxeditor-store/icons/cprj_obj.gif | Bin 0 -> 349 bytes taxeditor-store/icons/db.gif | Bin 0 -> 192 bytes taxeditor-store/icons/delete.gif | Bin 0 -> 159 bytes taxeditor-store/icons/delete_edit.gif | Bin 0 -> 351 bytes taxeditor-store/icons/edit_16x16.gif | Bin 0 -> 981 bytes taxeditor-store/icons/edit_16x16.ico | Bin 0 -> 1150 bytes taxeditor-store/icons/error_co.gif | Bin 0 -> 82 bytes taxeditor-store/icons/file_obj.gif | Bin 0 -> 152 bytes taxeditor-store/icons/form_banner.gif | Bin 0 -> 5600 bytes taxeditor-store/icons/garland_logo.png | Bin 0 -> 9143 bytes taxeditor-store/icons/help_topic.gif | Bin 0 -> 136 bytes taxeditor-store/icons/heterosyn.gif | Bin 0 -> 213 bytes taxeditor-store/icons/heterosyn_no_bg.gif | Bin 0 -> 162 bytes .../icons/heterosyn_original_no_bg.gif | Bin 0 -> 163 bytes taxeditor-store/icons/homonym.gif | Bin 0 -> 227 bytes taxeditor-store/icons/homonym_no_bg.gif | Bin 0 -> 171 bytes taxeditor-store/icons/homosyn.gif | Bin 0 -> 212 bytes taxeditor-store/icons/homosyn_no_bg.gif | Bin 0 -> 160 bytes .../icons/homosyn_original_no_bg.gif | Bin 0 -> 161 bytes taxeditor-store/icons/icon.ico | Bin 0 -> 15086 bytes taxeditor-store/icons/icon.png | Bin 0 -> 1237 bytes taxeditor-store/icons/large_image.gif | Bin 0 -> 2300 bytes taxeditor-store/icons/linkto_help.gif | Bin 0 -> 618 bytes taxeditor-store/icons/misapplied.gif | Bin 0 -> 367 bytes taxeditor-store/icons/misapplied_no_bg.gif | Bin 0 -> 200 bytes taxeditor-store/icons/move.gif | Bin 0 -> 232 bytes taxeditor-store/icons/move_no_bg.gif | Bin 0 -> 130 bytes taxeditor-store/icons/new_child.gif | Bin 0 -> 144 bytes taxeditor-store/icons/newprj_wiz.gif | Bin 0 -> 2864 bytes taxeditor-store/icons/open.gif | Bin 0 -> 216 bytes taxeditor-store/icons/orthovariant.gif | Bin 0 -> 260 bytes taxeditor-store/icons/orthovariant_no_bg.gif | Bin 0 -> 200 bytes taxeditor-store/icons/prj_obj.gif | Bin 0 -> 351 bytes taxeditor-store/icons/quick_add.gif | Bin 0 -> 145 bytes taxeditor-store/icons/quickfix_error_obj.gif | Bin 0 -> 348 bytes .../icons/quickfix_warning_obj.gif | Bin 0 -> 559 bytes taxeditor-store/icons/rel_no_bg.gif | Bin 0 -> 68 bytes taxeditor-store/icons/repsyn.gif | Bin 0 -> 361 bytes taxeditor-store/icons/repsyn_no_bg.gif | Bin 0 -> 197 bytes taxeditor-store/icons/sample.gif | Bin 0 -> 983 bytes taxeditor-store/icons/save.gif | Bin 0 -> 378 bytes taxeditor-store/icons/save_edit.gif | Bin 0 -> 639 bytes taxeditor-store/icons/swap.gif | Bin 0 -> 368 bytes taxeditor-store/icons/swap2.gif | Bin 0 -> 326 bytes taxeditor-store/icons/tax_to_syn.gif | Bin 0 -> 601 bytes taxeditor-store/icons/text.gif | Bin 0 -> 577 bytes taxeditor-store/icons/th_horizontal.gif | Bin 0 -> 174 bytes taxeditor-store/icons/th_vertical.gif | Bin 0 -> 217 bytes taxeditor-store/icons/undo.gif | Bin 0 -> 81 bytes taxeditor-store/icons/unknown.gif | Bin 0 -> 234 bytes taxeditor-store/icons/unknown_no_bg.gif | Bin 0 -> 179 bytes taxeditor-store/icons/warn_tsk.gif | Bin 0 -> 338 bytes taxeditor-store/plugin.xml | 148 + taxeditor-store/pom.xml | 33 + .../handler/ShowDataSourceViewHandler.java | 45 + .../etaxonomy/taxeditor/store/CdmStore.java | 373 + .../etaxonomy/taxeditor/store/StoreUtil.java | 24 + .../datasource/CdmDataSourceRepository.java | 252 + .../handler/AbstractDataSourceHandler.java | 49 + .../handler/ChangeConnectionHandler.java | 48 + .../handler/CreateDataSourceHandler.java | 40 + .../handler/DeleteDataSourceHandler.java | 40 + .../handler/EditDataSourceHandler.java | 43 + .../view/CdmDataSourceContentProvider.java | 49 + .../view/CdmDataSourceLabelProvider.java | 72 + .../datasource/view/CdmDataSourceView.java | 143 + .../CdmDataSourceCredentialsWizardPage.java | 181 + .../wizard/CdmDataSourceH2WizardPage.java | 74 + .../wizard/CdmDataSourceMySQLWizardPage.java | 110 + .../wizard/CdmDataSourceWizard.java | 234 + .../wizard/CdmDataSourceWizardPage.java | 184 + .../store/internal/TaxeditorStorePlugin.java | 82 + .../model/AbstractDataChangeBehaviour.java | 52 + .../store/model/AbstractUtility.java | 81 + .../store/model/DataChangeBridge.java | 29 + .../store/model/DescriptionUtil.java | 96 + .../store/model/IDataChangeBehavior.java | 59 + .../taxeditor/store/model/ImageResources.java | 197 + .../taxeditor/store/model/ImagesUtil.java | 114 + .../store/model/IterableSynonymyList.java | 105 + .../taxeditor/store/model/LanguageUtil.java | 32 + .../store/model/NameRelationsUtil.java | 94 + .../taxeditor/store/model/NameUtil.java | 151 + .../taxeditor/store/model/ReferenceUtil.java | 43 + .../taxeditor/store/model/Resources.java | 187 + .../taxeditor/store/model/SynonymUtil.java | 303 + .../taxeditor/store/model/TaxonTransfer.java | 83 + .../taxeditor/store/model/TaxonUtil.java | 147 + .../taxeditor/store/model/TimeUtil.java | 83 + .../taxeditor/store/model/UriDialog.java | 87 + .../AbstractPersistentPostOperation.java | 63 + .../operations/AbstractPostOperation.java | 86 + ...hangeConceptRelationshipTypeOperation.java | 92 + .../ChangeConceptToSynonymOperation.java | 95 + .../ChangeHomotypicGroupOperation.java | 115 + ...angeHomotypicalGroupBasionymOperation.java | 77 + .../ChangeSynonymToConceptOperation.java | 87 + ...ymToHomotypicalGroupBasionymOperation.java | 84 + ...hangeSynonymToMisapplicationOperation.java | 101 + .../ChangeSynonymToTaxonOperation.java | 81 + .../ChangeTaxonToSynonymOperation.java | 134 + .../operations/CreateChildTaxonOperation.java | 91 + .../CreateConceptRelationOperation.java | 88 + .../CreateDescriptionElementOperation.java | 103 + .../operations/CreateImageOperation.java | 88 + .../CreateMisapplicationOperation.java | 85 + ...mInExisitingHomotypicalGroupOperation.java | 102 + .../CreateSynonymInNewGroupOperation.java | 92 + .../DeleteConceptRelationOperation.java | 105 + .../DeleteDescriptionElementOperation.java | 90 + .../operations/DeleteImageOperation.java | 87 + .../DeleteMisapplicationOperation.java | 88 + .../operations/DeleteSynonymOperation.java | 84 + .../operations/DeleteTaxonOperation.java | 113 + .../operations/IPostOperationEnabled.java | 35 + .../store/operations/MoveTaxonOperation.java | 85 + ...moveHomotypicalGroupBasionymOperation.java | 77 + .../SwapSynonymAndAcceptedOperation.java | 97 + .../taxeditor/store/parser/CdmParserUtil.java | 112 + .../store/preference/CdmPreferences.java | 52 + .../preference/DescriptionPreferences.java | 52 + .../store/preference/FeaturePreferences.java | 110 + .../InitNomenclaturalCodePrefDialog.java | 126 + .../preference/InitializeDbPreferences.java | 110 + .../NomenclaturalCodePreferences.java | 114 + .../store/preference/PreferencesUtil.java | 322 + .../store/preference/RankMenuPreferences.java | 113 + .../preference/TaxonomicPreferences.java | 52 + .../cdm/defaultApplicationContext.xml | 30 + .../src/main/resources/log4j.properties | 29 + .../taxeditor/store/CdmStoreTest.java | 79 + .../store/NameProtectTitleCacheTest.java | 69 + .../AbstractTaxeditorOperationTest.java | 34 + ...eConceptRelationshipTypeOperationTest.java | 76 + .../ChangeConceptToSynonymOperationTest.java | 110 + .../ChangeHomotypicGroupOperationTest.java | 109 + ...HomotypicalGroupBasionymOperationTest.java | 98 + .../ChangeSynonymToConceptOperationTest.java | 107 + ...HomotypicalGroupBasionymOperationTest.java | 77 + ...eSynonymToMisapplicationOperationTest.java | 104 + .../ChangeSynonymToTaxonOperationTest.java | 104 + .../ChangeTaxonToSynonymOperationTest.java | 88 + .../CreateConceptRelationOperationTest.java | 91 + ...CreateDescriptionElementOperationTest.java | 59 + .../CreateMisapplicationOperationTest.java | 75 + ...xisitingHomotypicalGroupOperationTest.java | 149 + .../CreateSynonymInNewGroupOperationTest.java | 80 + .../DeleteConceptRelationOperationTest.java | 100 + ...DeleteDescriptionElementOperationTest.java | 93 + .../DeleteMisapplicationOperationTest.java | 96 + .../DeleteSynonymOperationTest.java | 83 + .../operations/DeleteTaxonOperationTest.java | 85 + .../operations/MoveTaxonOperationTest.java | 92 + .../SwapSynonymAndAcceptedOperationTest.java | 197 + .../src/test/resources/dbscripts/001_cdm.ddl | 606 ++ .../etaxonomy/cdm/applicationContext-test.xml | 58 + .../eu/etaxonomy/cdm/cdm.datasources.xml | 67 + .../test/resources/eu/etaxonomy/cdm/cdmfs.xml | 29 + .../TermsDataSet-with_auditing_info.xml | 6447 +++++++++++++++++ .../etaxonomy/cdm/database/TermsDataSet.xml | 6447 +++++++++++++++++ .../eu/etaxonomy/cdm/database/dataset.dtd | 3781 ++++++++++ .../taxeditor/store/CdmStoreTest.xml | 154 + .../taxeditor/store/ConcurrentSessionTest.xml | 154 + .../src/test/resources/log4j.properties | 98 + .../src/test/resources/unitils.properties | 18 + taxeditor-updateSite/.project | 17 + taxeditor-updateSite/artifacts.xml | 438 ++ taxeditor-updateSite/content.xml | 3139 ++++++++ taxeditor-updateSite/index.html | 60 + taxeditor-updateSite/site.xml | 11 + taxeditor-updateSite/web/site.css | 12 + taxeditor-updateSite/web/site.xsl | 214 + 419 files changed, 57423 insertions(+) create mode 100644 taxeditor-application/META-INF/MANIFEST.MF create mode 100644 taxeditor-application/TaxEditor.product create mode 100644 taxeditor-application/build.properties create mode 100644 taxeditor-application/icons/256color_16x16.gif create mode 100644 taxeditor-application/icons/256color_32x32.gif create mode 100644 taxeditor-application/icons/256color_48x48.gif create mode 100644 taxeditor-application/icons/edit_16x16.gif create mode 100644 taxeditor-application/plugin.properties create mode 100644 taxeditor-application/plugin.xml create mode 100644 taxeditor-application/plugin_customization.ini create mode 100644 taxeditor-application/pom.xml create mode 100644 taxeditor-application/splash.bmp create mode 100644 taxeditor-application/src/main/java/eu/etaxonomy/taxeditor/Application.java create mode 100644 taxeditor-application/src/main/java/eu/etaxonomy/taxeditor/ApplicationActionBarAdvisor.java create mode 100644 taxeditor-application/src/main/java/eu/etaxonomy/taxeditor/ApplicationWorkbenchAdvisor.java create mode 100644 taxeditor-application/src/main/java/eu/etaxonomy/taxeditor/ApplicationWorkbenchWindowAdvisor.java create mode 100644 taxeditor-application/src/main/java/eu/etaxonomy/taxeditor/Perspective.java create mode 100644 taxeditor-application/src/main/java/eu/etaxonomy/taxeditor/TaxonomicEditorPlugin.java create mode 100644 taxeditor-application/src/main/resources/log4j.properties create mode 100644 taxeditor-editor/.settings/org.eclipse.jdt.ui.prefs create mode 100644 taxeditor-editor/META-INF/MANIFEST.MF create mode 100644 taxeditor-editor/build.properties create mode 100644 taxeditor-editor/plugin.properties create mode 100644 taxeditor-editor/plugin.xml create mode 100644 taxeditor-editor/pom.xml create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/AbstractTaxonEditor.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/CompositeBorderDecorator.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/ContextMenu.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/EditorUtil.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/EmptyEditorView.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/EmptyTextViewerPrompt.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/ErrorAnnotation.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/FreeTextElementFactory.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/GroupComposite.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/GroupCompositeLabel.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/GroupedComposite.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/IFreeTextElementFactory.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/IHasPropertySource.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/LineBreakListener.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/LineWrapSquigglesStrategy.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/LineWrapSupport.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/MenuConstants.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/MultiPageTaxonEditor.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/MultiPageTaxonEditorDataChangeBehaviour.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/Page.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/ParseListener.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/SelectTaxonDialog.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/SimpleSelectionProvider.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/TaxonEditorInput.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/TaxonEditorInputFactory.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/TemporaryTaxon.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/UndoView.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/ViewerConfiguration.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/WarningAnnotation.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/WidgetTransfer.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/description/CommonNameComposite.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/description/DescriptionElementComposite.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/description/DescriptionFeatureGroupComposite.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/description/DescriptionGroupComposite.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/description/DescriptionLabelComposite.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/description/DistributionComposite.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/description/DistributionDialog.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/description/DistributionFeatureGroupComposite.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/description/DistributionMapDialog.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/description/DynamicFeatureMenu.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/description/IDescriptionEditorCompositeRepository.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/description/LanguageDialog.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/description/TaxonDescriptionEditor.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/description/handler/CreateDescriptionElementHandler.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/description/handler/DeleteDescriptionElementHandler.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/handler/CreateChildTaxonHandler.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/handler/EditNewTaxonHandler.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/handler/SaveAllHandler.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/handler/SaveTaxonHandler.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/handler/ShowPropertySheetHandler.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/images/GalleryLabelComposite.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/images/ImageComposite.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/images/ImagesGroupComposite.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/images/TaxonHasNoImagesComposite.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/images/TaxonImageEditor.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/images/handler/CreateImageHandler.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/images/handler/DeleteImageHandler.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/internal/TaxeditorEditorPlugin.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/AcceptedNameComposite.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/BasionymSynonymPropertySource.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/CdmParserController.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/ConceptComposite.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/ConceptGroupComposite.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/HomotypicalGroupComposite.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/INameEditorCompositeRepository.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/IterableSynonymyList.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/MisappliedGroupComposite.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/MisappliedNameComposite.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/NameComposite.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/NameSearchDialog.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/NameSelectComposite.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/NameViewer.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/RulerWithIcon.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/SynonymComposite.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/TaxonNameEditor.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/TaxonSearchDialog.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/handler/AbstractDynamicConceptRelationMenu.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/handler/ChangeConceptRelationshipTypeHandler.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/handler/ChangeConceptRelationshipTypeMenu.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/handler/ChangeToAcceptedTaxon.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/handler/ChangeToConceptRelationHandler.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/handler/ChangeToConceptRelationMenu.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/handler/ChangeToMisapplicationHandler.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/handler/ChangeToSynonymHandler.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/handler/CreateConceptRelationHandler.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/handler/CreateConceptRelationMenu.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/handler/CreateHeterotypicSynonymHandler.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/handler/CreateHomotypicSynonymHandler.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/handler/CreateMisapplicationHandler.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/handler/CreateSynonymInHomotypicalGroupHandler.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/handler/DeleteTaxonBaseHandler.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/handler/RemoveBasionymHandler.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/handler/SetBasionymHandler.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/handler/SwapSynonymAndAcceptedHandler.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/reference/IReferenceSearch.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/reference/ReferenceSearchDialog.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/reference/ReferenceSelectComposite.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/propertysheet/AbstractEditorPropertySheet.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/propertysheet/AnnotationPropertySource.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/propertysheet/AnnotationsDialog.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/propertysheet/AnnotationsPropertyDescriptor.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/propertysheet/CheckboxCellEditor.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/propertysheet/CheckboxPropertyDescriptor.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/propertysheet/CollectionPropertySource.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/propertysheet/CompletionProcessor.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/propertysheet/DayValidator.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/propertysheet/EditorPropertySheetEntry.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/propertysheet/MarkersPropertySource.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/propertysheet/PropertySheetUtil.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/propertysheet/SourceViewerConfig.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/propertysheet/TimePeriodPropertySource.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/propertysheet/YearValidator.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/propertysheet/description/CommonNamePropertySource.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/propertysheet/description/DescriptionElementPropertySource.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/propertysheet/description/DistributionPropertySource.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/propertysheet/description/TaxonDescriptionPropertySource.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/propertysheet/images/ImagePropertySource.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/propertysheet/name/AcceptedTaxonPropertySource.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/propertysheet/name/BotanicalNamePropertySource.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/propertysheet/name/ConceptPropertySource.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/propertysheet/name/EditorComboBoxPropertyDescriptor.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/propertysheet/name/MisapplicationPropertySource.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/propertysheet/name/NameRelationsPropertyDescriptor.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/propertysheet/name/NameRelationsPropertySource.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/propertysheet/name/NomStatusPropertySource.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/propertysheet/name/NomenclaturalAuthorshipPropertySource.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/propertysheet/name/NonViralNamePropertySource.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/propertysheet/name/ScientificNamePropertySource.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/propertysheet/name/SynonymPropertySource.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/propertysheet/name/TaxonBasePropertySource.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/propertysheet/name/ZoologicalNamePropertySource.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/propertysheet/namerelations/wizard/ChooseRelationWizardPage.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/propertysheet/namerelations/wizard/ListNameRelationsWizardPage.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/propertysheet/namerelations/wizard/NameRelationWizard.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/propertysheet/namerelations/wizard/NameRelationsListWizard.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/propertysheet/namerelations/wizard/NameRelationshipTemp.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/propertysheet/reference/IReferenceSearch.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/propertysheet/reference/NomenclaturalReferencePropertySource.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/propertysheet/reference/ReferencePropertySource.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/propertysheet/reference/ReferenceSearchDescriptor.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/propertysheet/reference/ReferenceSearchDialog.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/propertysheet/reference/SingleRefTypePropertySource.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/propertysheet/type/TypeCollectionPropertySource.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/propertysheet/type/TypeDesignationPropertySource.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/propertysheet/type/TypePropertyDescriptor.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/propertysheet/type/TypePropertySource.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/propertysheet/type/wizard/ChooseNameTypeWizardPage.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/propertysheet/type/wizard/ChooseSpecimenTypeWizardPage.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/propertysheet/type/wizard/ListTypeWizardPage.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/propertysheet/type/wizard/NameSearchDialog.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/propertysheet/type/wizard/TypeDesignationWizard.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/propertysheet/type/wizard/TypeListWizard.java create mode 100644 taxeditor-editor/src/main/resources/log4j.properties create mode 100644 taxeditor-editor/src/test/java/eu/etaxonomy/taxeditor/editor/Application.java create mode 100644 taxeditor-editor/src/test/java/eu/etaxonomy/taxeditor/editor/ApplicationActionBarAdvisor.java create mode 100644 taxeditor-editor/src/test/java/eu/etaxonomy/taxeditor/editor/ApplicationWorkbenchAdvisor.java create mode 100644 taxeditor-editor/src/test/java/eu/etaxonomy/taxeditor/editor/ApplicationWorkbenchWindowAdvisor.java create mode 100644 taxeditor-editor/src/test/java/eu/etaxonomy/taxeditor/editor/Perspective.java create mode 100644 taxeditor-editor/src/test/java/eu/etaxonomy/taxeditor/editor/TestOpenHandler.java create mode 100644 taxeditor-feature-dependencies/.project create mode 100644 taxeditor-feature-dependencies/build.properties create mode 100644 taxeditor-feature-dependencies/feature.xml create mode 100644 taxeditor-feature/build.properties create mode 100644 taxeditor-feature/feature.xml create mode 100644 taxeditor-navigation/META-INF/MANIFEST.MF create mode 100644 taxeditor-navigation/build.properties create mode 100644 taxeditor-navigation/icons/edit_16x16.gif create mode 100644 taxeditor-navigation/plugin.xml create mode 100644 taxeditor-navigation/pom.xml create mode 100644 taxeditor-navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/NavigationUtil.java create mode 100644 taxeditor-navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/RecentNamesContributionItem.java create mode 100644 taxeditor-navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/handler/CreateChildTaxonHandler.java create mode 100644 taxeditor-navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/handler/DeleteTaxonHandler.java create mode 100644 taxeditor-navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/handler/EditTaxonHandler.java create mode 100644 taxeditor-navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/handler/MoveTaxonHandler.java create mode 100644 taxeditor-navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/handler/QuickCreateChildTaxonHandler.java create mode 100644 taxeditor-navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/handler/ShowTaxonomicTreeViewHandler.java create mode 100644 taxeditor-navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/internal/TaxeditorNavigationPlugin.java create mode 100644 taxeditor-navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/search/SearchBar.java create mode 100644 taxeditor-navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/search/SearchResultLabelProvider.java create mode 100644 taxeditor-navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/search/SearchResultView.java create mode 100644 taxeditor-navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/taxonomictree/TaxonomicTreeContentProvider.java create mode 100644 taxeditor-navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/taxonomictree/TaxonomicTreeLabelProvider.java create mode 100644 taxeditor-navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/taxonomictree/TaxonomicTreeView.java create mode 100644 taxeditor-navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/taxonomictree/TaxonomicTreeViewDataChangeBehaviour.java create mode 100644 taxeditor-navigation/src/main/java/log4j.properties create mode 100644 taxeditor-navigation/src/test/java/eu/etaxonomy/taxeditor/navigation/Application.java create mode 100644 taxeditor-navigation/src/test/java/eu/etaxonomy/taxeditor/navigation/ApplicationActionBarAdvisor.java create mode 100644 taxeditor-navigation/src/test/java/eu/etaxonomy/taxeditor/navigation/ApplicationWorkbenchAdvisor.java create mode 100644 taxeditor-navigation/src/test/java/eu/etaxonomy/taxeditor/navigation/ApplicationWorkbenchWindowAdvisor.java create mode 100644 taxeditor-navigation/src/test/java/eu/etaxonomy/taxeditor/navigation/Perspective.java create mode 100644 taxeditor-navigation/src/test/java/log4j.properties create mode 100644 taxeditor-navigation/src/test/resources/eu/etaxonomy/cdm/applicationContext-test.xml create mode 100644 taxeditor-navigation/src/test/resources/eu/etaxonomy/cdm/defaultApplicationContext.xml create mode 100644 taxeditor-navigation/src/test/resources/log4j.properties create mode 100644 taxeditor-store/.settings/org.eclipse.jdt.core.prefs create mode 100644 taxeditor-store/META-INF/MANIFEST.MF create mode 100644 taxeditor-store/build.properties create mode 100644 taxeditor-store/icons/256color_16x16.bmp create mode 100644 taxeditor-store/icons/256color_32x32.bmp create mode 100644 taxeditor-store/icons/256color_48x48.bmp create mode 100644 taxeditor-store/icons/EDIT-logo.jpg create mode 100644 taxeditor-store/icons/Thumbs.db create mode 100644 taxeditor-store/icons/a_no_bg.gif create mode 100644 taxeditor-store/icons/accepted.gif create mode 100644 taxeditor-store/icons/accepted_small.gif create mode 100644 taxeditor-store/icons/add.gif create mode 100644 taxeditor-store/icons/add_edit.gif create mode 100644 taxeditor-store/icons/add_no_bg.gif create mode 100644 taxeditor-store/icons/add_no_bg2.gif create mode 100644 taxeditor-store/icons/alt_window_16.gif create mode 100644 taxeditor-store/icons/alt_window_32.gif create mode 100644 taxeditor-store/icons/autonym_no_bg.gif create mode 100644 taxeditor-store/icons/basionym.gif create mode 100644 taxeditor-store/icons/basionym_no_bg.gif create mode 100644 taxeditor-store/icons/change.gif create mode 100644 taxeditor-store/icons/close_view.gif create mode 100644 taxeditor-store/icons/concept.gif create mode 100644 taxeditor-store/icons/concept_no_bg.gif create mode 100644 taxeditor-store/icons/correction_change.gif create mode 100644 taxeditor-store/icons/cprj_obj.gif create mode 100644 taxeditor-store/icons/db.gif create mode 100644 taxeditor-store/icons/delete.gif create mode 100644 taxeditor-store/icons/delete_edit.gif create mode 100644 taxeditor-store/icons/edit_16x16.gif create mode 100644 taxeditor-store/icons/edit_16x16.ico create mode 100644 taxeditor-store/icons/error_co.gif create mode 100644 taxeditor-store/icons/file_obj.gif create mode 100644 taxeditor-store/icons/form_banner.gif create mode 100644 taxeditor-store/icons/garland_logo.png create mode 100644 taxeditor-store/icons/help_topic.gif create mode 100644 taxeditor-store/icons/heterosyn.gif create mode 100644 taxeditor-store/icons/heterosyn_no_bg.gif create mode 100644 taxeditor-store/icons/heterosyn_original_no_bg.gif create mode 100644 taxeditor-store/icons/homonym.gif create mode 100644 taxeditor-store/icons/homonym_no_bg.gif create mode 100644 taxeditor-store/icons/homosyn.gif create mode 100644 taxeditor-store/icons/homosyn_no_bg.gif create mode 100644 taxeditor-store/icons/homosyn_original_no_bg.gif create mode 100644 taxeditor-store/icons/icon.ico create mode 100644 taxeditor-store/icons/icon.png create mode 100644 taxeditor-store/icons/large_image.gif create mode 100644 taxeditor-store/icons/linkto_help.gif create mode 100644 taxeditor-store/icons/misapplied.gif create mode 100644 taxeditor-store/icons/misapplied_no_bg.gif create mode 100644 taxeditor-store/icons/move.gif create mode 100644 taxeditor-store/icons/move_no_bg.gif create mode 100644 taxeditor-store/icons/new_child.gif create mode 100644 taxeditor-store/icons/newprj_wiz.gif create mode 100644 taxeditor-store/icons/open.gif create mode 100644 taxeditor-store/icons/orthovariant.gif create mode 100644 taxeditor-store/icons/orthovariant_no_bg.gif create mode 100644 taxeditor-store/icons/prj_obj.gif create mode 100644 taxeditor-store/icons/quick_add.gif create mode 100644 taxeditor-store/icons/quickfix_error_obj.gif create mode 100644 taxeditor-store/icons/quickfix_warning_obj.gif create mode 100644 taxeditor-store/icons/rel_no_bg.gif create mode 100644 taxeditor-store/icons/repsyn.gif create mode 100644 taxeditor-store/icons/repsyn_no_bg.gif create mode 100644 taxeditor-store/icons/sample.gif create mode 100644 taxeditor-store/icons/save.gif create mode 100644 taxeditor-store/icons/save_edit.gif create mode 100644 taxeditor-store/icons/swap.gif create mode 100644 taxeditor-store/icons/swap2.gif create mode 100644 taxeditor-store/icons/tax_to_syn.gif create mode 100644 taxeditor-store/icons/text.gif create mode 100644 taxeditor-store/icons/th_horizontal.gif create mode 100644 taxeditor-store/icons/th_vertical.gif create mode 100644 taxeditor-store/icons/undo.gif create mode 100644 taxeditor-store/icons/unknown.gif create mode 100644 taxeditor-store/icons/unknown_no_bg.gif create mode 100644 taxeditor-store/icons/warn_tsk.gif create mode 100644 taxeditor-store/plugin.xml create mode 100644 taxeditor-store/pom.xml create mode 100644 taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/handler/ShowDataSourceViewHandler.java create mode 100644 taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/CdmStore.java create mode 100644 taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/StoreUtil.java create mode 100644 taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/datasource/CdmDataSourceRepository.java create mode 100644 taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/datasource/handler/AbstractDataSourceHandler.java create mode 100644 taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/datasource/handler/ChangeConnectionHandler.java create mode 100644 taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/datasource/handler/CreateDataSourceHandler.java create mode 100644 taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/datasource/handler/DeleteDataSourceHandler.java create mode 100644 taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/datasource/handler/EditDataSourceHandler.java create mode 100644 taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/datasource/view/CdmDataSourceContentProvider.java create mode 100644 taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/datasource/view/CdmDataSourceLabelProvider.java create mode 100644 taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/datasource/view/CdmDataSourceView.java create mode 100644 taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/datasource/wizard/CdmDataSourceCredentialsWizardPage.java create mode 100644 taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/datasource/wizard/CdmDataSourceH2WizardPage.java create mode 100644 taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/datasource/wizard/CdmDataSourceMySQLWizardPage.java create mode 100644 taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/datasource/wizard/CdmDataSourceWizard.java create mode 100644 taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/datasource/wizard/CdmDataSourceWizardPage.java create mode 100644 taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/internal/TaxeditorStorePlugin.java create mode 100644 taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/model/AbstractDataChangeBehaviour.java create mode 100644 taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/model/AbstractUtility.java create mode 100644 taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/model/DataChangeBridge.java create mode 100644 taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/model/DescriptionUtil.java create mode 100644 taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/model/IDataChangeBehavior.java create mode 100644 taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/model/ImageResources.java create mode 100644 taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/model/ImagesUtil.java create mode 100644 taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/model/IterableSynonymyList.java create mode 100644 taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/model/LanguageUtil.java create mode 100644 taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/model/NameRelationsUtil.java create mode 100644 taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/model/NameUtil.java create mode 100644 taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/model/ReferenceUtil.java create mode 100644 taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/model/Resources.java create mode 100644 taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/model/SynonymUtil.java create mode 100644 taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/model/TaxonTransfer.java create mode 100644 taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/model/TaxonUtil.java create mode 100644 taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/model/TimeUtil.java create mode 100644 taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/model/UriDialog.java create mode 100644 taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/operations/AbstractPersistentPostOperation.java create mode 100644 taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/operations/AbstractPostOperation.java create mode 100644 taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/operations/ChangeConceptRelationshipTypeOperation.java create mode 100644 taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/operations/ChangeConceptToSynonymOperation.java create mode 100644 taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/operations/ChangeHomotypicGroupOperation.java create mode 100644 taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/operations/ChangeHomotypicalGroupBasionymOperation.java create mode 100644 taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/operations/ChangeSynonymToConceptOperation.java create mode 100644 taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/operations/ChangeSynonymToHomotypicalGroupBasionymOperation.java create mode 100644 taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/operations/ChangeSynonymToMisapplicationOperation.java create mode 100644 taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/operations/ChangeSynonymToTaxonOperation.java create mode 100644 taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/operations/ChangeTaxonToSynonymOperation.java create mode 100644 taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/operations/CreateChildTaxonOperation.java create mode 100644 taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/operations/CreateConceptRelationOperation.java create mode 100644 taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/operations/CreateDescriptionElementOperation.java create mode 100644 taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/operations/CreateImageOperation.java create mode 100644 taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/operations/CreateMisapplicationOperation.java create mode 100644 taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/operations/CreateSynonymInExisitingHomotypicalGroupOperation.java create mode 100644 taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/operations/CreateSynonymInNewGroupOperation.java create mode 100644 taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/operations/DeleteConceptRelationOperation.java create mode 100644 taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/operations/DeleteDescriptionElementOperation.java create mode 100644 taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/operations/DeleteImageOperation.java create mode 100644 taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/operations/DeleteMisapplicationOperation.java create mode 100644 taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/operations/DeleteSynonymOperation.java create mode 100644 taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/operations/DeleteTaxonOperation.java create mode 100644 taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/operations/IPostOperationEnabled.java create mode 100644 taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/operations/MoveTaxonOperation.java create mode 100644 taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/operations/RemoveHomotypicalGroupBasionymOperation.java create mode 100644 taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/operations/SwapSynonymAndAcceptedOperation.java create mode 100644 taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/parser/CdmParserUtil.java create mode 100644 taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/preference/CdmPreferences.java create mode 100644 taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/preference/DescriptionPreferences.java create mode 100644 taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/preference/FeaturePreferences.java create mode 100644 taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/preference/InitNomenclaturalCodePrefDialog.java create mode 100644 taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/preference/InitializeDbPreferences.java create mode 100644 taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/preference/NomenclaturalCodePreferences.java create mode 100644 taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/preference/PreferencesUtil.java create mode 100644 taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/preference/RankMenuPreferences.java create mode 100644 taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/store/preference/TaxonomicPreferences.java create mode 100644 taxeditor-store/src/main/resources/eu/etaxonomy/cdm/defaultApplicationContext.xml create mode 100644 taxeditor-store/src/main/resources/log4j.properties create mode 100644 taxeditor-store/src/test/java/eu/etaxonomy/taxeditor/store/CdmStoreTest.java create mode 100644 taxeditor-store/src/test/java/eu/etaxonomy/taxeditor/store/NameProtectTitleCacheTest.java create mode 100644 taxeditor-store/src/test/java/eu/etaxonomy/taxeditor/store/operations/AbstractTaxeditorOperationTest.java create mode 100644 taxeditor-store/src/test/java/eu/etaxonomy/taxeditor/store/operations/ChangeConceptRelationshipTypeOperationTest.java create mode 100644 taxeditor-store/src/test/java/eu/etaxonomy/taxeditor/store/operations/ChangeConceptToSynonymOperationTest.java create mode 100644 taxeditor-store/src/test/java/eu/etaxonomy/taxeditor/store/operations/ChangeHomotypicGroupOperationTest.java create mode 100644 taxeditor-store/src/test/java/eu/etaxonomy/taxeditor/store/operations/ChangeHomotypicalGroupBasionymOperationTest.java create mode 100644 taxeditor-store/src/test/java/eu/etaxonomy/taxeditor/store/operations/ChangeSynonymToConceptOperationTest.java create mode 100644 taxeditor-store/src/test/java/eu/etaxonomy/taxeditor/store/operations/ChangeSynonymToHomotypicalGroupBasionymOperationTest.java create mode 100644 taxeditor-store/src/test/java/eu/etaxonomy/taxeditor/store/operations/ChangeSynonymToMisapplicationOperationTest.java create mode 100644 taxeditor-store/src/test/java/eu/etaxonomy/taxeditor/store/operations/ChangeSynonymToTaxonOperationTest.java create mode 100644 taxeditor-store/src/test/java/eu/etaxonomy/taxeditor/store/operations/ChangeTaxonToSynonymOperationTest.java create mode 100644 taxeditor-store/src/test/java/eu/etaxonomy/taxeditor/store/operations/CreateConceptRelationOperationTest.java create mode 100644 taxeditor-store/src/test/java/eu/etaxonomy/taxeditor/store/operations/CreateDescriptionElementOperationTest.java create mode 100644 taxeditor-store/src/test/java/eu/etaxonomy/taxeditor/store/operations/CreateMisapplicationOperationTest.java create mode 100644 taxeditor-store/src/test/java/eu/etaxonomy/taxeditor/store/operations/CreateSynonymInExisitingHomotypicalGroupOperationTest.java create mode 100644 taxeditor-store/src/test/java/eu/etaxonomy/taxeditor/store/operations/CreateSynonymInNewGroupOperationTest.java create mode 100644 taxeditor-store/src/test/java/eu/etaxonomy/taxeditor/store/operations/DeleteConceptRelationOperationTest.java create mode 100644 taxeditor-store/src/test/java/eu/etaxonomy/taxeditor/store/operations/DeleteDescriptionElementOperationTest.java create mode 100644 taxeditor-store/src/test/java/eu/etaxonomy/taxeditor/store/operations/DeleteMisapplicationOperationTest.java create mode 100644 taxeditor-store/src/test/java/eu/etaxonomy/taxeditor/store/operations/DeleteSynonymOperationTest.java create mode 100644 taxeditor-store/src/test/java/eu/etaxonomy/taxeditor/store/operations/DeleteTaxonOperationTest.java create mode 100644 taxeditor-store/src/test/java/eu/etaxonomy/taxeditor/store/operations/MoveTaxonOperationTest.java create mode 100644 taxeditor-store/src/test/java/eu/etaxonomy/taxeditor/store/operations/SwapSynonymAndAcceptedOperationTest.java create mode 100644 taxeditor-store/src/test/resources/dbscripts/001_cdm.ddl create mode 100644 taxeditor-store/src/test/resources/eu/etaxonomy/cdm/applicationContext-test.xml create mode 100644 taxeditor-store/src/test/resources/eu/etaxonomy/cdm/cdm.datasources.xml create mode 100644 taxeditor-store/src/test/resources/eu/etaxonomy/cdm/cdmfs.xml create mode 100644 taxeditor-store/src/test/resources/eu/etaxonomy/cdm/database/TermsDataSet-with_auditing_info.xml create mode 100644 taxeditor-store/src/test/resources/eu/etaxonomy/cdm/database/TermsDataSet.xml create mode 100644 taxeditor-store/src/test/resources/eu/etaxonomy/cdm/database/dataset.dtd create mode 100644 taxeditor-store/src/test/resources/eu/etaxonomy/taxeditor/store/CdmStoreTest.xml create mode 100644 taxeditor-store/src/test/resources/eu/etaxonomy/taxeditor/store/ConcurrentSessionTest.xml create mode 100644 taxeditor-store/src/test/resources/log4j.properties create mode 100644 taxeditor-store/src/test/resources/unitils.properties create mode 100644 taxeditor-updateSite/.project create mode 100644 taxeditor-updateSite/artifacts.xml create mode 100644 taxeditor-updateSite/content.xml create mode 100644 taxeditor-updateSite/index.html create mode 100644 taxeditor-updateSite/site.xml create mode 100644 taxeditor-updateSite/web/site.css create mode 100644 taxeditor-updateSite/web/site.xsl 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 0000000000000000000000000000000000000000..4494020f04d6447a3d5648f590ead0cca9d55358 GIT binary patch literal 1008 zcmZ?wbhEHb6krfw_|CxKzGT{ttX=CrEG$M@we?hUO8oqP63Y-4n6 zkxO)nab%2U;L6z{izof~{VQr}mCvl!J@;-NKCxrY?v=0KJ};Wn`0>}z=!vDb-@dll zzHRN6InkL`0UMS-`t&g-&!KC1Ur4G+SaXRY&(7+X#c)PPwzQx-5469x$O9^)#r{x_vT)?dctGVs!!j( z9=voUVpelVUtz7W%K@9mx7xU z0z(z-cWl4&=w?WyYHGf7*X2ur6U+TOGD<3ZZ8ohtbmLrjj$KHZkKgu9zkdIE_v1&` zfi3;#PWnx)`|$B?-G%eN{`{G?c5+i&LReKmVO3yiReh!{&EKPHzZV*zdl3 zS44sHpFh8YIy1ii__p%$>Cyu`6E-eAd4B)u1M4;%To<%#+VlgP61vi_efZ!#zwg}5 zv#}NavDHEU|Nmzg1p^uaia%LcKn~CW5uiN5z;Tx0XoFy|(*s5Zb~Z5|rUj?ww+sAd zP!Rms&&^=`Z_fqe=HyA@_4^8HW;mRmuj$R;!#Lsi(fKUFt7IyExGtV29{h=cL9^}Y zly)`6XDcVEA3SZt{%OXUjz`7w67N%=9CjSc*4lHD9*OW1t zq#F5A@p>1hONXbzGN)KRrGN`tt4mLY3M#Gpm%5>4L&sVkmpvXA5;!Nb=u4tX=CrEG$M@we?hUO8oqP63Y-4n6 zkxO)nab%2U;L6z{izof~{VQr}mCvl!J@;-NKCxrY?v=0KJ};Wn`0>}z=!vDb-@dll zzHRN6InkL`0UMS-`t&g-&!KC1Ur4G+SaXRY&(7+X#c)PPwzQx-5469x$O9^)#r{x_vT)?dctGVs!!j( z9=voUVpelVUtz7W%K@9mx7xU z0z(z-cWl4&=w?WyYHGf7*X2ur6U+TOGD<3ZZ8ohtbmLrjj$KHZkKgu9zkdIE_v1&` zfi3;#PWnx)`|$B?-G%eN{`{G?c5+i&LReKmVO3yiReh!{&EKPHzZV*zdl3 zS44sHpFh8YIy1ii__p%$>Cyu`6E-eAd4B)u1M4;%To<%#+VlgP61vi_efZ!#zwg}5 zv#}NavDHEU|Nmzg1p^uaia%LcKn~CW5uiN5!114fk;8{+0SiMDGq>23i5CTgISwmlZ3aWf|1UVb6Sx{QJN5Y0>L!9c*quE#WEi?a}DOT{GYUAxMWf!pHl!%bZ@^x3Tr>>4? z2tGV3hw*^HLmQT&x_2=ajwzEwv^qQwG&;yJq*)!8wM;(s`bOol6t&6&J-IjMbIT`a zef#=CGjaK%8IP>Xi=S=V=~RBs_=Cs8gPX(k<8~C!TPe1z?|F+rFIr&?FITkif>gO?8I59OtaYN1fVcCz84}+HNRy^5{4&?p1sg@wnIe)r;hA zjawWk%@I2?mQ3I^TCjv8xucP(OX-coQ^q8RlMYjy78M+rYTBp4#HAW~fTc@W%Hk5Y zlG=@UznCITg(D0YDM?6WdR9tgWh|Uvbf6_f*XC5qs#VVf9UZwvW_*0L QmM35VJ8R_~DFFs+05I6hyZ`_I literal 0 HcmV?d00001 diff --git a/taxeditor-application/icons/256color_48x48.gif b/taxeditor-application/icons/256color_48x48.gif new file mode 100644 index 0000000000000000000000000000000000000000..ea2bc3a301e9eff0208c5409bd7de9ed5e5131dd GIT binary patch literal 1887 zcmYk5dpy(oAIHBm4BzE?9L$_q45?%1q18_qYe=s87+hdb8Gk=lJq;2+*Y?_aEQS^YwZ>KbL>Ld-r+%%aKh0 z2*4Tu?5!$k5;de1#vZ&^9^Y^`x+Jw&)D~Bn=Xb{M`apLuj}?5vofYnID9Dy^=Nhx} zqI6^Z@a0tMPv=`F#=3f&N?Y#CExbBW%3EH4&ni0ga$(N7v7uH_%8K4i=T}d?TMmkI z%c;(1M(ps<{hlxWgVOxyQ0VrP=U6#cQwtiZUazekOFH0RoHF=k_U`ZF1H;|HiTg4| zLZ9}wsXr(7JgoBzvb`m0zBky-%8MO&-s@F=_ucAB$8dMxPwCA31c-m*(ez{_hs4S} zdQEU$F!F21^Zxn2-hPmOxLTf06g+5uG3=Wj%J9RwHZ_hd{Xol# zN=!cJTz|iFbTEKJVkS|&8|&9M))%GH9HF3Ku+RH)+S2ku+R&4AnXII?_*`bFe=0p8 zl@XCjC)ZT@U%%jAmV4+5#4In^+tM5uPm#$se6pj~q^ozH{pXbMQE1)IeNWo&3Geee z?)%&-xgx9&&58W)($ayl{K2t-;AC3xX&;3`f%-T!D)lqK3+*#gY07{?;o(8i@Z_*C zc!ik>8)TT36UHQ>sN_%V$fSjExp*Q7$2fbkSqK-8C(`hEZk!=#76O+b2yz|BT-X5} zi7;~=UX};pn_u3Aw;J^-^{T`5Wa@3-zwN1Iwg{!8*GwnZSM?QJt?*T@BEbHO z-$(@UDxRMDg`0V@vAze@v>Pn{q#xfsc>N7%$(h~JFDcL}-CEKEZAY*s6oLO{U zJ#VYe!&OU0k6m8PQQonq<Zelf(T%(L-Z0%>pC+GHH z#pQL=qCyv7F?)2`%<)@-OeSUvGj8b4g2o4%1#eV<2_JR3DF8W^oy7yXrz4{@noiD5 zEC7&7*>}KF((j$s>KYFf857gZj*wGp!p3T!hji%=moDL;xixR?FU{F;g$XT9W3M90{4ph&iiN#@rTz$X9D`ItLZf`-jCO_>e za9b5u&}^l~mW4+OM-BA+q17%Gx@U@;P7E_T;<8U`udkL*P|DASyX0(2u`@XyGTc^m z=NN+1Fm|lOegEXGYca;;aJ`!tVQ1-?<~I~I_w}J_9am{$w@PwJ3Qxym$J^JHg>n;{ zsyuHpo@N?ecsn-N=WTT5ao~lo))xA14=uJdybFD8Yk&~FrCYIeuBLtpqTF`>)?yCr zE2i^|NDFi!(it-9RO`jxIP(;a_HW)ZS_zA-PRrQtwmrR0#{ndg2Q)`x7$SYGr8)Z`z>Yu&^1cZ{ zs)oKY)ix)FTc&Eb?yn=8&ty%;_k5MBC+xGSt~t?fLH!ZXva95XbZutHj~`nGP}Pl` z*XI9zLMomV4LNPXNQS(uYbC?fT?>+D``0X1MwkJyE6)QXU5H@N4=4&c^z`9yrf14j-OlcJX>^DR}+=<>yzkH-I^~Pgpg(gs4&3bM+@5Jq^rCSi&tDL1F=XsIuw<>W?<<| z=7ADTjTnGD&WMNP+MTabFQ#wU>T029_GxTHwyQ%!iRO|rO@Aq3>x^4Uh#1%u!|yaD zSs?A9axglOVlZB)y1SIE<9tDyp-yLmVMtX2Q-ZsZsb2Q}@S_H0^z<$Gglq~2GHM)! etO-0#kC_VN7HJP5KOy%BV%q2+zXt*Ur~d&43`A)F literal 0 HcmV?d00001 diff --git a/taxeditor-application/icons/edit_16x16.gif b/taxeditor-application/icons/edit_16x16.gif new file mode 100644 index 0000000000000000000000000000000000000000..d857c6c7164081b8faa5053f33974bbd2f841415 GIT binary patch literal 981 zcmb_b&r8&C5S^fC3xpL)vPky6oFb~ni(DG1ip>=UX2HHa>`$3Sq6dO@cERr$M zp+y$@aS$r=6fPJAIftU~5Z$^Z*&)cbA5L#Re?tSycV}nj&3kXYd$6x}Z+AXRSz4xu zQu>tAqlBy!QLon>zdLz);E8Vt{PzEXiG)arEH)uyCKh5PHe!#WFo}>TiII5pDw7JS zk{YSUs49mD!j*)*=&OQ5IwIV1c3vtFjua z2PyQLuqm6dIXGgJUD%b~*s&F?0S3}w30kOOF|Yv*EDU=HiX5RLCgPzFYmupnny80d zut3pN%)}h(K?=R%DsJMC2R}d))35{jK>`ZF8ekv|mS_bJECx29f#u;`l#wG$)x${W z!&+o!Y7So^7c5XzH+A?3r(pnip&dp;Ev$qepowYN0ZtGMg`?8_*sn zif)vVBODilk=$Sl2N;cL2g6w?XA=5&?lO-6_7$-5X$cEk~q!az!-<0gqm04Hd? z4!9D`gC?wMZ>(NL_$zFWw>th4lzBp})%=FuwgXq!ti87GY16{)LQ`w^z05YN7dLUs z$BE|8&vy*3966P{KGHtu!!ItCn@?0HKCIu^@v^eHI^Hoodbn23P8X*#jeO&F_Em1` zPv&pmz}C*n(8|E#c=^lQ;=>0!cilL5^3j>Gv0sPoR0^*r-|suRIM;H#bLQ;t`&VxE z_iyPr|NY0i`I)c#bC-X1O)l82PqP + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 0000000000000000000000000000000000000000..f7fafc45779df07ab72adb5d4a252a39e89ea2bc GIT binary patch literal 702424 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
A0lqOw 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 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