- when searching for a taxon also the indirectly associated specimens of the derivat...
[taxeditor.git] / eu.etaxonomy.taxeditor.store / src / main / java / eu / etaxonomy / taxeditor / view / derivateSearch / DerivateSearchCompositeController.java
index ad861b21a1f882301c665f6f537cfeaa09c1de81..460ee23cfc7247c69eb1057cada1934226453c14 100644 (file)
@@ -10,8 +10,6 @@
 package eu.etaxonomy.taxeditor.view.derivateSearch;
 
 import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.LinkedHashMap;
 import java.util.List;
 
 import org.eclipse.core.commands.ExecutionException;
@@ -29,14 +27,17 @@ import org.eclipse.swt.widgets.Listener;
 import org.eclipse.swt.widgets.Widget;
 import org.eclipse.ui.handlers.IHandlerService;
 
-import eu.etaxonomy.cdm.api.facade.DerivedUnitFacadeCacheStrategy;
+import eu.etaxonomy.cdm.api.conversation.ConversationHolder;
 import eu.etaxonomy.cdm.api.service.IOccurrenceService;
-import eu.etaxonomy.cdm.api.service.config.IIdentifiableEntityServiceConfigurator;
-import eu.etaxonomy.cdm.api.service.config.IdentifiableServiceConfiguratorImpl;
+import eu.etaxonomy.cdm.api.service.config.FindOccurrencesConfigurator;
 import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase;
 import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationType;
+import eu.etaxonomy.cdm.model.taxon.Taxon;
 import eu.etaxonomy.taxeditor.model.AbstractUtility;
+import eu.etaxonomy.taxeditor.model.MessagingUtils;
 import eu.etaxonomy.taxeditor.store.CdmStore;
