adapt to cdmlib changes
[taxeditor.git] / eu.etaxonomy.taxeditor.editor / src / main / java / eu / etaxonomy / taxeditor / editor / view / derivate / searchFilter / DerivateSearchCompositeController.java
index 50d91e66a0ab44512791f7557a24134d281a36d4..d03d680626d7e6a99fbd0db9a7f3d136b5fa07d0 100644 (file)
@@ -1,4 +1,3 @@
-// $Id$
 /**
 * Copyright (C) 2013 EDIT
 * European Distributed Institute of Taxonomy
@@ -9,11 +8,10 @@
 */
 package eu.etaxonomy.taxeditor.editor.view.derivate.searchFilter;
 
-import java.util.ArrayList;
-import java.util.Collection;
 import java.util.List;
 import java.util.UUID;
 
+import org.eclipse.core.runtime.NullProgressMonitor;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.layout.GridData;
 import org.eclipse.swt.widgets.Composite;
@@ -22,13 +20,16 @@ import org.eclipse.swt.widgets.Listener;
 import org.eclipse.swt.widgets.Widget;
 
 import eu.etaxonomy.cdm.api.conversation.ConversationHolder;
-import eu.etaxonomy.cdm.api.service.IOccurrenceService;
+import eu.etaxonomy.cdm.api.service.ITaxonService;
 import eu.etaxonomy.cdm.api.service.config.FindOccurrencesConfigurator;
+import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper;
 import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase;
 import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationType;
 import eu.etaxonomy.cdm.model.taxon.Taxon;
 import eu.etaxonomy.cdm.model.taxon.TaxonBase;
+import eu.etaxonomy.cdm.persistence.query.AssignmentStatus;
 import eu.etaxonomy.taxeditor.editor.view.derivate.DerivateView;
