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
.IStructuredSelection
;
21 import org
.eclipse
.jface
.viewers
.ITableLabelProvider
;
22 import org
.eclipse
.jface
.viewers
.LabelProvider
;
23 import org
.eclipse
.jface
.viewers
.TableViewer
;
24 import org
.eclipse
.jface
.viewers
.TableViewerColumn
;
25 import org
.eclipse
.swt
.SWT
;
26 import org
.eclipse
.swt
.custom
.ScrolledComposite
;
27 import org
.eclipse
.swt
.events
.FocusEvent
;
28 import org
.eclipse
.swt
.events
.FocusListener
;
29 import org
.eclipse
.swt
.events
.SelectionAdapter
;
30 import org
.eclipse
.swt
.events
.SelectionEvent
;
31 import org
.eclipse
.swt
.graphics
.Image
;
32 import org
.eclipse
.swt
.layout
.GridData
;
33 import org
.eclipse
.swt
.layout
.GridLayout
;
34 import org
.eclipse
.swt
.widgets
.Button
;
35 import org
.eclipse
.swt
.widgets
.Composite
;
36 import org
.eclipse
.swt
.widgets
.Control
;
37 import org
.eclipse
.swt
.widgets
.Label
;
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
;
52 * Dialog to choose specimens for the character matrix.<br>
53 * Filters specimens that have already been added.
58 public class SpecimenSelectionDialog
extends Dialog
{
60 private static String TEXT_FILTER_DEFAULT
= "Enter text filter";
62 private TableViewer list
;
64 private Collection
<SpecimenNodeWrapper
> selectedSpecimens
= new ArrayList
<>();
65 private CharacterMatrix matrix
;
66 private Text txtTextFilter
;
68 // private TaxonNodeCombo comboTaxon;
70 protected SpecimenSelectionDialog(Shell parentShell
, CharacterMatrix matrix
) {
76 protected Control
createDialogArea(Composite parent
) {
77 Composite composite
= (Composite
) super.createDialogArea(parent
);
78 GridLayout gl_composite
= new GridLayout();
79 composite
.setLayout(gl_composite
);
81 Composite composite_1
= new Composite(composite
, SWT
.NONE
);
82 composite_1
.setLayoutData(new GridData(SWT
.FILL
, SWT
.TOP
, true, false, 1, 1));
83 composite_1
.setLayout(new GridLayout(2, false));
85 Label lblNewLabel
= new Label(composite_1
, SWT
.NONE
);
86 lblNewLabel
.setText("Refresh");
88 // FIXME temporary disabled taxon filter because of performance issues
89 // comboTaxon = new TaxonNodeCombo(composite_1, SWT.NONE);
90 // comboTaxon.setInput(matrix.getDescriptiveDataSet().getTaxonSubtreeFilter());
91 // comboTaxon.addSelectionChangedListener(e->applyFilter());
93 txtTextFilter
= new Text(composite_1
, SWT
.BORDER
);
94 txtTextFilter
.setLayoutData(new GridData(SWT
.FILL
, SWT
.CENTER
, true, false, 1, 1));
95 txtTextFilter
.setText(TEXT_FILTER_DEFAULT
);
96 txtTextFilter
.addFocusListener(new FocusListener() {
99 public void focusGained(FocusEvent e
) {
100 txtTextFilter
.setForeground(AbstractUtility
.getColor(Resources
.SEARCH_VIEW_FOCUS
));
101 if (TEXT_FILTER_DEFAULT
.equals(txtTextFilter
.getText())) {
102 txtTextFilter
.setText("");
107 public void focusLost(FocusEvent e
) {
108 if (CdmUtils
.isBlank(txtTextFilter
.getText())){
109 txtTextFilter
.setForeground(AbstractUtility
.getColor(Resources
.SEARCH_VIEW_FOREGROUND
));
110 txtTextFilter
.setText(TEXT_FILTER_DEFAULT
);
114 txtTextFilter
.addModifyListener(e
->applyFilter());
116 Button btnRefreshButton
= new Button(composite_1
, SWT
.NONE
);
117 btnRefreshButton
.setLayoutData(new GridData(SWT
.RIGHT
, SWT
.CENTER
, false, false, 1, 1));
118 btnRefreshButton
.setToolTipText(Messages
.SpecimenSelectionDialog_REFRESH
);
119 btnRefreshButton
.setImage(ImageResources
.getImage(ImageResources
.REFRESH
));
120 btnRefreshButton
.addSelectionListener(new SelectionAdapter() {
122 public void widgetSelected(SelectionEvent e
) {
124 list
.setInput(matrix
.getSpecimenCache());
128 ScrolledComposite scrolledComposite
= new ScrolledComposite(composite
, SWT
.BORDER
| SWT
.H_SCROLL
| SWT
.V_SCROLL
);
129 scrolledComposite
.setLayoutData(new GridData(SWT
.FILL
, SWT
.FILL
, true, true, 1, 1));
130 scrolledComposite
.setExpandHorizontal(true);
131 scrolledComposite
.setExpandVertical(true);
133 list
= new TableViewer(scrolledComposite
, SWT
.H_SCROLL
| SWT
.V_SCROLL
| SWT
.FULL_SELECTION
| SWT
.MULTI
);
134 Table table
= list
.getTable();
137 TableViewerColumn columnTaxon
= new TableViewerColumn(list
, SWT
.NONE
);
138 columnTaxon
.getColumn().setText("Taxon");
139 columnTaxon
.getColumn().setWidth(200);
140 columnTaxon
.getColumn().setResizable(true);
141 columnTaxon
.getColumn().setMoveable(true);
142 TableViewerColumn columnSpecimen
= new TableViewerColumn(list
, SWT
.NONE
);
143 columnSpecimen
.getColumn().setText("Specimen");
144 columnSpecimen
.getColumn().setResizable(true);
145 columnSpecimen
.getColumn().setMoveable(true);
146 columnSpecimen
.getColumn().setWidth(400);
147 table
.setHeaderVisible(true);
148 table
.setLinesVisible(true);
149 scrolledComposite
.setContent(table
);
150 scrolledComposite
.setMinSize(table
.computeSize(SWT
.DEFAULT
, SWT
.DEFAULT
));
151 list
.setContentProvider(new ArrayContentProvider());
152 list
.setLabelProvider(new SpecimenListLabelProvider());
155 if(matrix
.getSpecimenCache()==null){
159 list
.setInput(matrix
.getSpecimenCache());
161 columnSpecimen
.getColumn().pack();
166 private void applyFilter(){
167 List
<SpecimenNodeWrapper
> result
= new ArrayList
<>();
168 Collection
<SpecimenNodeWrapper
> specimenCache
= matrix
.getSpecimenCache();
169 if(CdmUtils
.isBlank(txtTextFilter
.getText())){
170 result
= new ArrayList
<>(specimenCache
);
173 // if(comboTaxon.getSelection()!=null){
174 // result.addAll(specimenCache.stream()
175 // .filter(wrapper->wrapper.getTaxonNode().equals(comboTaxon.getSelection()))
176 // .collect(Collectors.toList()));
178 if(!txtTextFilter
.getForeground().equals(AbstractUtility
.getColor(Resources
.SEARCH_VIEW_FOREGROUND
))
179 &&!CdmUtils
.isBlank(txtTextFilter
.getText())){
180 result
.addAll(specimenCache
.stream()
181 .filter(wrapper
->wrapper
.getUuidAndTitleCache().getTitleCache().toLowerCase().contains(txtTextFilter
.getText().toLowerCase()))
182 .collect(Collectors
.toList()));
183 result
.addAll(specimenCache
.stream()
184 .filter(wrapper
->wrapper
.getTaxonNode().getTaxon().getTitleCache().toLowerCase().contains(txtTextFilter
.getText().toLowerCase()))
185 .collect(Collectors
.toList()));
188 list
.setInput(result
);
191 private void loadSpecimens(){
192 ArrayList
<SpecimenNodeWrapper
> specimenList
= new ArrayList
<>(CdmStore
.getService(IDescriptiveDataSetService
.class).loadSpecimens(matrix
.getDescriptiveDataSet()));
193 Collections
.sort(specimenList
, new Comparator
<SpecimenNodeWrapper
>() {
196 public int compare(SpecimenNodeWrapper o1
, SpecimenNodeWrapper o2
) {
207 return o1
.getTaxonNode().getTaxon().getTitleCache().compareTo(o2
.getTaxonNode().getTaxon().getTitleCache());
209 catch(NullPointerException e
){
214 matrix
.setSpecimenCache(specimenList
);
218 protected void configureShell(Shell newShell
) {
219 super.configureShell(newShell
);
220 newShell
.setText(Messages
.SpecimenSelectionDialog_SELECT_SPECIMENS
);
221 newShell
.setMinimumSize(500, 600);
222 newShell
.setSize(800, 600);
226 protected void okPressed() {
227 selectedSpecimens
.clear();
228 selectedSpecimens
= ((IStructuredSelection
)list
.getSelection()).toList();
233 protected boolean isResizable() {
237 public Collection
<SpecimenNodeWrapper
> getSpecimen(){
238 return selectedSpecimens
;
241 private class SpecimenListLabelProvider
extends LabelProvider
implements ITableLabelProvider
{
244 public Image
getColumnImage(Object element
, int columnIndex
) {
249 public String
getColumnText(Object element
, int columnIndex
) {
250 if(element
instanceof SpecimenNodeWrapper
){
251 SpecimenNodeWrapper wrapper
= (SpecimenNodeWrapper
)element
;
252 switch (columnIndex
) {
254 return wrapper
.getTaxonNode().getTaxon().getName().getTitleCache();
256 return wrapper
.getUuidAndTitleCache().getTitleCache();