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
.List
;
14 import java
.util
.stream
.Collectors
;
16 import org
.eclipse
.jface
.dialogs
.Dialog
;
17 import org
.eclipse
.jface
.viewers
.ArrayContentProvider
;
18 import org
.eclipse
.jface
.viewers
.IStructuredSelection
;
19 import org
.eclipse
.jface
.viewers
.ITableLabelProvider
;
20 import org
.eclipse
.jface
.viewers
.LabelProvider
;
21 import org
.eclipse
.jface
.viewers
.TableViewer
;
22 import org
.eclipse
.jface
.viewers
.TableViewerColumn
;
23 import org
.eclipse
.swt
.SWT
;
24 import org
.eclipse
.swt
.custom
.ScrolledComposite
;
25 import org
.eclipse
.swt
.events
.FocusEvent
;
26 import org
.eclipse
.swt
.events
.FocusListener
;
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
.Label
;
36 import org
.eclipse
.swt
.widgets
.Shell
;
37 import org
.eclipse
.swt
.widgets
.Table
;
38 import org
.eclipse
.swt
.widgets
.Text
;
40 import eu
.etaxonomy
.cdm
.api
.service
.IDescriptiveDataSetService
;
41 import eu
.etaxonomy
.cdm
.common
.CdmUtils
;
42 import eu
.etaxonomy
.cdm
.persistence
.dto
.SpecimenNodeWrapper
;
43 import eu
.etaxonomy
.taxeditor
.editor
.l10n
.Messages
;
44 import eu
.etaxonomy
.taxeditor
.model
.AbstractUtility
;
45 import eu
.etaxonomy
.taxeditor
.model
.ImageResources
;
46 import eu
.etaxonomy
.taxeditor
.preference
.Resources
;
47 import eu
.etaxonomy
.taxeditor
.store
.CdmStore
;
48 import eu
.etaxonomy
.taxeditor
.ui
.combo
.taxon
.TaxonNodeCombo
;
51 * Dialog to choose specimens for the character matrix.<br>
52 * Filters specimens that have already been added.
57 public class SpecimenSelectionDialog
extends Dialog
{
59 private static String TEXT_FILTER_DEFAULT
= "Enter text filter";
61 private TableViewer list
;
63 private Collection
<SpecimenNodeWrapper
> 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(4, false));
84 Label lblNewLabel
= new Label(composite_1
, SWT
.NONE
);
85 lblNewLabel
.setText("Taxon");
87 comboTaxon
= new TaxonNodeCombo(composite_1
, SWT
.NONE
);
88 comboTaxon
.setInput(matrix
.getDescriptiveDataSet().getTaxonSubtreeFilter());
89 comboTaxon
.addSelectionChangedListener(e
->applyFilter());
91 txtTextFilter
= new Text(composite_1
, SWT
.BORDER
);
92 txtTextFilter
.setLayoutData(new GridData(SWT
.FILL
, SWT
.CENTER
, true, false, 1, 1));
93 txtTextFilter
.setText(TEXT_FILTER_DEFAULT
);
94 txtTextFilter
.addFocusListener(new FocusListener() {
97 public void focusGained(FocusEvent e
) {
98 txtTextFilter
.setForeground(AbstractUtility
.getColor(Resources
.SEARCH_VIEW_FOCUS
));
99 if (TEXT_FILTER_DEFAULT
.equals(txtTextFilter
.getText())) {
100 txtTextFilter
.setText("");
105 public void focusLost(FocusEvent e
) {
106 if (CdmUtils
.isBlank(txtTextFilter
.getText())){
107 txtTextFilter
.setForeground(AbstractUtility
.getColor(Resources
.SEARCH_VIEW_FOREGROUND
));
108 txtTextFilter
.setText(TEXT_FILTER_DEFAULT
);
112 txtTextFilter
.addModifyListener(e
->applyFilter());
114 Button btnRefreshButton
= new Button(composite_1
, SWT
.NONE
);
115 btnRefreshButton
.setLayoutData(new GridData(SWT
.RIGHT
, SWT
.CENTER
, false, false, 1, 1));
116 btnRefreshButton
.setToolTipText(Messages
.SpecimenSelectionDialog_REFRESH
);
117 btnRefreshButton
.setImage(ImageResources
.getImage(ImageResources
.REFRESH
));
118 btnRefreshButton
.addSelectionListener(new SelectionAdapter() {
120 public void widgetSelected(SelectionEvent e
) {
122 list
.setInput(matrix
.getSpecimenCache());
126 ScrolledComposite scrolledComposite
= new ScrolledComposite(composite
, SWT
.BORDER
| SWT
.H_SCROLL
| SWT
.V_SCROLL
);
127 scrolledComposite
.setLayoutData(new GridData(SWT
.FILL
, SWT
.FILL
, true, true, 1, 1));
128 scrolledComposite
.setExpandHorizontal(true);
129 scrolledComposite
.setExpandVertical(true);
131 list
= new TableViewer(scrolledComposite
, SWT
.H_SCROLL
| SWT
.V_SCROLL
| SWT
.FULL_SELECTION
| SWT
.MULTI
);
132 Table table
= list
.getTable();
135 TableViewerColumn columnTaxon
= new TableViewerColumn(list
, SWT
.NONE
);
136 columnTaxon
.getColumn().setText("Taxon");
137 columnTaxon
.getColumn().setWidth(200);
138 columnTaxon
.getColumn().setResizable(true);
139 columnTaxon
.getColumn().setMoveable(true);
140 TableViewerColumn columnSpecimen
= new TableViewerColumn(list
, SWT
.NONE
);
141 columnSpecimen
.getColumn().setText("Specimen");
142 columnSpecimen
.getColumn().setResizable(true);
143 columnSpecimen
.getColumn().setMoveable(true);
144 columnSpecimen
.getColumn().setWidth(400);
145 table
.setHeaderVisible(true);
146 table
.setLinesVisible(true);
147 scrolledComposite
.setContent(table
);
148 scrolledComposite
.setMinSize(table
.computeSize(SWT
.DEFAULT
, SWT
.DEFAULT
));
149 list
.setContentProvider(new ArrayContentProvider());
150 list
.setLabelProvider(new SpecimenListLabelProvider());
153 if(matrix
.getSpecimenCache()==null){
157 list
.setInput(matrix
.getSpecimenCache());
159 columnSpecimen
.getColumn().pack();
164 private void applyFilter(){
165 Collection
<SpecimenNodeWrapper
> specimenCache
= matrix
.getSpecimenCache();
166 List
<SpecimenNodeWrapper
> result
= new ArrayList
<>();
167 if(comboTaxon
.getSelection()!=null){
168 result
.addAll(specimenCache
.stream()
169 .filter(wrapper
->wrapper
.getTaxonNode().equals(comboTaxon
.getSelection()))
170 .collect(Collectors
.toList()));
172 if(!txtTextFilter
.getForeground().equals(AbstractUtility
.getColor(Resources
.SEARCH_VIEW_FOREGROUND
))
173 &&!CdmUtils
.isBlank(txtTextFilter
.getText())){
174 result
.addAll(specimenCache
.stream()
175 .filter(wrapper
->wrapper
.getUuidAndTitleCache().getTitleCache().toLowerCase().contains(txtTextFilter
.getText().toLowerCase()))
176 .collect(Collectors
.toList()));
178 list
.setInput(result
);
181 private void loadSpecimens(){
182 Collection
<SpecimenNodeWrapper
> specimenCache
= CdmStore
.getService(IDescriptiveDataSetService
.class).loadSpecimens(matrix
.getDescriptiveDataSet());
183 matrix
.setSpecimenCache(specimenCache
);
187 protected void configureShell(Shell newShell
) {
188 super.configureShell(newShell
);
189 newShell
.setText(Messages
.SpecimenSelectionDialog_SELECT_SPECIMENS
);
190 newShell
.setMinimumSize(500, 600);
191 newShell
.setSize(800, 600);
195 protected void okPressed() {
196 selectedSpecimens
.clear();
197 selectedSpecimens
= ((IStructuredSelection
)list
.getSelection()).toList();
202 protected boolean isResizable() {
206 public Collection
<SpecimenNodeWrapper
> getSpecimen(){
207 return selectedSpecimens
;
210 private class SpecimenListLabelProvider
extends LabelProvider
implements ITableLabelProvider
{
213 public Image
getColumnImage(Object element
, int columnIndex
) {
218 public String
getColumnText(Object element
, int columnIndex
) {
219 if(element
instanceof SpecimenNodeWrapper
){
220 SpecimenNodeWrapper wrapper
= (SpecimenNodeWrapper
)element
;
221 switch (columnIndex
) {
223 return wrapper
.getTaxonNode().getTaxon().getName().getTitleCache();
225 return wrapper
.getUuidAndTitleCache().getTitleCache();