+import eu.etaxonomy.taxeditor.store.SearchManager;
+import eu.etaxonomy.taxeditor.ui.dialog.selection.SelectionDialogFactory;
 import eu.etaxonomy.taxeditor.ui.mvc.combo.EnumTermComboController;
 
 /**
@@ -48,9 +49,10 @@ import eu.etaxonomy.taxeditor.ui.mvc.combo.EnumTermComboController;
 public class DerivateSearchCompositeController implements Listener{
 
     private final DerivateSearchComposite derivateSearchComposite;
-    private IIdentifiableEntityServiceConfigurator<SpecimenOrObservationBase<DerivedUnitFacadeCacheStrategy>> configurator;
-    private EnumTermComboController<SpecimenOrObservationType> enumTermComboController;
+    private EnumTermComboController<SpecimenOrObservationType> comboSpecimenTypeController;
     private final DerivateSearchView derivateSearchView;
+       private DerivateLabelProvider labelProvider;
+       private Taxon selectedTaxon;
 
     /**
      * @param parent
@@ -63,23 +65,22 @@ public class DerivateSearchCompositeController implements Listener{
     }
 
     private void init(){
-        LinkedHashMap<SpecimenOrObservationType, String> orderedTerms = AbstractUtility.orderTerms(Arrays.asList(SpecimenOrObservationType.values()));
-        String[] comboItems = new String[orderedTerms.size()];
-        int count = 0;
-        for(String termMessage:orderedTerms.values()){
-            comboItems[count] = termMessage;
-            count++;
-        }
-
-        enumTermComboController = new EnumTermComboController<SpecimenOrObservationType>(derivateSearchComposite.getComboDerivateType(), null, null, SpecimenOrObservationType.class, 0);
-        enumTermComboController.setSelection(SpecimenOrObservationType.Unknown);
+        //derivate type combo
+        comboSpecimenTypeController = new EnumTermComboController<SpecimenOrObservationType>(derivateSearchComposite.getComboDerivateType(), null, null, SpecimenOrObservationType.class, 0);
+        comboSpecimenTypeController.setSelection(SpecimenOrObservationType.Unknown);
 
+        //add listeners
         derivateSearchComposite.getSearchField().addListener(SWT.KeyDown, this);
         derivateSearchComposite.getButtonSearch().addListener(SWT.Selection, this);
+        derivateSearchComposite.getBtnBrowseTaxa().addListener(SWT.Selection, this);
+        derivateSearchComposite.getBtnClearTaxon().addListener(SWT.Selection, this);
+
 
+        //result table
         TableViewer resultViewer = derivateSearchComposite.getResultViewer();
         resultViewer.setContentProvider(new ArrayContentProvider());
-        resultViewer.setLabelProvider(new DerivateLabelProvider());
+        labelProvider = new DerivateLabelProvider();
+        resultViewer.setLabelProvider(labelProvider);
         resultViewer.addDoubleClickListener(new IDoubleClickListener() {
             @Override
             public void doubleClick(DoubleClickEvent event) {
@@ -89,18 +90,17 @@ public class DerivateSearchCompositeController implements Listener{
                 try {
                     handlerService.executeCommand(commandId, null);
                 } catch (ExecutionException e) {
-                    AbstractUtility.error(DerivateSearchCompositeController.class, e);
+                    MessagingUtils.error(DerivateSearchCompositeController.class, e);
                 } catch (NotDefinedException e) {
-                    AbstractUtility.error(DerivateSearchCompositeController.class, e);
+                    MessagingUtils.error(DerivateSearchCompositeController.class, e);
                 } catch (NotEnabledException e) {
-                    AbstractUtility.error(DerivateSearchCompositeController.class, e);
+                    MessagingUtils.error(DerivateSearchCompositeController.class, e);
                 } catch (NotHandledException e) {
-                    AbstractUtility.error(DerivateSearchCompositeController.class, e);
+                    MessagingUtils.error(DerivateSearchCompositeController.class, e);
                 }
 
             }
         });
-        configurator = new IdentifiableServiceConfiguratorImpl<SpecimenOrObservationBase<DerivedUnitFacadeCacheStrategy>>();
 
     }
 
@@ -109,21 +109,44 @@ public class DerivateSearchCompositeController implements Listener{
             derivateSearchView.setFocus(); //rebind the conversation
         }
 
-        configurator.setTitleSearchString(derivateSearchComposite.getSearchField().getText());
-        SpecimenOrObservationType type = enumTermComboController.getSelection();
-        //filter by specimen type
-        List<SpecimenOrObservationBase> results = CdmStore.getSearchManager().findOccurrencesByType(configurator, type);
+        String queryString = derivateSearchComposite.getSearchField().getText();
+        SpecimenOrObservationType specimenType = comboSpecimenTypeController.getSelection();
+
+        FindOccurrencesConfigurator config = new FindOccurrencesConfigurator();
+        config.setAssociatedTaxonUuid(selectedTaxon!=null?selectedTaxon.getUuid():null);
+        config.setSpecimenType(specimenType==SpecimenOrObservationType.Unknown?null:specimenType);//unknown := all types
+        config.setTitleSearchString(queryString);
+        if(selectedTaxon!=null){
+            config.setRetrieveIndirectlyAssociatedSpecimens(true);
+            config.setSpecimenType(null);
+        }
+
+        SearchManager searchManager = new SearchManager();
+        List<SpecimenOrObservationBase> occurrences = searchManager.findOccurrences(config);
+
+        //filter out specimens of wrong type (only if an associated taxon was selected)
+        if(selectedTaxon!=null){
+            List<SpecimenOrObservationBase> specimensOfCorrectType = new ArrayList<SpecimenOrObservationBase>();
+            for(SpecimenOrObservationBase<?> occurrence:occurrences){
+                if(occurrence.getRecordBasis().equals(comboSpecimenTypeController.getSelection())
+                        || occurrence.getRecordBasis().isKindOf(comboSpecimenTypeController.getSelection())){
+                    specimensOfCorrectType.add(occurrence);
+                }
+            }
+            occurrences = specimensOfCorrectType;
+        }
+
         //filter out assigned specimens
         if(derivateSearchComposite.getBtnFilterUndeterminedSpecimen().getSelection()){
             List<SpecimenOrObservationBase> specimensWithNoDetermination = new ArrayList<SpecimenOrObservationBase>();
-            for(SpecimenOrObservationBase<?> result:results){
+            for(SpecimenOrObservationBase<?> result:occurrences){
                 if(CdmStore.getService(IOccurrenceService.class).countDeterminations(result, null)==0){
                     specimensWithNoDetermination.add(result);
                 }
             }
-            results = specimensWithNoDetermination;
+            occurrences = specimensWithNoDetermination;
         }
-        derivateSearchComposite.getResultViewer().setInput(results);
+        derivateSearchComposite.getResultViewer().setInput(occurrences);
     }
 
     /* (non-Javadoc)
@@ -136,6 +159,16 @@ public class DerivateSearchCompositeController implements Listener{
                 || (eventSource == derivateSearchComposite.getSearchField() && event.keyCode == SWT.CR)){
             searchDerivates();
         }
+        else if(eventSource==derivateSearchComposite.getBtnBrowseTaxa()){
+            selectedTaxon = SelectionDialogFactory.getSelectionFromDialog(Taxon.class, derivateSearchView.getSite().getShell(), derivateSearchView.getConversationHolder(), null);
+            if(selectedTaxon!=null){
+                derivateSearchComposite.getTextTaxonName().setText(selectedTaxon.getTitleCache());
+            }
+        }
+        else if(eventSource==derivateSearchComposite.getBtnClearTaxon()){
+            selectedTaxon = null;
+            derivateSearchComposite.getTextTaxonName().setText("");
+        }
     }
 
     /**
@@ -152,10 +185,13 @@ public class DerivateSearchCompositeController implements Listener{
      * Resets all input fields
      */
     public void reset(){
-        derivateSearchComposite.getResultViewer().setInput(null);
-        derivateSearchComposite.getSearchField().setText("");
-        enumTermComboController.setSelection(SpecimenOrObservationType.Unknown);
-        derivateSearchComposite.getComboDerivateType().deselectAll();
+        if(!derivateSearchComposite.isDisposed()){
+            derivateSearchComposite.getResultViewer().setInput(null);
+            derivateSearchComposite.getSearchField().setText("");
+            derivateSearchComposite.getComboDerivateType().deselectAll();
+            comboSpecimenTypeController.setSelection(SpecimenOrObservationType.Unknown);
+        }
+        selectedTaxon = null;
     }
 
     public TableViewer getResultViewer() {
@@ -166,4 +202,11 @@ public class DerivateSearchCompositeController implements Listener{
         derivateSearchComposite.getResultViewer().getControl().setFocus();
     }
 
+    /**
+     * @param conversationHolder
+     */
+    public void setConversation(ConversationHolder conversationHolder) {
+        labelProvider.setConversation(conversationHolder);
+    }
+
 }