1) Created CdmSessionDataRepository to keep track of all session data - all taxon...
authorp.ciardelli <p.ciardelli@localhost>
Mon, 22 Dec 2008 13:11:16 +0000 (13:11 +0000)
committerp.ciardelli <p.ciardelli@localhost>
Mon, 22 Dec 2008 13:11:16 +0000 (13:11 +0000)
27 files changed:
.gitattributes
eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/ApplicationActionBarAdvisor.java
eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/TaxEditorPlugin.java
eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/UiUtil.java
eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/actions/SaveAllAction.java
eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/actions/cdm/AddHeterotypicSynonymToTaxonAction.java
eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/actions/cdm/ChangeSynonymToTaxonAction.java
eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/actions/cdm/DeleteTaxonAction.java
eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/actions/cdm/MoveTaxonAction.java
eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/actions/cdm/SaveTaxonAction.java
eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/actions/ui/AddQuickNameAction.java
eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/actions/ui/ChangeSynonymToTaxonUiAction.java
eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/actions/ui/ChangeTaxonToSynonymAction.java
eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/datasource/CdmDataSourceDialog.java
eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/datasource/CdmDataSourceRepository.java
eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/datasource/CdmTransactionController.java
eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/datasource/RegisterDatabaseDialog.java
eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/editor/IDataDisposer.java [deleted file]
eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/editor/IParserFeedback.java [deleted file]
eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/editor/SelectTaxonDialog.java
eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/model/CdmSessionDataRepository.java [new file with mode: 0644]
eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/model/CdmUtil.java
eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/model/ICdmSessionDataRepository.java
eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/model/ICdmTaxonSetListener.java [new file with mode: 0644]
eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/model/TaxonomicTreeContentProvider.java
eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/navigation/TaxonomicTreeView.java
eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/navigation/TaxonomicTreeViewer.java

index 910a2ebadad5350f23d7368f11a76f9f0de3aa0a..f6fbb0780dba8e743c67d1d406e711554af1bfc8 100644 (file)
@@ -466,11 +466,9 @@ eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/editor/ErrorAn
 eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/editor/GroupComposite.java -text
 eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/editor/GroupCompositeLabel.java -text
 eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/editor/GroupedComposite.java -text
-eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/editor/IDataDisposer.java -text
 eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/editor/IFavoritesDraggable.java -text
 eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/editor/IHasPropertySource.java -text
 eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/editor/IParentDataAdapter.java -text
-eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/editor/IParserFeedback.java -text
 eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/editor/LineBreakListener.java -text
 eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/editor/LineWrapSquigglesStrategy.java -text
 eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/editor/LineWrapSupport.java -text
@@ -493,8 +491,10 @@ eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/editor/name/Ta
 eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/editor/name/messages.properties -text
 eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/io/InputWizard.java -text
 eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/io/InputWizard2.java -text
+eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/model/CdmSessionDataRepository.java -text
 eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/model/CdmUtil.java -text
 eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/model/ICdmSessionDataRepository.java -text
+eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/model/ICdmTaxonSetListener.java -text
 eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/model/NameEditorInput.java -text
 eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/model/TaxonomicTreeContentProvider.java -text
 eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/navigation/FavoritesTableViewer.java -text
