Project

General

Profile

Download (13.7 KB) Statistics
| Branch: | Tag: | Revision:
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.apache.commons.lang.StringUtils;
17
import org.eclipse.jface.dialogs.Dialog;
18
import org.eclipse.jface.viewers.ArrayContentProvider;
19
import org.eclipse.jface.viewers.ColumnLabelProvider;
20
import org.eclipse.jface.viewers.IStructuredSelection;
21
import org.eclipse.jface.viewers.ITableLabelProvider;
22
import org.eclipse.jface.viewers.TableViewer;
23
import org.eclipse.jface.viewers.TableViewerColumn;
24
import org.eclipse.jface.viewers.Viewer;
25
import org.eclipse.jface.viewers.ViewerComparator;
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.Label;
39
import org.eclipse.swt.widgets.Shell;
40
import org.eclipse.swt.widgets.Table;
41
import org.eclipse.swt.widgets.Text;
42

    
43
import eu.etaxonomy.cdm.api.service.IDescriptiveDataSetService;
44
import eu.etaxonomy.cdm.common.CdmUtils;
45
import eu.etaxonomy.cdm.persistence.dto.SpecimenNodeWrapper;
46
import eu.etaxonomy.taxeditor.editor.l10n.Messages;
47
import eu.etaxonomy.taxeditor.model.AbstractUtility;
48
import eu.etaxonomy.taxeditor.model.ImageResources;
49
import eu.etaxonomy.taxeditor.preference.Resources;
50
import eu.etaxonomy.taxeditor.store.CdmStore;
51
import eu.etaxonomy.taxeditor.store.StoreUtil;
52

    
53
/**
54
 * Dialog to choose specimens for the character matrix.<br>
55
 * Filters specimens that have already been added.
56
 * @author pplitzner
57
 * @since Jan 3, 2018
58
 *
59
 */
60
public class SpecimenSelectionDialog extends Dialog {
61

    
62
    private static String TEXT_FILTER_DEFAULT = "Enter text filter";
63

    
64
    private TableViewer list;
65

    
66
    private Collection<SpecimenNodeWrapper> selectedSpecimens = new ArrayList<>();
67
    private CharacterMatrix matrix;
68
    private Text txtTextFilter;
69
    private List<String> treeIndex;
70

    
71

    
72
    public SpecimenSelectionDialog(Shell parentShell, CharacterMatrix matrix, List<String> treeIndex) {
73
        super(parentShell);
74
        this.matrix = matrix;
75
        this.treeIndex = treeIndex;
76
    }
77

    
78
    @Override
79
    protected Control createDialogArea(Composite parent) {
80
        Composite composite = (Composite) super.createDialogArea(parent);
81
        GridLayout gl_composite = new GridLayout();
82
        gl_composite.numColumns = 2;
83
        composite.setLayout(gl_composite);
84

    
85
        Composite composite_1 = new Composite(composite, SWT.NONE);
86
        composite_1.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false, 2, 1));
87
        composite_1.setLayout(new GridLayout(5, false));
88

    
89
        Label l_textFilter = new Label(composite_1, SWT.NULL);
90
        GridData data_label = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1);
91

    
92

    
93
        l_textFilter.setLayoutData(data_label);
94
        l_textFilter.setText("Specimen Filter");
95
        l_textFilter.setAlignment(SWT.RIGHT);
96
        txtTextFilter = new Text(composite_1, SWT.BORDER);
97
        txtTextFilter.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 2, 1));
98
        txtTextFilter.setText(TEXT_FILTER_DEFAULT);
99
        txtTextFilter.addFocusListener(new FocusListener() {
100

    
101
            @Override
102
            public void focusGained(FocusEvent e) {
103
                txtTextFilter.setForeground(AbstractUtility.getColor(Resources.SEARCH_VIEW_FOCUS));
104
                if (TEXT_FILTER_DEFAULT.equals(txtTextFilter.getText())) {
105
                    StoreUtil.setTextWithoutModifyListeners(txtTextFilter, "");
106
                }
107
            }
108

    
109
            @Override
110
            public void focusLost(FocusEvent e) {
111
                if (CdmUtils.isBlank(txtTextFilter.getText())){
112
                    txtTextFilter.setForeground(AbstractUtility.getColor(Resources.SEARCH_VIEW_FOREGROUND));
113
                    StoreUtil.setTextWithoutModifyListeners(txtTextFilter, TEXT_FILTER_DEFAULT);
114
                }
115
            }
116
        });
117
        txtTextFilter.addModifyListener(e->applyFilter());
118

    
119
        Button btnRefreshButton = new Button(composite_1, SWT.NONE);
120
        btnRefreshButton.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
121
        btnRefreshButton.setToolTipText(Messages.SpecimenSelectionDialog_REFRESH);
122
        btnRefreshButton.setImage(ImageResources.getImage(ImageResources.REFRESH));
