ref #7095 Add taxon filter combo to specimen selection dialog
[taxeditor.git] / eu.etaxonomy.taxeditor.editor / src / main / java / eu / etaxonomy / taxeditor / editor / workingSet / matrix / SpecimenSelectionDialog.java
index 220a83b3aec625931bc2b099cce4711a412ce991..9a349b931803d3358a5b0447bc0bc67eedc01048 100644 (file)
@@ -13,30 +13,39 @@ import java.util.Collection;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
+import java.util.UUID;
 
 import org.eclipse.jface.dialogs.Dialog;
 import org.eclipse.jface.viewers.ArrayContentProvider;
 import org.eclipse.jface.viewers.IStructuredSelection;
 import org.eclipse.jface.viewers.LabelProvider;
 import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Control;
 import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.Text;
 
 import eu.etaxonomy.cdm.api.service.IOccurrenceService;
-import eu.etaxonomy.cdm.api.service.ITaxonService;
-import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper;
-import eu.etaxonomy.cdm.model.description.WorkingSet;
-import eu.etaxonomy.cdm.model.name.Rank;
-import eu.etaxonomy.cdm.model.name.TaxonName;
+import eu.etaxonomy.cdm.api.service.ITaxonNodeService;
+import eu.etaxonomy.cdm.api.service.config.FindOccurrencesConfigurator;
+import eu.etaxonomy.cdm.filter.TaxonNodeFilter;
 import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase;
 import eu.etaxonomy.cdm.model.taxon.Taxon;
-import eu.etaxonomy.cdm.model.taxon.TaxonNode;
+import eu.etaxonomy.taxeditor.editor.l10n.Messages;
 import eu.etaxonomy.taxeditor.model.ImageResources;
 import eu.etaxonomy.taxeditor.store.CdmStore;
