fixes #1343
authorn.hoffmann <n.hoffmann@localhost>
Tue, 5 Jan 2010 14:51:02 +0000 (14:51 +0000)
committern.hoffmann <n.hoffmann@localhost>
Tue, 5 Jan 2010 14:51:02 +0000 (14:51 +0000)
16 files changed:
.gitattributes
taxeditor-editor/plugin.xml
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/EditorUtil.java
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/IMultiPageTaxonEditorPage.java [new file with mode: 0644]
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/MultiPageTaxonEditor.java
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/MultiPageTaxonEditorDataChangeBehaviour.java
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/TaxonEditorInput.java
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/TaxonEditorInputDataChangeBehaviour.java [new file with mode: 0644]
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/WidgetTransfer.java
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/descriptiontree/TaxonDescriptionTreeEditor.java
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/TaxonNameEditor.java
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/handler/ChangeAcceptedTaxonToSynonymHandler.java
taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/io/wizard/JaxbExportWizard.java
taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/operations/AbstractPersistentPostOperation.java
taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/operations/ChangeAcceptedTaxonToSynonymOperation.java [new file with mode: 0644]
taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/operations/ChangeSynonymToAcceptedTaxonOperation.java

index 38b666721a454fed3601a36220d485a6cbc7b04c..318ff18d4b1c6fc8d9064c866f7c5170282d05ec 100644 (file)
@@ -735,6 +735,7 @@ taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/GroupCompositeLabel
 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/GroupedComposite.java -text
 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/IFreeTextElementFactory.java -text
 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/IHasPropertySource.java -text
+taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/IMultiPageTaxonEditorPage.java -text
 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/LineBreakListener.java -text
 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/LineWrapSquigglesStrategy.java -text
 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/LineWrapSupport.java -text
@@ -744,6 +745,7 @@ taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/MultiPageTaxonEdito
 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/Page.java -text
 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/SimpleSelectionProvider.java -text
 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/TaxonEditorInput.java -text
+taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/TaxonEditorInputDataChangeBehaviour.java -text
 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/TaxonEditorInputFactory.java -text
 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/ViewerConfiguration.java -text
 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/WidgetTransfer.java -text
@@ -1190,6 +1192,7 @@ taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/model/TimeHelper.java -text
 taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/operations/AbstractPersistentPostOperation.java -text
 taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/operations/AbstractPostOperation.java -text
 taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/operations/AddImageToDescriptionElementOperation.java -text
+taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/operations/ChangeAcceptedTaxonToSynonymOperation.java -text
 taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/operations/ChangeConceptRelationshipTypeOperation.java -text
 taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/operations/ChangeConceptToSynonymOperation.java -text
 taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/operations/ChangeHomotypicGroupOperation.java -text
index 7ddf5341db3dcce78cb321b2a41116ec69df671a..01f42dfcc6d6db665893b91b5e15001277382b67 100644 (file)
             id="eu.etaxonomy.taxeditor.editor.command.showPropertySheetView"
             name="Show Property Sheet">
       </command>
-      <command
-            defaultHandler="eu.etaxonomy.taxeditor.namerelationsview.ShowNameRelationsHandler"
-            id="eu.etaxonomy.taxeditor.editor.commands.showNameRelationsView"
-            name="Show Name Relations">
-      </command>
    </extension>
    <extension
          point="org.eclipse.ui.commands">
index e722b6235f703949ba30af222d47c5ffd77ca9fa..7221836b086a56693cec7c34890fe4fa557777b7 100644 (file)
@@ -24,6 +24,7 @@ import org.eclipse.ui.IPageLayout;
 import org.eclipse.ui.IViewPart;\r
 import org.eclipse.ui.PartInitException;\r
 \r
+import eu.etaxonomy.cdm.model.taxon.TaxonNode;\r
 import eu.etaxonomy.taxeditor.model.AbstractUtility;\r
 \r
 /**\r
@@ -82,7 +83,13 @@ public class EditorUtil extends AbstractUtility{
                IEditorInput input = TaxonEditorInput.NewInstance(taxonNodeUuid); \r
                return open(input, MultiPageTaxonEditor.ID);\r
        }\r
+       \r
 \r
+       public static IEditorPart findEditorByTaxonNodeUuid(UUID taxonNodeUuid){\r
+               IEditorInput input = TaxonEditorInput.NewInstance(taxonNodeUuid); \r
+               return getActivePage().findEditor(input);\r
+       }\r
+       \r
        /**\r
         * An uninitialized taxon is one that hasn't been saved yet. As such, it should appear in neither\r
         * the list of recent names nor in the taxonomic tree when opened.\r
diff --git a/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/IMultiPageTaxonEditorPage.java b/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/IMultiPageTaxonEditorPage.java
new file mode 100644 (file)
index 0000000..c8d9614
--- /dev/null
@@ -0,0 +1,42 @@
+// $Id$
+/**
+* Copyright (C) 2007 EDIT
+* European Distributed Institute of Taxonomy 
+* http://www.e-taxonomy.eu
+* 
+* The contents of this file are subject to the Mozilla Public License Version 1.1
+* See LICENSE.TXT at the top of this package for the full license terms.
+*/
+
+package eu.etaxonomy.taxeditor.editor;
+
+import org.eclipse.ui.IEditorPart;
+
+/**
+ * @author n.hoffmann
+ * @created Jan 5, 2010
+ * @version 1.0
+ */
+public interface IMultiPageTaxonEditorPage extends IEditorPart {
+
+       /**
+        * Redraws this editor
+        * return true on success
+        */
+       public boolean redraw();
+       
+       /**
+        * Redraws the editor controls
+        * 
+        * @param focus if set to true the focus is set on the editor
+        * @return true on success
+        */
+       public boolean redraw(boolean focus);
+       
+       /**
+        * Whether the editor page is currently redrawing
+        * 
+        * @return
+        */
+       public boolean isRedrawing();
+}
index 35208161f682716c39df43c35ad9cd62fffa59db..3726d75c34a8179e72fffc9b413915e6f85095c3 100644 (file)
@@ -308,15 +308,15 @@ public class MultiPageTaxonEditor extends FormEditor implements IConversationEna
        }\r
        \r
        /**\r
-        * Returns an <code>AbstractTaxonEditor</code> implementation by type\r
+        * Returns an <code>IEditorPart</code> implementation by type\r
         * \r
         * @param page the page type\r
         * @return\r
         */\r