123
        btnRefreshButton.addSelectionListener(new SelectionAdapter() {
124
            @Override
125
            public void widgetSelected(SelectionEvent e) {
126
                loadSpecimens();
127
                refreshInput(matrix.getSpecimenCache());
128
            }
129
        });
130

    
131
        Button btnRemoveTaxonFilterButton = new Button(composite_1, SWT.NONE);
132
        btnRemoveTaxonFilterButton.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
133
        btnRemoveTaxonFilterButton.setToolTipText(Messages.SpecimenSelectionDialog_REMOVE_FILTER);
134
        btnRemoveTaxonFilterButton.setImage(ImageResources.getImage(ImageResources.TRASH_ICON));
135
        btnRemoveTaxonFilterButton.addSelectionListener(new SelectionAdapter() {
136
            @Override
137
            public void widgetSelected(SelectionEvent e) {
138
                txtTextFilter.setText("");
139
                refreshInput(matrix.getSpecimenCache());
140
            }
141
        });
142

    
143
        Label lblNewLabel = new Label(composite, SWT.NONE);
144
        lblNewLabel.setImage(ImageResources.getImage(ImageResources.WARNING_ICON));
145

    
146
        Label lblNewLabel_1 = new Label(composite, SWT.NONE);
147
        lblNewLabel_1.setText(": Specimen not associated with taxon");
148

    
149
        ScrolledComposite scrolledComposite = new ScrolledComposite(composite, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL);
150
        scrolledComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 2, 1));
151
        scrolledComposite.setExpandHorizontal(true);
152
        scrolledComposite.setExpandVertical(true);
153
        //table
154
        list = new TableViewer(scrolledComposite, SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION | SWT.MULTI);
155
        Table table = list.getTable();
156

    
157
        //table columns
158
        TableViewerColumn columnTaxon = new TableViewerColumn(list, SWT.NONE);
159
        columnTaxon.getColumn().setText("Taxon");
160
        columnTaxon.getColumn().setWidth(200);
161
        columnTaxon.getColumn().setResizable(true);
162
        columnTaxon.getColumn().setMoveable(true);
163
        TableViewerColumn columnType = new TableViewerColumn(list, SWT.NONE);
164
        columnType.getColumn().setText("Type");
165
        columnType.getColumn().setWidth(150);
166
        columnType.getColumn().setResizable(true);
167
        columnType.getColumn().setMoveable(true);
168
        TableViewerColumn columnSpecimen = new TableViewerColumn(list, SWT.NONE);
169
        columnSpecimen.getColumn().setText("Specimen");
170
        columnSpecimen.getColumn().setResizable(true);
171
        columnSpecimen.getColumn().setMoveable(true);
172
        columnSpecimen.getColumn().setWidth(400);
173

    
174
        table.setHeaderVisible(true);
175
        table.setLinesVisible(true);
176
        scrolledComposite.setContent(table);
177
        scrolledComposite.setMinSize(table.computeSize(SWT.DEFAULT, SWT.DEFAULT));
178
        list.setContentProvider(new ArrayContentProvider());
179
        list.setLabelProvider(new SpecimenListLabelProvider());
180

    
181
        ViewerComparator comp = new ViewerComparator() {
182
            @Override
183
            public int compare(Viewer viewer, Object o1, Object o2) {
184
                if(o1 == null){
185
                     if(o2 == null){
186
                         return 0;
187
                     }
188
                     return -1;
189
                 }
190
                 if(o2==null){
191
                     return 1;
192
                 }
193
                 try{
194
                    return ((SpecimenNodeWrapper)o1).getTaxonNode().getTitleCache().compareTo(((SpecimenNodeWrapper)o2).getTaxonNode().getTitleCache());
195

    
196
                 }
197
                 catch(NullPointerException e){
198
                     return 0;
199
                 }
200

    
201
             }
202
        };
203

    
204
        list.setComparator(comp);
205

    
206
        //gather specimens
207
        if(matrix.getSpecimenCache()==null){
208
            loadSpecimens();
209
        }
210
        if(treeIndex !=null){
211
            filterByTaxonNode(treeIndex, null);
212
        }else{
213
            refreshInput(matrix.getSpecimenCache());
214
        }
215

    
216
        columnSpecimen.getColumn().pack();
217

    
218
        return composite;
219
    }
220

    
221
    private void refreshInput(Object input){
222
        list.setInput(input);
223
    }
