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
*
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);
}
/**
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();
}
}
}