ref #8450: add label to specimen filter
[taxeditor.git] / eu.etaxonomy.taxeditor.editor / src / main / java / eu / etaxonomy / taxeditor / editor / descriptiveDataSet / matrix / SpecimenSelectionDialog.java
index 5bc904e61d8abbb5fa6c1f92fcac53949f640c28..d8b2fd1ffd87e344cf4ee9f98f891731374070de 100644 (file)
@@ -1,27 +1,29 @@
 /**
-* Copyright (C) 2018 EDIT
-* European Distributed Institute of Taxonomy
-* http://www.e-taxonomy.eu
-*
-* The contents of this file are subject to the Mozilla Public License Version 1.1
-* See LICENSE.TXT at the top of this package for the full license terms.
-*/
+ * Copyright (C) 2018 EDIT
+ * European Distributed Institute of Taxonomy
+ * http://www.e-taxonomy.eu
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * See LICENSE.TXT at the top of this package for the full license terms.
+ */
 package eu.etaxonomy.taxeditor.editor.descriptiveDataSet.matrix;
 
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.Collections;
+import java.util.Comparator;
 import java.util.List;
 import java.util.stream.Collectors;
 
 import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.layout.GridDataFactory;
 import org.eclipse.jface.viewers.ArrayContentProvider;
+import org.eclipse.jface.viewers.ColumnLabelProvider;
 import org.eclipse.jface.viewers.IStructuredSelection;
 import org.eclipse.jface.viewers.ITableLabelProvider;
-import org.eclipse.jface.viewers.LabelProvider;
 import org.eclipse.jface.viewers.TableViewer;
 import org.eclipse.jface.viewers.TableViewerColumn;
 import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.ScrolledComposite;
 import org.eclipse.swt.events.FocusEvent;
 import org.eclipse.swt.events.FocusListener;
 import org.eclipse.swt.events.SelectionAdapter;
@@ -45,7 +47,7 @@ import eu.etaxonomy.taxeditor.model.AbstractUtility;
 import eu.etaxonomy.taxeditor.model.ImageResources;
 import eu.etaxonomy.taxeditor.preference.Resources;
 import eu.etaxonomy.taxeditor.store.CdmStore;
