Merge branch 'develop' into LibrAlign
[taxeditor.git] / eu.etaxonomy.taxeditor.editor / src / main / java / eu / etaxonomy / taxeditor / editor / view / derivate / DerivateView.java
index ff919dfca756439b4493a023000b3e91e4d2fe05..a7845395ed1b783ac5bb80dc3a0cf5d933986ed5 100644 (file)
@@ -4,12 +4,18 @@ import java.util.Collection;
 import java.util.HashSet;
 import java.util.Map.Entry;
 import java.util.Set;
+import java.util.UUID;
 
 import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.jface.action.MenuManager;
 import org.eclipse.jface.util.LocalSelectionTransfer;
+import org.eclipse.jface.viewers.AbstractTreeViewer;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
 import org.eclipse.jface.viewers.StructuredSelection;
 import org.eclipse.jface.viewers.TreeNode;
+import org.eclipse.jface.viewers.TreeSelection;
 import org.eclipse.jface.viewers.TreeViewer;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.dnd.DND;
@@ -21,42 +27,35 @@ import org.eclipse.swt.widgets.Tree;
 import org.eclipse.ui.IEditorInput;
 import org.eclipse.ui.IEditorPart;
 import org.eclipse.ui.IEditorSite;
-import org.eclipse.ui.IMemento;
 import org.eclipse.ui.PartInitException;
 import org.eclipse.ui.part.EditorPart;
 
 import eu.etaxonomy.cdm.api.conversation.ConversationHolder;
 import eu.etaxonomy.cdm.api.conversation.IConversationEnabled;
+import eu.etaxonomy.cdm.api.service.IOccurrenceService;
 import eu.etaxonomy.cdm.api.service.molecular.ISequenceService;
+import eu.etaxonomy.cdm.model.common.CdmBase;
 import eu.etaxonomy.cdm.model.molecular.Sequence;
 import eu.etaxonomy.cdm.model.molecular.SingleRead;
-import eu.etaxonomy.cdm.model.occurrence.FieldUnit;
 import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase;
 import eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeMap;
-import eu.etaxonomy.taxeditor.model.IContextListener;
-import eu.etaxonomy.taxeditor.model.IDirtyMarkableSelectionProvider;
+import eu.etaxonomy.taxeditor.model.IDirtyMarkable;
 import eu.etaxonomy.taxeditor.model.IPartContentHasDetails;
 import eu.etaxonomy.taxeditor.model.IPartContentHasFactualData;
+import eu.etaxonomy.taxeditor.model.IPartContentHasMedia;
 import eu.etaxonomy.taxeditor.model.IPartContentHasSupplementalData;
+import eu.etaxonomy.taxeditor.operation.IPostOperationEnabled;
 import eu.etaxonomy.taxeditor.store.CdmStore;
+import eu.etaxonomy.taxeditor.view.derivateSearch.DerivateContentProvider;
 import eu.etaxonomy.taxeditor.view.derivateSearch.DerivateLabelProvider;
 
 /**
- * Displays the derivate hierarchy of all derivates having one single {@link FieldUnit} as root.
+ * Displays the derivate hierarchy of the specimen specified in the editor input.
  *
  */