-       public IEditorPart getPage(Page page){\r
+       public IMultiPageTaxonEditorPage getPage(Page page){\r
                for(IEditorPart editor : this.getPages()){\r
                        if(editor.getClass().equals(page.getClazz())){\r
-                               return editor;\r
+                               return (IMultiPageTaxonEditorPage) editor;\r
                        }\r
                }\r
                return null;\r
@@ -335,4 +335,27 @@ public class MultiPageTaxonEditor extends FormEditor implements IConversationEna
                }\r
                return editors;\r
        }\r
+       \r
+       /**\r
+        * Refreshes a certain page of the MultipageTaxonEditor\r
+        * \r
+        * @param page\r
+        * @return\r
+        */\r
+       public boolean redraw(Page page){\r
+               return redraw(page, true);\r
+       }\r
+       \r
+       /**\r
+        * Refreshes a certain page of the MultipageTaxonEditor and\r
+        * sets focus to that page\r
+        * \r
+        * @param page\r
+        * @param focus\r
+        * @return\r
+        */\r
+       public boolean redraw(Page page, boolean focus){\r
+               IMultiPageTaxonEditorPage editorPage = getPage(page);\r
+               return editorPage != null && editorPage.redraw(focus);\r
+       }\r
 }
\ No newline at end of file
index 866d3cb5197493b992d4f794b5122b75e4509034..542be3f2bc23a40aee67c7a4f3aeaf7b76e6d46e 100644 (file)
@@ -14,6 +14,7 @@ import java.util.Vector;
 import org.apache.log4j.Logger;
 
 import eu.etaxonomy.cdm.model.name.TaxonNameBase;
+import eu.etaxonomy.cdm.model.taxon.Synonym;
 import eu.etaxonomy.cdm.model.taxon.TaxonNode;
 import eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeEvent;
 import eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeMap;
