2 * Copyright (C) 2018 EDIT
3 * European Distributed Institute of Taxonomy
4 * http://www.e-taxonomy.eu
6 * The contents of this file are subject to the Mozilla Public License Version 1.1
7 * See LICENSE.TXT at the top of this package for the full license terms.
9 package eu
.etaxonomy
.taxeditor
.editor
.workingSet
.matrix
;
11 import java
.util
.ArrayList
;
12 import java
.util
.Collection
;
13 import java
.util
.List
;
14 import java
.util
.UUID
;
15 import java
.util
.stream
.Collectors
;
16 import java
.util
.stream
.Stream
;
18 import org
.eclipse
.jface
.dialogs
.Dialog
;
19 import org
.eclipse
.jface
.layout
.GridDataFactory
;
20 import org
.eclipse
.jface
.viewers
.IStructuredContentProvider
;
21 import org
.eclipse
.jface
.viewers
.IStructuredSelection
;
22 import org
.eclipse
.jface
.viewers
.ITableLabelProvider
;
23 import org
.eclipse
.jface
.viewers
.LabelProvider
;
24 import org
.eclipse
.jface
.viewers
.TableViewer
;
25 import org
.eclipse
.jface
.viewers
.TableViewerColumn
;
26 import org
.eclipse
.swt
.SWT
;
27 import org
.eclipse
.swt
.events
.SelectionAdapter
;
28 import org
.eclipse
.swt
.events
.SelectionEvent
;
29 import org
.eclipse
.swt
.graphics
.Image
;
30 import org
.eclipse
.swt
.layout
.GridData
;
31 import org
.eclipse
.swt
.layout
.GridLayout
;
32 import org
.eclipse
.swt
.widgets
.Button
;
33 import org
.eclipse
.swt
.widgets
.Composite
;
34 import org
.eclipse
.swt
.widgets
.Control
;
35 import org
.eclipse
.swt
.widgets
.Shell
;
36 import org
.eclipse
.swt
.widgets
.Table
;
37 import org
.eclipse
.swt
.widgets
.Text
;
39 import eu
.etaxonomy
.cdm
.api
.service
.IOccurrenceService
;
40 import eu
.etaxonomy
.cdm
.api
.service
.ITaxonNodeService
;
41 import eu
.etaxonomy
.cdm
.api
.service
.config
.FindOccurrencesConfigurator
;
42 import eu
.etaxonomy
.cdm
.common
.CdmUtils
;
43 import eu
.etaxonomy
.cdm
.filter
.TaxonNodeFilter
;
44 import eu
.etaxonomy
.cdm
.model
.occurrence
.SpecimenOrObservationBase
;
45 import eu
.etaxonomy
.cdm
.model
.taxon
.Taxon
;
46 import eu
.etaxonomy
.cdm
.model
.taxon
.TaxonNode
;
47 import eu
.etaxonomy
.taxeditor
.editor
.l10n
.Messages
;
48 import eu
.etaxonomy
.taxeditor
.model
.ImageResources
;
49 import eu
.etaxonomy
.taxeditor
.store
.CdmStore
;
50 import eu
.etaxonomy
.taxeditor
.ui
.combo
.taxon
.TaxonNodeCombo
;
53 * Dialog to choose specimens for the character matrix.<br>
54 * Filters specimens that have already been added.
59 public class SpecimenSelectionDialog
extends Dialog
{
61 private TableViewer list
;
63 private Collection
<SpecimenOrObservationBase
> selectedSpecimens
= new ArrayList
<>();
64 private CharacterMatrix matrix
;
65 private Text txtTextFilter
;
67 private TaxonNodeCombo comboTaxon
;
69 protected SpecimenSelectionDialog(Shell parentShell
, CharacterMatrix matrix
) {
75 protected Control
createDialogArea(Composite parent
) {
76 Composite composite
= (Composite
) super.createDialogArea(parent
);
77 GridLayout gl_composite
= new GridLayout();
78 composite
.setLayout(gl_composite
);
80 Composite composite_1
= new Composite(composite
, SWT
.NONE
);
81 composite_1
.setLayoutData(new GridData(SWT
.FILL
, SWT
.TOP
, true, false, 1, 1));
82 composite_1
.setLayout(new GridLayout(3, false));
84 txtTextFilter
= new Text(composite_1
, SWT
.BORDER
);
85 txtTextFilter
.setLayoutData(new GridData(SWT
.FILL
, SWT
.CENTER
, true, false, 1, 1));
86 txtTextFilter
.addModifyListener(e
->applyFilter());
88 comboTaxon
= new TaxonNodeCombo(composite_1
, SWT
.NONE
);
89 comboTaxon
.setInput(matrix
.getWorkingSet().getTaxonSubtreeFilter());
90 comboTaxon
.addSelectionChangedListener(e
->applyFilter());
92 Button btnRefreshButton
= new Button(composite_1
, SWT
.NONE
);
93 btnRefreshButton
.setLayoutData(new GridData(SWT
.RIGHT
, SWT
.CENTER
, false, false, 1, 1));
94 btnRefreshButton
.setToolTipText(Messages
.SpecimenSelectionDialog_REFRESH
);
95 btnRefreshButton
.setImage(ImageResources
.getImage(ImageResources
.REFRESH
));
96 btnRefreshButton
.addSelectionListener(new SelectionAdapter() {
98 public void widgetSelected(SelectionEvent e
) {
100 list
.setInput(matrix
.getSpecimenCache());
104 list
= new TableViewer(composite
, SWT
.H_SCROLL
| SWT
.V_SCROLL
| SWT
.FULL_SELECTION
);
105 Table table
= list
.getTable();
106 GridData gd_table
= GridDataFactory
.fillDefaults().create();
107 gd_table
.grabExcessHorizontalSpace
= true;
108 gd_table
.grabExcessVerticalSpace
= true;
109 table
.setLayoutData(gd_table
);
111 TableViewerColumn columnTaxon
= new TableViewerColumn(list
, SWT
.NONE
);
112 columnTaxon
.getColumn().setText("Taxon");
113 columnTaxon
.getColumn().setWidth(200);
114 columnTaxon
.getColumn().setResizable(true);
115 columnTaxon
.getColumn().setMoveable(true);
116 TableViewerColumn columnSpecimen
= new TableViewerColumn(list
, SWT
.NONE
);
117 columnSpecimen
.getColumn().setText("Specimen");
118 columnSpecimen
.getColumn().setWidth(200);
119 columnSpecimen
.getColumn().setResizable(true);
120 columnSpecimen
.getColumn().setMoveable(true);
121 table
.setHeaderVisible(true);
122 table
.setLinesVisible(true);
123 list
.setContentProvider(new SpecimenListContentProvider());
124 list
.setLabelProvider(new SpecimenListLabelProvider());
127 if(matrix
.getSpecimenCache()==null){
130 list
.setInput(matrix
.getSpecimenCache());
134 private void applyFilter(){
135 Stream
<SpecimenWrapper
> filteredWrappers
=matrix
.getSpecimenCache().stream();
136 if(comboTaxon
.getSelection()!=null){
139 .filter(wrapper
->wrapper
.getTaxonNode().equals(comboTaxon
.getSelection()));
141 if(!CdmUtils
.isBlank(txtTextFilter
.getText())){
144 .filter(wrapper
->wrapper
.getLabel().toLowerCase().contains(txtTextFilter
.getText().toLowerCase()));
146 list
.setInput(filteredWrappers
.collect(Collectors
.toList()));
149 private void loadSpecimens(){
150 List
<SpecimenWrapper
> specimenCache
= new ArrayList
<>();
151 //set filter parameters
152 TaxonNodeFilter filter
= TaxonNodeFilter
.NewRankInstance(matrix
.getWorkingSet().getMinRank(), matrix
.getWorkingSet().getMaxRank());
153 matrix
.getWorkingSet().getGeoFilter().forEach(area
-> filter
.orArea(area
.getUuid()));
154 matrix
.getWorkingSet().getTaxonSubtreeFilter().forEach(node
-> filter
.orSubtree(node
));
155 filter
.setIncludeUnpublished(true);
157 ITaxonNodeService taxonNodeService
= CdmStore
.getService(ITaxonNodeService
.class);
158 List
<UUID
> filteredNodes
= taxonNodeService
.uuidList(filter
);
159 for (UUID uuid
: filteredNodes
) {
160 //TODO implement occurrence service for taxon nodes
161 // let it return UuidAndTitleCache
162 TaxonNode taxonNode
= taxonNodeService
.load(uuid
);
163 Taxon taxon
= taxonNode
.getTaxon();
165 FindOccurrencesConfigurator config
= new FindOccurrencesConfigurator();
166 config
.setAssociatedTaxonUuid(taxon
.getUuid());
167 List
<SpecimenOrObservationBase
> specimensForTaxon
= CdmStore
.getService(IOccurrenceService
.class).findByTitle(config
).getRecords();
168 specimensForTaxon
.forEach(specimen
->specimenCache
.add(new SpecimenWrapper(specimen
, taxonNode
, specimen
.getTitleCache())));
171 matrix
.setSpecimenCache(specimenCache
);
175 protected void configureShell(Shell newShell
) {
176 super.configureShell(newShell
);
177 newShell
.setText(Messages
.SpecimenSelectionDialog_SELECT_SPECIMENS
);
178 newShell
.setMinimumSize(500, 400);
182 protected void okPressed() {
183 selectedSpecimens
.clear();
184 List
<SpecimenWrapper
> wrappers
= ((IStructuredSelection
)list
.getSelection()).toList();
185 wrappers
.forEach(element
->selectedSpecimens
.add(element
.getSpecimen()));
190 protected boolean isResizable() {
194 public Collection
<SpecimenOrObservationBase
> getSpecimen(){
195 return selectedSpecimens
;
198 private class SpecimenListContentProvider
implements IStructuredContentProvider
{
200 public Object
[] getElements(Object inputElement
) {
201 return ((List
<SpecimenWrapper
>) inputElement
).stream().filter(wrapper
->
202 wrapper
.getSpecimen().getDescriptions().stream().noneMatch(description
->
203 matrix
.getWorkingSet().getDescriptions().contains(description
))).toArray();
207 private class SpecimenListLabelProvider
extends LabelProvider
implements ITableLabelProvider
{
210 public Image
getColumnImage(Object element
, int columnIndex
) {
215 public String
getColumnText(Object element
, int columnIndex
) {
216 if(element
instanceof SpecimenWrapper
){
217 SpecimenWrapper wrapper
= (SpecimenWrapper
)element
;
218 switch (columnIndex
) {
220 return wrapper
.getTaxonNode().getTaxon().getName().getTitleCache();
222 return wrapper
.getSpecimen().getTitleCache();