+import eu.etaxonomy.taxeditor.ui.combo.taxon.TaxonNodeCombo;
 
 /**
+ * Dialog to choose specimens for the character matrix.<br>
+ * Filters specimens that have already been added.
  * @author pplitzner
  * @since Jan 3, 2018
  *
@@ -45,57 +54,86 @@ public class SpecimenSelectionDialog extends Dialog {
 
     private TableViewer list;
 
-    private WorkingSet workingSet;
+    private Collection<SpecimenOrObservationBase> selectedSpecimens = new ArrayList<>();
+    private CharacterMatrix matrix;
+    private Text txtTextFilter;
 
-    Collection<SpecimenOrObservationBase> selectedSpecimens = new ArrayList<>();
+    private TaxonNodeCombo comboTaxon;
 
-    protected SpecimenSelectionDialog(Shell parentShell, WorkingSet workingSet) {
+    protected SpecimenSelectionDialog(Shell parentShell, CharacterMatrix matrix) {
         super(parentShell);
-        this.workingSet = workingSet;
+        this.matrix = matrix;
     }
 
     @Override
     protected Control createDialogArea(Composite parent) {
         Composite composite = (Composite) super.createDialogArea(parent);
+        GridLayout gl_composite = new GridLayout();
+        composite.setLayout(gl_composite);
+
+        Composite composite_1 = new Composite(composite, SWT.NONE);
+        composite_1.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false, 1, 1));
+        composite_1.setLayout(new GridLayout(3, false));
+
+        txtTextFilter = new Text(composite_1, SWT.BORDER);
+        txtTextFilter.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
+
+        comboTaxon = new TaxonNodeCombo(composite_1, SWT.NONE);
+        comboTaxon.setInput(matrix.getWorkingSet().getTaxonSubtreeFilter());
+
+        Button btnRefreshButton = new Button(composite_1, SWT.NONE);
+        btnRefreshButton.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
+        btnRefreshButton.setToolTipText(Messages.SpecimenSelectionDialog_REFRESH);
+        btnRefreshButton.setImage(ImageResources.getImage(ImageResources.REFRESH));
+        btnRefreshButton.addSelectionListener(new SelectionAdapter() {
+            @Override
+            public void widgetSelected(SelectionEvent e) {
+                loadSpecimens();
+                list.setInput(matrix.getSpecimenCache());
+            }
+        });
         list = new TableViewer(composite);
-        list.setContentProvider(new ArrayContentProvider());
-        list.setLabelProvider(new DescriptionLabelProvider());
+        Table table = list.getTable();
+        table.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
+        list.setContentProvider(new DescriptionContentProvider());
+        list.setLabelProvider(new LabelProvider());
 
         //gather descriptions
-        Set<TaxonNode> taxonNodes = workingSet.getTaxonSubtreeFilter();
-        Set<SpecimenOrObservationBase> specimens = new HashSet<>();
-        for (TaxonNode node : taxonNodes) {
-            specimens.addAll(addSpecimensRecursively(node));
+        if(matrix.getSpecimenCache()==null){
+            loadSpecimens();
         }
-        list.setInput(specimens);
+        list.setInput(matrix.getSpecimenCache());
         return composite;
     }
 
-    private Collection<SpecimenOrObservationBase> addSpecimensRecursively(TaxonNode node){
-        Collection<SpecimenOrObservationBase> specimens = new HashSet<>();
-        if(node.getTaxon()!=null){
-            Taxon taxon = HibernateProxyHelper.deproxy(node.getTaxon(), Taxon.class);
-            TaxonName name = taxon.getName();
-            //filter by Rank
-            if(name!=null &&
-                    (name.getRank().equals(workingSet.getMinRank())
-                    || name.getRank().isHigher(workingSet.getMinRank())
-                    || name.getRank().equals(workingSet.getMaxRank())
-                    || name.getRank().isLower(workingSet.getMaxRank()))){
-                IOccurrenceService service = CdmStore.getService(IOccurrenceService.class);
-                //TODO extend FindOccurrencesConfigurator to support area and rank filter
-                //            FindOccurrencesConfigurator config = new FindOccurrencesConfigurator();
-                //            config.setAssociatedTaxonNameUuid(taxon.getUuid());
-                //            service.findByTitle(config);
-
-                specimens = service.listByAssociatedTaxon(SpecimenOrObservationBase.class, null, taxon, null, null, null, null, null);
+    private void loadSpecimens(){
+        Set<SpecimenOrObservationBase> specimens = new HashSet<>();
+        //set filter parameters
+        TaxonNodeFilter filter = TaxonNodeFilter.NewRankInstance(matrix.getWorkingSet().getMinRank(), matrix.getWorkingSet().getMaxRank());
+        matrix.getWorkingSet().getGeoFilter().forEach(area -> filter.orArea(area.getUuid()));
+        matrix.getWorkingSet().getTaxonSubtreeFilter().forEach(node -> filter.orSubtree(node));
+        filter.setIncludeUnpublished(true);
+
+        ITaxonNodeService taxonNodeService = CdmStore.getService(ITaxonNodeService.class);
+        List<UUID> filteredNodes = taxonNodeService.uuidList(filter);
+        for (UUID uuid : filteredNodes) {
+            //TODO implement occurrence service for taxon nodes
+            // let it return UuidAndTitleCache
+            Taxon taxon = taxonNodeService.load(uuid).getTaxon();
+            if(taxon!=null){
+                FindOccurrencesConfigurator config = new FindOccurrencesConfigurator();
+                config.setAssociatedTaxonUuid(taxon.getUuid());
+                specimens.addAll(CdmStore.getService(IOccurrenceService.class).findByTitle(config).getRecords());
             }
         }
-        List<TaxonNode> childNodes = node.getChildNodes();
-        for (TaxonNode childNode : childNodes) {
-            specimens.addAll(addSpecimensRecursively(childNode));
-        }
-        return specimens;
+        matrix.setSpecimenCache(specimens);
+    }
+
+    @Override
+    protected void configureShell(Shell newShell) {
+        super.configureShell(newShell);
+        newShell.setText(Messages.SpecimenSelectionDialog_SELECT_SPECIMENS);
+        newShell.setMinimumSize(500, 400);
     }
 
     /**
@@ -111,16 +149,16 @@ public class SpecimenSelectionDialog extends Dialog {
         return selectedSpecimens;
     }
 
-    private class DescriptionLabelProvider extends LabelProvider{
+    private class DescriptionContentProvider extends ArrayContentProvider{
+
         /**
          * {@inheritDoc}
          */
         @Override
-        public Image getImage(Object element) {
-            if(workingSet.getDescriptions().contains(element)){
-                return ImageResources.getImage(ImageResources.SYNCED);
-            }
-            return null;
+        public Object[] getElements(Object inputElement) {
+            return ((Collection<SpecimenOrObservationBase>) inputElement).stream().filter(specimen ->
+                specimen.getDescriptions().stream().noneMatch(description ->
+                matrix.getWorkingSet().getDescriptions().contains(description))).toArray();
         }
     }
 }