simplify taxon association section code
[taxeditor.git] / eu.etaxonomy.taxeditor.store / src / main / java / eu / etaxonomy / taxeditor / ui / section / occurrence / association / TaxonAssociationDetailElement.java
index 3cfb86048935c2a9a2a3c848a731a168406f37e8..34da746194fc0e6ea975b6606d2b577b1747c203 100644 (file)
@@ -11,37 +11,27 @@ package eu.etaxonomy.taxeditor.ui.section.occurrence.association;
 
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.HashSet;
 import java.util.Set;
 
-import org.eclipse.core.commands.Command;
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.commands.IParameter;
-import org.eclipse.core.commands.NotEnabledException;
-import org.eclipse.core.commands.NotHandledException;
-import org.eclipse.core.commands.Parameterization;
-import org.eclipse.core.commands.ParameterizedCommand;
-import org.eclipse.core.commands.common.NotDefinedException;
+import org.eclipse.jface.action.MenuManager;
 import org.eclipse.jface.viewers.ArrayContentProvider;
 import org.eclipse.jface.viewers.DoubleClickEvent;
 import org.eclipse.jface.viewers.IDoubleClickListener;
 import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.viewers.ListViewer;
 import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Control;
 import org.eclipse.swt.widgets.Label;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.commands.ICommandService;
-import org.eclipse.ui.handlers.IHandlerService;
+import org.eclipse.swt.widgets.Menu;
+import org.eclipse.ui.handlers.HandlerUtil;
 
 import eu.etaxonomy.cdm.api.facade.DerivedUnitFacade;
 import eu.etaxonomy.cdm.api.service.IOccurrenceService;
-import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper;
 import eu.etaxonomy.cdm.model.common.CdmBase;
-import eu.etaxonomy.cdm.model.description.IndividualsAssociation;
-import eu.etaxonomy.cdm.model.description.TaxonDescription;
 import eu.etaxonomy.cdm.model.name.SpecimenTypeDesignation;
 import eu.etaxonomy.cdm.model.name.TaxonNameBase;
+import eu.etaxonomy.cdm.model.occurrence.DeterminationEvent;
 import eu.etaxonomy.cdm.model.taxon.TaxonBase;
 import eu.etaxonomy.taxeditor.model.MessagingUtils;
 import eu.etaxonomy.taxeditor.store.CdmStore;
@@ -49,6 +39,7 @@ import eu.etaxonomy.taxeditor.ui.element.CdmFormFactory;
 import eu.etaxonomy.taxeditor.ui.element.ICdmFormElement;
 import eu.etaxonomy.taxeditor.ui.element.LayoutConstants;
 import eu.etaxonomy.taxeditor.ui.section.AbstractCdmDetailElement;