-public class DerivateView extends EditorPart implements IPartContentHasFactualData, IDirtyMarkableSelectionProvider,
-        IConversationEnabled, IPartContentHasDetails, IPartContentHasSupplementalData, IContextListener {
-
-       /**
-     * Key used for storing a single DerivateView in a memento
-     */
-    private static final String DERIVATE_VIEW_MEMENTO_KEY = "derivateView";
-
-    /**
-     * Key to to group mementos for every single DerivateView
-     */
-    private static final String DERIVATE_VIEWS_MEMENTO_KEY = "derivateViews";
+public class DerivateView extends EditorPart implements IPartContentHasFactualData, IDirtyMarkable,
+        IConversationEnabled, IPartContentHasDetails, IPartContentHasSupplementalData, IPartContentHasMedia,
+        ISelectionChangedListener, IPostOperationEnabled {
 
     public static final String ID = "eu.etaxonomy.taxeditor.editor.view.derivate.DerivateView";
 
@@ -72,11 +71,12 @@ public class DerivateView extends EditorPart implements IPartContentHasFactualDa
 
     private Set<SingleRead> multiLinkSingleReads;
 
+    private ISelection selection = null;
+
     /**
      * Default constructor
      */
     public DerivateView() {
-        CdmStore.getContextManager().addContextListener(this);
     }
 
     /* (non-Javadoc)
@@ -87,10 +87,13 @@ public class DerivateView extends EditorPart implements IPartContentHasFactualDa
         viewer = new TreeViewer(new Tree(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION));
         viewer.setContentProvider(new DerivateContentProvider());
         labelProvider = new DerivateLabelProvider();
+        labelProvider.setConversation(conversation);
         viewer.setLabelProvider(labelProvider);
-        viewer.setAutoExpandLevel(2);
+        viewer.setAutoExpandLevel(AbstractTreeViewer.ALL_LEVELS);
         // Propagate selection from viewer
         getSite().setSelectionProvider(viewer);
+        //listen to selection changes
+        viewer.addSelectionChangedListener(this);
 
         //create context menu
         MenuManager menuManager = new MenuManager();
@@ -102,12 +105,16 @@ public class DerivateView extends EditorPart implements IPartContentHasFactualDa
         generateMultiLinkSingleReads();
         labelProvider.setMultiLinkSingleReads(multiLinkSingleReads);
         IEditorInput editorInput = getEditorInput();
-        viewer.setInput(editorInput);
+        viewer.setInput(((DerivateViewEditorInput) editorInput).getRootUUIDs());
+        //set selection to selected derivate if only one was selected
         if(editorInput instanceof DerivateViewEditorInput){
-            SpecimenOrObservationBase<?> specimen = ((DerivateViewEditorInput) editorInput).getDerivate();
-            SpecimenOrObservationBase<?> rootElement = ((DerivateViewEditorInput) editorInput).getRootElement();
-            setPartName(DerivateLabelProvider.getDerivateText(rootElement));
-            viewer.setSelection(new StructuredSelection(new TreeNode(specimen)));
+            Set<UUID> derivateUUIDs = ((DerivateViewEditorInput) editorInput).getDerivateUUIDs();
+            if(derivateUUIDs.size()==1){
+                SpecimenOrObservationBase<?> specimen = CdmStore.getService(IOccurrenceService.class).load(derivateUUIDs.iterator().next());
+                if(specimen!=null){
+                    viewer.setSelection(new StructuredSelection(new TreeNode(specimen)));
+                }
+            }
         }
 
         //add drag'n'drop support
@@ -121,7 +128,12 @@ public class DerivateView extends EditorPart implements IPartContentHasFactualDa
      */
     @Override
     public void doSave(IProgressMonitor monitor) {
-        monitor.beginTask("Saving Derivates", 3);
+        String taskName = "Saving hierarchy";
+        if(getEditorInput() instanceof DerivateViewEditorInput){
+            DerivateViewEditorInput derivateViewEditorInput = (DerivateViewEditorInput) getEditorInput();
+            taskName += " "+derivateViewEditorInput.getName();
+        }
+        monitor.beginTask(taskName, 3);
         if (!conversation.isBound()) {
             conversation.bind();
         }
@@ -150,7 +162,11 @@ public class DerivateView extends EditorPart implements IPartContentHasFactualDa
      */
     @Override
     public String getTitleToolTip() {
-        return "Derivate View";
+        if(getEditorInput() instanceof DerivateViewEditorInput){
+            DerivateViewEditorInput derivateViewEditorInput = (DerivateViewEditorInput) getEditorInput();
+            return derivateViewEditorInput.getName();
+        }
+        return "Derivative Editor";
     }
 
     /* (non-Javadoc)
@@ -161,7 +177,9 @@ public class DerivateView extends EditorPart implements IPartContentHasFactualDa
         setSite(site);
         setInput(input);
         if(input instanceof DerivateViewEditorInput){
-            conversation = ((DerivateViewEditorInput) input).getConversationHolder();
+            DerivateViewEditorInput derivateViewEditorInput = (DerivateViewEditorInput) input;
+            conversation = derivateViewEditorInput.getConversationHolder();
+            setPartName(derivateViewEditorInput.getName());
         }
     }
 
@@ -194,6 +212,7 @@ public class DerivateView extends EditorPart implements IPartContentHasFactualDa
      */
     @Override
     public void setFocus() {
+        viewer.getControl().setFocus();
         //make sure to bind again if maybe in another view the conversation was unbound
         if(!conversation.isBound()){
             conversation.bind();
@@ -232,6 +251,27 @@ public class DerivateView extends EditorPart implements IPartContentHasFactualDa
         viewer.refresh();
     }
 
+    /* (non-Javadoc)
+     * @see eu.etaxonomy.taxeditor.model.IDirtyMarkableSelectionProvider#forceDirty()
+     */
+    @Override
+    public void forceDirty() {
+        changed(null);
+    }
+
+    /**
+     * Refreshes the derivate hierarchy tree and expands the tree
+     * to show and select the given object.
+     *
+     * @param expandTo the object to which the tree should be expanded
+     */
+    public void refreshTree(Object expandTo){
+        refreshTree();
+        TreeSelection selection = (TreeSelection) viewer.getSelection();
+        viewer.expandToLevel(selection.getFirstElement(), 1);
+        viewer.setSelection(new StructuredSelection(new TreeNode(expandTo)));
+    }
+
     /**
      * Refreshes the derivate hierarchy tree
      */
@@ -241,6 +281,7 @@ public class DerivateView extends EditorPart implements IPartContentHasFactualDa
         viewer.refresh();
     }
 
+
     private void generateMultiLinkSingleReads() {
         Set<SingleRead> multiLinkSingleReads = new HashSet<SingleRead>();
         for(Entry<SingleRead, Collection<Sequence>> entry:CdmStore.getService(ISequenceService.class).getSingleReadSequencesMap().entrySet()){
@@ -259,57 +300,39 @@ public class DerivateView extends EditorPart implements IPartContentHasFactualDa
     }
 
     /* (non-Javadoc)
-     * @see eu.etaxonomy.taxeditor.model.IContextListener#contextAboutToStop(org.eclipse.ui.IMemento, org.eclipse.core.runtime.IProgressMonitor)
+     * @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
      */
     @Override
-    public void contextAboutToStop(IMemento memento, IProgressMonitor monitor) {
+    public void selectionChanged(SelectionChangedEvent event) {
+        this.selection  = event.getSelection();
     }
 
-    /* (non-Javadoc)
-     * @see eu.etaxonomy.taxeditor.model.IContextListener#contextStop(org.eclipse.ui.IMemento, org.eclipse.core.runtime.IProgressMonitor)
-     */
-    @Override
-    public void contextStop(IMemento memento, IProgressMonitor monitor) {
+    public ISelection getSelection() {
+        return selection;
     }
 
-    /* (non-Javadoc)
-     * @see eu.etaxonomy.taxeditor.model.IContextListener#contextStart(org.eclipse.ui.IMemento, org.eclipse.core.runtime.IProgressMonitor)
-     */
-    @Override
-    public void contextStart(IMemento memento, IProgressMonitor monitor) {
-//        if(memento == null){
-//            return;
-//        }
-//        IMemento editorMementos = memento.getChild(DERIVATE_VIEW_MEMENTO_KEY);
-//            DerivateViewEditorInput input = new DerivateViewEditorInput(UUID.fromString(editorInput.getString(DerivateViewEditorInput.UUID_MEMENTO_KEY)));
-//                try {
-//                    EditorUtil.open(input);
-//                } catch (PartInitException e) {
-//                    AbstractUtility.error(getClass(), "Error opening an editor window", e);
-//                }
+    public DerivateLabelProvider getLabelProvider() {
+        return labelProvider;
     }
 
     /* (non-Javadoc)
-     * @see eu.etaxonomy.taxeditor.model.IContextListener#contextRefresh(org.eclipse.core.runtime.IProgressMonitor)
+     * @see eu.etaxonomy.taxeditor.operation.IPostOperationEnabled#postOperation(eu.etaxonomy.cdm.model.common.CdmBase)
      */
     @Override
-    public void contextRefresh(IProgressMonitor monitor) {
+    public boolean postOperation(CdmBase objectAffectedByOperation) {
+        refreshTree();
+        if(objectAffectedByOperation!=null){
+            changed(objectAffectedByOperation);
+        }
+        return true;
     }
 
     /* (non-Javadoc)
-     * @see eu.etaxonomy.taxeditor.model.IContextListener#workbenchShutdown(org.eclipse.ui.IMemento, org.eclipse.core.runtime.IProgressMonitor)
+     * @see eu.etaxonomy.taxeditor.operation.IPostOperationEnabled#onComplete()
      */
     @Override
-    public void workbenchShutdown(IMemento memento, IProgressMonitor monitor) {
-//        if(memento == null){
-//            return;
-//        }
-//
-//        IEditorInput input = getEditorInput();
-//        if(input instanceof IPersistable){
-//            memento.createChild(DERIVATE_VIEW_MEMENTO_KEY);
-//            ((IPersistable) input).saveState(memento);
-//        }
+    public boolean onComplete() {
+        return true;
     }
 
 }