ref #8450 Show recordBasis and isIndividualsAssociation in table
[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.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;
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 import eu.etaxonomy.taxeditor.store.StoreUtil;
51
52 /**
53 * Dialog to choose specimens for the character matrix.<br>
54 * Filters specimens that have already been added.
55 * @author pplitzner
56 * @since Jan 3, 2018
57 *
58 */
59 public class SpecimenSelectionDialog extends Dialog {
60
61 private static String TEXT_FILTER_DEFAULT = "Enter text filter";
62
63 private TableViewer list;
64
65 private Collection<SpecimenNodeWrapper> selectedSpecimens = new ArrayList<>();
66 private CharacterMatrix matrix;
67 private Text txtTextFilter;
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 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() {
88
89 @Override
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, "");
94 }
95 }
96
97 @Override
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);
102 }
103 }
104 });
105 txtTextFilter.addModifyListener(e->applyFilter());
106
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() {
112 @Override
113 public void widgetSelected(SelectionEvent e) {
114 loadSpecimens();
115 list.setInput(matrix.getSpecimenCache());
116 }
117 });
118
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);
123 //table
124 list = new TableViewer(scrolledComposite, SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION | SWT.MULTI);
125 Table table = list.getTable();
126
127 //table columns
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);
143
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());
150
151 //gather specimens
152 if(matrix.getSpecimenCache()==null){
153 loadSpecimens();
154 }
155
156 list.setInput(matrix.getSpecimenCache());
157
158 columnSpecimen.getColumn().pack();
159
160 // enable tooltips
161 columnSpecimen.setLabelProvider(new SpecimenListLabelProvider());
162 ColumnViewerToolTipSupport.enableFor(columnSpecimen.getViewer());
163
164 return composite;
165 }
166
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);
173 }
174 else{
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()));
183 }
184 }
185 list.setInput(result);
186 }
187
188 private void loadSpecimens(){
189 ArrayList<SpecimenNodeWrapper> specimenList = new ArrayList<>(CdmStore.getService(IDescriptiveDataSetService.class).loadSpecimens(matrix.getDescriptiveDataSet()));
190 Collections.sort(specimenList, new Comparator<SpecimenNodeWrapper>() {
191
192 @Override
193 public int compare(SpecimenNodeWrapper o1, SpecimenNodeWrapper o2) {
194 if(o1 == null){
195 if(o2 == null){
196 return 0;
197 }
198 return -1;
199 }
200 if(o2==null){
201 return 1;
202 }
203 try{
204 return o1.getTaxonNode().getTaxon().getTitleCache().compareTo(o2.getTaxonNode().getTaxon().getTitleCache());
205 }
206 catch(NullPointerException e){
207 return 0;
208 }
209 }
210 });
211 matrix.setSpecimenCache(specimenList);
212 }
213
214 @Override
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);
220 }
221
222 @Override
223 protected void okPressed() {
224 selectedSpecimens.clear();
225 selectedSpecimens = ((IStructuredSelection)list.getSelection()).toList();
226 super.okPressed();
227 }
228
229 @Override
230 protected boolean isResizable() {
231 return true;
232 }
233
234 public Collection<SpecimenNodeWrapper> getSpecimen(){
235 return selectedSpecimens;
236 }
237
238 private class SpecimenListLabelProvider extends ColumnLabelProvider implements ITableLabelProvider {
239
240 @Override
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";
245 }
246 return null;
247 }
248
249 @Override
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);
254 }
255 return null;
256 }
257
258 @Override
259 public String getColumnText(Object element, int columnIndex) {
260 if(element instanceof SpecimenNodeWrapper){
261 SpecimenNodeWrapper wrapper = (SpecimenNodeWrapper)element;
262 switch (columnIndex) {
263 case 0:
264 return wrapper.getTaxonNode().getTaxon().getName().getTitleCache();
265 case 1:
266 return wrapper.getType().getMessage();
267 case 2:
268 return wrapper.getUuidAndTitleCache().getTitleCache();
269 default:
270 break;
271 }
272 }
273 return "";
274 }
275 }
276 }