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
.descriptiveDataSet
.matrix
;
11 import java
.util
.ArrayList
;
12 import java
.util
.Collection
;
13 import java
.util
.Collections
;
14 import java
.util
.Comparator
;
15 import java
.util
.List
;
16 import java
.util
.stream
.Collectors
;
18 import org
.eclipse
.jface
.dialogs
.Dialog
;
19 import org
.eclipse
.jface
.viewers
.ArrayContentProvider
;
20 import org
.eclipse
.jface
.viewers
.ColumnLabelProvider
;
21 import org
.eclipse
.jface
.viewers
.ColumnViewerToolTipSupport
;
22 import org
.eclipse
.jface
.viewers
.IStructuredSelection
;
23 import org
.eclipse
.jface
.viewers
.ITableLabelProvider
;
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
.custom
.ScrolledComposite
;
28 import org
.eclipse
.swt
.events
.FocusEvent
;
29 import org
.eclipse
.swt
.events
.FocusListener
;
30 import org
.eclipse
.swt
.events
.SelectionAdapter
;
31 import org
.eclipse
.swt
.events
.SelectionEvent
;
32 import org
.eclipse
.swt
.graphics
.Image
;
33 import org
.eclipse
.swt
.layout
.GridData
;
34 import org
.eclipse
.swt
.layout
.GridLayout
;
35 import org
.eclipse
.swt
.widgets
.Button
;
36 import org
.eclipse
.swt
.widgets
.Composite
;
37 import org
.eclipse
.swt
.widgets
.Control
;
38 import org
.eclipse
.swt
.widgets
.Shell
;
39 import org
.eclipse
.swt
.widgets
.Table
;
40 import org
.eclipse
.swt
.widgets
.Text
;
42 import eu
.etaxonomy
.cdm
.api
.service
.IDescriptiveDataSetService
;
43 import eu
.etaxonomy
.cdm
.common
.CdmUtils
;
44 import eu
.etaxonomy
.cdm
.persistence
.dto
.SpecimenNodeWrapper
;
45 import eu
.etaxonomy
.taxeditor
.editor
.l10n
.Messages
;
46 import eu
.etaxonomy
.taxeditor
.model
.AbstractUtility
;
47 import eu
.etaxonomy
.taxeditor
.model
.ImageResources
;
48 import eu
.etaxonomy
.taxeditor
.preference
.Resources
;
49 import eu
.etaxonomy
.taxeditor
.store
.CdmStore
;
50 import eu
.etaxonomy
.taxeditor
.store
.StoreUtil
;
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 static String TEXT_FILTER_DEFAULT
= "Enter text filter";
63 private TableViewer list
;
65 private Collection
<SpecimenNodeWrapper
> selectedSpecimens
= new ArrayList
<>();
66 private CharacterMatrix matrix
;
67 private Text txtTextFilter
;
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(4, false));
84 txtTextFilter
= new Text(composite_1
, SWT
.BORDER
);
85 txtTextFilter
.setLayoutData(new GridData(SWT
.FILL
, SWT
.CENTER
, true, false, 3, 1));
86 txtTextFilter
.setText(TEXT_FILTER_DEFAULT
);
87 txtTextFilter
.addFocusListener(new FocusListener() {
90 public void focusGained(FocusEvent e
) {
91 txtTextFilter
.setForeground(AbstractUtility
.getColor(Resources
.SEARCH_VIEW_FOCUS
));
92 if (TEXT_FILTER_DEFAULT
.equals(txtTextFilter
.getText())) {
93 StoreUtil
.setTextWithoutModifyListeners(txtTextFilter
, "");
98 public void focusLost(FocusEvent e
) {
99 if (CdmUtils
.isBlank(txtTextFilter
.getText())){
100 txtTextFilter
.setForeground(AbstractUtility
.getColor(Resources
.SEARCH_VIEW_FOREGROUND
));
101 StoreUtil
.setTextWithoutModifyListeners(txtTextFilter
, TEXT_FILTER_DEFAULT
);
105 txtTextFilter
.addModifyListener(e
->applyFilter());
107 Button btnRefreshButton
= new Button(composite_1
, SWT
.NONE
);
108 btnRefreshButton
.setLayoutData(new GridData(SWT
.RIGHT
, SWT
.CENTER
, false, false, 1, 1));
109 btnRefreshButton
.setToolTipText(Messages
.SpecimenSelectionDialog_REFRESH
);
110 btnRefreshButton
.setImage(ImageResources
.getImage(ImageResources
.REFRESH
));
111 btnRefreshButton
.addSelectionListener(new SelectionAdapter() {
113 public void widgetSelected(SelectionEvent e
) {
115 list
.setInput(matrix
.getSpecimenCache());
119 ScrolledComposite scrolledComposite
= new ScrolledComposite(composite
, SWT
.BORDER
| SWT
.H_SCROLL
| SWT
.V_SCROLL
);
120 scrolledComposite
.setLayoutData(new GridData(SWT
.FILL
, SWT
.FILL
, true, true, 1, 1));
121 scrolledComposite
.setExpandHorizontal(true);
122 scrolledComposite
.setExpandVertical(true);
124 list
= new TableViewer(scrolledComposite
, SWT
.H_SCROLL
| SWT
.V_SCROLL
| SWT
.FULL_SELECTION
| SWT
.MULTI
);
125 Table table
= list
.getTable();
128 TableViewerColumn columnTaxon
= new TableViewerColumn(list
, SWT
.NONE
);
129 columnTaxon
.getColumn().setText("Taxon");
130 columnTaxon
.getColumn().setWidth(200);
131 columnTaxon
.getColumn().setResizable(true);
132 columnTaxon
.getColumn().setMoveable(true);
133 TableViewerColumn columnType
= new TableViewerColumn(list
, SWT
.NONE
);
134 columnType
.getColumn().setText("Type");
135 columnType
.getColumn().setWidth(150);
136 columnType
.getColumn().setResizable(true);
137 columnType
.getColumn().setMoveable(true);
138 TableViewerColumn columnSpecimen
= new TableViewerColumn(list
, SWT
.NONE
);
139 columnSpecimen
.getColumn().setText("Specimen");
140 columnSpecimen
.getColumn().setResizable(true);
141 columnSpecimen
.getColumn().setMoveable(true);
142 columnSpecimen
.getColumn().setWidth(400);
144 table
.setHeaderVisible(true);
145 table
.setLinesVisible(true);
146 scrolledComposite
.setContent(table
);
147 scrolledComposite
.setMinSize(table
.computeSize(SWT
.DEFAULT
, SWT
.DEFAULT
));
148 list
.setContentProvider(new ArrayContentProvider());
149 list
.setLabelProvider(new SpecimenListLabelProvider());
152 if(matrix
.getSpecimenCache()==null){
156 list
.setInput(matrix
.getSpecimenCache());
158 columnSpecimen
.getColumn().pack();
161 columnSpecimen
.setLabelProvider(new SpecimenListLabelProvider());
162 ColumnViewerToolTipSupport
.enableFor(columnSpecimen
.getViewer());
167 private void applyFilter(){
168 List
<SpecimenNodeWrapper
> result
= new ArrayList
<>();
169 Collection
<SpecimenNodeWrapper
> specimenCache
= matrix
.getSpecimenCache();
170 String text
= txtTextFilter
.getText();
171 if(CdmUtils
.isBlank(text
)){
172 result
= new ArrayList
<>(specimenCache
);
175 if(!txtTextFilter
.getForeground().equals(AbstractUtility
.getColor(Resources
.SEARCH_VIEW_FOREGROUND
))
176 &&!CdmUtils
.isBlank(text
)){
177 result
.addAll(specimenCache
.stream()
178 .filter(wrapper
->wrapper
.getUuidAndTitleCache().getTitleCache().toLowerCase().contains(text
.toLowerCase()))
179 .collect(Collectors
.toList()));
180 result
.addAll(specimenCache
.stream()
181 .filter(wrapper
->wrapper
.getTaxonNode().getTaxon().getTitleCache().toLowerCase().contains(text
.toLowerCase()))
182 .collect(Collectors
.toList()));
185 list
.setInput(result
);
188 private void loadSpecimens(){
189 ArrayList
<SpecimenNodeWrapper
> specimenList
= new ArrayList
<>(CdmStore
.getService(IDescriptiveDataSetService
.class).loadSpecimens(matrix
.getDescriptiveDataSet()));
190 Collections
.sort(specimenList
, new Comparator
<SpecimenNodeWrapper
>() {
193 public int compare(SpecimenNodeWrapper o1
, SpecimenNodeWrapper o2
) {
204 return o1
.getTaxonNode().getTaxon().getTitleCache().compareTo(o2
.getTaxonNode().getTaxon().getTitleCache());
206 catch(NullPointerException e
){
211 matrix
.setSpecimenCache(specimenList
);
215 protected void configureShell(Shell newShell
) {
216 super.configureShell(newShell
);
217 newShell
.setText(Messages
.SpecimenSelectionDialog_SELECT_SPECIMENS
);
218 newShell
.setMinimumSize(500, 600);
219 newShell
.setSize(800, 600);
223 protected void okPressed() {
224 selectedSpecimens
.clear();
225 selectedSpecimens
= ((IStructuredSelection
)list
.getSelection()).toList();
230 protected boolean isResizable() {
234 public Collection
<SpecimenNodeWrapper
> getSpecimen(){
235 return selectedSpecimens
;
238 private class SpecimenListLabelProvider
extends ColumnLabelProvider
implements ITableLabelProvider
{
241 public String
getToolTipText(Object element
) {
242 if(element
instanceof SpecimenNodeWrapper
243 && !((SpecimenNodeWrapper
) element
).isIndividualsAssociation()){
244 return "Does not have and IndividualsAssociation with the taxon";
250 public Image
getColumnImage(Object element
, int columnIndex
) {
251 if(element
instanceof SpecimenNodeWrapper
&& columnIndex
== 2
252 && !((SpecimenNodeWrapper
) element
).isIndividualsAssociation()){
253 return ImageResources
.getImage(ImageResources
.WARNING_ICON
);
259 public String
getColumnText(Object element
, int columnIndex
) {
260 if(element
instanceof SpecimenNodeWrapper
){
261 SpecimenNodeWrapper wrapper
= (SpecimenNodeWrapper
)element
;
262 switch (columnIndex
) {
264 return wrapper
.getTaxonNode().getTaxon().getName().getTitleCache();
266 return wrapper
.getType().getMessage();
268 return wrapper
.getUuidAndTitleCache().getTitleCache();