index 739da59cc06ee1aa9be9c2f6f8ea81b074d2bb5c..5675677a9070513cea39bb49a93f1756f6770b7f 100644 (file)
@@ -67,6 +67,8 @@ public class ApplicationActionBarAdvisor extends ActionBarAdvisor {
                // Registering also provides automatic disposal of the actions when
                // the window is closed.
 
+               UiUtil.setStatusLineManager(getActionBarConfigurer().getStatusLineManager());
+               
                saveAction = ActionFactory.SAVE.create(window);
                register(saveAction);
                
index 4ccc3e49d3436add63a9c6e252abd4a630a90a04..98d36cc47f7c059f69104b873f73c8198be9de89 100644 (file)
 package eu.etaxonomy.taxeditor;\r
 \r
 import java.net.URL;\r
-import java.util.Collection;\r
 import java.util.HashMap;\r
-import java.util.HashSet;\r
 import java.util.Locale;\r
-import java.util.Map;\r
 import java.util.Set;\r
-import java.util.UUID;\r
 \r
 import org.apache.log4j.Logger;\r
-import org.eclipse.core.databinding.observable.Realm;\r
 import org.eclipse.core.databinding.observable.list.WritableList;\r
-import org.eclipse.core.databinding.observable.set.IObservableSet;\r
-import org.eclipse.core.databinding.observable.set.WritableSet;\r
 import org.eclipse.core.runtime.FileLocator;\r
 import org.eclipse.core.runtime.IPath;\r
 import org.eclipse.core.runtime.Path;\r
-import org.eclipse.jface.databinding.swt.SWTObservables;\r
 import org.eclipse.jface.resource.FontRegistry;\r
 import org.eclipse.jface.resource.ImageDescriptor;\r
 import org.eclipse.jface.resource.ImageRegistry;\r
@@ -42,10 +34,6 @@ import org.eclipse.ui.views.properties.PropertySheetPage;
 import org.osgi.framework.BundleContext;\r
 \r
 import eu.etaxonomy.cdm.api.application.CdmApplicationController;\r
-import eu.etaxonomy.cdm.api.service.IDescriptionService;\r
-import eu.etaxonomy.cdm.api.service.INameService;\r
-import eu.etaxonomy.cdm.api.service.IReferenceService;\r
-import eu.etaxonomy.cdm.api.service.ITaxonService;\r
 import eu.etaxonomy.cdm.api.service.ITermService;\r
 import eu.etaxonomy.cdm.database.DataSourceNotFoundException;\r
 import eu.etaxonomy.cdm.database.DbSchemaValidation;\r
@@ -57,20 +45,17 @@ import eu.etaxonomy.cdm.model.common.init.TermNotFoundException;
 import eu.etaxonomy.cdm.model.name.NameRelationshipType;\r
 import eu.etaxonomy.cdm.model.name.NomenclaturalStatusType;\r
 import eu.etaxonomy.cdm.model.name.Rank;\r
-import eu.etaxonomy.cdm.model.reference.ReferenceBase;\r
-import eu.etaxonomy.cdm.model.taxon.Taxon;\r
 import eu.etaxonomy.taxeditor.datasource.CdmDataSourceRepository;\r
 import eu.etaxonomy.taxeditor.datasource.CdmTransactionController;\r
-import eu.etaxonomy.taxeditor.navigation.TaxonomicTreeViewer;\r
+import eu.etaxonomy.taxeditor.model.CdmSessionDataRepository;\r
 \r
 /**\r
  * The class controlling the plug-in life cycle.\r
  * </p>\r
  * <ul>\r
  *     <li>Initializes datastore as necessary.</li>\r
+ *     <li>Initializes CDM application controller.</li> * \r
  *     <li>Initializes default preferences.</li>\r
- *     <li>Gateway to CDM service layer.</li>\r
- *     <li>Stores taxa for application session.</li>\r
  *     <li>Stores registries for colors, fonts, images.</li>\r
  * </ul>\r
  * \r
@@ -100,35 +85,15 @@ public class TaxEditorPlugin extends AbstractUIPlugin {
         * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext)\r
         */\r
        public void start(BundleContext context) throws Exception {\r
+               \r
                super.start(context);\r
                plugin = this;\r
                                \r
-               // Check in the prefs store whether the application (i.e. its default\r
-               //      data source) has been initialized\r
-               boolean initialized = false;\r
-               if (getPreferenceStore().contains(ITaxEditorConstants.INITIALIZED)) {\r
-                       initialized = getPreferenceStore().getBoolean(\r
-                                       ITaxEditorConstants.INITIALIZED);\r
-               }\r
-       \r
-               // If not ...\r
-               if (!initialized) {\r
-                       \r
-                       // ... set validation to CREATE\r
-                       logger.warn("Initializing datastore");\r
-                       dbSchemaValidation = DbSchemaValidation.CREATE;\r
-                       \r
-                       // ... and note in prefs that application has been initialized\r
-                       getPreferenceStore()\r
-                                       .setValue(ITaxEditorConstants.INITIALIZED, true);\r
-               }\r
-\r
-               // Initialize application controller\r
-               cdmApp = initCdmApp();\r
+               // Check whether this is the first time the application has ever been run\r
+               checkInitialExecution();\r
                \r
-               // Set application controller for objects that use it \r
-               CdmTransactionController.setCdmApplicationController(cdmApp);\r
-               CdmDataSourceRepository.getDefault().setCdmApplicationController(cdmApp);\r
+               // Initialize application controller\r
+               initApplicationController();\r
                \r
                // Start a transaction\r
                CdmTransactionController.startTransaction();\r
@@ -138,6 +103,7 @@ public class TaxEditorPlugin extends AbstractUIPlugin {
                Locale.setDefault(locale);\r
        }\r
 \r
+       \r
        /*\r
         * (non-Javadoc)\r
         * \r
@@ -151,7 +117,6 @@ public class TaxEditorPlugin extends AbstractUIPlugin {
                disposeColors();\r
        }\r
        \r
-\r
        /**\r
         * Returns the shared instance\r
         * \r
@@ -161,6 +126,28 @@ public class TaxEditorPlugin extends AbstractUIPlugin {
                return plugin;\r
        }\r
 \r
+       private void checkInitialExecution() {\r
+               \r
+               // Check in the prefs store whether the application (i.e. its default\r
+               //      data source) has been initialized\r
+               boolean initialized = false;\r
+               if (getPreferenceStore().contains(ITaxEditorConstants.INITIALIZED)) {\r
+                       initialized = getPreferenceStore().getBoolean(\r
+                                       ITaxEditorConstants.INITIALIZED);\r
+               }\r
+       \r
+               // If not ...\r
+               if (!initialized) {\r
+                       \r
+                       // ... set validation to CREATE\r
+                       logger.warn("Initializing datastore");\r
+                       dbSchemaValidation = DbSchemaValidation.CREATE;\r
+                       \r
+                       // ... and note in prefs that application has been initialized\r
+                       getPreferenceStore().setValue(ITaxEditorConstants.INITIALIZED, true);\r
+               }\r
+       }\r
+       \r
        /***************************************************************************\r
         * CDM SERVICES\r
         **************************************************************************/\r
@@ -168,68 +155,38 @@ public class TaxEditorPlugin extends AbstractUIPlugin {
        /**\r
         * All CDM services are called via the application controller\r
         */\r
-       private CdmApplicationController cdmApp;\r
+       private CdmApplicationController applicationController;\r
 \r
-       private CdmApplicationController initCdmApp() {\r
+       private CdmApplicationController initApplicationController() {\r
                \r
-               // Get the "current", i.e. most recently used, data source\r
+               // Get the "current" - i.e. most recently used - data source\r
                ICdmDataSource cdmDatasource = CdmDataSourceRepository.getDefault().\r
                                getCurrentDataSource();\r
                \r
-               // \r
+               // Initialize the controller with the data source\r
                try {\r
-                       cdmApp = CdmApplicationController.NewInstance(cdmDatasource, dbSchemaValidation);\r
+                       applicationController = CdmApplicationController.NewInstance(cdmDatasource, dbSchemaValidation);\r
                } catch (DataSourceNotFoundException e) {\r
                        // TODO user-friendly failure here\r
                        e.printStackTrace();\r
                } catch (TermNotFoundException e) {\r
                        e.printStackTrace();\r
                }\r
-               return cdmApp;\r
+               \r
+               // Set application controller for objects that use it \r
+               CdmTransactionController.setApplicationController(applicationController);\r
+               CdmDataSourceRepository.getDefault().setCdmApplicationController(applicationController);\r
+               CdmSessionDataRepository.getDefault().setApplicationController(applicationController);\r
+               \r
+               return applicationController;\r
        }\r
        \r
-       public CdmApplicationController getCdmApp() {\r
-               if (cdmApp == null) {\r
+       public CdmApplicationController getApplicationController() {\r
+               if (applicationController == null) {\r
                        throw new IllegalStateException("CdmApplicationController not yet set.");\r
                }\r
-               return cdmApp;\r
-       }\r
-\r
-       private ITaxonService taxonService;\r
-\r
-       public ITaxonService getTaxonService() {\r
-               if (taxonService == null) {\r
-                       taxonService = getCdmApp().getTaxonService();\r
-               }\r
-               return taxonService;\r
-       }\r
-       \r
-       private INameService nameService;\r
-\r
-       public INameService getNameService() {\r
-               if (nameService == null) {\r
-                       nameService = getCdmApp().getNameService();\r
-               }\r
-               return nameService;\r
+               return applicationController;\r
        }\r
-       \r
-       private IDescriptionService descriptionService;\r
-       \r
-       public IDescriptionService getDescriptionService() {\r
-               if (descriptionService == null) {\r
-                       descriptionService = getCdmApp().getDescriptionService();\r
-               }\r
-               return descriptionService;      \r
-       }\r
-       \r
-       private IReferenceService referenceService; \r
-       \r
-       public IReferenceService getReferenceService() {\r
-               if (referenceService == null) {\r
-                       referenceService = getCdmApp().getReferenceService();\r
-               }\r
-               return referenceService;\r
-       }       \r
 \r
        /***************************************************************************\r
         * OBSERVABLE LISTS\r
@@ -383,197 +340,13 @@ public class TaxEditorPlugin extends AbstractUIPlugin {
        /***************************************************************************\r
         * TAXONOMIC TREE\r
         **************************************************************************/\r
-\r
-       public ReferenceBase getSessionDefaultSec() {\r
-               return getCdmApp().getReferenceService().getReferenceByUuid(\r
-                               UUID.fromString("f3593c18-a8d2-4e51-bdad-0befbf8fb2d1"));\r
-       }\r
-\r
-       private Set<Taxon> sessionRootTaxa;\r
-       /**\r
-        * The taxonomic tree content provider observes this set for changes, and\r
-        * makes the appropriate changes to the tree.\r
-        */\r
-       private IObservableSet observableSessionTaxonSet;\r
-       /**\r
-        * This map of taxa to their taxonomic children is used by\r
-        * NameTreeContentProvider's getChildren method.\r
-        * \r
-        * key = taxon, value = key's child taxa Note that a map can have a key ==\r
-        * null, i.e. no parent taxon\r
-        */\r
-       private HashMap<Taxon, Set<Taxon>> sessionTaxonomicChildrenMap;\r
-\r
-       public Set<Taxon> getSessionRootTaxa() {\r
-               \r
-               boolean ROOT_TAXA_ONLY_W_CHILDREN = true;\r
-               boolean ROOT_TAXA_W_NO_CHILDREN_ALLOWED = false;\r
-               boolean WITH_MISAPPLIED_NAMES = true;\r
-               boolean NO_MISAPPLIED_NAMES = false;\r
-               \r
-               if (sessionRootTaxa == null) {\r
-                       \r
-                       sessionRootTaxa = new HashSet<Taxon>();\r
-//                     sessionRootTaxa.addAll(getCdmApp().getTaxonService().getRootTaxa(\r
-//                                     getSessionDefaultSec(), null, ROOT_TAXA_W_NO_CHILDREN_ALLOWED));                        \r
-                       sessionRootTaxa.addAll(getCdmApp().getTaxonService().getRootTaxa(\r
-                                       getSessionDefaultSec(), ROOT_TAXA_W_NO_CHILDREN_ALLOWED, WITH_MISAPPLIED_NAMES));\r
-                       addSessionTaxa(sessionRootTaxa);\r
-                                               \r
-               }\r
-               return sessionRootTaxa;\r
-       }\r
-\r
-       private Map<Taxon, Set<Taxon>> getTaxonomicChildrenMap() {\r
-               if (sessionTaxonomicChildrenMap == null) {\r
-                       sessionTaxonomicChildrenMap = new HashMap<Taxon, Set<Taxon>>();\r
-               }\r
-               return sessionTaxonomicChildrenMap;\r
-       }\r
-\r
-       /**\r
-        * Returns a set of any child taxa for this taxon that have already been\r
-        * requested during this session.\r
-        * \r
-        * @param parentTaxon\r
-        * @return\r
-        */\r
-       public Set<Taxon> getSessionTaxonomicChildren(Taxon parentTaxon) {\r
-               if (!getTaxonomicChildrenMap().containsKey(parentTaxon)) {\r
-                       if (parentTaxon == null) {\r
-                               getTaxonomicChildrenMap().put(parentTaxon, getSessionRootTaxa());\r
-                       } else {\r
-                       \r
-                               // BUG deleted taxon were re-appearing as NULL children\r
-                               Set<Taxon> childTaxa = new HashSet<Taxon>();\r
-                               \r
-//                             TransactionStatus tx = getCdmApp().startTransaction();\r
-//                             getCdmApp().getTaxonService().saveTaxon(parentTaxon);\r
-                               for (Taxon taxon : parentTaxon.getTaxonomicChildren()) {\r
-                                       if (taxon != null) {\r
-                                               childTaxa.add(taxon);\r
-                                       }\r
-                               }\r
-//                             getCdmApp().commitTransaction(tx);\r
-                               \r
-                               getTaxonomicChildrenMap().put(parentTaxon, childTaxa);\r
-                       }\r
-               }\r
-               return getTaxonomicChildrenMap().get(parentTaxon);\r
-       }\r
-\r
-       /**\r
-        * @return\r
-        */\r
-       public IObservableSet getObservableSessionTaxa() {\r
-               if (observableSessionTaxonSet == null) {\r
-                       Realm realm = SWTObservables.getRealm(Display.getDefault());\r
-                       observableSessionTaxonSet = new WritableSet(realm);\r
-               }\r
-               return observableSessionTaxonSet;\r
-       }\r
-\r
-       /**\r
-        * Recursive function to clear the hashmap of a taxon's children used in\r
-        * this session, and the childrens' children, etc.\r
-        * \r
-        * @param taxon\r
-        */\r
-       private void clearTaxonomicChildren(Taxon taxon) {\r
-               Set<Taxon> children = getSessionTaxonomicChildren(taxon);\r
-               if (children != null) {\r
-                       for (Taxon child : children) {\r
-                               clearTaxonomicChildren(child);\r
-                       }\r
-                       getTaxonomicChildrenMap().remove(taxon);\r
-                       getObservableSessionTaxa().removeAll(children);\r
-               }\r
-       }\r
        \r
        public void clearSessionTaxa() {\r
-               sessionTaxonomicChildrenMap = null;\r
-               sessionRootTaxa = null;\r
+               CdmSessionDataRepository.getDefault().removeAllTaxa();\r
+               \r
                observableRecentNamesList = null;\r
                observableFavoritesList = null;\r
        }\r
-\r
-       /**\r
-        * Remove taxon from all session collections\r
-        * \r
-        * @param taxon\r
-        */\r
-       public void removeSessionTaxon(Taxon taxon) {\r
-\r
-               // Recursively remove all children, children's children, etc.\r
-               clearTaxonomicChildren(taxon);\r
-\r
-               Taxon parentTaxon = taxon.getTaxonomicParent();\r
-\r
-               // Remove from parent's child map, or from root taxa\r
-               if (parentTaxon == null) {\r
-                       getSessionRootTaxa().remove(taxon);\r
-               } else {\r
-                       getSessionTaxonomicChildren(parentTaxon).remove(taxon);\r
-               }\r
-\r
-               // Remove from session taxa\r
-               getObservableSessionTaxa().remove(taxon);\r
-               \r
-               UiUtil.getTreeViewer().remove(taxon);\r
-       }\r
-\r
-       public void addSessionTaxa(Collection<Taxon> taxa) {\r
-               for (Taxon taxon : taxa) {\r
-                       addSessionTaxon(taxon);\r
-               }\r
-       }\r
-\r
-       /**\r
-        * Whenever a taxon is opened, either for editing or for display in the\r
-        * taxonomic tree, it should be added to the collections of taxa used during\r
-        * this session.\r
-        * \r
-        * @param taxon\r
-        */\r
-       public void addSessionTaxon(Taxon taxon) {\r
-\r
-               getObservableSessionTaxa().remove(taxon);\r
-               \r
-               // Add taxon to session taxa if not already there\r
-               if (!(getObservableSessionTaxa().contains(taxon))) {\r
-                       getObservableSessionTaxa().add(taxon);\r
-               }\r
-               \r
-               Taxon parentTaxon = taxon.getTaxonomicParent();\r
-\r
-               // If taxon has no parent, add it to root taxa\r
-               if (parentTaxon == null) {\r
-                       if (!(getSessionRootTaxa().contains(taxon))) {\r
-                               getSessionRootTaxa().add(taxon);\r
-                       }\r
-               }\r
-\r
-               // Add taxon to its parent's child map\r
-               getSessionTaxonomicChildren(parentTaxon).add(taxon);\r
-                               \r
-               TaxonomicTreeViewer viewer = UiUtil.getTreeViewer();\r
-               \r
-               if (viewer != null) {\r
-                       \r
-                       if (parentTaxon == null) {\r
-                               viewer.setInput(getSessionRootTaxa());\r
-                       } else {\r
-                               \r
-                               // If this taxon is already in the tree, remove then re-add to force re-sort\r
-                               if (viewer.testFindItem(taxon) != null) {\r
-                                       viewer.remove(taxon);\r
-                               }\r
-                               viewer.add(parentTaxon, taxon);\r
-                       }\r
-               \r
-               }\r
-       }\r
-\r
        \r
        /***************************************************************************\r
         * RANKS\r
@@ -582,7 +355,7 @@ public class TaxEditorPlugin extends AbstractUIPlugin {
 \r
        public OrderedTermVocabulary<Rank> getRankVocabulary() {\r
                if (rankVocabulary == null) {\r
-                       rankVocabulary = getCdmApp().getNameService().getRankVocabulary();\r
+                       rankVocabulary = getApplicationController().getNameService().getRankVocabulary();\r
                }\r
                return rankVocabulary;\r
        }\r
@@ -594,7 +367,7 @@ public class TaxEditorPlugin extends AbstractUIPlugin {
 \r
        public TermVocabulary<NomenclaturalStatusType> getNomStatusVocabulary() {\r
                if (nomStatusVocabulary == null) {\r
-                       nomStatusVocabulary = getCdmApp().getNameService()\r
+                       nomStatusVocabulary = getApplicationController().getNameService()\r
                                        .getStatusTypeVocabulary();\r
                }\r
                return nomStatusVocabulary;\r
@@ -611,11 +384,11 @@ public class TaxEditorPlugin extends AbstractUIPlugin {
 \r
        public TermVocabulary<NameRelationshipType> getNameRelationshipTypeVocabulary() {\r
                if (nameRelationshipTypeVocabulary == null) {\r
-                       nameRelationshipTypeVocabulary = getCdmApp().getNameService()\r
+                       nameRelationshipTypeVocabulary = getApplicationController().getNameService()\r
                                        .getNameRelationshipTypeVocabulary();\r
                        \r
                        // Add all terms manually to transaction\r
-                       ITermService termService = getCdmApp().getTermService();\r
+                       ITermService termService = getApplicationController().getTermService();\r
                        for (NameRelationshipType type : nameRelationshipTypeVocabulary) {\r
                                termService.saveTerm(type);\r
                        }\r
index a191f16d3a8dce01e368233a4a1c0b41af6f662f..a67298195819581a2ac17babb0bda836030fa9a2 100644 (file)
@@ -16,6 +16,8 @@ import org.apache.log4j.Logger;
 import org.eclipse.core.commands.operations.IOperationHistory;\r
 import org.eclipse.core.commands.operations.IUndoContext;\r
 import org.eclipse.core.commands.operations.OperationHistoryFactory;\r
+import org.eclipse.core.runtime.IProgressMonitor;\r
+import org.eclipse.jface.action.IStatusLineManager;\r
 import org.eclipse.swt.graphics.Color;\r
 import org.eclipse.swt.widgets.Composite;\r
 import org.eclipse.swt.widgets.Control;\r
@@ -63,6 +65,8 @@ public class UiUtil {
        public static Set<Feature> preferredFeatureSet;\r
        public static Set<Rank> preferredRankSet;\r
        private static IViewPart treeView;\r
+\r
+       private static IOperationHistory operationHistory;\r
        \r
        public static IViewPart getPropertySheet() {\r
                for (IViewReference reference : getActivePage().getViewReferences()) {\r
@@ -267,7 +271,10 @@ public class UiUtil {
        }\r
        \r
        public static IOperationHistory getOperationHistory() {\r
-               return OperationHistoryFactory.getOperationHistory();\r
+               if (operationHistory == null) {\r
+                       operationHistory = OperationHistoryFactory.getOperationHistory();\r
+               }\r
+               return operationHistory;\r
 //             return getOperationSupport().getOperationHistory();\r
        }\r
 \r
@@ -448,11 +455,26 @@ public class UiUtil {
 \r
        static boolean isSaving = false;\r
 \r
+       private static IStatusLineManager statusLineManager;\r
+\r
        public static void setIsSaving(boolean isSavin) {\r
                isSaving = isSavin;\r
        }\r
        \r
        public static boolean getIsSaving() {\r
                return isSaving;\r
-       }       \r
+       }\r
+\r
+       public static void setStatusLineManager(IStatusLineManager manager) {\r
+               statusLineManager = manager;\r
+       }\r
+\r
+       public static void setStatusLine(String message) {\r
+               statusLineManager.setMessage(message);\r
+       }\r
+       \r
+       public static IProgressMonitor getStatusLineProgressMonitor() {\r
+               statusLineManager.setCancelEnabled(false);\r
+               return statusLineManager.getProgressMonitor();\r
+       }\r
 }
\ No newline at end of file
index 048df5739573714e8b30c1b35ca05b6bdf00c1a5..81f99c9e06ad63bdc4e1d5926d56acc230c0ac1a 100644 (file)
@@ -18,11 +18,11 @@ import org.eclipse.ui.IWorkbenchWindow;
 import org.eclipse.ui.IWorkbenchWindowActionDelegate;
 
 import eu.etaxonomy.cdm.model.taxon.Taxon;
-import eu.etaxonomy.taxeditor.TaxEditorPlugin;
 import eu.etaxonomy.taxeditor.UiUtil;
 import eu.etaxonomy.taxeditor.actions.cdm.SaveTaxonAction;
 import eu.etaxonomy.taxeditor.datasource.CdmTransactionController;
 import eu.etaxonomy.taxeditor.editor.MultiPageTaxonEditor;
+import eu.etaxonomy.taxeditor.model.CdmSessionDataRepository;
 import eu.etaxonomy.taxeditor.model.CdmUtil;
 
 /**
@@ -76,16 +76,14 @@ public class SaveAllAction implements IWorkbenchWindowActionDelegate {
                CdmTransactionController.commitTransaction();
        
                // Force library objects to be associated with new transaction
-               CdmUtil.clearLibraryObjects();
+               CdmUtil.clearNonTaxonData();
                
                // Start a new transaction
                CdmTransactionController.startTransaction();
                
                // Put all open taxa in the new transaction
-               for (Object taxon : TaxEditorPlugin.getDefault().getObservableSessionTaxa()) {
-                       CdmUtil.getTaxonService().saveTaxon((Taxon) taxon);
-               }
-
+               CdmTransactionController.addSessionDataToTransaction();
+               
                UiUtil.setIsSaving(false);
        }
 
index 65e2c017a64a7d0916ac902ae6f9f57c238947bd..0fce7843425bd8ac95adcb7318a35c00924c3b9b 100644 (file)
@@ -16,7 +16,6 @@ import org.eclipse.jface.resource.ImageDescriptor;
 import eu.etaxonomy.cdm.model.name.TaxonNameBase;\r
 import eu.etaxonomy.cdm.model.taxon.Synonym;\r
 import eu.etaxonomy.cdm.model.taxon.SynonymRelationship;\r
-import eu.etaxonomy.cdm.model.taxon.SynonymRelationshipType;\r
 import eu.etaxonomy.cdm.model.taxon.Taxon;\r
 import eu.etaxonomy.taxeditor.ITaxEditorConstants;\r
 import eu.etaxonomy.taxeditor.TaxEditorPlugin;\r
index e57f2a194303178f280b90f582a611f0836e1b76..f69e36651e17bceea9e9d8ab253ce64a060ba18e 100644 (file)
@@ -37,7 +37,7 @@ public class ChangeSynonymToTaxonAction extends Action {
                Taxon taxon = (Taxon) synonym.getAcceptedTaxa().toArray()[0];\r
                Taxon newTaxon = Taxon.NewInstance(synonym.getName(), taxon.getSec());\r
                taxon.removeSynonym(synonym);\r
-               TaxEditorPlugin.getDefault().getCdmApp().getTaxonService().removeTaxon(synonym);\r
+               TaxEditorPlugin.getDefault().getApplicationController().getTaxonService().removeTaxon(synonym);\r
                \r
                new SaveTaxonAction(taxon).run();\r
                new SaveTaxonAction(newTaxon).run();\r
index e4555823e8bb57832f46a63e6fa448712a21373a..3b8a251effe76c42bfbc8a33d200880448ce00a2 100644 (file)
@@ -14,21 +14,19 @@ package eu.etaxonomy.taxeditor.actions.cdm;
  * @created 14.05.2008\r
  * @version 1.0\r
  */\r
-import java.util.UUID;\r
-\r
 import org.apache.log4j.Logger;\r
+import org.eclipse.core.runtime.IProgressMonitor;\r
 import org.eclipse.jface.action.Action;\r
 import org.eclipse.jface.dialogs.MessageDialog;\r
 import org.eclipse.jface.resource.ImageDescriptor;\r
 import org.eclipse.ui.PartInitException;\r
 \r
 import eu.etaxonomy.cdm.model.taxon.Taxon;\r
-import eu.etaxonomy.cdm.model.taxon.TaxonRelationship;\r
-import eu.etaxonomy.cdm.model.taxon.TaxonRelationshipType;\r
 import eu.etaxonomy.taxeditor.ITaxEditorConstants;\r
 import eu.etaxonomy.taxeditor.TaxEditorPlugin;\r
 import eu.etaxonomy.taxeditor.UiUtil;\r
 import eu.etaxonomy.taxeditor.actions.SaveAllAction;\r
+import eu.etaxonomy.taxeditor.model.CdmSessionDataRepository;\r
 import eu.etaxonomy.taxeditor.model.CdmUtil;\r
 \r
 /**\r
@@ -59,9 +57,17 @@ public class DeleteTaxonAction extends Action {
        }\r
 \r
        public void run() {\r
-\r
+               \r
+               // Get taxon name for progress monitor\r
+               String taxonName = CdmUtil.getDisplayName(taxon);\r
+               \r
+               // Get and start progress monitor\r
+               IProgressMonitor monitor = UiUtil.getStatusLineProgressMonitor();\r
+               monitor.beginTask("Deleting taxon '" + taxonName + "'.", 10);\r
+               \r
                // Call save all action\r
                new SaveAllAction().run(null);\r
+               monitor.worked(2);\r
                \r
                // If the taxon has children, cancel operation\r
                // TODO add option to continue, and delete children\r
@@ -69,58 +75,35 @@ public class DeleteTaxonAction extends Action {
                        MessageDialog.openInformation(UiUtil.getShell(), "Cannot delete taxon", \r
                                        "'" + CdmUtil.getDisplayName(taxon) + "' has taxonomic children. " +\r
                                        "These must be manually deleted before their parent.");\r
+                       monitor.done();\r
                        return;\r
                }\r
+               monitor.worked(1);\r
                \r
-               TaxEditorPlugin.getDefault().removeSessionTaxon(taxon);\r
-\r
                // Close taxon's editor, if any is active\r
                try {\r
                        UiUtil.closeEditor(taxon, true);\r
                } catch (PartInitException e) {\r
                        e.printStackTrace();\r
                }\r
+               monitor.worked(1);\r
 \r
-               // Remove from recent names list\r
-               TaxEditorPlugin.getDefault().getObservableRecentNamesList().remove(\r
-                               taxon);         \r
+               // Delete taxon from CDM layer\r
+               CdmSessionDataRepository.getDefault().deleteTaxon(taxon);\r
+               monitor.worked(4);\r
+                               \r
+               // Call save all action\r
+               new SaveAllAction().run(null);\r
+               monitor.worked(2);\r
                \r
-               Taxon parentTaxon = taxon.getTaxonomicParent();\r
-\r
-               if (parentTaxon != null) {\r
-                       for (TaxonRelationship taxonRelation : parentTaxon\r
-                                       .getTaxonRelations()) {\r
-\r
-                               TaxonRelationshipType type = taxonRelation.getType();\r
-                               Taxon fromTaxon = taxonRelation.getFromTaxon();\r
-\r
-                               // Beware of phantom taxon relations with a "NULL" fromTaxon\r
-                               if (fromTaxon == null) {\r
-                                       continue;\r
-                               }\r
-\r
-                               if (type.equals(TaxonRelationshipType\r
-                                               .TAXONOMICALLY_INCLUDED_IN())\r
-                                               && fromTaxon.equals(taxon)) {\r
-                                       parentTaxon.removeTaxonRelation(taxonRelation);\r
-                                       TaxEditorPlugin.getDefault().getCdmApp().getTaxonService()\r
-                                                       .saveTaxon(parentTaxon);\r
-                                       break;\r
-                               }\r
-                       }\r
-               }\r
+               // Close the progress monitor\r
+               monitor.done();\r
                \r
-               // Check whether taxon has already been saved to the CDM\r
-               UUID taxonUuid = taxon.getUuid();\r
-               if (TaxEditorPlugin.getDefault().getCdmApp().getTaxonService()\r
-                               .getTaxonByUuid(taxonUuid) != null) {\r
-                       \r
-                       // Remove the taxon from the CDM\r
-                       TaxEditorPlugin.getDefault().getCdmApp().getTaxonService()\r
-                                       .removeTaxon(taxon);\r
-               }\r
+               // Announce taxon was deleted on status line\r
+               UiUtil.setStatusLine("Deleted taxon '" + taxonName + "'.");\r
                \r
-               // Call save all action\r
-               new SaveAllAction().run(null);\r
+//             Status status = new Status(IStatus.INFO, TaxEditorPlugin.PLUGIN_ID, \r
+//                             "Deleted.", null);\r
+//             StatusManager.getManager().handle(status, StatusManager.SHOW);\r
        }\r
 }
\ No newline at end of file
index 683f8764f1dc2a752a6b8a5cb36e4ea8564dbb9a..609be0b86f2ae31ca0c628aeadd116ccd230e7eb 100644 (file)
@@ -16,6 +16,7 @@ import org.eclipse.jface.viewers.ISelection;
 import eu.etaxonomy.cdm.model.taxon.Taxon;\r
 import eu.etaxonomy.taxeditor.TaxEditorPlugin;\r
 import eu.etaxonomy.taxeditor.UiUtil;\r
+import eu.etaxonomy.taxeditor.model.CdmSessionDataRepository;\r
 import eu.etaxonomy.taxeditor.navigation.TaxonomicTreeViewer;\r
 \r
 /**\r
@@ -32,33 +33,20 @@ public class MoveTaxonAction extends Action {
 \r
        Taxon taxon;\r
        Taxon newParentTaxon;\r
+       Taxon oldParentTaxon;\r
        \r
        public MoveTaxonAction(Taxon taxon, Taxon newParentTaxon) {\r
+               \r
                this.taxon = taxon;\r
                this.newParentTaxon = newParentTaxon;\r
+               \r
+               // Save old parent taxon for undo\r
+               this.oldParentTaxon = taxon.getTaxonomicParent();\r
        }\r
        \r
        public void run() {\r
-               \r
-               // Save any selection and expansion info ...\r
-               Object[] viewerExpandedElements = null;\r
-               ISelection viewerSelection = null;\r
-               TaxonomicTreeViewer viewer = UiUtil.getTreeViewer();\r
-               if (viewer != null) {\r
-                       viewerExpandedElements = viewer.getExpandedElements();\r
-                       viewerSelection = viewer.getSelection();\r
-               }\r
-               \r
-               TaxEditorPlugin.getDefault().removeSessionTaxon(taxon);\r
-               taxon.setTaxonomicParent(newParentTaxon, null, null);\r
-               TaxEditorPlugin.getDefault().addSessionTaxon(taxon);\r
-               \r
+               CdmSessionDataRepository.getDefault().\r
+                               setTaxonomicParent(taxon, newParentTaxon);              \r
                new SaveTaxonAction(taxon).run();\r
-\r
-               // ... to restore after taxon has been removed then re-added\r
-               if (viewer != null) {\r
-                       viewer.setExpandedElements(viewerExpandedElements);\r
-                       viewer.setSelection(viewerSelection, true);\r
-               }\r
        }\r
 }
\ No newline at end of file
index 42f8abedc72bff1f38c558035b8d0e6442bb18b5..f0ac8071aa4f4cee91b3788597b2a67a94c31712 100644 (file)
@@ -4,10 +4,7 @@ import org.apache.log4j.Logger;
 import org.eclipse.jface.action.Action;\r
 \r
 import eu.etaxonomy.cdm.model.taxon.Taxon;\r
-import eu.etaxonomy.taxeditor.TaxEditorPlugin;\r
-import eu.etaxonomy.taxeditor.UiUtil;\r
-import eu.etaxonomy.taxeditor.model.CdmUtil;\r
-import eu.etaxonomy.taxeditor.navigation.TaxonomicTreeViewer;\r
+import eu.etaxonomy.taxeditor.model.CdmSessionDataRepository;\r
 \r
 /**\r
  * Commit any changes to this taxon to the CDM\r
@@ -25,31 +22,8 @@ public class SaveTaxonAction extends Action {
        }\r
        \r
        public void run() {\r
-               // If this is a new taxon, add it to the recent names list;\r
-               //  if it is already in the tree, remove then re-add it\r
-               //  to force a re-sort\r
-//             if (!TaxEditorPlugin.getDefault().getObservableRecentNamesList().contains(taxon)) {     \r
-//                     TaxEditorPlugin.getDefault().getObservableRecentNamesList().add(0, taxon);\r
-//             }\r
-\r
-//             SaveAction\r
-               \r
-               // If this action creates a root taxon, create the tax. tree\r
-               TaxonomicTreeViewer treeViewer = UiUtil.getTreeViewer();\r
-               if (treeViewer == null) {\r
-                       treeViewer = UiUtil.createTreeViewer();\r
-               }               \r
-               \r
-               TaxEditorPlugin.getDefault().addSessionTaxon(taxon);\r
                \r
                // Save the taxon to the CDM\r
-               CdmUtil.getTaxonService().saveTaxon(taxon);\r
-\r
-               // Notify taxon listeners in case name has been updated - updates editor view tab and recent names\r
-               taxon.firePropertyChange("name", null, null);\r
-               \r
-               // Open node on save\r
-               treeViewer.revealTaxon(taxon);\r
-               \r
+               CdmSessionDataRepository.getDefault().saveTaxon(taxon);\r
        }\r
 }
\ No newline at end of file
index 9b4a7aa4b728566bb20447ec3cc2f09e3d8e1aef..31e8160c28bc0adbd5b15a10353b26279bacb067 100644 (file)
@@ -13,18 +13,15 @@ import org.apache.log4j.Logger;
 import org.eclipse.jface.action.Action;\r
 import org.eclipse.jface.resource.ImageDescriptor;\r
 \r
-import eu.etaxonomy.cdm.model.name.BotanicalName;\r
 import eu.etaxonomy.cdm.model.name.NonViralName;\r
-import eu.etaxonomy.cdm.model.name.Rank;\r
-import eu.etaxonomy.cdm.model.name.ZoologicalName;\r
 import eu.etaxonomy.cdm.model.reference.ReferenceBase;\r
 import eu.etaxonomy.cdm.model.taxon.Taxon;\r
 import eu.etaxonomy.taxeditor.ITaxEditorConstants;\r
 import eu.etaxonomy.taxeditor.TaxEditorPlugin;\r
 import eu.etaxonomy.taxeditor.UiUtil;\r
+import eu.etaxonomy.taxeditor.model.CdmSessionDataRepository;\r
 import eu.etaxonomy.taxeditor.navigation.TaxonomicTreeViewer;\r
 import eu.etaxonomy.taxeditor.preference.PreferencesUtil;\r
-import eu.etaxonomy.taxeditor.propertysheet.PropertySourceAdapter;\r
 \r
 /**\r
  * Open up a celleditor in the taxonomic tree \r
@@ -64,7 +61,7 @@ public class AddQuickNameAction extends Action {
                quickNameTaxon = Taxon.NewInstance(name, sec);\r
                parentTaxon.addTaxonomicChild(quickNameTaxon, null, null);\r
                \r
-               TaxEditorPlugin.getDefault().addSessionTaxon(quickNameTaxon);\r
+               CdmSessionDataRepository.getDefault().addTaxon(quickNameTaxon);\r
                \r
                // ULTRA HACKY, ULTRA MYSTERIOUS - if this is not called, name created with quick name\r
                // then deleted in the same session causes error \r
index 9fb222bab02ec3397647b3630e535ddf18638552..cf47c1130d8ecf3f4caf5023a7529333c7f5e159 100644 (file)
@@ -27,6 +27,7 @@ import eu.etaxonomy.taxeditor.UiUtil;
 import eu.etaxonomy.taxeditor.actions.UndoableAction;\r
 import eu.etaxonomy.taxeditor.actions.cdm.SwapSynonymAndTaxonAction;\r
 import eu.etaxonomy.taxeditor.editor.name.NameComposite;\r
+import eu.etaxonomy.taxeditor.model.CdmSessionDataRepository;\r
 \r
 /**\r
  * @author p.ciardelli\r
@@ -73,10 +74,10 @@ public class ChangeSynonymToTaxonUiAction extends UndoableAction {
                                                }\r
 \r
                                                // Remove old taxon from tree\r
-                                               TaxEditorPlugin.getDefault().removeSessionTaxon(taxon);\r
+                                               CdmSessionDataRepository.getDefault().removeTaxon(taxon);\r
 \r
                                                // Add new taxon to tree\r
-                                               TaxEditorPlugin.getDefault().addSessionTaxon(newTaxon);\r
+                                               CdmSessionDataRepository.getDefault().addTaxon(newTaxon);\r
 \r
                                                // Open editor for new taxon\r
                                                new OpenTaxonEditorAction(newTaxon).run();\r
index d2e2bde317898426ecb96f5fd5d0fd760c1365b1..6779086dcb4d84d14989885b9f8bb3c9ed8f5265 100644 (file)
@@ -10,6 +10,7 @@
 package eu.etaxonomy.taxeditor.actions.ui;\r
 \r
 import org.apache.log4j.Logger;\r
+import org.eclipse.core.databinding.observable.set.IObservableSet;\r
 import org.eclipse.jface.action.Action;\r
 import org.eclipse.jface.dialogs.MessageDialog;\r
 import org.eclipse.jface.resource.ImageDescriptor;\r
@@ -30,6 +31,7 @@ import eu.etaxonomy.taxeditor.UiUtil;
 import eu.etaxonomy.taxeditor.actions.cdm.SaveTaxonAction;\r
 import eu.etaxonomy.taxeditor.editor.SelectTaxonDialog;\r
 import eu.etaxonomy.taxeditor.editor.name.IterableSynonymyList;\r
+import eu.etaxonomy.taxeditor.model.CdmSessionDataRepository;\r
 import eu.etaxonomy.taxeditor.model.CdmUtil;\r
 \r
 /**\r
@@ -124,9 +126,9 @@ public class ChangeTaxonToSynonymAction extends Action {
                        TaxEditorPlugin.getDefault().getObservableRecentNamesList().\r
                                        remove(oldTaxon);\r
 //             }\r
-                       \r
-               TaxEditorPlugin.getDefault().removeSessionTaxon(oldTaxon);      \r
                \r
+               CdmSessionDataRepository.getDefault().removeTaxon(oldTaxon);    \r
+                               \r
                // Close open editor for oldTaxon without forcing save.\r
                // User has already saved or declined to do so above.\r
                try {\r
index cb75e77a536c426f13ae7a5ef1760b3a0907ab61..675a73807b477fa636e9e1fe7e5172300c090e6b 100644 (file)
@@ -43,6 +43,7 @@ import org.eclipse.swt.widgets.Table;
 import org.eclipse.swt.widgets.Text;\r
 \r
 import eu.etaxonomy.cdm.common.CdmUtils;\r
+import eu.etaxonomy.cdm.database.CdmDataSource;\r
 import eu.etaxonomy.cdm.database.CdmPersistentDataSource;\r
 import eu.etaxonomy.cdm.database.DatabaseTypeEnum;\r
 import eu.etaxonomy.cdm.database.ICdmDataSource;\r
@@ -57,7 +58,6 @@ import eu.etaxonomy.taxeditor.UiUtil;
 public class CdmDataSourceDialog extends Dialog {\r
        private static final Logger logger = Logger.getLogger(CdmDataSourceDialog.class);\r
        \r
-       private Text databaseText;\r
        private Text portText;\r
        private Text serverText;\r
        private Text passwordText;\r
@@ -78,7 +78,6 @@ public class CdmDataSourceDialog extends Dialog {
 \r
        private TableViewer dataSourceViewer;\r
 \r
-       \r
        /**\r
         * Create the dialog\r
         * @param parentShell\r
@@ -354,12 +353,12 @@ public class CdmDataSourceDialog extends Dialog {
                passwordText = new Text(authenticationGroup, SWT.BORDER);\r
                passwordText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));\r
 \r
-               // Create save password label\r
-               Label savePasswordLabel = new Label(authenticationGroup, SWT.NONE);\r
-               savePasswordLabel.setText("Save password:");\r
-\r
-               // Create save password checkbox\r
-               Button button = new Button(authenticationGroup, SWT.CHECK);\r
+//             // Create save password label\r
+//             Label savePasswordLabel = new Label(authenticationGroup, SWT.NONE);\r
+//             savePasswordLabel.setText("Save password:");\r
+//\r
+//             // Create save password checkbox\r
+//             Button button = new Button(authenticationGroup, SWT.CHECK);\r
 \r
                // Create group composite for location data \r
                locationGroup = new Group(dbConfigComposite, SWT.NONE);\r
@@ -385,9 +384,28 @@ public class CdmDataSourceDialog extends Dialog {
                portText = new Text(locationGroup, SWT.BORDER);\r
                portText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));\r
 \r
+               // Create composite for buttons\r
+               Composite buttonComposite = new Composite(dbConfigComposite, SWT.NONE);\r
+               buttonComposite.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, true, false));\r
+               GridLayout buttonLayout = new GridLayout();\r
+               buttonLayout.numColumns = 2;\r
+               buttonComposite.setLayout(buttonLayout);\r
+               \r
+               // Create test connection button\r
+               Button testButton = new Button(buttonComposite, SWT.NONE);\r
+               testButton.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false));\r
+               testButton.setText("Test connection");\r
+               \r
+               // Test connection when button is pressed\r
+               testButton.addMouseListener(new MouseAdapter() {\r
+                       public void mouseUp(MouseEvent e) {\r
+                               testDbConfig();\r
+                       }\r
+               });\r
+               \r
                // Create save button\r
-               saveButton = new Button(dbConfigComposite, SWT.NONE);\r
-               final GridData saveButtonLayout = new GridData(SWT.RIGHT, SWT.CENTER, false, false);\r
+               saveButton = new Button(buttonComposite, SWT.NONE);\r
+               GridData saveButtonLayout = new GridData(SWT.RIGHT, SWT.CENTER, false, false);\r
                saveButtonLayout.widthHint = 76;\r
                saveButton.setLayoutData(saveButtonLayout);\r
                saveButton.setText("Save");\r
@@ -398,11 +416,12 @@ public class CdmDataSourceDialog extends Dialog {
                                saveDbConfig();\r
                        }\r
                });\r
-               \r
+                               \r
                // Populate fields with datasource data\r
                if (dataSource != null) {\r
                        databaseNameText.setText(CdmUtils.Nz(dataSource.getDatabase()));\r
-//                     passwordText.setText(dataSource.getP);\r
+                       passwordText.setText(CdmUtils.Nz(dataSource.getPassword()));\r
+                       usernameText.setText(CdmUtils.Nz(dataSource.getUserName()));\r
                        serverText.setText(CdmUtils.Nz(dataSource.getServer()));\r
                        portText.setText(String.valueOf(dataSource.getPort()));                 \r
                }\r
@@ -410,7 +429,20 @@ public class CdmDataSourceDialog extends Dialog {
                // Redraw\r
                container.layout(true, true);\r
        }\r
-       \r
+\r
+       private void testDbConfig() {\r
+               ICdmDataSource dataSource = CdmDataSource.NewMySqlInstance(\r
+                               serverText.getText(),\r
+                               databaseNameText.getText(), \r
+                               Integer.valueOf(portText.getText()), \r
+                               usernameText.getText(), \r
+                               passwordText.getText());\r
+               if (dataSource.testConnection()) {\r
+                       MessageDialog.openConfirm(UiUtil.getShell(), "Test successful", "Test successful");\r
+               } else {\r
+                       MessageDialog.openWarning(UiUtil.getShell(), "Test unsuccessful", "Test unsuccessful");                 \r
+               }\r
+       }\r
 \r
        private void saveDbConfig() {\r
                \r
index f8245bf75f4d73172d47a0f096ec0e07e1e23809..c09726f450b4483d4706b2734fb70cf57e7ba7b5 100644 (file)
@@ -26,6 +26,7 @@ import eu.etaxonomy.cdm.database.ICdmDataSource;
 import eu.etaxonomy.cdm.model.common.init.TermNotFoundException;\r
 import eu.etaxonomy.taxeditor.TaxEditorPlugin;\r
 import eu.etaxonomy.taxeditor.UiUtil;\r
+import eu.etaxonomy.taxeditor.model.CdmSessionDataRepository;\r
 import eu.etaxonomy.taxeditor.model.CdmUtil;\r
 \r
 public class CdmDataSourceRepository implements ICdmDataSourceRepository {\r
@@ -150,7 +151,7 @@ public class CdmDataSourceRepository implements ICdmDataSourceRepository {
                                        monitor.beginTask("Changing to a new datasource ...", 25);\r
                                \r
                                        // Clear all session variables\r
-                                       CdmUtil.clearLibraryObjects();\r
+                                       CdmUtil.clearNonTaxonData();\r
                                        monitor.worked(1);\r
                                        \r
                                        // Clear session taxa\r
@@ -173,7 +174,11 @@ public class CdmDataSourceRepository implements ICdmDataSourceRepository {
                                        monitor.worked(1);\r
                                                                                \r
                                        // Get session root taxa\r
-                                       UiUtil.getTreeViewer().setInput(TaxEditorPlugin.getDefault().getSessionRootTaxa());\r
+                                       // TODO get listener in tree content provider to take care of this\r
+                                       UiUtil.getTreeViewer().setInput(\r
+                                                       CdmSessionDataRepository.getDefault().getRootTaxa());\r
+//                                     CdmSessionDataRepository.getDefault().getRootTaxa();\r
+                                                       \r
                                        monitor.worked(11);\r
                                                                                \r
                                        monitor.done();\r
index ff26ca1b6139771b7fe38f401c00b4d459da955e..25eee59905a93f290e5e19323dfe791f5fc2e358 100644 (file)
@@ -17,6 +17,9 @@ import org.springframework.transaction.TransactionStatus;
 \r
 import eu.etaxonomy.cdm.api.application.CdmApplicationController;\r
 import eu.etaxonomy.cdm.model.name.NomenclaturalStatusType;\r
+import eu.etaxonomy.cdm.model.taxon.Taxon;\r
+import eu.etaxonomy.taxeditor.model.CdmSessionDataRepository;\r
+import eu.etaxonomy.taxeditor.model.CdmUtil;\r
 \r
 /**\r
  * @author p.ciardelli\r
@@ -27,7 +30,7 @@ public class CdmTransactionController {
        private static final Logger logger = Logger\r
                        .getLogger(CdmTransactionController.class);\r
        \r
-       private static CdmApplicationController cdmAppController;\r
+       private static CdmApplicationController applicationController;\r
        private static TransactionStatus txStatus;\r
        private CdmTransactionController controller;\r
                \r
@@ -60,7 +63,7 @@ public class CdmTransactionController {
                list.add(NomenclaturalStatusType.COMBINATION_INVALID());\r
                list.add(NomenclaturalStatusType.VALID());\r
                for (NomenclaturalStatusType status : list){\r
-                       cdmAppController.getTermService().saveTerm(status);\r
+                       applicationController.getTermService().saveTerm(status);\r
                }\r
        }\r
 \r
@@ -75,16 +78,25 @@ public class CdmTransactionController {
                txStatus = null;\r
        }\r
        \r
-       public static void setCdmApplicationController(CdmApplicationController cdmAppController) {\r
-               CdmTransactionController.cdmAppController = cdmAppController;\r
+       public static void setApplicationController(CdmApplicationController applicationController) {\r
+               CdmTransactionController.applicationController = applicationController;\r
        }\r
        \r
        private static CdmApplicationController getCdmAppController() {\r
                \r
                // Make sure the app controller has been set\r
-               if (cdmAppController == null) {\r
+               if (applicationController == null) {\r
                        throw new IllegalStateException("CdmApplicationController not yet set.");\r
                }\r
-               return cdmAppController;\r
+               return applicationController;\r
+       }\r
+\r
+       public static void addTaxonToTransaction(Taxon taxon) {\r
+               CdmUtil.getTaxonService().saveTaxon(taxon);\r
+       }\r
+       \r
+       public static void addSessionDataToTransaction() {\r
+               CdmUtil.getTaxonService().saveTaxonAll(\r
+                               CdmSessionDataRepository.getDefault().getAllTaxa());\r
        }\r
 }\r
index 2773e604312fddac0871b6347144a220337aa84b..306302ef474aaa35f7df84c4dd1bf81fb9739d82 100644 (file)
@@ -107,6 +107,19 @@ public class RegisterDatabaseDialog extends TitleAreaDialog {
                final GridData gd_txtPort = new GridData(SWT.FILL, SWT.CENTER, true, false);\r
                txtPort.setLayoutData(gd_txtPort);\r
 \r
+               final Composite composite = new Composite(rightPanel, SWT.NONE);\r
+               composite.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false));\r
+               final GridLayout gridLayout_3 = new GridLayout();\r
+               gridLayout_3.numColumns = 2;\r
+               composite.setLayout(gridLayout_3);\r
+\r
+               final Button button = new Button(composite, SWT.NONE);\r
+               button.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false));\r
+               button.setText("button1");\r
+\r
+               final Button button_1 = new Button(composite, SWT.NONE);\r
+               button_1.setText("button2");\r
+\r
                final Button btnTestConnection = new Button(rightPanel, SWT.NONE);\r
                final GridData gd_btnTestConnection = new GridData(SWT.FILL, SWT.CENTER, true, false);\r
                btnTestConnection.setLayoutData(gd_btnTestConnection);\r
diff --git a/eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/editor/IDataDisposer.java b/eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/editor/IDataDisposer.java
deleted file mode 100644 (file)
index 1f61953..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-package eu.etaxonomy.taxeditor.editor;\r
-\r
-public interface IDataDisposer {\r
-       public void disposeData();\r
-}\r
diff --git a/eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/editor/IParserFeedback.java b/eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/editor/IParserFeedback.java
deleted file mode 100644 (file)
index afdc18a..0000000
+++ /dev/null
@@ -1,42 +0,0 @@
-/**\r
-* Copyright (C) 2007 EDIT\r
-* European Distributed Institute of Taxonomy \r
-* http://www.e-taxonomy.eu\r
-* \r
-* The contents of this file are subject to the Mozilla Public License Version 1.1\r
-* See LICENSE.TXT at the top of this package for the full license terms.\r
-*/\r
-package eu.etaxonomy.taxeditor.editor;\r
-\r
-import org.eclipse.jface.text.IDocumentPartitioner;\r
-\r
-/**\r
- * @author p.ciardelli\r
- * @created 18.08.2008\r
- * @version 1.0\r
- */\r
-public interface IParserFeedback extends IDocumentPartitioner {\r
-       \r
-       /**\r
-        * Returns the name of the data field where the cursor\r
-        * is.\r
-        * \r
-        * Necessary for autocomplete.\r
-        * \r
-        * TODO is there some kind of reflection that would allow\r
-        * us to return something besides a String?\r
-        * \r
-        * @return\r
-        */\r
-//     public String getCursorInFieldName ();\r
-       \r
-       /**\r
-        * Returns an array of position objects, i.e. from "x to y, it's Name.Genus".\r
-        * \r
-        * Could be used for formatting - bold, italic, different font size, etc.\r
-        * \r
-        * @return\r
-        */\r
-//     public String getFieldPositions();\r
-       \r
-}\r
index 00c968aa292b6ee55d5560b85cae775bef9cc189..d53b28552f4d26fb67c25ce03dff9e5ba3051aa2 100644 (file)
@@ -49,6 +49,7 @@ import eu.etaxonomy.cdm.model.name.TaxonNameBase;
 import eu.etaxonomy.cdm.model.taxon.Taxon;\r
 import eu.etaxonomy.taxeditor.ITaxEditorConstants;\r
 import eu.etaxonomy.taxeditor.TaxEditorPlugin;\r
+import eu.etaxonomy.taxeditor.model.CdmSessionDataRepository;\r
 import eu.etaxonomy.taxeditor.model.CdmUtil;\r
 import eu.etaxonomy.taxeditor.navigation.RecentNamesTableViewer;\r
 import eu.etaxonomy.taxeditor.navigation.TaxonomicTreeLabelProvider;\r
@@ -152,8 +153,8 @@ public class SelectTaxonDialog extends Dialog {
 \r
                treeViewer = new TaxonomicTreeViewer(taxTreeComposite);\r
 \r
-               IObservableSet observableTaxonSet = TaxEditorPlugin.getDefault()\r
-                               .getObservableSessionTaxa();\r
+               IObservableSet observableTaxonSet = \r
+                               CdmSessionDataRepository.getDefault().getObservableTaxa();\r
                treeViewer.setLabelProvider(new TaxonomicTreeLabelProvider(\r
                                observableTaxonSet) {\r
 \r
diff --git a/eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/model/CdmSessionDataRepository.java b/eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/model/CdmSessionDataRepository.java
new file mode 100644 (file)
index 0000000..31da025
--- /dev/null
@@ -0,0 +1,357 @@
+/**\r
+* Copyright (C) 2007 EDIT\r
+* European Distributed Institute of Taxonomy \r
+* http://www.e-taxonomy.eu\r
+* \r
+* The contents of this file are subject to the Mozilla Public License Version 1.1\r
+* See LICENSE.TXT at the top of this package for the full license terms.\r
+*/\r
+\r
+package eu.etaxonomy.taxeditor.model;\r
+\r
+import java.util.ArrayList;\r
+import java.util.Collection;\r
+import java.util.HashMap;\r
+import java.util.HashSet;\r
+import java.util.List;\r
+import java.util.Map;\r
+import java.util.Set;\r
+import java.util.UUID;\r
+\r
+import org.apache.log4j.Logger;\r
+import org.eclipse.core.databinding.observable.Realm;\r
+import org.eclipse.core.databinding.observable.set.IObservableSet;\r
+import org.eclipse.core.databinding.observable.set.ISetChangeListener;\r
+import org.eclipse.core.databinding.observable.set.SetChangeEvent;\r
+import org.eclipse.core.databinding.observable.set.WritableSet;\r
+import org.eclipse.jface.databinding.swt.SWTObservables;\r
+import org.eclipse.swt.widgets.Display;\r
+\r
+import eu.etaxonomy.cdm.api.application.CdmApplicationController;\r
+import eu.etaxonomy.cdm.model.reference.ReferenceBase;\r
+import eu.etaxonomy.cdm.model.taxon.Taxon;\r
+import eu.etaxonomy.taxeditor.TaxEditorPlugin;\r
+import eu.etaxonomy.taxeditor.datasource.CdmTransactionController;\r
+\r
+/**\r
+ * @author p.ciardelli\r
+ * @created 17.12.2008\r
+ * @version 1.0\r
+ */\r
+public class CdmSessionDataRepository implements ICdmSessionDataRepository {\r
+       private static final Logger logger = Logger\r
+                       .getLogger(CdmSessionDataRepository.class);\r
+\r
+       /**\r
+        * This map of taxa to their taxonomic children is used by\r
+        * NameTreeContentProvider's getChildren method.\r
+        * \r
+        * key = taxon, value = key's child taxa Note that a map can have a key ==\r
+        * null, i.e. no parent taxon\r
+        */\r
+       private HashMap<Taxon, Set<Taxon>> taxonomicChildrenMap;\r
+       \r
+       private static ICdmSessionDataRepository repository;\r
+\r
+       private CdmApplicationController applicationController;\r
+\r
+       private IObservableSet observableTaxonSet;\r
+\r
+       private List<ICdmTaxonSetListener> listeners;\r
+\r
+       public static ICdmSessionDataRepository getDefault() {\r
+               \r
+               if (repository == null) {\r
+                       repository = new CdmSessionDataRepository();\r
+               }\r
+               \r
+               \r
+               return repository;\r
+       }\r
+       \r
+       private CdmSessionDataRepository() {\r
+               getObservableTaxa().addSetChangeListener(new observableTaxaListener());\r
+       }\r
+       \r
+       @Override\r
+       public void clearAllData() {\r
+               // TODO Auto-generated method stub\r
+               \r
+       }\r
+\r
+       @Override\r
+       public void clearTaxonData() {\r
+               // TODO Auto-generated method stub\r
+               \r
+       }\r
+\r
+       @Override\r
+       public void clearNonTaxonData() {\r
+               // TODO Auto-generated method stub\r
+               \r
+       }\r
+\r
+       @Override\r
+       public void setApplicationController(CdmApplicationController applicationController) {\r
+               this.applicationController = applicationController;\r
+       }\r
+\r
+       private Map<Taxon, Set<Taxon>> getTaxonomicChildrenMap() {\r
+               if (taxonomicChildrenMap == null) {\r
+                       taxonomicChildrenMap = new HashMap<Taxon, Set<Taxon>>();\r
+               }\r
+               return taxonomicChildrenMap;\r
+       }\r
+       \r
+       private CdmApplicationController getApplicationController() {\r
+               // Make sure the app controller has been set\r
+               if (applicationController == null) {\r
+                       throw new IllegalStateException("CdmApplicationController not yet set.");\r
+               }\r
+               return applicationController;\r
+       }\r
+\r
+       @Override\r
+       public ReferenceBase getDefaultSec() {\r
+               return getApplicationController().getReferenceService().getReferenceByUuid(\r
+                               UUID.fromString("f3593c18-a8d2-4e51-bdad-0befbf8fb2d1"));\r
+       }\r
+\r
+       @Override\r
+       public Set<Taxon> getRootTaxa() {\r
+               return getTaxonomicChildren(null);\r
+       }\r
+       \r
+       @Override\r
+       public Set<Taxon> getTaxonomicChildren(Taxon parentTaxon) {\r
+                               \r
+               // Check whether the map contains children for parentTaxon\r
+               if (!getTaxonomicChildrenMap().containsKey(parentTaxon)) {\r
+                       \r
+                       // Make a new child taxa set to ensure deleted taxa\r
+                       //      don't re-appear as NULL children\r
+                       Set<Taxon> childTaxa = new HashSet<Taxon>();\r
+                               \r
+                       // Root taxa have parentTaxon = NULL\r
+                       if (parentTaxon == null) {\r
+                               \r
+                               // Get root taxa from data source\r
+                               boolean onlyWithChildren = false;\r
+                               boolean withMisapplications = true;\r
+                               childTaxa.addAll(getApplicationController().getTaxonService().getRootTaxa(\r
+                                       getDefaultSec(), onlyWithChildren, withMisapplications));\r
+                               \r
+                       } else {\r
+                               \r
+                               // Get children from taxon\r
+                               childTaxa.addAll(parentTaxon.getTaxonomicChildren());\r
+                       }\r
+                       \r
+                       // Iterate through all child taxa, throwing out NULLs and saving the rest to internal collections\r
+                       Set<Taxon> nullTaxa = new HashSet<Taxon>();\r
+                       for (Taxon taxon : childTaxa) {\r
+                               \r
+                               // Some imports resulted in NULL child taxa\r
+                               if (taxon == null) {\r
+                                       if (parentTaxon == null) {\r
+                                               logger.warn("NULL taxon in root taxa.");\r
+                                       } else {\r
+                                               logger.warn("Taxon " + parentTaxon.toString() + " has a NULL child taxon.");\r
+                                       }\r
+                                       nullTaxa.add(taxon);\r
+                               } else {\r
+                                       \r
+                                       // Add the taxon to internal collections\r
+                                       addTaxonIntern(taxon);\r
+                               }\r
+                       }\r
+                       childTaxa.removeAll(nullTaxa);\r
+                                                       \r
+                       // Put the new set in the parent-children map\r
+                       getTaxonomicChildrenMap().put(parentTaxon, childTaxa);\r
+               }\r
+               return getTaxonomicChildrenMap().get(parentTaxon);\r
+       }\r
+       \r
+       private void addTaxonIntern(Taxon taxon) {\r
+                               \r
+               // Add it to the transaction\r
+               CdmTransactionController.addTaxonToTransaction(taxon);\r
+\r
+               // Remove then re-add session taxon\r
+               getObservableTaxa().add(taxon);\r
+       }\r
+       \r
+       @Override\r
+       public void addTaxon(Taxon taxon) {\r
+               \r
+               // Add taxon to its parent's child map\r
+               Taxon parentTaxon = taxon.getTaxonomicParent();\r
+               getTaxonomicChildren(parentTaxon).add(taxon);\r
+               \r
+               // Add taxon to internal collections\r
+               addTaxonIntern(taxon);\r
+       }\r
+\r
+       @Override\r
+       public IObservableSet getObservableTaxa() {\r
+               if (observableTaxonSet == null) {\r
+                       Realm realm = SWTObservables.getRealm(Display.getDefault());\r
+                       observableTaxonSet = new WritableSet(realm);\r
+               }\r
+               return observableTaxonSet;\r
+       }\r
+\r
+       @Override\r
+       public boolean deleteTaxon(Taxon taxon) {\r
+               \r
+               // Remove taxon from repository collections\r
+               removeTaxon(taxon);\r
+               \r
+               // If taxon has been saved before, delete it from the data source\r
+               if (isInPersistentDataSource(taxon)) {\r
+                       getApplicationController().getTaxonService().removeTaxon(taxon);\r
+               }\r
+               \r
+               // If parent taxon has been saved before, save it to reflect loss of child\r
+               Taxon parentTaxon = taxon.getTaxonomicParent();\r
+               if (parentTaxon != null && isInPersistentDataSource(parentTaxon)) {\r
+                       getApplicationController().getTaxonService().saveTaxon(parentTaxon);\r
+               }\r
+               \r
+               return true;\r
+       }\r
+       \r
+       private boolean isInPersistentDataSource(Taxon taxon) {\r
+               UUID taxonUuid = taxon.getUuid();\r
+               if (getApplicationController().getTaxonService()\r
+                               .getTaxonByUuid(taxonUuid) != null) {\r
+                       return true;\r
+               } else {\r
+                       return false;\r
+               }\r
+       }\r
+\r
+       @Override\r
+       public void removeTaxon(Taxon taxon) {\r
+\r
+               // Remove from session taxa\r
+               getObservableTaxa().remove(taxon);\r
+               \r
+               // Recursively remove all children, children's children, etc.\r
+               clearTaxonomicChildren(taxon);\r
+\r
+               // Remove from parent and from parent's child map\r
+               Taxon parentTaxon = taxon.getTaxonomicParent();\r
+               if (parentTaxon != null) {\r
+                       removeTaxonomicChild(taxon, parentTaxon);\r
+               }\r
+               \r
+               // Remove from recent names list\r
+               TaxEditorPlugin.getDefault().\r
+                               getObservableRecentNamesList().remove(taxon);\r
+       }\r
+       \r
+       private void removeTaxonomicChild(Taxon taxon, Taxon parentTaxon) {\r
+               parentTaxon.removeTaxonomicChild(taxon);\r
+               getTaxonomicChildren(parentTaxon).remove(taxon);\r
+       }\r
+\r
+       private void clearTaxonomicChildren(Taxon taxon) {\r
+               Set<Taxon> children = getTaxonomicChildren(taxon);\r
+               if (children != null) {\r
+                       for (Taxon child : children) {\r
+                               clearTaxonomicChildren(child);\r
+                       }\r
+                       getTaxonomicChildrenMap().remove(taxon);\r
+                       getObservableTaxa().removeAll(children);\r
+               }\r
+       }\r
+\r
+       @Override\r
+       public Collection<Taxon> getAllTaxa() {\r
+               return getObservableTaxa();\r
+       }\r
+       \r
+       @Override\r
+       public void removeAllTaxa() {\r
+               taxonomicChildrenMap.clear();\r
+               observableTaxonSet.clear();\r
+       }\r
+\r
+\r
+       @Override\r
+       public boolean saveTaxon(Taxon taxon) {\r
+               \r
+               // If this is not in the list of observable taxa, add\r
+               if (!isInRepository(taxon)) {\r
+                       addTaxon(taxon);\r
+               }\r
+               \r
+               // Save taxon to CDM layer\r
+               CdmUtil.getTaxonService().saveTaxon(taxon);\r
+               \r
+               // Notify taxon listeners in case name has been updated - \r
+               //      updates editor view tab and recent names\r
+               taxon.firePropertyChange("name", null, null);\r
+               \r
+               return true;\r
+       }\r
+       \r
+       private boolean isInRepository(Taxon taxon) {\r
+               return observableTaxonSet.contains(taxon);\r
+       }\r
+\r
+       @Override\r
+       public void setTaxonomicParent(Taxon taxon, Taxon newParentTaxon) {\r
+               \r
+               // Get old taxonomic parent\r
+               Taxon oldParentTaxon = taxon.getTaxonomicParent();\r
+               \r
+               // Set new taxonomic parent\r
+               taxon.setTaxonomicParent(newParentTaxon, null, null);\r
+               \r
+               // Update child taxa collection         \r
+               getTaxonomicChildren(oldParentTaxon).remove(taxon);\r
+               getTaxonomicChildren(newParentTaxon).add(taxon);\r
+               \r
+               // Notify listeners that taxon has moved\r
+               if (listeners != null) {\r
+                       for (ICdmTaxonSetListener listener : listeners) {\r
+                               listener.taxonMoved(taxon, newParentTaxon);\r
+                       }\r
+               }\r
+       }\r
+       \r
+       @Override\r
+       public void addTaxonSetListener(ICdmTaxonSetListener listener) {\r
+               \r
+               if (listeners == null) { \r
+                       listeners = new ArrayList<ICdmTaxonSetListener>();\r
+               }\r
+               listeners.add(listener);\r
+       }\r
+       \r
+       class observableTaxaListener implements ISetChangeListener {\r
+               @Override\r
+               public void handleSetChange(SetChangeEvent event) {\r
+                       if (event.diff != null) {\r
+                               Set<Taxon> additions = event.diff.getAdditions();\r
+                               Set<Taxon> removals = event.diff.getRemovals();\r
+                               \r
+                               if (listeners != null) {\r
+                                       for (ICdmTaxonSetListener listener : listeners) {\r
+                                               \r
+                                               if (additions.size() > 0) {\r
+                                                       listener.taxaAdded(additions);\r
+                                               }\r
+                                               \r
+                                               if (removals.size() > 0) {\r
+                                                       listener.taxaRemoved(removals);\r
+                                               }\r
+                                       }\r
+                               }\r
+                       }\r
+               }               \r
+       }\r
+}\r
index 7cd1bc2c1a954c608c854e0dc47ca989d81584d4..243fbabfa84589493be35b6c028254db260b2f37 100644 (file)
@@ -17,6 +17,7 @@ import java.util.SortedSet;
 import org.apache.log4j.Logger;\r
 import org.eclipse.jface.dialogs.MessageDialog;\r
 \r
+import eu.etaxonomy.cdm.api.application.CdmApplicationController;\r
 import eu.etaxonomy.cdm.api.service.IDescriptionService;\r
 import eu.etaxonomy.cdm.api.service.INameService;\r
 import eu.etaxonomy.cdm.api.service.IReferenceService;\r
@@ -62,7 +63,7 @@ public class CdmUtil {
         * to force them to re-initialize the next time they\r
         * are called.\r
         */\r
-       public static void clearLibraryObjects() {\r
+       public static void clearNonTaxonData() {\r
                features = null;\r
                ranks = null;\r
                nonViralNameParser = null;\r
@@ -339,8 +340,7 @@ public class CdmUtil {
         * @return\r
         */\r
        public static ReferenceBase getSessionDefaultSec() {\r
-//             return null;\r
-               return TaxEditorPlugin.getDefault().getSessionDefaultSec();\r
+               return CdmSessionDataRepository.getDefault().getDefaultSec();\r
        }\r
 \r
        /**\r
@@ -369,20 +369,24 @@ public class CdmUtil {
                return resultsSet;\r
        }\r
        \r
+       private static CdmApplicationController getApplicationController() {\r
+               return TaxEditorPlugin.getDefault().getApplicationController();\r
+       }\r
+       \r
        public static INameService getNameService() {\r
-               return TaxEditorPlugin.getDefault().getNameService();\r
+               return getApplicationController().getNameService();\r
        }\r
        \r
        public static ITaxonService getTaxonService() {\r
-               return TaxEditorPlugin.getDefault().getTaxonService();\r
+               return getApplicationController().getTaxonService();\r
        }\r
 \r
        public static IDescriptionService getDescriptionService() {\r
-               return TaxEditorPlugin.getDefault().getDescriptionService();\r
+               return getApplicationController().getDescriptionService();\r
        }\r
 \r
        public static IReferenceService getReferenceService() {\r
-               return TaxEditorPlugin.getDefault().getReferenceService();\r
+               return getApplicationController().getReferenceService();\r
        }\r
        \r
        public static TermVocabulary<Feature> getFeatures() {\r
index 44237e9c14acc2c122b96dcb4c657efaf62991b2..1539492e71e586774e3b72b968b070bff82d2526 100644 (file)
@@ -9,13 +9,27 @@
 \r
 package eu.etaxonomy.taxeditor.model;\r
 \r
-import eu.etaxonomy.cdm.database.ICdmDataSource;\r
+import java.util.Collection;\r
+import java.util.Set;\r
+\r
+import org.eclipse.core.databinding.observable.set.IObservableSet;\r
+\r
+import eu.etaxonomy.cdm.api.application.CdmApplicationController;\r
+import eu.etaxonomy.cdm.model.reference.ReferenceBase;\r
+import eu.etaxonomy.cdm.model.taxon.Taxon;\r
 \r
 /**\r
  * All session data - taxa, term vocabularies, etc. - are stored in a\r
  * session data repository.\r
  * <p>\r
- * The repository contains a datasource used to retrieve data.\r
+ * The repository uses a CDM application controller to retrieve data.\r
+ * <p>\r
+ * Any method starting with "add" or "remove" deals with data solely in the session.\r
+ * For instance, <code>addTaxon(taxon)</code> will cause a new <code>taxon</code>\r
+ * to appear in the taxonomic tree, but will not save it to the CDM data source.\r
+ * <p>\r
+ * Any method starting with "save" or "delete" will call its corresponding "add"/"remove"\r
+ * method, and commit the change to the CDM data source.  \r
  * \r
  * @author p.ciardelli\r
  * @created 16.12.2008\r
@@ -23,13 +37,67 @@ import eu.etaxonomy.cdm.database.ICdmDataSource;
  */\r
 public interface ICdmSessionDataRepository {\r
 \r
-       public boolean setDataSource(ICdmDataSource dataSource);\r
+       /**\r
+        * Returns the root taxa associated with the current data source, and\r
+        * adds them to session data if not already there.\r
+        *  \r
+        * @return\r
+        */\r
+       public Set<Taxon> getRootTaxa();\r
+       \r
+       /**\r
+        * Returns all of a taxon's children, and adds them to session data\r
+        * if not already there.\r
+        *  \r
+        * @param parentTaxon\r
+        * @return\r
+        */\r
+       public Set<Taxon> getTaxonomicChildren(Taxon parentTaxon);\r
+       \r
+       /**\r
+        * Get the default sec. reference used by the current dataset\r
+        * @return\r
+        */\r
+       public ReferenceBase getDefaultSec();\r
+       \r
+       /**\r
+        * Adds a taxon to the repository.\r
+        * \r
+        * @param taxon\r
+        */\r
+       public void addTaxon(Taxon taxon);\r
+\r
+       /**\r
+        * Removes a taxon from the repository.\r
+        * \r
+        * @param taxon\r
+        */\r
+       public void removeTaxon(Taxon taxon);\r
+\r
+       /**\r
+        * Removes all taxa from the repository.\r
+        * replaces clearSessionTaxa\r
+        * \r
+        * @param taxon\r
+        */\r
+       public void removeAllTaxa();\r
+       \r
+       /**\r
+        * This is a set that can be used to be notified when there are changes\r
+        * to the list of all taxa, or to their names, for instance, when the name\r
+        * of a taxon displayed in a tree changes. \r
+        * \r
+        * @return\r
+        */\r
+       public IObservableSet getObservableTaxa();\r
+       \r
+       public void setApplicationController(CdmApplicationController applicationController);\r
        \r
        /**\r
         * Sets all term vocabularies to NULL to be regenerated the next time\r
         * they are needed, i.e. when a new transaction is opened.\r
         */\r
-       public void clearTermVocabularies();\r
+       public void clearNonTaxonData();\r
 \r
        /**\r
         * Sets all taxon collections to NULL to be regenerated the next time\r
@@ -39,4 +107,13 @@ public interface ICdmSessionDataRepository {
        \r
        public void clearAllData();\r
        \r
+       public void addTaxonSetListener(ICdmTaxonSetListener listener);\r
+\r
+       public Collection<Taxon> getAllTaxa();  \r
+       \r
+       public boolean saveTaxon(Taxon taxon);\r
+       \r
+       public boolean deleteTaxon(Taxon taxon);\r
+\r
+       public void setTaxonomicParent(Taxon taxon, Taxon newParentTaxon);\r
 }\r
diff --git a/eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/model/ICdmTaxonSetListener.java b/eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/model/ICdmTaxonSetListener.java
new file mode 100644 (file)
index 0000000..147027b
--- /dev/null
@@ -0,0 +1,30 @@
+/**\r
+* Copyright (C) 2007 EDIT\r
+* European Distributed Institute of Taxonomy \r
+* http://www.e-taxonomy.eu\r
+* \r
+* The contents of this file are subject to the Mozilla Public License Version 1.1\r
+* See LICENSE.TXT at the top of this package for the full license terms.\r
+*/\r
+\r
+package eu.etaxonomy.taxeditor.model;\r
+\r
+import java.util.Set;\r
+\r
+import eu.etaxonomy.cdm.model.taxon.Taxon;\r
+\r
+\r
+/**\r
+ * @author p.ciardelli\r
+ * @created 18.12.2008\r
+ * @version 1.0\r
+ */\r
+public interface ICdmTaxonSetListener {\r
+\r
+       public void taxaAdded(Set<Taxon> taxa);\r
+       \r
+       public void taxaRemoved(Set<Taxon> taxa);\r
+       \r
+       public void taxonMoved(Taxon taxon, Taxon newParentTaxon);\r
+       \r
+}\r
index 497d88408dd4e6286043a5e9128d795048a217b5..713d5966f2a16920004247b1e1ef28c232f82549 100644 (file)
@@ -14,11 +14,11 @@ import java.util.List;
 import java.util.Set;\r
 \r
 import org.apache.log4j.Logger;\r
+import org.eclipse.core.runtime.Assert;\r
 import org.eclipse.jface.viewers.ITreeContentProvider;\r
 import org.eclipse.jface.viewers.Viewer;\r
 \r
 import eu.etaxonomy.cdm.model.taxon.Taxon;\r
-import eu.etaxonomy.taxeditor.TaxEditorPlugin;\r
 \r
 /**\r
  * @author p.ciardelli\r
@@ -36,31 +36,30 @@ public class TaxonomicTreeContentProvider implements ITreeContentProvider {
         */\r
        public Object[] getChildren(Object parentElement) {\r
                \r
+               String errorMessage = "getChildren(parentElement) called with non-Taxon element.";\r
+               \r
+               // Make sure we are dealing with taxon objects\r
+               Assert.isTrue(\r
+                               parentElement instanceof Taxon || parentElement instanceof Collection,\r
+                               errorMessage);\r
+               \r
+               // Return children for a single taxon\r
                if (parentElement instanceof Taxon) {\r
                        return getTaxonChildren((Taxon) parentElement).toArray();\r
                }\r
-               \r
-               if (!(parentElement instanceof Collection)) {\r
-                       throw new IllegalArgumentException(\r
-                                       "getChildren() expects either a Collection or a Taxon object."); //$NON-NLS-1$  \r
-               }\r
-               \r
+\r
+               // Return children for a collection of taxa\r
                List<Taxon> children = new ArrayList<Taxon>();\r
                for (Object parent : (Collection) parentElement) {\r
-                       if (!(parent instanceof Taxon)) {\r
-                               throw new IllegalArgumentException(\r
-                                               "parentElement Collection can only contain Taxon objects."); //$NON-NLS-1$                              \r
-                       }\r
-                       \r
+\r
+                       Assert.isTrue(parent instanceof Taxon, errorMessage);\r
                        children.addAll(getTaxonChildren((Taxon) parent));\r
                }\r
                return children.toArray();\r
        }\r
 \r
-       public Set<Taxon> getTaxonChildren(Taxon parentTaxon) {\r
-\r
-               return TaxEditorPlugin.getDefault().getSessionTaxonomicChildren(\r
-                               parentTaxon);\r
+       private Set<Taxon> getTaxonChildren(Taxon parentTaxon) {\r
+               return CdmSessionDataRepository.getDefault().getTaxonomicChildren(parentTaxon);\r
        }\r
 \r
        /*\r
@@ -69,10 +68,10 @@ public class TaxonomicTreeContentProvider implements ITreeContentProvider {
         * @see org.eclipse.jface.viewers.ITreeContentProvider#getParent(java.lang.Object)\r
         */\r
        public Object getParent(Object element) {\r
-               if (!(element instanceof Taxon)) {\r
-                       throw new IllegalArgumentException(\r
-                                       "getParent() expects a Taxon object."); //$NON-NLS-1$                           \r
-               }\r
+               \r
+               Assert.isTrue(element instanceof Taxon, \r
+                               "getParent(element) called with non-Taxon element.");\r
+               \r
                return ((Taxon) element).getTaxonomicParent();\r
        }\r
 \r
@@ -82,12 +81,10 @@ public class TaxonomicTreeContentProvider implements ITreeContentProvider {
         * @see org.eclipse.jface.viewers.ITreeContentProvider#hasChildren(java.lang.Object)\r
         */\r
        public boolean hasChildren(Object element) {\r
-               if (!(element instanceof Taxon)) {\r
-                       throw new IllegalArgumentException(\r
-                                       "getParent() expects a Taxon object."); //$NON-NLS-1$                           \r
-               }\r
+               Assert.isTrue(element instanceof Taxon, \r
+                               "hasChildren(element) called with non-Taxon element.");\r
                \r
-               return getChildren(element).length > 0;\r
+               return ((Taxon) element).getTaxonomicChildrenCount() > 0;\r
        }\r
 \r
        /*\r
@@ -101,7 +98,11 @@ public class TaxonomicTreeContentProvider implements ITreeContentProvider {
                // CONFLICTING INFO ONLINE!!!\r
 //             return TaxEditorPlugin.getDefault().getObservableSessionTaxa().toArray();\r
                \r
-               return TaxEditorPlugin.getDefault().getSessionRootTaxa().toArray();\r
+               // Is this merely a method to convert elements into an array?\r
+               // OR should children be returned?\r
+               \r
+               return CdmSessionDataRepository.getDefault().getRootTaxa().toArray();\r
+//             return getChildren(inputElement);\r
        }\r
 \r
        /*\r
index 492af3e0b84dc89bb1d26cef6fae1617802ca108..9d88950402d9f10d39814818e50b580835d13e32 100644 (file)
@@ -44,6 +44,7 @@ import eu.etaxonomy.taxeditor.UiUtil;
 import eu.etaxonomy.taxeditor.actions.ui.OpenTaxonEditorAction;\r
 import eu.etaxonomy.taxeditor.datasource.CdmDataSourceDialog;\r
 import eu.etaxonomy.taxeditor.datasource.CdmDataSourceRepository;\r
+import eu.etaxonomy.taxeditor.model.CdmSessionDataRepository;\r
 \r
 /**\r
  * The panel containing the taxonomic tree.\r
@@ -125,7 +126,7 @@ public class TaxonomicTreeView extends ViewPart {
                taxTreeComposite.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE));\r
                \r
                // If there are no root taxa, provide a link to create this tree's initial root taxon\r
-               if (TaxEditorPlugin.getDefault().getSessionRootTaxa().size() == 0) {\r
+               if (CdmSessionDataRepository.getDefault().getRootTaxa().size() == 0) {\r
                        \r
                        hyperlinkForm = new ManagedForm(taxTreeComposite);\r
                        Composite linkBody = hyperlinkForm.getForm().getBody();\r
index b08a65fee70e94db5f01b86db98d9ded7e908a5a..e912226e4efa4246944076aa07df6bb655f50d64 100644 (file)
@@ -9,6 +9,8 @@
 \r
 package eu.etaxonomy.taxeditor.navigation;\r
 \r
+import java.util.Set;\r
+\r
 import org.apache.log4j.Logger;\r
 import org.eclipse.core.databinding.observable.set.IObservableSet;\r
 import org.eclipse.jface.action.Action;\r
@@ -23,10 +25,12 @@ import org.eclipse.jface.viewers.CellEditor;
 import org.eclipse.jface.viewers.DoubleClickEvent;\r
 import org.eclipse.jface.viewers.ICellEditorListener;\r
 import org.eclipse.jface.viewers.ICellModifier;\r
-import org.eclipse.jface.viewers.IContentProvider;\r
 import org.eclipse.jface.viewers.IDoubleClickListener;\r
+import org.eclipse.jface.viewers.ISelection;\r
+import org.eclipse.jface.viewers.ITreeContentProvider;\r
 import org.eclipse.jface.viewers.StructuredSelection;\r
 import org.eclipse.jface.viewers.TextCellEditor;\r
+import org.eclipse.jface.viewers.TreePath;\r
 import org.eclipse.jface.viewers.TreeSelection;\r
 import org.eclipse.jface.viewers.TreeViewer;\r
 import org.eclipse.jface.viewers.ViewerComparator;\r
@@ -58,7 +62,6 @@ import eu.etaxonomy.cdm.model.name.TaxonNameBase;
 import eu.etaxonomy.cdm.model.taxon.Taxon;\r
 import eu.etaxonomy.cdm.model.taxon.TaxonBase;\r
 import eu.etaxonomy.taxeditor.ITaxEditorConstants;\r
-import eu.etaxonomy.taxeditor.TaxEditorPlugin;\r
 import eu.etaxonomy.taxeditor.UiUtil;\r
 import eu.etaxonomy.taxeditor.actions.TaxonTransfer;\r
 import eu.etaxonomy.taxeditor.actions.cdm.DeleteTaxonAction;\r
@@ -69,7 +72,9 @@ import eu.etaxonomy.taxeditor.actions.ui.OpenNewChildNameEditorAction;
 import eu.etaxonomy.taxeditor.actions.ui.OpenTaxonEditorAction;\r
 import eu.etaxonomy.taxeditor.editor.ContextMenu;\r
 import eu.etaxonomy.taxeditor.editor.name.IterableSynonymyList;\r
+import eu.etaxonomy.taxeditor.model.CdmSessionDataRepository;\r
 import eu.etaxonomy.taxeditor.model.CdmUtil;\r
+import eu.etaxonomy.taxeditor.model.ICdmTaxonSetListener;\r
 import eu.etaxonomy.taxeditor.model.TaxonomicTreeContentProvider;\r
 \r
 /**\r
@@ -308,29 +313,79 @@ public class TaxonomicTreeViewer extends TreeViewer {
        private void createContent() {\r
                \r
                // Yet another custom content provider ...\r
-               IContentProvider viewerContentProviderList = new TaxonomicTreeContentProvider();\r
-               this.setContentProvider(viewerContentProviderList);\r
+               ITreeContentProvider viewerContentProviderList = new TaxonomicTreeContentProvider();\r
+               setContentProvider(viewerContentProviderList);\r
 \r
                // Label provider that listens for changes to name cache\r
-               IObservableSet observableTaxonSet = TaxEditorPlugin.getDefault()\r
-                               .getObservableSessionTaxa();\r
-               this.setLabelProvider(new TaxonomicTreeLabelProvider(\r
+               IObservableSet observableTaxonSet = \r
+                               CdmSessionDataRepository.getDefault().getObservableTaxa();\r
+               setLabelProvider(new TaxonomicTreeLabelProvider(\r
                                                observableTaxonSet));\r
 \r
                // TaxonTreeList added to every time a node is opened with its\r
                // children, or when a new taxon is added\r
-               this.setInput(TaxEditorPlugin.getDefault().getSessionRootTaxa());\r
-\r
+               setInput(CdmSessionDataRepository.getDefault().getRootTaxa());\r
+                               \r
                // Sort according to "getColumnText" above, i.e. by NameCache\r
-               this.setComparator(new ViewerComparator());\r
+               setComparator(new ViewerComparator());\r
+               \r
+               CdmSessionDataRepository.getDefault().\r
+                               addTaxonSetListener(new ICdmTaxonSetListener() {\r
+\r
+                       @Override\r
+                       public void taxaAdded(Set<Taxon> taxa) {\r
+                               Taxon lastTaxon = null;\r
+                               for (Taxon taxon : taxa) {\r
+                                       addTaxonToTree(taxon, taxon.getTaxonomicParent());\r
+                                       lastTaxon = taxon;\r
+                               }\r
+                       }\r
+\r
+                       @Override\r
+                       public void taxaRemoved(Set<Taxon> taxa) {\r
+                               for (Taxon taxon : taxa) {\r
+                                       remove(taxon);\r
+                               }\r
+                       }\r
+\r
+                       @Override\r
+                       public void taxonMoved(Taxon taxon, Taxon newParentTaxon) {\r
+                               \r
+                               // Save any selection and expansion info ...\r
+                               // NOTE: may be superfluous\r
+                               Object[] viewerExpandedElements = null;\r
+                               ISelection viewerSelection = null;\r
+                               viewerExpandedElements = getExpandedElements();\r
+                               viewerSelection = getSelection();\r
+                                                               \r
+                               remove(taxon);\r
+                               addTaxonToTree(taxon, newParentTaxon);\r
+                               \r
+                               // ... to restore after taxon has been removed then re-added\r
+                               setExpandedElements(viewerExpandedElements);\r
+                               setSelection(viewerSelection, true);\r
+                       }               \r
+               });\r
        }\r
 \r
+       private void addTaxonToTree(Taxon taxon, Taxon parentTaxon) {\r
+               if (parentTaxon == null) {\r
+                       add(TreePath.EMPTY, taxon);\r
+               } else {\r
+                       add(parentTaxon, taxon);\r
+               }\r
+               \r
+       }\r
+       \r
        /**\r
         * If taxon node in the tree is hidden, open and select it\r
         * \r
         * @param taxon\r
         */\r
        public void revealTaxon(Taxon taxon) {\r
+               if (taxon == null) {\r
+                       return;\r
+               }\r
                this.setSelection(new StructuredSelection(taxon), true);\r
                this.reveal(taxon);\r
        }\r