Disable taxon filter + enable text filter on taxon names
[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.Collections;
14 import java.util.Comparator;
15 import java.util.List;
16 import java.util.stream.Collectors;
17
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;
41
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
51 /**
52 * Dialog to choose specimens for the character matrix.<br>
53 * Filters specimens that have already been added.
54 * @author pplitzner
55 * @since Jan 3, 2018
56 *
57 */
58 public class SpecimenSelectionDialog extends Dialog {
59
60 private static String TEXT_FILTER_DEFAULT = "Enter text filter";
61
62 private TableViewer list;
63
64 private Collection<SpecimenNodeWrapper> selectedSpecimens = new ArrayList<>();
65 private CharacterMatrix matrix;
66 private Text txtTextFilter;
67
68 // private TaxonNodeCombo comboTaxon;
69
70 protected SpecimenSelectionDialog(Shell parentShell, CharacterMatrix matrix) {
71 super(parentShell);
72 this.matrix = matrix;
73 }
74
75 @Override
76 protected Control createDialogArea(Composite parent) {
77 Composite composite = (Composite) super.createDialogArea(parent);
78 GridLayout gl_composite = new GridLayout();
79 composite.setLayout(gl_composite);
80
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));
84
85 Label lblNewLabel = new Label(composite_1, SWT.NONE);
86 lblNewLabel.setText("Refresh");
87
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());
92
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() {
97
98 @Override
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("");
103 }
104 }
105
106 @Override
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);
111 }
112 }
113 });
114 txtTextFilter.addModifyListener(e->applyFilter());
115
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() {
121 @Override
122 public void widgetSelected(SelectionEvent e) {
123 loadSpecimens();
124 list.setInput(matrix.getSpecimenCache());
125 }
126 });
127
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);
132 //table
133 list = new TableViewer(scrolledComposite, SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION | SWT.MULTI);
134 Table table = list.getTable();
135
136 //table columns
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());
153
154 //gather specimens
155 if(matrix.getSpecimenCache()==null){
156 loadSpecimens();
157 }
158
159 list.setInput(matrix.getSpecimenCache());
160
161 columnSpecimen.getColumn().pack();
162
163 return composite;
164 }
165
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);
171 }
172 else{
173 // if(comboTaxon.getSelection()!=null){
174 // result.addAll(specimenCache.stream()
175 // .filter(wrapper->wrapper.getTaxonNode().equals(comboTaxon.getSelection()))
176 // .collect(Collectors.toList()));
177 // }
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()));
186 }
187 }
188 list.setInput(result);
189 }
190
191 private void loadSpecimens(){
192 ArrayList<SpecimenNodeWrapper> specimenList = new ArrayList<>(CdmStore.getService(IDescriptiveDataSetService.class).loadSpecimens(matrix.getDescriptiveDataSet()));
193 Collections.sort(specimenList, new Comparator<SpecimenNodeWrapper>() {
194
195 @Override
196 public int compare(SpecimenNodeWrapper o1, SpecimenNodeWrapper o2) {
197 if(o1 == null){
198 if(o2 == null){
199 return 0;
200 }
201 return -1;
202 }
203 if(o2==null){
204 return 1;
205 }
206 try{
207 return o1.getTaxonNode().getTaxon().getTitleCache().compareTo(o2.getTaxonNode().getTaxon().getTitleCache());
208 }
209 catch(NullPointerException e){
210 return 0;
211 }
212 }
213 });
214 matrix.setSpecimenCache(specimenList);
215 }
216
217 @Override
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);
223 }
224
225 @Override
226 protected void okPressed() {
227 selectedSpecimens.clear();
228 selectedSpecimens = ((IStructuredSelection)list.getSelection()).toList();
229 super.okPressed();
230 }
231
232 @Override
233 protected boolean isResizable() {
234 return true;
235 }
236
237 public Collection<SpecimenNodeWrapper> getSpecimen(){
238 return selectedSpecimens;
239 }
240
241 private class SpecimenListLabelProvider extends LabelProvider implements ITableLabelProvider{
242
243 @Override
244 public Image getColumnImage(Object element, int columnIndex) {
245 return null;
246 }
247
248 @Override
249 public String getColumnText(Object element, int columnIndex) {
250 if(element instanceof SpecimenNodeWrapper){
251 SpecimenNodeWrapper wrapper = (SpecimenNodeWrapper)element;
252 switch (columnIndex) {
253 case 0:
254 return wrapper.getTaxonNode().getTaxon().getName().getTitleCache();
255 case 1:
256 return wrapper.getUuidAndTitleCache().getTitleCache();
257 default:
258 break;
259 }
260 }
261 return "";
262 }
263 }
264 }