+import eu.etaxonomy.taxeditor.view.CdmViewerChooser;
 
 /**
  * @author pplitzner
@@ -57,10 +48,6 @@ import eu.etaxonomy.taxeditor.ui.section.AbstractCdmDetailElement;
  */
 public class TaxonAssociationDetailElement extends AbstractCdmDetailElement<DerivedUnitFacade> implements IDoubleClickListener{
 
-
-    private TableViewer associationsViewer;
-    private TableViewer typeDesignationViewer;
-
     public TaxonAssociationDetailElement(CdmFormFactory formFactory, ICdmFormElement formElement) {
         super(formFactory, formElement);
     }
@@ -71,45 +58,57 @@ public class TaxonAssociationDetailElement extends AbstractCdmDetailElement<Deri
 
         //TODO add context menu for deleting associations
 
-        Label associationsLabel = formFactory.createLabel(getLayoutComposite(), "Individuals Associations");
-        associationsLabel.setLayoutData(LayoutConstants.FILL_HORIZONTALLY(2, 1));
-
-        associationsViewer = new TableViewer(getLayoutComposite(), SWT.FULL_SELECTION);
-        associationsViewer.getTable().setLayoutData(LayoutConstants.FILL_HORIZONTALLY(2, 1));
-        associationsViewer.setContentProvider(new ArrayContentProvider());
-        Collection<IndividualsAssociation> individualsAssociations = CdmStore.getService(IOccurrenceService.class).listIndividualsAssociations(entity.innerDerivedUnit(), null, null, null, null);
-        //TODO implement service method for this which is just used in the label provider
-        Collection<TaxonBase<?>> associatedTaxa = new HashSet<TaxonBase<?>>();
-        for (IndividualsAssociation individualsAssociation : individualsAssociations) {
-            if(individualsAssociation.getInDescription().isInstanceOf(TaxonDescription.class)){
-                TaxonDescription taxonDescription = HibernateProxyHelper.deproxy(individualsAssociation.getInDescription(), TaxonDescription.class);
-                associatedTaxa.add(taxonDescription.getTaxon());
-            }
-        }
-        associationsViewer.setInput(associatedTaxa);
-        associationsViewer.addDoubleClickListener(this);
-
-        Label typeLabel = formFactory.createLabel(getLayoutComposite(), "Type Designations");
-        typeLabel.setLayoutData(LayoutConstants.FILL_HORIZONTALLY(2, 1));
-
-        typeDesignationViewer = new TableViewer(getLayoutComposite(), SWT.FULL_SELECTION);
-        typeDesignationViewer.getTable().setLayoutData(LayoutConstants.FILL_HORIZONTALLY(2, 1));
-        typeDesignationViewer.setContentProvider(new ArrayContentProvider());
+        Collection<TaxonBase<?>> associatedTaxa = CdmStore.getService(IOccurrenceService.class).listIndividualsAssociationTaxa(entity.innerDerivedUnit(), null, null, null, null);
         Collection<SpecimenTypeDesignation> typeDesignations = CdmStore.getService(IOccurrenceService.class).listTypeDesignations(entity.innerDerivedUnit(), null, null, null, null);
-        //TODO implement service method for this which is just used in the label provider
-        Collection<TaxonBase<?>> typedTaxa = new HashSet<TaxonBase<?>>();
-        for (SpecimenTypeDesignation specimenTypeDesignation : typeDesignations) {
-            for (TaxonNameBase taxonNameBase : specimenTypeDesignation.getTypifiedNames()) {
-                Set taxa = taxonNameBase.getTaxa();
-                for (Object taxon : taxa) {
-                    if(taxon instanceof CdmBase && ((CdmBase)taxon).isInstanceOf(TaxonBase.class)){
-                        typedTaxa.add(HibernateProxyHelper.deproxy(taxon, TaxonBase.class));
-                    }
-                }
-            }
+        Collection<DeterminationEvent> determinationEvents = CdmStore.getService(IOccurrenceService.class).listDeterminationEvents(entity.innerDerivedUnit(), null, null, null, null);
+
+        Collection<CdmBase> associations = new ArrayList<>();
+        associations.addAll(associatedTaxa);
+        associations.addAll(typeDesignations);
+        associations.addAll(determinationEvents);
+        
+        if(associatedTaxa.isEmpty() && typeDesignations.isEmpty() && determinationEvents.isEmpty()){
+            Label label = formFactory.createLabel(getLayoutComposite(), "No associations");
+            label.setLayoutData(LayoutConstants.FILL_HORIZONTALLY(2, 1));
+            return;
+        }
+        if(!associations.isEmpty()){
+               ListViewer viewer = new ListViewer(getLayoutComposite(), SWT.SINGLE);
+               viewer.getList().setLayoutData(LayoutConstants.FILL_HORIZONTALLY(2, 1));
+               viewer.setContentProvider(new ArrayContentProvider());
+               viewer.setLabelProvider(new LabelProvider(){
+                       @Override
+                       public String getText(Object element) {
+                               if(element instanceof TaxonBase){
+                                       return "Associated with "+element.toString();
+                               }
+                               else if(element instanceof DeterminationEvent){
+                        DeterminationEvent determinationEvent = (DeterminationEvent)element;
+                        if(determinationEvent.getTaxon()!=null){
+                            return "Determined as taxon "+determinationEvent.getTaxon();
+                        }
+                        if(determinationEvent.getTaxonName()!=null){
+                            return "Determined as name "+determinationEvent.getTaxonName();
+                        }
+                               }
+                               else if(element instanceof SpecimenTypeDesignation){
+                        SpecimenTypeDesignation typeDesignation = (SpecimenTypeDesignation)element;
+                        String label = typeDesignation.getTypeStatus()!=null?typeDesignation.getTypeStatus().getLabel()+" of ":"Type of ";
+                        Set<TaxonNameBase> typifiedNames = typeDesignation.getTypifiedNames();
+                        for (TaxonNameBase taxonNameBase : typifiedNames) {
+                            label += taxonNameBase+", ";
+                        }
+                        if(label.endsWith(", ")){
+                            label = label.substring(0, label.length()-2);
+                        }
+                        return label;
+                               }
+                               return "";
+                       }
+               });
+               viewer.setInput(associations);
+               viewer.addDoubleClickListener(this);
         }
-        typeDesignationViewer.setInput(typedTaxa);
-        typeDesignationViewer.addDoubleClickListener(this);
     }
 
     /** {@inheritDoc} */
@@ -118,53 +117,29 @@ public class TaxonAssociationDetailElement extends AbstractCdmDetailElement<Deri
         //empty
     }
 
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.viewers.IDoubleClickListener#doubleClick(org.eclipse.jface.viewers.DoubleClickEvent)
-     */
     @Override
     public void doubleClick(DoubleClickEvent event) {
-        if(associationsViewer.getSelection() instanceof IStructuredSelection){
-            Object firstElement = ((IStructuredSelection) associationsViewer.getSelection()).getFirstElement();
-            if(firstElement instanceof TaxonBase<?>){
-                TaxonBase<?> taxonBase = (TaxonBase<?>)firstElement;
-                String commandId = "eu.etaxonomy.taxeditor.editor.openTaxonEditor";
-
-
-                ArrayList parameters = new ArrayList();
-                IParameter iparam = null;
-
-                //get the command from plugin.xml
-                IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
-                ICommandService cmdService = (ICommandService)window.getService(ICommandService.class);
-                Command cmd = cmdService.getCommand(commandId);
-
-                //get the parameter
-                try {
-                    iparam = cmd.getParameter("eu.etaxonomy.taxeditor.editor.taxonParameter");
-                } catch (NotDefinedException e1) {
-                    MessagingUtils.error(this.getClass(), "Command not defined", e1);
+        if(event.getSelection() instanceof IStructuredSelection){
+            Object firstElement = ((IStructuredSelection) event.getSelection()).getFirstElement();
+            if(firstElement instanceof SpecimenTypeDesignation){
+               SpecimenTypeDesignation typeDesignation = (SpecimenTypeDesignation)firstElement;
+               Set<TaxonNameBase> typifiedNames = typeDesignation.getTypifiedNames();
+               if(typifiedNames.size()==1){
+                       firstElement = typifiedNames.iterator().next();
+               }
+               if(typifiedNames.size()==0 || typifiedNames.size()>=2){
+                       MessagingUtils.informationDialog("Could not open name", "Type designation has either 0 or more than 1 names associated");
+               }
+            }
+            else if(firstElement instanceof DeterminationEvent){
+                if(((DeterminationEvent) firstElement).getTaxon()!=null){
+                    firstElement = ((DeterminationEvent) firstElement).getTaxon();
                 }
-                Parameterization params = new Parameterization(iparam, (taxonBase).getUuid().toString());
-                parameters.add(params);
-
-                //build the parameterized command
-                ParameterizedCommand pc = new ParameterizedCommand(cmd, (Parameterization[]) parameters.toArray(new Parameterization[parameters.size()]));
-
-                //execute the command
-                IHandlerService handlerService = (IHandlerService)window.getService(IHandlerService.class);
-                try {
-                    handlerService.executeCommand(pc, null);
-                } catch (ExecutionException e) {
-                    MessagingUtils.error(TaxonAssociationDetailElement.class, e);
-                } catch (NotDefinedException e) {
-                    MessagingUtils.error(TaxonAssociationDetailElement.class, e);
-                } catch (NotEnabledException e) {
-                    MessagingUtils.error(TaxonAssociationDetailElement.class, e);
-                } catch (NotHandledException e) {
-                    MessagingUtils.error(TaxonAssociationDetailElement.class, e);
+                else if(((DeterminationEvent) firstElement).getTaxonName()!=null){
+                       firstElement = ((DeterminationEvent) firstElement).getTaxonName();
                 }
             }
+            new CdmViewerChooser(event.getViewer().getControl().getShell()).chooseViewer(firstElement);
         }
     }
-
 }