- added support for image gallery creation for FieldUnits (#4389)
[taxeditor.git] / eu.etaxonomy.taxeditor.editor / src / main / java / eu / etaxonomy / taxeditor / editor / view / derivate / DerivateView.java
index 2bc35bb28c95420bedc3688f97237207a406a195..1cc320d3308a529ff502d9bb61b81a868dbe71cc 100644 (file)
@@ -1,10 +1,23 @@
 package eu.etaxonomy.taxeditor.editor.view.derivate;
 
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Map.Entry;
+import java.util.Set;
+
 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.TreeViewer;
 import org.eclipse.swt.SWT;
+import org.eclipse.swt.dnd.DND;
+import org.eclipse.swt.dnd.Transfer;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Control;
 import org.eclipse.swt.widgets.Menu;
@@ -12,37 +25,67 @@ 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.facade.DerivedUnitFacadeCacheStrategy;
+import eu.etaxonomy.cdm.api.service.molecular.ISequenceService;
+import eu.etaxonomy.cdm.model.molecular.Sequence;
+import eu.etaxonomy.cdm.model.molecular.SingleRead;
 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.IPartContentHasDetails;
+import eu.etaxonomy.taxeditor.model.IPartContentHasFactualData;
+import eu.etaxonomy.taxeditor.model.IPartContentHasMedia;
 import eu.etaxonomy.taxeditor.model.IPartContentHasSupplementalData;
 import eu.etaxonomy.taxeditor.store.CdmStore;
-import eu.etaxonomy.taxeditor.ui.campanula.derivatesearch.DerivateLabelProvider;
+import eu.etaxonomy.taxeditor.view.derivateSearch.DerivateLabelProvider;
 
 /**
- * Displays the derivate hierarchy of all derivates belonging to a taxon.
+ * Displays the derivate hierarchy of the specimen specified in the editor input.
  *
  */
-public class DerivateView extends EditorPart implements IDirtyMarkableSelectionProvider, IConversationEnabled, IPartContentHasDetails, IPartContentHasSupplementalData {
+public class DerivateView extends EditorPart implements IPartContentHasFactualData, IDirtyMarkableSelectionProvider,
+        IConversationEnabled, IPartContentHasDetails, IPartContentHasMedia, IPartContentHasSupplementalData,
+        IContextListener, ISelectionChangedListener {
 
-       /** Constant <code>ID="eu.etaxonomy.taxeditor.editor.view.desc"{trunked}</code> */
-       public static final String ID = "eu.etaxonomy.taxeditor.editor.view.derivate.DerivateView";
+       /**
+     * Key used for storing a single DerivateView in a memento
+     */
+    private static final String DERIVATE_VIEW_MEMENTO_KEY = "derivateView";
 
-       private ConversationHolder conversation;
+    /**
+     * Key to to group mementos for every single DerivateView
+     */
+    private static final String DERIVATE_VIEWS_MEMENTO_KEY = "derivateViews";
 
-       protected TreeViewer viewer;
+    public static final String ID = "eu.etaxonomy.taxeditor.editor.view.derivate.DerivateView";
 
-       private SpecimenOrObservationBase<DerivedUnitFacadeCacheStrategy> derivate;
+       private ConversationHolder conversation;
+
+       private TreeViewer viewer;
 
     private boolean isDirty;
 
+    private final int dndOperations = DND.DROP_MOVE;
+
+    private DerivateLabelProvider labelProvider;
+
+    private Set<SingleRead> multiLinkSingleReads;
+
+    private ISelection selection = null;
+
+    /**
+     * Default constructor
+     */
+    public DerivateView() {
+        CdmStore.getContextManager().addContextListener(this);
+    }
+
     /* (non-Javadoc)
      * @see org.eclipse.ui.part.WorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite)
      */
@@ -50,23 +93,37 @@ public class DerivateView extends EditorPart implements IDirtyMarkableSelectionP
     public void createPartControl(Composite parent) {
         viewer = new TreeViewer(new Tree(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION));
         viewer.setContentProvider(new DerivateContentProvider());
-        viewer.setLabelProvider(new DerivateLabelProvider());
+        labelProvider = new DerivateLabelProvider();
+        labelProvider.setConversation(conversation);
+        viewer.setLabelProvider(labelProvider);
         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();
-
         getSite().registerContextMenu(menuManager, viewer);
-
         Control control = viewer.getControl();
         Menu menu = menuManager.createContextMenu(control);
-
         control.setMenu(menu);
 
+        generateMultiLinkSingleReads();
+        labelProvider.setMultiLinkSingleReads(multiLinkSingleReads);
+        IEditorInput editorInput = getEditorInput();
+        viewer.setInput(editorInput);
+        if(editorInput instanceof DerivateViewEditorInput){
+            SpecimenOrObservationBase<?> specimen = ((DerivateViewEditorInput) editorInput).getDerivate();
+            SpecimenOrObservationBase<?> rootElement = ((DerivateViewEditorInput) editorInput).getRootElement();
+            setPartName(labelProvider.getDerivateText(rootElement));
+            viewer.setSelection(new StructuredSelection(new TreeNode(specimen)));
+        }
 
-        viewer.setInput(getEditorInput());
+        //add drag'n'drop support
+        Transfer[] transfers = new Transfer[] {LocalSelectionTransfer.getTransfer(),};
+        viewer.addDragSupport(dndOperations, transfers, new DerivateDragListener(this));
+        viewer.addDropSupport(dndOperations, transfers, new DerivateDropListener(this));
     }
 
     /* (non-Javadoc)
@@ -88,6 +145,7 @@ public class DerivateView extends EditorPart implements IDirtyMarkableSelectionP
         monitor.worked(1);
         monitor.done();
         firePropertyChange(PROP_DIRTY);
+        refreshTree();
     }
 
     /* (non-Javadoc)
@@ -95,8 +153,6 @@ public class DerivateView extends EditorPart implements IDirtyMarkableSelectionP
      */
     @Override
     public void doSaveAs() {
-        // TODO Auto-generated method stub
-
     }
 
     /* (non-Javadoc)
@@ -104,7 +160,6 @@ public class DerivateView extends EditorPart implements IDirtyMarkableSelectionP
      */
     @Override
     public String getTitleToolTip() {
-        // TODO Auto-generated method stub
         return "Derivate View";
     }
 
@@ -113,14 +168,10 @@ public class DerivateView extends EditorPart implements IDirtyMarkableSelectionP
      */
     @Override
     public void init(IEditorSite site, IEditorInput input) throws PartInitException {
-        conversation = CdmStore.createConversation();
         setSite(site);
         setInput(input);
         if(input instanceof DerivateViewEditorInput){
-            derivate = ((DerivateViewEditorInput) input).getDerivate();
-        }
-        else{
-            throw new PartInitException("Invalid Input: Must be DerivateViewEditorInput");
+            conversation = ((DerivateViewEditorInput) input).getConversationHolder();
         }
     }
 
@@ -144,7 +195,6 @@ public class DerivateView extends EditorPart implements IDirtyMarkableSelectionP
      */
     @Override
     public boolean isSaveAsAllowed() {
-        // TODO Auto-generated method stub
         return false;
     }
 
@@ -154,8 +204,11 @@ public class DerivateView extends EditorPart implements IDirtyMarkableSelectionP
      */
     @Override
     public void setFocus() {
-        // TODO Auto-generated method stub
-
+        viewer.getControl().setFocus();
+        //make sure to bind again if maybe in another view the conversation was unbound
+        if(!conversation.isBound()){
+            conversation.bind();
+        }
     }
 
     /* (non-Javadoc)
@@ -163,8 +216,6 @@ public class DerivateView extends EditorPart implements IDirtyMarkableSelectionP
      */
     @Override
     public void update(CdmDataChangeMap changeEvents) {
-        // TODO Auto-generated method stub
-
     }
 
     /* (non-Javadoc)
@@ -175,14 +226,120 @@ public class DerivateView extends EditorPart implements IDirtyMarkableSelectionP
         return conversation;
     }
 
+    /**
+     * @return the viewer
+     */
+    public TreeViewer getViewer() {
+        return viewer;
+    }
+
     /* (non-Javadoc)
      * @see eu.etaxonomy.taxeditor.model.IDirtyMarkableSelectionProvider#changed(java.lang.Object)
      */
     @Override
     public void changed(Object element) {
-        firePropertyChange(IEditorPart.PROP_DIRTY);
-        viewer.setInput(getEditorInput());
         setDirty(true);
+        firePropertyChange(IEditorPart.PROP_DIRTY);
+        viewer.refresh();
+    }
+
+    /**
+     * Refreshes the derivate hierarchy tree
+     */
+    public void refreshTree(){
+        generateMultiLinkSingleReads();
+        labelProvider.setMultiLinkSingleReads(multiLinkSingleReads);
+        viewer.refresh();
+    }
+
+    private void generateMultiLinkSingleReads() {
+        Set<SingleRead> multiLinkSingleReads = new HashSet<SingleRead>();
+        for(Entry<SingleRead, Collection<Sequence>> entry:CdmStore.getService(ISequenceService.class).getSingleReadSequencesMap().entrySet()){
+            if(entry.getValue().size()>1){
+                multiLinkSingleReads.add(entry.getKey());
+            }
+        }
+        this.multiLinkSingleReads = multiLinkSingleReads;
+    }
+
+    /**
+     * @return a set of {@link SingleRead}s that have multiple parents
+     */
+    public Set<SingleRead> getMultiLinkSingleReads() {
+        return this.multiLinkSingleReads;
+    }
+
+    /* (non-Javadoc)
+     * @see eu.etaxonomy.taxeditor.model.IContextListener#contextAboutToStop(org.eclipse.ui.IMemento, org.eclipse.core.runtime.IProgressMonitor)
+     */
+    @Override
+    public void contextAboutToStop(IMemento memento, IProgressMonitor monitor) {
+    }
+
+    /* (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) {
+    }
+
+    /* (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);
+//                }
+    }
+
+    /* (non-Javadoc)
+     * @see eu.etaxonomy.taxeditor.model.IContextListener#contextRefresh(org.eclipse.core.runtime.IProgressMonitor)
+     */
+    @Override
+    public void contextRefresh(IProgressMonitor monitor) {
+    }
+
+    /* (non-Javadoc)
+     * @see eu.etaxonomy.taxeditor.model.IContextListener#workbenchShutdown(org.eclipse.ui.IMemento, org.eclipse.core.runtime.IProgressMonitor)
+     */
+    @Override
+    public void workbenchShutdown(IMemento memento, IProgressMonitor monitor) {
+//        if (!conversation.isBound()) {
+//            conversation.bind();
+//        }
+//        conversation.close();
+//        if(memento == null){
+//            return;
+//        }
+//
+//        IEditorInput input = getEditorInput();
+//        if(input instanceof IPersistable){
+//            memento.createChild(DERIVATE_VIEW_MEMENTO_KEY);
+//            ((IPersistable) input).saveState(memento);
+//        }
+    }
+
+    /* (non-Javadoc)
+     * @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
+     */
+    @Override
+    public void selectionChanged(SelectionChangedEvent event) {
+        this.selection  = event.getSelection();
+    }
+
+    /**
+     * @return the selection
+     */
+    public ISelection getSelection() {
+        return selection;
     }
 
 }