merge
[taxeditor.git] / eu.etaxonomy.taxeditor.editor / src / main / java / eu / etaxonomy / taxeditor / editor / view / descriptive / DescriptiveViewPart.java
index 64a4123639a1709da77b5ff6067d8c0c29d3c3e3..52fedd9b04960d13ab6ffd527757f956339ce945 100644 (file)
 package eu.etaxonomy.taxeditor.editor.view.descriptive;
 
 import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
 import java.util.Map;
+import java.util.Set;
+import java.util.UUID;
 
 import org.eclipse.jface.action.Action;
 import org.eclipse.jface.action.GroupMarker;
@@ -19,10 +23,14 @@ import org.eclipse.jface.action.IAction;
 import org.eclipse.jface.action.IToolBarManager;
 import org.eclipse.jface.action.MenuManager;
 import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.viewers.DoubleClickEvent;
+import org.eclipse.jface.viewers.IDoubleClickListener;
 import org.eclipse.jface.viewers.ISelection;
 import org.eclipse.jface.viewers.IStructuredSelection;
 import org.eclipse.jface.viewers.ITreeContentProvider;
 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.jface.viewers.Viewer;
 import org.eclipse.swt.SWT;
@@ -35,11 +43,21 @@ import org.eclipse.swt.widgets.Menu;
 import org.eclipse.swt.widgets.Tree;
 import org.eclipse.ui.IWorkbenchActionConstants;
 import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.PartInitException;
 
 import eu.etaxonomy.cdm.model.common.CdmBase;
 import eu.etaxonomy.cdm.model.description.DescriptionBase;
 import eu.etaxonomy.cdm.model.description.DescriptionElementBase;
 import eu.etaxonomy.cdm.model.description.IDescribable;
+import eu.etaxonomy.cdm.model.description.IndividualsAssociation;
+import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase;
+import eu.etaxonomy.cdm.model.taxon.Taxon;
+import eu.etaxonomy.taxeditor.bulkeditor.BulkEditor;
+import eu.etaxonomy.taxeditor.editor.EditorUtil;
+import eu.etaxonomy.taxeditor.editor.view.checklist.ChecklistEditor;
+import eu.etaxonomy.taxeditor.editor.view.derivate.DerivateView;
+import eu.etaxonomy.taxeditor.editor.view.derivate.DerivateViewEditorInput;
+import eu.etaxonomy.taxeditor.editor.view.media.MediaViewPart;
 import eu.etaxonomy.taxeditor.model.AbstractUtility;
 import eu.etaxonomy.taxeditor.model.FeatureNodeContainer;
 import eu.etaxonomy.taxeditor.model.FeatureNodeContainerTree;
@@ -47,6 +65,7 @@ import eu.etaxonomy.taxeditor.model.IPartContentHasDetails;
 import eu.etaxonomy.taxeditor.model.IPartContentHasFactualData;
 import eu.etaxonomy.taxeditor.model.IPartContentHasSupplementalData;
 import eu.etaxonomy.taxeditor.model.ImageResources;
+import eu.etaxonomy.taxeditor.model.MessagingUtils;
 import eu.etaxonomy.taxeditor.view.AbstractCdmEditorViewPart;
 import eu.etaxonomy.taxeditor.view.detail.DetailsViewPart;
 import eu.etaxonomy.taxeditor.view.supplementaldata.SupplementalDataViewPart;
@@ -77,12 +96,15 @@ public class DescriptiveViewPart extends AbstractCdmEditorViewPart implements IP
 
        protected int dndOperations = DND.DROP_COPY | DND.DROP_MOVE;
 
+    private DescriptiveContentProvider provider;
+
        /** {@inheritDoc} */
        @Override
        public void createViewer(Composite parent) {
                viewer = new TreeViewer(new Tree(parent, SWT.MULTI | SWT.H_SCROLL
                                | SWT.V_SCROLL | SWT.FULL_SELECTION));
-               viewer.setContentProvider(new DescriptiveContentProvider(featureNodeContainerCache));
+               provider = new DescriptiveContentProvider(featureNodeContainerCache);
+        viewer.setContentProvider(provider);
                viewer.setLabelProvider(new DescriptiveLabelProvider());
                viewer.setSorter(new DescriptiveViewerSorter());
                viewer.setAutoExpandLevel(2);
@@ -107,6 +129,49 @@ public class DescriptiveViewPart extends AbstractCdmEditorViewPart implements IP
 //             if(getEditor() != null){
 //                     viewer.setInput(getEditor().getEditorInput());
 //             }
+
+               viewer.addDoubleClickListener(new IDoubleClickListener() {
+            @Override
+            public void doubleClick(DoubleClickEvent event) {
+                //Open derivate editor when specimen description element is double clicked
+                TreeSelection selection = (TreeSelection) viewer.getSelection();
+                Iterator iterator = selection.iterator();
+                Set<UUID> specimenUuids = new HashSet<UUID>();
+                while(iterator.hasNext()){
+                    Object next = iterator.next();
+                    if(next instanceof IndividualsAssociation){
+                        SpecimenOrObservationBase<?> specimen = ((IndividualsAssociation)next).getAssociatedSpecimenOrObservation();
+                        if(specimen!=null){
+                            specimenUuids.add(specimen.getUuid());
+                        }
+                    }
+                }
+                try {
+                    if(!specimenUuids.isEmpty()){
+                        EditorUtil.open(new DerivateViewEditorInput(specimenUuids));
+                    }
+                } catch (PartInitException e) {
+                    MessagingUtils.error(DescriptiveViewPart.class, "Could not open Derivative Editor", e);
+                }
+
+
+                    //TODO: extend command to accept parameter to open editor
+//                    String commandId = "eu.etaxonomy.taxeditor.editor.handler.openDerivateView";
+//                    IHandlerService handlerService = (IHandlerService) AbstractUtility.getService(IHandlerService.class);
+//                    try {
+//                        handlerService.executeCommand(commandId, null);
+//                    } catch (ExecutionException e) {
+//                        MessagingUtils.error(DerivateSearchCompositeController.class, e);
+//                    } catch (NotDefinedException e) {
+//                        MessagingUtils.error(DerivateSearchCompositeController.class, e);
+//                    } catch (NotEnabledException e) {
+//                        MessagingUtils.error(DerivateSearchCompositeController.class, e);
+//                    } catch (NotHandledException e) {
+//                        MessagingUtils.error(DerivateSearchCompositeController.class, e);
+//                    }
+
+            }
+        });
        }
 
        /* (non-Javadoc)
@@ -149,8 +214,9 @@ public class DescriptiveViewPart extends AbstractCdmEditorViewPart implements IP
 
        /** {@inheritDoc} */
        @Override
