Fix selection handling for DetailsView
[taxeditor.git] / eu.etaxonomy.taxeditor.store / src / main / java / eu / etaxonomy / taxeditor / view / detail / DetailsViewPart.java
index d95401969d5395a93c190252653c16c8e7c9277c..f6ff7123b8f4e478f67d2deb602da4caf3c5f755 100644 (file)
@@ -1,4 +1,3 @@
-// $Id$
 /**
 * Copyright (C) 2007 EDIT
 * European Distributed Institute of Taxonomy
 
 package eu.etaxonomy.taxeditor.view.detail;
 
+import java.util.Collection;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.e4.ui.model.application.ui.basic.MPart;
+import org.eclipse.e4.ui.workbench.modeling.EPartService;
 import org.eclipse.jface.viewers.ISelection;
 import org.eclipse.jface.viewers.IStructuredSelection;
 import org.eclipse.jface.viewers.TreeNode;
 import org.eclipse.jface.viewers.Viewer;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IMemento;
 import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.internal.e4.compatibility.CompatibilityPart;
 
 import eu.etaxonomy.cdm.api.conversation.IConversationEnabled;
 import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper;
 import eu.etaxonomy.cdm.model.common.CdmBase;
 import eu.etaxonomy.cdm.model.description.Feature;
 import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase;
-import eu.etaxonomy.taxeditor.Messages;
+import eu.etaxonomy.taxeditor.l10n.Messages;
 import eu.etaxonomy.taxeditor.model.AbstractUtility;
 import eu.etaxonomy.taxeditor.model.FeatureNodeContainer;
+import eu.etaxonomy.taxeditor.model.IContextListener;
 import eu.etaxonomy.taxeditor.model.IPartContentHasDetails;
 import eu.etaxonomy.taxeditor.model.IPartContentHasSupplementalData;
+import eu.etaxonomy.taxeditor.store.internal.TaxeditorStorePlugin;
 import eu.etaxonomy.taxeditor.view.AbstractCdmEditorViewPart;
 
 /**
@@ -37,13 +45,16 @@ import eu.etaxonomy.taxeditor.view.AbstractCdmEditorViewPart;
  * @created Jun 10, 2010
  * @version 1.0
  */
-public class DetailsViewPart extends AbstractCdmEditorViewPart implements IPartContentHasSupplementalData{
+public class DetailsViewPart extends AbstractCdmEditorViewPart implements IPartContentHasSupplementalData, IContextListener{
 
        /** Constant <code>ID="eu.etaxonomy.taxeditor.editor.forms.det"{trunked}</code> */
        public static String ID = "eu.etaxonomy.taxeditor.view.detail"; //$NON-NLS-1$
 
        private DetailsViewer viewer;
 
+       //FIXME E4: this can be removed when working with E4 event system
+       private Object selectionProvidingPart;
+
        /** {@inheritDoc} */
        @Override
        public void createViewer(Composite parent) {
@@ -53,15 +64,46 @@ public class DetailsViewPart extends AbstractCdmEditorViewPart implements IPartC
        }
 
        @Override
-    protected void selectionChanged_internal(IWorkbenchPart part, ISelection selection){
-           if(AbstractUtility.getActiveEditor() == null && !(AbstractUtility.getActivePart() instanceof IConversationEnabled)){
+    protected void selectionChanged_internal(IWorkbenchPart workbenchPart, ISelection selection){
+           Object part = workbenchPart;
+           Object wrappedPart = AbstractUtility.getE4WrappedPart(part);
+           if(wrappedPart!=null){
+               part = wrappedPart;
+           }
+           if(AbstractUtility.getActiveE4Editor() == null && !(AbstractUtility.getActiveE4Part() instanceof IConversationEnabled)){
             showEmptyPage();
             return;
         }
 
-        if(part == this){
-            return;
-        }
+           //special case where the details view still open with details about the closed object #5495
+           try{
+               boolean isSelectionProvidingPartStillActive = false;
+               if(selectionProvidingPart!=null){
+                   EPartService partService = TaxeditorStorePlugin.getDefault().getWorkbench().getService(EPartService.class);
+                   Collection<MPart> parts = partService.getParts();
+                   for (MPart mPart : parts) {
+                       Object object = mPart.getObject();
+                       if(object instanceof CompatibilityPart){
+                           object = ((CompatibilityPart) object).getPart();
+                       }
+                       if(selectionProvidingPart.equals(object)){
+                           isSelectionProvidingPartStillActive = true;
+                           break;
+                       }
+                   }
+                   if(!isSelectionProvidingPartStillActive &&
+                           selection instanceof IStructuredSelection && ((IStructuredSelection) selection).getFirstElement() !=null){
+                       showEmptyPage();
+                       return;
+                   }
+               }
+           }catch(IllegalStateException e){
+               //nothing
+           }
+
+           if(part == this){
+               return;
+           }
 
         if(!(selection instanceof IStructuredSelection)){
             return;
@@ -84,6 +126,7 @@ public class DetailsViewPart extends AbstractCdmEditorViewPart implements IPartC
                     return;
                 }
             }
+            selectionProvidingPart = part;
             showViewer(part, structuredSelection);
         }else{
             showEmptyPage();
@@ -114,6 +157,7 @@ public class DetailsViewPart extends AbstractCdmEditorViewPart implements IPartC
 
        @Override
        public void showEmptyPage() {
+           selectionProvidingPart = null;
            viewer.setSelection(null);
            super.showEmptyPage();
        }
@@ -147,4 +191,43 @@ public class DetailsViewPart extends AbstractCdmEditorViewPart implements IPartC
     public boolean onComplete() {
                return true;
        }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void contextAboutToStop(IMemento memento, IProgressMonitor monitor) {
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void contextStop(IMemento memento, IProgressMonitor monitor) {
+        showEmptyPage();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void contextStart(IMemento memento, IProgressMonitor monitor) {
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void contextRefresh(IProgressMonitor monitor) {
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void workbenchShutdown(IMemento memento, IProgressMonitor monitor) {
+    }
+
+
+
 }