-import eu.etaxonomy.taxeditor.ui.combo.taxon.TaxonNodeCombo;
+import eu.etaxonomy.taxeditor.store.StoreUtil;
 
 /**
  * Dialog to choose specimens for the character matrix.<br>
@@ -64,8 +66,6 @@ public class SpecimenSelectionDialog extends Dialog {
     private CharacterMatrix matrix;
     private Text txtTextFilter;
 
-    private TaxonNodeCombo comboTaxon;
-
     protected SpecimenSelectionDialog(Shell parentShell, CharacterMatrix matrix) {
         super(parentShell);
         this.matrix = matrix;
@@ -75,21 +75,22 @@ public class SpecimenSelectionDialog extends Dialog {
     protected Control createDialogArea(Composite parent) {
         Composite composite = (Composite) super.createDialogArea(parent);
         GridLayout gl_composite = new GridLayout();
+        gl_composite.numColumns = 2;
         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.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false, 2, 1));
         composite_1.setLayout(new GridLayout(4, false));
 
-        Label lblNewLabel = new Label(composite_1, SWT.NONE);
-        lblNewLabel.setText("Taxon");
+        Label l_textFilter = new Label(composite_1, SWT.NULL);
+        GridData data_label = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1);
 
-        comboTaxon = new TaxonNodeCombo(composite_1, SWT.NONE);
-        comboTaxon.setInput(matrix.getDescriptiveDataSet().getTaxonSubtreeFilter());
-        comboTaxon.addSelectionChangedListener(e->applyFilter());
 
+        l_textFilter.setLayoutData(data_label);
+        l_textFilter.setText("Specimen Filter");
+        l_textFilter.setAlignment(SWT.RIGHT);
         txtTextFilter = new Text(composite_1, SWT.BORDER);
-        txtTextFilter.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
+        txtTextFilter.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 2, 1));
         txtTextFilter.setText(TEXT_FILTER_DEFAULT);
         txtTextFilter.addFocusListener(new FocusListener() {
 
@@ -97,7 +98,7 @@ public class SpecimenSelectionDialog extends Dialog {
             public void focusGained(FocusEvent e) {
                 txtTextFilter.setForeground(AbstractUtility.getColor(Resources.SEARCH_VIEW_FOCUS));
                 if (TEXT_FILTER_DEFAULT.equals(txtTextFilter.getText())) {
-                    txtTextFilter.setText("");
+                    StoreUtil.setTextWithoutModifyListeners(txtTextFilter, "");
                 }
             }
 
@@ -105,7 +106,7 @@ public class SpecimenSelectionDialog extends Dialog {
             public void focusLost(FocusEvent e) {
                 if (CdmUtils.isBlank(txtTextFilter.getText())){
                     txtTextFilter.setForeground(AbstractUtility.getColor(Resources.SEARCH_VIEW_FOREGROUND));
-                    txtTextFilter.setText(TEXT_FILTER_DEFAULT);
+                    StoreUtil.setTextWithoutModifyListeners(txtTextFilter, TEXT_FILTER_DEFAULT);
                 }
             }
         });
@@ -119,29 +120,45 @@ public class SpecimenSelectionDialog extends Dialog {
             @Override
             public void widgetSelected(SelectionEvent e) {
                 loadSpecimens();
-                list.setInput(matrix.getSpecimenCache());
+                refreshInput(matrix.getSpecimenCache());
             }
         });
+
+        Label lblNewLabel = new Label(composite, SWT.NONE);
+        lblNewLabel.setImage(ImageResources.getImage(ImageResources.WARNING_ICON));
+
+        Label lblNewLabel_1 = new Label(composite, SWT.NONE);
+        lblNewLabel_1.setText(": Specimen not associated with taxon");
+
+        ScrolledComposite scrolledComposite = new ScrolledComposite(composite, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL);
+        scrolledComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 2, 1));
+        scrolledComposite.setExpandHorizontal(true);
+        scrolledComposite.setExpandVertical(true);
         //table
-        list = new TableViewer(composite, SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION | SWT.MULTI);
+        list = new TableViewer(scrolledComposite, SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION | SWT.MULTI);
         Table table = list.getTable();
-        GridData gd_table = GridDataFactory.fillDefaults().create();
-        gd_table.grabExcessHorizontalSpace = true;
-        gd_table.grabExcessVerticalSpace = true;
-        table.setLayoutData(gd_table);
+
         //table columns
         TableViewerColumn columnTaxon = new TableViewerColumn(list, SWT.NONE);
         columnTaxon.getColumn().setText("Taxon");
         columnTaxon.getColumn().setWidth(200);
         columnTaxon.getColumn().setResizable(true);
         columnTaxon.getColumn().setMoveable(true);
+        TableViewerColumn columnType = new TableViewerColumn(list, SWT.NONE);
+        columnType.getColumn().setText("Type");
+        columnType.getColumn().setWidth(150);
+        columnType.getColumn().setResizable(true);
+        columnType.getColumn().setMoveable(true);
         TableViewerColumn columnSpecimen = new TableViewerColumn(list, SWT.NONE);
         columnSpecimen.getColumn().setText("Specimen");
-        columnSpecimen.getColumn().setWidth(200);
         columnSpecimen.getColumn().setResizable(true);
         columnSpecimen.getColumn().setMoveable(true);
+        columnSpecimen.getColumn().setWidth(400);
+
         table.setHeaderVisible(true);
         table.setLinesVisible(true);
+        scrolledComposite.setContent(table);
+        scrolledComposite.setMinSize(table.computeSize(SWT.DEFAULT, SWT.DEFAULT));
         list.setContentProvider(new ArrayContentProvider());
         list.setLabelProvider(new SpecimenListLabelProvider());
 
@@ -149,37 +166,71 @@ public class SpecimenSelectionDialog extends Dialog {
         if(matrix.getSpecimenCache()==null){
             loadSpecimens();
         }
-        list.setInput(matrix.getSpecimenCache());
+
+        refreshInput(matrix.getSpecimenCache());
+
+        columnSpecimen.getColumn().pack();
+
         return composite;
     }
 
+    private void refreshInput(Object input){
+        list.setInput(input);
+    }
+
     private void applyFilter(){
-        Collection<SpecimenNodeWrapper> specimenCache = matrix.getSpecimenCache();
         List<SpecimenNodeWrapper> result = new ArrayList<>();
-        if(comboTaxon.getSelection()!=null){
-            result.addAll(specimenCache.stream()
-                    .filter(wrapper->wrapper.getTaxonNode().equals(comboTaxon.getSelection()))
-                    .collect(Collectors.toList()));
+        Collection<SpecimenNodeWrapper> specimenCache = matrix.getSpecimenCache();
+        String text = txtTextFilter.getText();
+        if(CdmUtils.isBlank(text)){
+            result = new ArrayList<>(specimenCache);
         }
-        if(!txtTextFilter.getForeground().equals(AbstractUtility.getColor(Resources.SEARCH_VIEW_FOREGROUND))
-                &&!CdmUtils.isBlank(txtTextFilter.getText())){
-            result.addAll(specimenCache.stream()
-                    .filter(wrapper->wrapper.getUuidAndTitleCache().getTitleCache().toLowerCase().contains(txtTextFilter.getText().toLowerCase()))
-                    .collect(Collectors.toList()));
+        else{
+            if(!txtTextFilter.getForeground().equals(AbstractUtility.getColor(Resources.SEARCH_VIEW_FOREGROUND))
+                    &&!CdmUtils.isBlank(text)){
+                result.addAll(specimenCache.stream()
+                        .filter(wrapper->wrapper.getUuidAndTitleCache().getTitleCache().toLowerCase().contains(text.toLowerCase()))
+                        .collect(Collectors.toList()));
+                result.addAll(specimenCache.stream()
+                        .filter(wrapper->wrapper.getTaxonNode().getTaxon().getTitleCache().toLowerCase().contains(text.toLowerCase()))
+                        .collect(Collectors.toList()));
+            }
         }
-        list.setInput(result);
+        refreshInput(result);
     }
 
     private void loadSpecimens(){
-        Collection<SpecimenNodeWrapper> specimenCache = CdmStore.getService(IDescriptiveDataSetService.class).loadSpecimens(matrix.getDescriptiveDataSet());
-        matrix.setSpecimenCache(specimenCache);
+        ArrayList<SpecimenNodeWrapper> specimenList = new ArrayList<>(CdmStore.getService(IDescriptiveDataSetService.class).loadSpecimens(matrix.getDescriptiveDataSet().getUuid()));
+        Collections.sort(specimenList, new Comparator<SpecimenNodeWrapper>() {
+
+            @Override
+            public int compare(SpecimenNodeWrapper o1, SpecimenNodeWrapper o2) {
+                if(o1 == null){
+                    if(o2 == null){
+                        return 0;
+                    }
+                    return -1;
+                }
+                if(o2==null){
+                    return 1;
+                }
+                try{
+                    return o1.getTaxonNode().getTaxon().getTitleCache().compareTo(o2.getTaxonNode().getTaxon().getTitleCache());
+                }
+                catch(NullPointerException e){
+                    return 0;
+                }
+            }
+        });
+        matrix.setSpecimenCache(specimenList);
     }
 
     @Override
     protected void configureShell(Shell newShell) {
         super.configureShell(newShell);
         newShell.setText(Messages.SpecimenSelectionDialog_SELECT_SPECIMENS);
-        newShell.setMinimumSize(500, 400);
+        newShell.setMinimumSize(500, 600);
+        newShell.setSize(800, 600);
     }
 
     @Override
@@ -198,10 +249,23 @@ public class SpecimenSelectionDialog extends Dialog {
         return selectedSpecimens;
     }
 
-    private class SpecimenListLabelProvider extends LabelProvider implements ITableLabelProvider{
+    private class SpecimenListLabelProvider extends ColumnLabelProvider implements ITableLabelProvider {
+
+        @Override
+        public String getToolTipText(Object element) {
+            if(element instanceof SpecimenNodeWrapper
+                    && ((SpecimenNodeWrapper) element).getTaxonDescriptionUuid()==null){
+                return "Does not have and IndividualsAssociation with the taxon";
+            }
+            return null;
+        }
 
         @Override
         public Image getColumnImage(Object element, int columnIndex) {
+            if(element instanceof SpecimenNodeWrapper && columnIndex == 2
+                    && ((SpecimenNodeWrapper) element).getTaxonDescriptionUuid()==null){
+                return ImageResources.getImage(ImageResources.WARNING_ICON);
+            }
             return null;
         }
 
@@ -213,6 +277,8 @@ public class SpecimenSelectionDialog extends Dialog {
                 case 0:
                     return wrapper.getTaxonNode().getTaxon().getName().getTitleCache();
                 case 1:
+                    return wrapper.getType().getMessage();
+                case 2:
                     return wrapper.getUuidAndTitleCache().getTitleCache();
                 default:
                     break;