+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;
@@ -65,11 +66,19 @@ public class DerivateSearchCompositeController implements Listener{
         derivateSearchComposite.getButtonSearch().addListener(SWT.Selection, this);
         derivateSearchComposite.getBtnBrowseTaxa().addListener(SWT.Selection, this);
         derivateSearchComposite.getBtnClearTaxon().addListener(SWT.Selection, this);
-        derivateSearchComposite.getButtonToggleLink().addListener(SWT.Selection, this);
 
     }
 
     private void searchDerivates(){
+        if(derivativeEditor.isDirty()){
+            boolean confirm = MessagingUtils.confirmDialog("Unsaved changes", "You have to save before performing this action. Save now?");
+            if(confirm){
+                derivativeEditor.save(new NullProgressMonitor());
+            }
+            else{
+                return;
+            }
+        }
         String queryString = derivateSearchComposite.getSearchField().getText();
         SpecimenOrObservationType specimenType = comboSpecimenTypeController.getSelection();
 
@@ -80,47 +89,27 @@ public class DerivateSearchCompositeController implements Listener{
         if(selectedTaxon!=null){
             config.setSpecimenType(null);
         }
+        switch (derivateSearchComposite.getComboTaxonAssignment().getSelectionIndex()) {
+        case DerivateSearchComposite.ALL_SPECIMENS:
+            config.setAssignmentStatus(AssignmentStatus.ALL_SPECIMENS);
+            break;
+        case DerivateSearchComposite.ASSIGNED_SPECIMENS:
+            config.setAssignmentStatus(AssignmentStatus.ASSIGNED_SPECIMENS);
+            break;
+        case DerivateSearchComposite.UNASSIGNED_SPECIMENS:
+            config.setAssignmentStatus(AssignmentStatus.UNASSIGNED_SPECIMENS);
+            break;
+        default:
+            break;
+        }
+        if(derivativeEditor.getCdmEntitySession()!=null){
+            derivativeEditor.getCdmEntitySession().dispose();
+            derivativeEditor.getCdmEntitySession().bind();
+        }
 
         SearchManager searchManager = new SearchManager();
         List<SpecimenOrObservationBase> occurrences = searchManager.findOccurrences(config, true);
-
-        //filter out specimens of wrong type (only if an associated taxon was selected)
-        if(selectedTaxon!=null && !specimenType.equals(SpecimenOrObservationType.Unknown)){
-            List<SpecimenOrObservationBase> specimensOfCorrectType = new ArrayList<SpecimenOrObservationBase>();
-            for(SpecimenOrObservationBase<?> occurrence:occurrences){
-                if(occurrence.getRecordBasis().equals(specimenType)
-                        || occurrence.getRecordBasis().isKindOf(specimenType)){
-                    specimensOfCorrectType.add(occurrence);
-                }
-            }
-            occurrences = specimensOfCorrectType;
-        }
-
-        //filter out (un-)assigned specimens
-        if(selectedTaxon==null){
-            int selectionIndex = derivateSearchComposite.getComboTaxonAssignment().getSelectionIndex();
-            List<SpecimenOrObservationBase<?>> specimenWithAssociations = new ArrayList<SpecimenOrObservationBase<?>>();
-            if(selectionIndex!=DerivateSearchComposite.ALL_SPECIMENS){
-                for (SpecimenOrObservationBase specimenOrObservationBase : occurrences) {
-                    Collection<TaxonBase<?>> associatedTaxa = CdmStore.getService(IOccurrenceService.class).listAssociatedTaxa(specimenOrObservationBase, null, null, null, null);
-                    if(!associatedTaxa.isEmpty()){
-                        specimenWithAssociations.add(specimenOrObservationBase);
-                        specimenWithAssociations.addAll(CdmStore.getService(IOccurrenceService.class).getFieldUnits(specimenOrObservationBase.getUuid()));
-                    }
-                }
-            }
-            if(selectionIndex==DerivateSearchComposite.UNASSIGNED_SPECIMENS){
-                occurrences.removeAll(specimenWithAssociations);
-            }
-            else if(selectionIndex==DerivateSearchComposite.ASSIGNED_SPECIMENS){
-                occurrences = new ArrayList<SpecimenOrObservationBase>(specimenWithAssociations);
-            }
-        }
-        List<UUID> derivateUuids = new ArrayList<UUID>();
-        for (SpecimenOrObservationBase specimenOrObservationBase : occurrences) {
-            derivateUuids.add(specimenOrObservationBase.getUuid());
-        }
-        derivativeEditor.updateRootEntities(derivateUuids);
+        derivativeEditor.updateRootEntities(occurrences);
     }
 
     @Override
@@ -131,7 +120,8 @@ public class DerivateSearchCompositeController implements Listener{
             searchDerivates();
         }
         else if(eventSource==derivateSearchComposite.getBtnBrowseTaxa()){
-            selectedTaxon = SelectionDialogFactory.getSelectionFromDialog(Taxon.class, this.derivateSearchComposite.getShell(), derivativeEditor.getConversationHolder(), null);
+            selectedTaxon = SelectionDialogFactory.getSelectionFromDialog(Taxon.class, this.derivateSearchComposite.getShell(), //derivativeEditor.getConversationHolder(),
+                    null);
             if(selectedTaxon!=null){
                 derivateSearchComposite.getTextTaxonName().setText(selectedTaxon.getTitleCache());
             }
@@ -141,14 +131,11 @@ public class DerivateSearchCompositeController implements Listener{
         }
         else if(eventSource==derivateSearchComposite.getBtnClearTaxon()){
             selectedTaxon = null;
-            derivateSearchComposite.getTextTaxonName().setText("");
+            derivateSearchComposite.getTextTaxonName().setText(""); //$NON-NLS-1$
             derivateSearchComposite.getComboTaxonAssignment().select(DerivateSearchComposite.ALL_SPECIMENS);
             derivateSearchComposite.getComboTaxonAssignment().setEnabled(true);
             derivateSearchComposite.getLbltaxonAssignment().setEnabled(true);
         }
-        else if(eventSource==derivateSearchComposite.getButtonToggleLink()){
-            derivativeEditor.toggleListenToSelectionChange();
-        }
     }
 
     /**
@@ -168,12 +155,24 @@ public class DerivateSearchCompositeController implements Listener{
         derivateSearchComposite.setLayoutData(layoutData);
     }
 
+    /**
+     * Checks whether or not the search criteria are set to their default value.<br>
+     * This does not consider the title search field.
+     * @return <code>true</code> if search criteria are set to default.
+     */
+    public boolean isDefaultSearch(){
+        boolean isDefault = true;
+        isDefault &= comboSpecimenTypeController.getSelection()==SpecimenOrObservationType.Unknown;
+        isDefault &= derivateSearchComposite.getComboTaxonAssignment().getSelectionIndex()==DerivateSearchComposite.ALL_SPECIMENS;
+        isDefault &= selectedTaxon==null;
+        return isDefault;
+    }
     /**
      * Resets all input fields
      */
     public void reset(){
         if(!derivateSearchComposite.isDisposed()){
-            derivateSearchComposite.getSearchField().setText("");
+            derivateSearchComposite.getSearchField().setText(""); //$NON-NLS-1$
             derivateSearchComposite.getComboDerivateType().deselectAll();
             comboSpecimenTypeController.setSelection(SpecimenOrObservationType.Unknown);
         }
@@ -184,4 +183,19 @@ public class DerivateSearchCompositeController implements Listener{
         labelProvider.setConversation(conversationHolder);
     }
 
+    public void setTaxonFilter(UUID taxonUuid) {
+        TaxonBase taxonBase = CdmStore.getService(ITaxonService.class).load(taxonUuid);
+        if(taxonBase!=null && taxonBase.isInstanceOf(Taxon.class)){
+            selectedTaxon = HibernateProxyHelper.deproxy(taxonBase, Taxon.class);
+            derivateSearchComposite.getTextTaxonName().setText(taxonBase.getTitleCache());
+            derivateSearchComposite.getLbltaxonAssignment().setEnabled(false);
+            derivateSearchComposite.getComboTaxonAssignment().select(DerivateSearchComposite.ASSIGNED_SPECIMENS);
+            derivateSearchComposite.getComboTaxonAssignment().setEnabled(false);
+        }
+    }
+
+    public void setFocusOnSearchField(){
+       derivateSearchComposite.getSearchField().setFocus();
+    }
+
 }