-    public void selectionChanged(IWorkbenchPart part, ISelection selection) {
+    protected void selectionChanged_internal(IWorkbenchPart part, ISelection selection) {
                if(AbstractUtility.getActiveEditor() == null){
+                   setPartName(createPartTitle(null));
                        showEmptyPage();
                        return;
                }
@@ -158,23 +224,50 @@ public class DescriptiveViewPart extends AbstractCdmEditorViewPart implements IP
                if(part == this){
                    return;
                }
-               if(part instanceof DetailsViewPart || part instanceof SupplementalDataViewPart){
-                   // do not show empty page as these views are also used to edit the description selected in this view
-                   return;
+        if (part instanceof DetailsViewPart || part instanceof SupplementalDataViewPart
+                || part instanceof MediaViewPart) {
+            // do not show empty page as these views are also used to edit the
+            // description selected in this view
+            return;
+        }
+               // unpackage TreeNode of DerivateView
+               else if(part instanceof DerivateView){
+                   TreeNode treeNodeOfSelection = EditorUtil.getTreeNodeOfSelection(selection);
+                   if(treeNodeOfSelection!=null){
+                       selection = new StructuredSelection(treeNodeOfSelection.getValue());
+                   }
                }
-
+        else if(part instanceof ChecklistEditor){
+            if(selection instanceof StructuredSelection  && ((IStructuredSelection) selection).getFirstElement() instanceof Taxon){
+                Taxon taxon = (Taxon)((IStructuredSelection) selection).getFirstElement();
+                selection = new StructuredSelection(taxon);
+            }
+        }
                if(selection instanceof IStructuredSelection
                        && ((IStructuredSelection) selection).getFirstElement() instanceof IDescribable<?>
-                       && part instanceof IPartContentHasFactualData){
+                       && part instanceof IPartContentHasFactualData  && !(((IStructuredSelection) selection).getFirstElement() instanceof SpecimenOrObservationBase && part instanceof BulkEditor)){
                    featureNodeContainerCache.clear();
+               setPartName(createPartTitle(((IStructuredSelection) selection).getFirstElement()));
                    showViewer(part, (IStructuredSelection) selection);
                    return;
                }
                else{
+            setPartName(createPartTitle(null));
                    showEmptyPage();
                }
        }
 
+       protected String getViewName(){
+           return "Factual Data";
+       }
+
+       private String createPartTitle(Object selectedObject){
+           if(selectedObject!=null){
+               return getViewName()+": "+selectedObject;
+           }
+        return getViewName();
+       }
+
        /**
         *
         * @author n.hoffmann
@@ -227,6 +320,7 @@ public class DescriptiveViewPart extends AbstractCdmEditorViewPart implements IP
                for(FeatureNodeContainerTree containerTree : featureNodeContainerCache.values()){
                        containerTree.buildTree();
                }
+               viewer.expandToLevel(2);
                viewer.refresh();
 
                if(object instanceof DescriptionElementBase){
@@ -243,6 +337,9 @@ public class DescriptiveViewPart extends AbstractCdmEditorViewPart implements IP
                        StructuredSelection selection = new StructuredSelection(object);
                        viewer.setSelection(selection, true);
                }
+               if(part instanceof BulkEditor && !(object instanceof SpecimenOrObservationBase<?>)){
+                   ((BulkEditor) part).forceDirty();
+               }
 
                super.changed(object);
        }
@@ -262,4 +359,9 @@ public class DescriptiveViewPart extends AbstractCdmEditorViewPart implements IP
     public boolean onComplete() {
                return false;
        }
+
+       public void toggleShowOnlyIndividualAssociations(){
+           provider.toggleShowOnlyIndividualAssociations();
+           viewer.refresh();
+       }
 }