@@ -51,6 +52,10 @@ public class MultiPageTaxonEditorDataChangeBehaviour extends AbstractDataChangeB
        public void reactOnDataChange(CdmDataChangeMap changeEvents) {
                input = (TaxonEditorInput) source.getEditorInput();
                
+               // I don't know when this happens but ...
+               if(input.getTaxon() == null)
+                       return;
+               
                if(changeEvents.sizeByEventType(EventType.UPDATE) > 0){
                        reactOnUpdate(changeEvents.getEvents(EventType.UPDATE));
                }
@@ -82,20 +87,35 @@ public class MultiPageTaxonEditorDataChangeBehaviour extends AbstractDataChangeB
        public void reactOnUpdate(Vector<CdmDataChangeEvent> events){
 
                for(CdmDataChangeEvent event : events){
+                       
                        // update editor title
-                       if((event.getEntity() instanceof TaxonNameBase) 
-                                       && input.getTaxon().getName().equals(event.getEntity())){
-                               // set the name of the editor window
-                               source.setPartName();
-                               logger.debug("Updating title of taxons editor.");
+                       if(event.getEntity() instanceof TaxonNameBase){
+                               if(input.getTaxon().getName().equals(event.getEntity())){
+                                       // set the name of the editor window
+                                       source.setPartName();
+                                       logger.debug("Updating title of taxons editor.");
+                               }
                        }
-                       
                        // TODO other stuff to happen
+                       
                }
        }
        
        @Override
        public void reactOnInsert(Vector<CdmDataChangeEvent> events){
-               
+               boolean doRedraw = false;
+               for(CdmDataChangeEvent event : events){
+                       // refresh on synonym changes
+                       if(input.getTaxon().hasSynonyms() && event.getEntity() instanceof Synonym){
+                               Synonym synonym = (Synonym) event.getEntity();
+                               
+                               if(synonym.isSynonymOf(input.getTaxon())){
+                                       doRedraw = true;
+                                       break;
+                               }
+                       }
+               }
+//             if(doRedraw)
+//                     source.redraw(Page.NAME);
        }
 }
index 78bd8d35d37a0e3e8d89503185b78353c3058ae8..cfc9c56376f4188acb7e6d211ad334a501ecb864 100644 (file)
@@ -24,8 +24,8 @@ import eu.etaxonomy.cdm.model.name.TaxonNameBase;
 import eu.etaxonomy.cdm.model.taxon.ITreeNode;
 import eu.etaxonomy.cdm.model.taxon.Taxon;
 import eu.etaxonomy.cdm.model.taxon.TaxonNode;
-import eu.etaxonomy.cdm.model.taxon.TaxonomicTree;
 import eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeMap;
+import eu.etaxonomy.taxeditor.model.DataChangeBridge;
 import eu.etaxonomy.taxeditor.preference.PreferencesUtil;
 import eu.etaxonomy.taxeditor.store.CdmStore;
 
@@ -41,6 +41,8 @@ public class TaxonEditorInput implements IEditorInput, IConversationEnabled, IPe
        private ConversationHolder conversation;
 
        private TaxonNode taxonNode;
+
+       private TaxonEditorInputDataChangeBehaviour dataChangeBehavior;
        
        private TaxonEditorInput(TaxonNode taxonNode, ConversationHolder conversation){
                this.taxonNode = taxonNode;
@@ -124,6 +126,9 @@ public class TaxonEditorInput implements IEditorInput, IConversationEnabled, IPe
         * @see org.eclipse.ui.IEditorInput#getName()
         */
        public String getName() {
+               if(getTaxon() == null){
+                       return null;
+               }
                TaxonNameBase<?, ?> name = getTaxon().getName();
                if (name == null || name.getTitleCache() == null) {
                        return "New taxon";
@@ -183,6 +188,7 @@ public class TaxonEditorInput implements IEditorInput, IConversationEnabled, IPe
      */        
        public boolean equals(Object obj) {
                if (obj.getClass().equals(TaxonEditorInput.class) 
+                               && getTaxon() != null
                                && getTaxon().equals(((TaxonEditorInput) obj).getTaxon()))
                        return true;
                return false;
@@ -215,7 +221,11 @@ public class TaxonEditorInput implements IEditorInput, IConversationEnabled, IPe
         * @see eu.etaxonomy.cdm.persistence.hibernate.ICdmPostCrudObserver#update(eu.etaxonomy.cdm.persistence.hibernate.CdmCrudEvent)
         */
        public void update(CdmDataChangeMap events) {
-               // FIXME update the editor input
+               if(dataChangeBehavior == null){
+                       dataChangeBehavior = new TaxonEditorInputDataChangeBehaviour(this);
+               }
+               
+               DataChangeBridge.handleDataChange(events, dataChangeBehavior);
        }
 
        /* (non-Javadoc)
diff --git a/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/TaxonEditorInputDataChangeBehaviour.java b/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/TaxonEditorInputDataChangeBehaviour.java
new file mode 100644 (file)
index 0000000..bcf43db
--- /dev/null
@@ -0,0 +1,45 @@
+// $Id$
+/**
+* Copyright (C) 2007 EDIT
+* European Distributed Institute of Taxonomy 
+* http://www.e-taxonomy.eu
+* 
+* The contents of this file are subject to the Mozilla Public License Version 1.1
+* See LICENSE.TXT at the top of this package for the full license terms.
+*/
+
+package eu.etaxonomy.taxeditor.editor;
+
+import org.apache.log4j.Logger;
+
+import eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeMap;
+import eu.etaxonomy.taxeditor.model.AbstractDataChangeBehaviour;
+
+/**
+ * @author n.hoffmann
+ * @created Jan 5, 2010
+ * @version 1.0
+ */
+public class TaxonEditorInputDataChangeBehaviour extends
+               AbstractDataChangeBehaviour {
+       private static final Logger logger = Logger
+                       .getLogger(TaxonEditorInputDataChangeBehaviour.class);
+       
+       private TaxonEditorInput source;
+
+       /**
+        * @param taxonEditorInput
+        */
+       public TaxonEditorInputDataChangeBehaviour(TaxonEditorInput taxonEditorInput) {
+               source = taxonEditorInput;
+       }
+
+       /* (non-Javadoc)
+        * @see eu.etaxonomy.taxeditor.model.AbstractDataChangeBehaviour#reactOnDataChange(eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeMap)
+        */
+       @Override
+       public void reactOnDataChange(CdmDataChangeMap events) {
+               // TODO Auto-generated method stub
+
+       }
+}
index daf6a18c9bccf76e0b33d559ed9a3c31e1c4871d..1677b2b709ac755e96a4573a796d7df68761099b 100644 (file)
@@ -25,7 +25,7 @@ public class WidgetTransfer extends ByteArrayTransfer {
        /*\r
         * Returns the singleton\r
         */\r
-       public static WidgetTransfer getInstance() {\r
+       public static synchronized WidgetTransfer getInstance() {\r
                return INSTANCE;\r
        }\r
        /*\r
index baca445b82770b534fcdb425c49ffbcc7f3c80d2..6a5e71804c15bd0104c0a9cb52ebbfbdfa90203a 100644 (file)
@@ -12,18 +12,21 @@ import org.eclipse.ui.forms.editor.FormPage;
 import org.eclipse.ui.forms.widgets.ScrolledForm;\r
 \r
 import eu.etaxonomy.cdm.model.common.CdmBase;\r
+import eu.etaxonomy.taxeditor.editor.IMultiPageTaxonEditorPage;\r
 import eu.etaxonomy.taxeditor.operations.IPostOperationEnabled;\r
 \r
 /**\r
  * @author p.ciardelli\r
  *\r
  */\r
-public class TaxonDescriptionTreeEditor extends FormPage implements IPostOperationEnabled {\r
+public class TaxonDescriptionTreeEditor extends FormPage implements IMultiPageTaxonEditorPage, IPostOperationEnabled {\r
 \r
        private static final String ID = "eu.etaxonomy.taxeditor.descriptiontreeeditor";\r
        \r
        private DescriptionMasterDetailsBlock block;\r
 \r
+       private boolean isRedrawing;\r
+\r
        /**\r
         * @param editor\r
         */\r
@@ -79,4 +82,29 @@ public class TaxonDescriptionTreeEditor extends FormPage implements IPostOperati
                block.refreshTree(objectAffectedByOperation);\r
                return true;\r
        }\r
+\r
+       /* (non-Javadoc)\r
+        * @see eu.etaxonomy.taxeditor.editor.IMultiPageTaxonEditorPage#redraw()\r
+        */\r
+       public boolean redraw() {\r
+               return redraw(true);\r
+       }\r
+\r
+       /* (non-Javadoc)\r
+        * @see eu.etaxonomy.taxeditor.editor.IMultiPageTaxonEditorPage#redraw(boolean)\r
+        */\r
+       public boolean redraw(boolean focus) {\r
+               isRedrawing = true;\r
+               block.refreshTree(null);\r
+               isRedrawing = false;\r
+               this.setFocus();\r
+               return true;\r
+       }\r
+\r
+       /* (non-Javadoc)\r
+        * @see eu.etaxonomy.taxeditor.editor.IMultiPageTaxonEditorPage#isRedrawing()\r
+        */\r
+       public boolean isRedrawing() {\r
+               return isRedrawing;\r
+       }\r
 }\r
index 6c7a8a54b5649fc330967e1216d592bc9a1741f1..fd2e8586d7bbe5de66bfbdb8e34b1e39733a59c0 100644 (file)
@@ -75,8 +75,10 @@ import eu.etaxonomy.taxeditor.editor.EditorUtil;
 import eu.etaxonomy.taxeditor.editor.GroupComposite;\r
 import eu.etaxonomy.taxeditor.editor.GroupedComposite;\r
 import eu.etaxonomy.taxeditor.editor.IHasPropertySource;\r
+import eu.etaxonomy.taxeditor.editor.IMultiPageTaxonEditorPage;\r
 import eu.etaxonomy.taxeditor.editor.MultiPageTaxonEditor;\r
 import eu.etaxonomy.taxeditor.editor.SimpleSelectionProvider;\r
+import eu.etaxonomy.taxeditor.editor.TaxonEditorInput;\r
 import eu.etaxonomy.taxeditor.editor.WidgetTransfer;\r
 import eu.etaxonomy.taxeditor.model.Resources;\r
 import eu.etaxonomy.taxeditor.operations.ChangeConceptToSynonymOperation;\r
@@ -90,7 +92,7 @@ import eu.etaxonomy.taxeditor.propertysheet.PropertySheetUtil;
  * @created 15.05.2008\r
  * @version 1.0\r
  */\r
-public class TaxonNameEditor extends EditorPart implements IAdaptable, IConversationEnabled, IPostOperationEnabled, ITabbedPropertySheetPageContributor \r
+public class TaxonNameEditor extends EditorPart implements IMultiPageTaxonEditorPage, IAdaptable, IConversationEnabled, IPostOperationEnabled, ITabbedPropertySheetPageContributor \r
                ,INameEditorCompositeRepository {\r
        \r
        private static final Logger logger = Logger.getLogger(TaxonNameEditor.class);\r
@@ -136,7 +138,7 @@ public class TaxonNameEditor extends EditorPart implements IAdaptable, IConversa
        \r
        public TaxonNameEditor(MultiPageTaxonEditor editor){\r
                this.editor = editor;\r
-               this.conversation = editor.getConversationHolder();\r
+               conversation = editor.getConversationHolder();\r
        }\r
        \r
        /**\r
@@ -150,6 +152,8 @@ public class TaxonNameEditor extends EditorPart implements IAdaptable, IConversa
                        }\r
                }\r
        };\r
+\r
+       private DropTarget target;\r
        \r
        public IUndoContext getUndoContext() {\r
                return editor.getUndoContext();\r
@@ -670,52 +674,11 @@ public class TaxonNameEditor extends EditorPart implements IAdaptable, IConversa
                //  user wants to create a new group\r
                Transfer[] types = new Transfer[] {WidgetTransfer.getInstance()};\r
                int operations = DND.DROP_MOVE | DND.DROP_COPY | DND.DROP_DEFAULT;\r
-               DropTarget target = new DropTarget(parent, operations);\r
-               target.setTransfer(types);\r
-               target.addDropListener(new DropTargetAdapter() {\r
-                       \r
-                       public void drop(DropTargetEvent event) {\r
-                       \r
-                               if (event.data instanceof GroupedComposite) {\r
-                                       final GroupedComposite composite = (GroupedComposite) event.data;\r
-                                       if (composite.getDragSource() != null) {\r
-                                               \r
-                                                       // Execute operations at end of drag event\r
-                                                       composite.getDragSource().addListener(DND.DragEnd, new Listener() {\r
-                                               \r
-                                                               public void handleEvent(Event event) {\r
-                                                                       IUndoableOperation operation = null;\r
-                                                                       \r
-                                                                       // Synonym being dropped\r
-                                                                       if(composite instanceof SynonymComposite){\r
-                                                                               Synonym synonym = ((SynonymComposite)composite).getSynonym();\r
-                                                                               operation = new ChangeHomotypicGroupOperation\r
-                                                                                               ("change type", getUndoContext(), \r
-                                                                                                               getTaxon(), synonym, HomotypicalGroup.NewInstance(), TaxonNameEditor.this);\r
-                                                                       }\r
-                                                                       \r
-                                                                       // Misapplied name being dropped\r
-                                                                       if(composite instanceof MisappliedNameComposite){\r
-                                                                                       Taxon misapplication = ((MisappliedNameComposite)composite).getMisappliedName();\r
-                                                                                       operation = new ChangeConceptToSynonymOperation\r
-                                                                                                       ("change misapplied name to synonym", getUndoContext(), \r
-                                                                                                                       getTaxon(), misapplication, HomotypicalGroup.NewInstance(), TaxonNameEditor.this);                                      \r
-                                                                       }\r
-                                                                       \r
-                                                                       // Execute operation if it's been init'ed\r
-                                                                       if (operation == null) {\r
-                                                                               logger.warn("User unsuccessfully tried to drop " + composite.getClass());\r
-                                                                       } else {\r
-                                                                               EditorUtil.executeOperation(operation);\r
-                                                                       }\r
-                                                               }\r
-                                                       });                                                     \r
-                                       }\r
-                               }\r
-                               \r
-\r
-                       }               \r
-               });             \r
+               if(target == null){\r
+                       target = new DropTarget(parent, operations);\r
+                       target.setTransfer(types);\r
+                       target.addDropListener(new NameEditorDropTargetListener());\r
+               }               \r
        }\r
 \r
        public Composite getAcceptedName() {\r
@@ -933,6 +896,15 @@ public class TaxonNameEditor extends EditorPart implements IAdaptable, IConversa
        public boolean isDirty() {\r
                return false;\r
        }\r
+       \r
+       /* (non-Javadoc)\r
+        * @see org.eclipse.ui.part.WorkbenchPart#dispose()\r
+        */\r
+       @Override\r
+       public void dispose() {\r
+               super.dispose();\r
+               \r
+       }\r
 \r
        /* (non-Javadoc)\r
         * @see org.eclipse.ui.part.EditorPart#isSaveAsAllowed()\r
@@ -941,4 +913,47 @@ public class TaxonNameEditor extends EditorPart implements IAdaptable, IConversa
        public boolean isSaveAsAllowed() {\r
                return false;\r
        }\r
+       \r
+       private class NameEditorDropTargetListener extends DropTargetAdapter{\r
+               private GroupedComposite composite;\r
+\r
+               public void drop(DropTargetEvent event) {\r
+                       Assert.isTrue(event.data instanceof GroupedComposite);\r
+                       \r
+                       composite = (GroupedComposite) event.data;\r
+                       if (composite.getDragSource() != null) {\r
+                               // Execute operations at end of drag event\r
+                               composite.getDragSource().addListener(DND.DragEnd, new DragListener());\r
+                       }\r
+               }       \r
+               \r
+               private class DragListener implements Listener{\r
+                       public void handleEvent(Event event) {\r
+                               IUndoableOperation operation = null;\r
+                               \r
+                               // Synonym being dropped\r
+                               if(composite instanceof SynonymComposite){\r
+                                       Synonym synonym = ((SynonymComposite)composite).getSynonym();\r
+                                       operation = new ChangeHomotypicGroupOperation\r
+                                                       ("change type", getUndoContext(), \r
+                                                                       getTaxon(), synonym, HomotypicalGroup.NewInstance(), TaxonNameEditor.this);\r
+                               }\r
+                               \r
+                               // Misapplied name being dropped\r
+                               if(composite instanceof MisappliedNameComposite){\r
+                                               Taxon misapplication = ((MisappliedNameComposite)composite).getMisappliedName();\r
+                                               operation = new ChangeConceptToSynonymOperation\r
+                                                               ("change misapplied name to synonym", getUndoContext(), \r
+                                                                               getTaxon(), misapplication, HomotypicalGroup.NewInstance(), TaxonNameEditor.this);                                      \r
+                               }\r
+                               \r
+                               // Execute operation if it's been initiated\r
+                               if (operation == null) {\r
+                                       logger.warn("User unsuccessfully tried to drop " + composite.getClass());\r
+                               } else {\r
+                                       EditorUtil.executeOperation(operation);\r
+                               }\r
+                       }\r
+               }\r
+       }\r
 }
\ No newline at end of file
index c73fd034fbba60eae0d94f6aba782e6fb4ab19cc..9e1df532b9795055be311cb5c381a0f46848649a 100644 (file)
@@ -4,9 +4,7 @@
 package eu.etaxonomy.taxeditor.editor.name.handler;\r
 \r
 import java.util.ArrayList;\r
-import java.util.HashSet;\r
 import java.util.List;\r
-import java.util.Set;\r
 import java.util.UUID;\r
 \r
 import org.apache.log4j.Logger;\r
@@ -14,170 +12,84 @@ import org.eclipse.core.commands.AbstractHandler;
 import org.eclipse.core.commands.ExecutionEvent;\r
 import org.eclipse.core.commands.ExecutionException;\r
 import org.eclipse.core.commands.IHandler;\r
-import org.eclipse.jface.dialogs.MessageDialog;\r
-import org.eclipse.jface.viewers.ISelection;\r
-import org.eclipse.jface.viewers.StructuredSelection;\r
+import org.eclipse.core.commands.common.NotDefinedException;\r
 import org.eclipse.ui.IEditorPart;\r
-import org.eclipse.ui.IWorkbenchPage;\r
 import org.eclipse.ui.PartInitException;\r
 import org.eclipse.ui.handlers.HandlerUtil;\r
 \r
-import eu.etaxonomy.cdm.api.conversation.ConversationHolder;\r
-import eu.etaxonomy.cdm.model.description.TaxonDescription;\r
-import eu.etaxonomy.cdm.model.name.TaxonNameBase;\r
-import eu.etaxonomy.cdm.model.reference.ReferenceBase;\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.cdm.model.common.CdmBase;\r
 import eu.etaxonomy.cdm.model.taxon.TaxonNode;\r
-import eu.etaxonomy.cdm.model.taxon.TaxonRelationship;\r
-import eu.etaxonomy.cdm.model.taxon.TaxonRelationshipType;\r
 import eu.etaxonomy.taxeditor.dialogs.filteredSelection.FilteredTaxonNodeSelectionDialog;\r
 import eu.etaxonomy.taxeditor.editor.EditorUtil;\r
-import eu.etaxonomy.taxeditor.propertysheet.name.TaxonBasePropertySource;\r
-import eu.etaxonomy.taxeditor.store.CdmStore;\r
+import eu.etaxonomy.taxeditor.editor.MultiPageTaxonEditor;\r
+import eu.etaxonomy.taxeditor.editor.Page;\r
+import eu.etaxonomy.taxeditor.editor.TaxonEditorInput;\r
+import eu.etaxonomy.taxeditor.editor.name.TaxonNameEditor;\r
+import eu.etaxonomy.taxeditor.operations.ChangeAcceptedTaxonToSynonymOperation;\r
+import eu.etaxonomy.taxeditor.operations.IPostOperationEnabled;\r
 \r
 /**\r
- * @author p.ciardelli\r
- *\r
+ * \r
+ * @author n.hoffmann\r
+ * @created Jan 4, 2010\r
+ * @version 1.0\r
  */\r
 public class ChangeAcceptedTaxonToSynonymHandler extends AbstractHandler\r
-               implements IHandler {\r
+               implements IHandler, IPostOperationEnabled {\r
        private static final Logger logger = Logger\r
                        .getLogger(ChangeAcceptedTaxonToSynonymHandler.class);\r
+       private ChangeAcceptedTaxonToSynonymOperation operation;\r
 \r
+       private UUID newAcceptedTaxonNodeUuid;\r
+       \r
        /* (non-Javadoc)\r
         * @see org.eclipse.core.commands.IHandler#execute(org.eclipse.core.commands.ExecutionEvent)\r
         */\r
        public Object execute(ExecutionEvent event) throws ExecutionException {\r
-               ConversationHolder conversation = CdmStore.NewTransactionalConversation();\r
                \r
-               try{\r
-                       ISelection menuSelection = HandlerUtil.getActiveMenuSelection(event);\r
-                       TaxonBasePropertySource taxonBasePropertySource = \r
-                                       (TaxonBasePropertySource) ((StructuredSelection) menuSelection).getFirstElement();\r
-                       Taxon oldAcceptedTaxon = (Taxon) taxonBasePropertySource.getTaxonBase();\r
-                       \r
-                       // Retrieve active editor and active page for later use\r
-                       IEditorPart editor = HandlerUtil.getActiveEditor(event);\r
-                       IWorkbenchPage activePage = HandlerUtil.getActiveWorkbenchWindowChecked(event).getActivePage();\r
-                       \r
-                       // Choose new accepted taxon    \r
-                       List<UUID> excludeTaxa = new ArrayList<UUID>();\r
-                       excludeTaxa.add(oldAcceptedTaxon.getUuid());\r
-                       Taxon newAcceptedTaxon = FilteredTaxonNodeSelectionDialog.selectTaxonNode(HandlerUtil.getActiveShell(event), "Choose the accepted taxon", excludeTaxa, null).getTaxon();\r
-                       \r
-                       \r
-                       if (newAcceptedTaxon == null) {\r
-                               return null;\r
-                       }\r
-                       \r
-                       try {\r
-                               \r
-                               Taxon newTaxon = (Taxon) CdmStore.getTaxonService().load(newAcceptedTaxon.getUuid());\r
-                               Taxon oldTaxon = (Taxon) CdmStore.getTaxonService().load(oldAcceptedTaxon.getUuid());\r
-                               \r
-                               // Check for multiple nodes\r
-                               if (newTaxon.getTaxonNodes().size() > 1 || oldTaxon.getTaxonNodes().size() > 1) {\r
-                                       MessageDialog.openInformation(HandlerUtil.getActiveShell(event), \r
-                                               "Taxon implemented in multiple trees", \r
-                                               "One or both of these taxa is implemented in multiple taxonomic trees.");\r
-                                       return null;\r
-                               }\r
-                               \r
-                               // Close editor                         \r
-                               boolean proceed = activePage.closeEditor(editor, true);\r
-\r
-                               if (!proceed) {\r
-                                       return null;\r
-                               }\r
-                               \r
-                               makeTaxonSynonym(oldTaxon, newTaxon, null, null, null);\r
-                                       \r
-                               conversation.commit();\r
-                               Set<TaxonNode> nodes = newTaxon.getTaxonNodes();\r
-                               UUID uuid = nodes.iterator().next().getUuid();\r
-                               \r
-                               EditorUtil.open(uuid);\r
-                                                       \r
-                       } catch (PartInitException e) {\r
-                               logger.error(e);\r
-                               throw new RuntimeException(e);\r
-                       }\r
-                       \r
+               TaxonNameEditor editor = (TaxonNameEditor) EditorUtil.getActiveEditorPage(\r
+                               Page.NAME);\r
+               TaxonNode oldAcceptedTaxonNode = ((TaxonEditorInput) editor.getEditorInput()).getTaxonNode();\r
+               \r
+               // Choose new accepted taxon    \r
+               List<UUID> excludeTaxa = new ArrayList<UUID>();\r
+               excludeTaxa.add(oldAcceptedTaxonNode.getUuid());\r
+               TaxonNode newAcceptedTaxonNode = FilteredTaxonNodeSelectionDialog.selectTaxonNode(HandlerUtil.getActiveShell(event), "Choose the accepted taxon", excludeTaxa, null);\r
+               \r
+               newAcceptedTaxonNodeUuid = newAcceptedTaxonNode.getUuid();\r
+               \r
+               if (newAcceptedTaxonNode == null) {\r
                        return null;\r
-               }finally{\r
-                       conversation.close();\r
-               }\r
-       }\r
-\r
-       /**\r
-        * @param oldTaxon\r
-        * @param newTaxon\r
-        */\r
-       private void makeTaxonSynonym(Taxon oldTaxon, Taxon newAcceptedTaxon, SynonymRelationshipType synonymType, ReferenceBase citation, String citationMicroReference) {\r
-               if (oldTaxon == null || newAcceptedTaxon == null || oldTaxon.getName() == null){\r
-                       return;\r
                }\r
                \r
-               // Move oldTaxon to newTaxon\r
-               TaxonNameBase<?,?> synonymName = oldTaxon.getName();\r
-               if (synonymType == null){\r
-                       if (synonymName.isHomotypic(newAcceptedTaxon.getName())){\r
-                               synonymType = SynonymRelationshipType.HOMOTYPIC_SYNONYM_OF();\r
-                       }else{\r
-                               //TODO synonymType \r
-                               synonymType = SynonymRelationshipType.HETEROTYPIC_SYNONYM_OF();\r
-                       }\r
+               try {\r
+                       operation = new ChangeAcceptedTaxonToSynonymOperation(event.getCommand().getName(), \r
+                                                                       editor.getUndoContext(), oldAcceptedTaxonNode, newAcceptedTaxonNode, this, editor);\r
+                       EditorUtil.executeOperation(operation);\r
+                       EditorUtil.close(editor.getMultiPageTaxonEditor());\r
+               } catch (NotDefinedException e) {\r
+                       logger.warn("Command name not set");\r
                }\r
-               SynonymRelationship synRel = newAcceptedTaxon.addSynonymName(synonymName, synonymType, citation, citationMicroReference);\r
                \r
-               //Move Synonym Relations to new Taxon\r
-               for(SynonymRelationship synRelation : oldTaxon.getSynonymRelations()){\r
-                       synRelation.setAcceptedTaxon(newAcceptedTaxon);\r
-               }\r
-\r
-               //Move Taxon RelationShips to new Taxon\r
-               Set<TaxonRelationship> removableTaxonRels = new HashSet<TaxonRelationship>();\r
-               for(TaxonRelationship taxonRelation : oldTaxon.getTaxonRelations()){\r
-                       //CHILDREN\r
-                       if (taxonRelation.getType().equals(TaxonRelationshipType.TAXONOMICALLY_INCLUDED_IN())){\r
-                               if (taxonRelation.getFromTaxon() == oldTaxon){\r
-                                       taxonRelation.setFromTaxon(newAcceptedTaxon);\r
-                               }else if(taxonRelation.getToTaxon() == oldTaxon){\r
-                                       taxonRelation.setToTaxon(newAcceptedTaxon);\r
-                               }else{\r
-                                       logger.warn("Taxon is not part of its own Taxonrelationship");\r
-                               }\r
+               try {\r
+                       MultiPageTaxonEditor possibleOpenEditor = (MultiPageTaxonEditor) EditorUtil.findEditorByTaxonNodeUuid(newAcceptedTaxonNodeUuid);\r
+                       if(possibleOpenEditor != null){\r
+                               EditorUtil.close(possibleOpenEditor);\r
                        }\r
-                       //MISAPPLIED NAMES\r
-                       if (taxonRelation.getType().equals(TaxonRelationshipType.MISAPPLIED_NAME_FOR())){\r
-                               if (taxonRelation.getFromTaxon() == oldTaxon){\r
-                                       taxonRelation.setFromTaxon(newAcceptedTaxon);\r
-                               }else if(taxonRelation.getToTaxon() == oldTaxon){\r
-                                       taxonRelation.setToTaxon(newAcceptedTaxon);\r
-                               }else{\r
-                                       logger.warn("Taxon is not part of its own Taxonrelationship");\r
-                               }\r
-                       }\r
-                       //Concept Relationships\r
-                       //FIXME implement\r
-                       logger.warn("Transfer of concept relationships not implemented yet");\r
+                       EditorUtil.open(newAcceptedTaxonNodeUuid);\r
+               } catch (PartInitException e) {\r
+                       logger.error(e);\r
+                       throw new RuntimeException(e);\r
                }\r
                \r
-               \r
-               //Move Descriptions to new Taxon\r
-               Set<TaxonDescription> descriptions = new HashSet<TaxonDescription>();\r
-               for(TaxonDescription taxDescription : oldTaxon.getDescriptions()){\r
-                       descriptions.add(taxDescription);\r
-               }                                               \r
-               for(TaxonDescription taxDescription : descriptions){\r
-                       newAcceptedTaxon.addDescription(taxDescription);\r
-               }\r
-\r
-\r
-               oldTaxon.getTaxonNodes().iterator().next().delete();\r
+               return null;\r
                \r
        }\r
-       \r
+\r
+       /* (non-Javadoc)\r
+        * @see eu.etaxonomy.taxeditor.operations.IPostOperationEnabled#postOperation(eu.etaxonomy.cdm.model.common.CdmBase)\r
+        */\r
+       public boolean postOperation(CdmBase objectAffectedByOperation) {\r
+               return true;\r
+       }       \r
 }
\ No newline at end of file
index 00f5355bacb0a2ce61d6a0c76735dbaf4f2b2c7c..0314aa60b26814a09a1124c3f8af0029a13fdaf1 100644 (file)
@@ -46,7 +46,7 @@ public class JaxbExportWizard extends AbstractExportWizard<JaxbExportConfigurato
        @Override
        public boolean performFinish() {
                
-               String urlString = page.getFolderText() + File.pathSeparator + page.getExportFileName();
+               String urlString = page.getFolderText() + File.separator + page.getExportFileName();
                
                configurator.setDestination(urlString);
                
index 9660bf1a3ec162fec254cb4b7fa3cd0bfe18310b..4e0d0e1a36de57d288444a063243a68c39e95eed 100644 (file)
@@ -47,12 +47,13 @@ public abstract class AbstractPersistentPostOperation extends AbstractPostOperat
        }
 
        protected IStatus postExecute(CdmBase objectAffectedByOperation) {      
-               IStatus status = super.postExecute(objectAffectedByOperation);
-               
+
                if(conversationEnabled != null){
                        conversationEnabled.getConversationHolder().commit(true);
                }
                
+               IStatus status = super.postExecute(objectAffectedByOperation);
+               
                return status;
        }
 
diff --git a/taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/operations/ChangeAcceptedTaxonToSynonymOperation.java b/taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/operations/ChangeAcceptedTaxonToSynonymOperation.java
new file mode 100644 (file)
index 0000000..4f248cf
--- /dev/null
@@ -0,0 +1,84 @@
+// $Id$
+/**
+* Copyright (C) 2007 EDIT
+* European Distributed Institute of Taxonomy 
+* http://www.e-taxonomy.eu
+* 
+* The contents of this file are subject to the Mozilla Public License Version 1.1
+* See LICENSE.TXT at the top of this package for the full license terms.
+*/
+
+package eu.etaxonomy.taxeditor.operations;
+
+import org.apache.log4j.Logger;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.commands.operations.IUndoContext;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+
+import eu.etaxonomy.cdm.api.conversation.IConversationEnabled;
+import eu.etaxonomy.cdm.model.taxon.Synonym;
+import eu.etaxonomy.cdm.model.taxon.TaxonNode;
+import eu.etaxonomy.taxeditor.store.CdmStore;
+
+/**
+ * @author n.hoffmann
+ * @created Jan 4, 2010
+ * @version 1.0
+ */
+public class ChangeAcceptedTaxonToSynonymOperation extends
+               AbstractPersistentPostOperation {
+
+       private static final Logger logger = Logger
+                       .getLogger(ChangeAcceptedTaxonToSynonymOperation.class);
+       
+       private TaxonNode newAcceptedTaxonNode;
+
+       private TaxonNode oldTaxonNode;
+       
+       /**
+        * @param label
+        * @param undoContext
+        * @param taxon
+        * @param postOperationEnabled
+        */
+       public ChangeAcceptedTaxonToSynonymOperation(String label,
+                       IUndoContext undoContext, TaxonNode oldTaxonNode, TaxonNode newAcceptedTaxonNode,
+                       IPostOperationEnabled postOperationEnabled, IConversationEnabled conversationEnabled) {
+               super(label, undoContext, oldTaxonNode.getTaxon(), postOperationEnabled, conversationEnabled);
+               this.oldTaxonNode = oldTaxonNode;
+               this.newAcceptedTaxonNode = newAcceptedTaxonNode;
+       }
+
+
+       /* (non-Javadoc)
+        * @see org.eclipse.core.commands.operations.AbstractOperation#execute(org.eclipse.core.runtime.IProgressMonitor, org.eclipse.core.runtime.IAdaptable)
+        */
+       @Override
+       public IStatus execute(IProgressMonitor monitor, IAdaptable info)
+                       throws ExecutionException {
+               Synonym synonym = CdmStore.getTaxonService().changeAcceptedTaxonToSynonym(oldTaxonNode, newAcceptedTaxonNode, null, null, null);
+               return postExecute(synonym);
+       }
+
+       /* (non-Javadoc)
+        * @see org.eclipse.core.commands.operations.AbstractOperation#redo(org.eclipse.core.runtime.IProgressMonitor, org.eclipse.core.runtime.IAdaptable)
+        */
+       @Override
+       public IStatus redo(IProgressMonitor monitor, IAdaptable info)
+                       throws ExecutionException {
+               // TODO Auto-generated method stub
+               return null;
+       }
+
+       /* (non-Javadoc)
+        * @see org.eclipse.core.commands.operations.AbstractOperation#undo(org.eclipse.core.runtime.IProgressMonitor, org.eclipse.core.runtime.IAdaptable)
+        */
+       @Override
+       public IStatus undo(IProgressMonitor monitor, IAdaptable info)
+                       throws ExecutionException {
+               // TODO Auto-generated method stub
+               return null;
+       }
+}
index 05937a4288799e6a20f281156fa09df727be18e3..a03952f4dd8d7eb77f59ea20f2f5af6bf415cfd2 100644 (file)
@@ -55,7 +55,7 @@ public class ChangeSynonymToAcceptedTaxonOperation extends AbstractPostOperation
        public IStatus execute(IProgressMonitor monitor, IAdaptable info)\r
                        throws ExecutionException {\r
                \r
-               newTaxon = CdmStore.getTaxonService().makeSynonymAcceptedTaxon(synonym, taxon);\r
+               newTaxon = CdmStore.getTaxonService().changeSynonymToAcceptedTaxon(synonym, taxon);\r
                \r
 //             synonym.setSec(null);\r
                \r