224

    
225
    private void applyFilter(){
226
        List<SpecimenNodeWrapper> result = new ArrayList<>();
227
        Collection<SpecimenNodeWrapper> specimenCache = matrix.getSpecimenCache();
228
        String text = txtTextFilter.getText();
229

    
230
        //filter for treeIndex is missing
231
        if(CdmUtils.isBlank(text)){
232
            result = new ArrayList<>(specimenCache);
233
        }
234
        else{
235
            if(!txtTextFilter.getForeground().equals(AbstractUtility.getColor(Resources.SEARCH_VIEW_FOREGROUND))
236
                    &&!CdmUtils.isBlank(text)){
237
                result.addAll(specimenCache.stream()
238
                        .filter(wrapper->wrapper.getUuidAndTitleCache().getTitleCache().toLowerCase().contains(text.toLowerCase()))
239
                        .collect(Collectors.toList()));
240
                result.addAll(specimenCache.stream()
241
                        .filter(wrapper->wrapper.getTaxonNode().getTitleCache().toLowerCase().contains(text.toLowerCase()))
242
                        .collect(Collectors.toList()));
243
            }
244
        }
245
        filterByTaxonNode(treeIndex, result);
246

    
247
    }
248

    
249
    private void loadSpecimens(){
250
        ArrayList<SpecimenNodeWrapper> specimenList = new ArrayList<>(CdmStore.getService(IDescriptiveDataSetService.class).loadSpecimens(matrix.getDescriptiveDataSet().getUuid()));
251
//        Collections.sort(specimenList, new Comparator<SpecimenNodeWrapper>() {
252
//
253
//            @Override
254
//            public int compare(SpecimenNodeWrapper o1, SpecimenNodeWrapper o2) {
255
//                if(o1 == null){
256
//                    if(o2 == null){
257
//                        return 0;
258
//                    }
259
//                    return -1;
260
//                }
261
//                if(o2==null){
262
//                    return 1;
263
//                }
264
//                try{
265
//                    return o1.getTaxonNode().getTitleCache().compareTo(o2.getTaxonNode().getTitleCache());
266
//                }
267
//                catch(NullPointerException e){
268
//                    return 0;
269
//                }
270
//            }
271
//        });
272
        matrix.setSpecimenCache(specimenList);
273
    }
274

    
275
    @Override
276
    protected void configureShell(Shell newShell) {
277
        super.configureShell(newShell);
278
        newShell.setText(Messages.SpecimenSelectionDialog_SELECT_SPECIMENS);
279
        newShell.setMinimumSize(500, 600);
280
        newShell.setSize(800, 600);
281
    }
282

    
283
    @Override
284
    protected void okPressed() {
285
        selectedSpecimens.clear();
286
        selectedSpecimens = ((IStructuredSelection)list.getSelection()).toList();
287
        super.okPressed();
288
    }
289

    
290
    @Override
291
    protected boolean isResizable() {
292
        return true;
293
    }
294

    
295
    public Collection<SpecimenNodeWrapper> getSpecimen(){
296
        return selectedSpecimens;
297
    }
298

    
299
    private class SpecimenListLabelProvider extends ColumnLabelProvider implements ITableLabelProvider {
300

    
301
        @Override
302
        public String getToolTipText(Object element) {
303
            if(element instanceof SpecimenNodeWrapper
304
                    && ((SpecimenNodeWrapper) element).getTaxonDescriptionUuid()==null){
305
                return "Does not have and IndividualsAssociation with the taxon";
306
            }
307
            return null;
308
        }
309

    
310
        @Override
311
        public Image getColumnImage(Object element, int columnIndex) {
312
            if(element instanceof SpecimenNodeWrapper && columnIndex == 2
313
                    && ((SpecimenNodeWrapper) element).getTaxonDescriptionUuid()==null){
314
                return ImageResources.getImage(ImageResources.WARNING_ICON);
315
            }
316
            return null;
317
        }
318

    
319
        @Override
320
        public String getColumnText(Object element, int columnIndex) {
321
            if(element instanceof SpecimenNodeWrapper){
322
                SpecimenNodeWrapper wrapper = (SpecimenNodeWrapper)element;
323
                switch (columnIndex) {
324
                case 0:
325
                    return wrapper.getTaxonNode().getTitleCache();
326
                case 1:
327
                    return wrapper.getType().getMessage();
328
                case 2:
329
                    return wrapper.getUuidAndTitleCache().getTitleCache();
330
                default:
331
                    break;
332
                }
333
            }
334
            return "";
335
        }
336
    }
337

    
338
    private void filterByTaxonNode(List<String> treeIndexList, Collection<SpecimenNodeWrapper> specimenCache){
339
        Collection<SpecimenNodeWrapper> result = new ArrayList<>();
340
        if (specimenCache == null){
341
            specimenCache = matrix.getSpecimenCache();
342
        }
343
        for (String treeIndex: treeIndexList){
344
            if (StringUtils.isNotBlank(treeIndex)){
345
                result.addAll(specimenCache.stream()
346
                            .filter(wrapper->wrapper.getTaxonNode().getTreeIndex().startsWith(treeIndex))
347
                            .collect(Collectors.toList()));
348
            }
349
        }
350

    
351

    
352
        refreshInput(result);
353
    }
354
}
(19-19/19)