Merge branch 'release/5.6.0'
[taxeditor.git] / eu.etaxonomy.taxeditor.editor / src / main / java / eu / etaxonomy / taxeditor / editor / descriptiveDataSet / matrix / SpecimenSelectionDialog.java
1 /**
2 * Copyright (C) 2018 EDIT
3 * European Distributed Institute of Taxonomy
4 * http://www.e-taxonomy.eu
5 *
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.
8 */
9 package eu.etaxonomy.taxeditor.editor.descriptiveDataSet.matrix;
10
11 import java.util.ArrayList;
12 import java.util.Collection;
13 import java.util.List;
14 import java.util.stream.Collectors;
15
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;
39
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;
49
50 /**
51 * Dialog to choose specimens for the character matrix.<br>
52 * Filters specimens that have already been added.
53 * @author pplitzner
54 * @since Jan 3, 2018
55 *
56 */
57 public class SpecimenSelectionDialog extends Dialog {
58
59 private static String TEXT_FILTER_DEFAULT = "Enter text filter";
60
61 private TableViewer list;
62
63 private Collection<SpecimenNodeWrapper> selectedSpecimens = new ArrayList<>();
64 private CharacterMatrix matrix;
65 private Text txtTextFilter;
66
67 private TaxonNodeCombo comboTaxon;
68
69 protected SpecimenSelectionDialog(Shell parentShell, CharacterMatrix matrix) {
70 super(parentShell);
71 this.matrix = matrix;
72 }
73
74 @Override
75 protected Control createDialogArea(Composite parent) {
76 Composite composite = (Composite) super.createDialogArea(parent);
77 GridLayout gl_composite = new GridLayout();
78 composite.setLayout(gl_composite);
79
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));
83
84 Label lblNewLabel = new Label(composite_1, SWT.NONE);
85 lblNewLabel.setText("Taxon");
86
87 comboTaxon = new TaxonNodeCombo(composite_1, SWT.NONE);
88 comboTaxon.setInput(matrix.getDescriptiveDataSet().getTaxonSubtreeFilter());
89 comboTaxon.addSelectionChangedListener(e->applyFilter());
90
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() {
95
96 @Override
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("");
101 }
102 }
103
104 @Override
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);
109 }
110 }
111 });
112 txtTextFilter.addModifyListener(e->applyFilter());
113
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() {
119 @Override
120 public void widgetSelected(SelectionEvent e) {
121 loadSpecimens();
122 list.setInput(matrix.getSpecimenCache());
123 }
124 });
125
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);
130 //table
131 list = new TableViewer(scrolledComposite, SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION | SWT.MULTI);
132 Table table = list.getTable();
133
134 //table columns
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());
151
152 //gather specimens
153 if(matrix.getSpecimenCache()==null){
154 loadSpecimens();
155 }
156
157 list.setInput(matrix.getSpecimenCache());
158
159 columnSpecimen.getColumn().pack();
160
161 return composite;
162 }
163
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()));
171 }
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()));
177 }
178 list.setInput(result);
179 }
180
181 private void loadSpecimens(){
182 Collection<SpecimenNodeWrapper> specimenCache = CdmStore.getService(IDescriptiveDataSetService.class).loadSpecimens(matrix.getDescriptiveDataSet());
183 matrix.setSpecimenCache(specimenCache);
184 }
185
186 @Override
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);
192 }
193
194 @Override
195 protected void okPressed() {
196 selectedSpecimens.clear();
197 selectedSpecimens = ((IStructuredSelection)list.getSelection()).toList();
198 super.okPressed();
199 }
200
201 @Override
202 protected boolean isResizable() {
203 return true;
204 }
205
206 public Collection<SpecimenNodeWrapper> getSpecimen(){
207 return selectedSpecimens;
208 }
209
210 private class SpecimenListLabelProvider extends LabelProvider implements ITableLabelProvider{
211
212 @Override
213 public Image getColumnImage(Object element, int columnIndex) {
214 return null;
215 }
216
217 @Override
218 public String getColumnText(Object element, int columnIndex) {
219 if(element instanceof SpecimenNodeWrapper){
220 SpecimenNodeWrapper wrapper = (SpecimenNodeWrapper)element;
221 switch (columnIndex) {
222 case 0:
223 return wrapper.getTaxonNode().getTaxon().getName().getTitleCache();
224 case 1:
225 return wrapper.getUuidAndTitleCache().getTitleCache();
226 default:
227 break;
228 }
229 }
230 return "";
231 }
232 }
233 }