Project

General

Profile

Download (14.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.HashSet;
14
import java.util.Iterator;
15
import java.util.List;
16
import java.util.Set;
17
import java.util.stream.Collectors;
18

    
19
import org.apache.commons.lang.StringUtils;
20
import org.eclipse.jface.dialogs.Dialog;
21
import org.eclipse.jface.viewers.ArrayContentProvider;
22
import org.eclipse.jface.viewers.ColumnLabelProvider;
23
import org.eclipse.jface.viewers.IStructuredSelection;
24
import org.eclipse.jface.viewers.ITableLabelProvider;
25
import org.eclipse.jface.viewers.TableViewer;
26
import org.eclipse.jface.viewers.TableViewerColumn;
27
import org.eclipse.jface.viewers.Viewer;
28
import org.eclipse.jface.viewers.ViewerComparator;
29
import org.eclipse.swt.SWT;
30
import org.eclipse.swt.custom.ScrolledComposite;
31
import org.eclipse.swt.events.FocusEvent;
32
import org.eclipse.swt.events.FocusListener;
33
import org.eclipse.swt.events.SelectionAdapter;
34
import org.eclipse.swt.events.SelectionEvent;
35
import org.eclipse.swt.graphics.Image;
36
import org.eclipse.swt.layout.GridData;
37
import org.eclipse.swt.layout.GridLayout;
38
import org.eclipse.swt.widgets.Button;
39
import org.eclipse.swt.widgets.Composite;
40
import org.eclipse.swt.widgets.Control;
41
import org.eclipse.swt.widgets.Label;
42
import org.eclipse.swt.widgets.Shell;
43
import org.eclipse.swt.widgets.Table;
44
import org.eclipse.swt.widgets.Text;
45

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

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

    
65
    private static String TEXT_FILTER_DEFAULT = "Enter text filter";
66

    
67
    private TableViewer list;
68

    
69
    private Collection<SpecimenNodeWrapper> selectedSpecimens = new ArrayList<>();
70
    private CharacterMatrix matrix;
71
    private Text txtTextFilter;
72
    private List<String> treeIndexList;
73
    private List<String> taxonTitleList;
74
    private Label l_title;
75

    
76

    
77
    public SpecimenSelectionDialog(Shell parentShell, CharacterMatrix matrix, List<String> treeIndex, List<String> taxonTitleList) {
78
        super(parentShell);
79
        this.matrix = matrix;
80
        this.treeIndexList = treeIndex;
81
        this.taxonTitleList = taxonTitleList;
82
    }
83

    
84
    @Override
85
    protected Control createDialogArea(Composite parent) {
86
        Composite composite = (Composite) super.createDialogArea(parent);
87
        GridLayout gl_composite = new GridLayout();
88
        gl_composite.numColumns = 2;
89
        composite.setLayout(gl_composite);
90
        l_title = new Label(composite, SWT.NULL);
91
        if (taxonTitleList != null && !taxonTitleList.isEmpty()){
92
            Iterator<String> iterator = taxonTitleList.iterator();
93
            String titleString=iterator.next();
94
            while(iterator.hasNext() ){
95
                titleString += ", "+ iterator.next();
96
            }
97
            l_title.setText("Taxon Filter: ");
98
            Label l_title_filter = new Label(composite, SWT.NULL);
99
            l_title_filter.setText(titleString);
100
        }
101
        Composite composite_1 = new Composite(composite, SWT.NONE);
102
        composite_1.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false, 2, 1));
103
        composite_1.setLayout(new GridLayout(5, false));
104

    
105
        Label l_textFilter = new Label(composite_1, SWT.NULL);
106
        GridData data_label = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1);
107

    
108

    
109
        l_textFilter.setLayoutData(data_label);
110
        l_textFilter.setText("Specimen Filter");
111
        l_textFilter.setAlignment(SWT.RIGHT);
112
        txtTextFilter = new Text(composite_1, SWT.BORDER);
113
        txtTextFilter.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 2, 1));
114
        txtTextFilter.setText(TEXT_FILTER_DEFAULT);
115
        txtTextFilter.addFocusListener(new FocusListener() {
116

    
117
            @Override
118
            public void focusGained(FocusEvent e) {
119
                txtTextFilter.setForeground(AbstractUtility.getColor(Resources.SEARCH_VIEW_FOCUS));
120
                if (TEXT_FILTER_DEFAULT.equals(txtTextFilter.getText())) {
121
                    StoreUtil.setTextWithoutModifyListeners(txtTextFilter, "");
122
                }
123
            }
124

    
125
            @Override
126
            public void focusLost(FocusEvent e) {
127
                if (CdmUtils.isBlank(txtTextFilter.getText())){
128
                    txtTextFilter.setForeground(AbstractUtility.getColor(Resources.SEARCH_VIEW_FOREGROUND));
129
                    StoreUtil.setTextWithoutModifyListeners(txtTextFilter, TEXT_FILTER_DEFAULT);
130
                }
131
            }
132
        });
133
        txtTextFilter.addModifyListener(e->applyFilter());
134

    
135
        Button btnRefreshButton = new Button(composite_1, SWT.NONE);
136
        btnRefreshButton.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
137
        btnRefreshButton.setToolTipText(Messages.SpecimenSelectionDialog_REFRESH);
138
        btnRefreshButton.setImage(ImageResources.getImage(ImageResources.REFRESH));
139
        btnRefreshButton.addSelectionListener(new SelectionAdapter() {
140
            @Override
141
            public void widgetSelected(SelectionEvent e) {
142
                loadSpecimens();
143
                refreshInput();
144
            }
145
        });
146

    
147
        Button btnRemoveFilterButton = new Button(composite_1, SWT.NONE);
148
        btnRemoveFilterButton.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
149
        btnRemoveFilterButton.setToolTipText(Messages.SpecimenSelectionDialog_REMOVE_FILTER);
150
        btnRemoveFilterButton.setImage(ImageResources.getImage(ImageResources.TRASH_ICON));
151
        btnRemoveFilterButton.addSelectionListener(new SelectionAdapter() {
152
            @Override
153
            public void widgetSelected(SelectionEvent e) {
154
                txtTextFilter.setText("");
155
                treeIndexList = null;
156
                l_title.setText("");
157
                refreshInput();
158
            }
159
        });
160

    
161
        Composite composite_2 = new Composite(composite, SWT.NONE);
162
        composite_2.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false, 2, 1));
163
        composite_2.setLayout(new GridLayout(2, false));
164
        Label lblNewLabel = new Label(composite_2, SWT.NONE);
165
        lblNewLabel.setImage(ImageResources.getImage(ImageResources.WARNING_ICON));
166

    
167
        Label lblNewLabel_1 = new Label(composite_2, SWT.NONE);
168
        lblNewLabel_1.setText(": Specimen not associated with taxon");
169

    
170
        ScrolledComposite scrolledComposite = new ScrolledComposite(composite, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL);
171
        scrolledComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 2, 1));
172
        scrolledComposite.setExpandHorizontal(true);
173
        scrolledComposite.setExpandVertical(true);
174
        //table
175
        list = new TableViewer(scrolledComposite, SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION | SWT.MULTI);
176
        Table table = list.getTable();
177

    
178
        //table columns
179
        TableViewerColumn columnTaxon = new TableViewerColumn(list, SWT.NONE);
180
        columnTaxon.getColumn().setText("Taxon");
181
        columnTaxon.getColumn().setWidth(200);
182
        columnTaxon.getColumn().setResizable(true);
183
        columnTaxon.getColumn().setMoveable(true);
184
        TableViewerColumn columnType = new TableViewerColumn(list, SWT.NONE);
185
        columnType.getColumn().setText("Type");
186
        columnType.getColumn().setWidth(150);
187
        columnType.getColumn().setResizable(true);
188
        columnType.getColumn().setMoveable(true);
189
        TableViewerColumn columnSpecimen = new TableViewerColumn(list, SWT.NONE);
190
        columnSpecimen.getColumn().setText("Specimen");
191
        columnSpecimen.getColumn().setResizable(true);
192
        columnSpecimen.getColumn().setMoveable(true);
193
        columnSpecimen.getColumn().setWidth(400);
194

    
195
        table.setHeaderVisible(true);
196
        table.setLinesVisible(true);
197
        scrolledComposite.setContent(table);
198
        scrolledComposite.setMinSize(table.computeSize(SWT.DEFAULT, SWT.DEFAULT));
199
        list.setContentProvider(new ArrayContentProvider());
200
        list.setLabelProvider(new SpecimenListLabelProvider());
201

    
202
        ViewerComparator comp = new ViewerComparator() {
203
            @Override
204
            public int compare(Viewer viewer, Object o1, Object o2) {
205
                if(o1 == null){
206
                     if(o2 == null){
207
                         return 0;
208
                     }
209
                     return -1;
210
                 }
211
                 if(o2==null){
212
                     return 1;
213
                 }
214
                 try{
215
                    return ((SpecimenNodeWrapper)o1).getTaxonNode().getTitleCache().compareTo(((SpecimenNodeWrapper)o2).getTaxonNode().getTitleCache());
216

    
217
                 }
218
                 catch(NullPointerException e){
219
                     return 0;
220
                 }
221

    
222
             }
223
        };
224

    
225
        list.setComparator(comp);
226

    
227
        //gather specimens
228
        if(matrix.getSpecimenCache()==null){
229
            loadSpecimens();
230
        }
231
        if(treeIndexList !=null){
232
            filterByTaxonNode( null);
233
        }else{
234
            refreshInput();
235
        }
236

    
237
        columnSpecimen.getColumn().pack();
238

    
239
        return composite;
240
    }
241

    
242
    private void refreshInput(){
243
        applyFilter();
244
    }
245

    
246
    private void applyFilter(){
247
        Set<SpecimenNodeWrapper> result = new HashSet<>();
248
        Collection<SpecimenNodeWrapper> specimenCache = matrix.getSpecimenCache();
249
        String text = txtTextFilter.getText();
250

    
251
        //filter for treeIndexList is missing
252
        if(CdmUtils.isBlank(text) || text.equals(TEXT_FILTER_DEFAULT)){
253
            result = new HashSet<>(specimenCache);
254
        }
255
        else{
256
            if(!txtTextFilter.getForeground().equals(AbstractUtility.getColor(Resources.SEARCH_VIEW_FOREGROUND))
257
                    &&!CdmUtils.isBlank(text)){
258
                result.addAll(specimenCache.stream()
259
                        .filter(wrapper->wrapper.getUuidAndTitleCache().getTitleCache().toLowerCase().contains(text.toLowerCase()))
260
                        .collect(Collectors.toList()));
261
                result.addAll(specimenCache.stream()
262
                        .filter(wrapper->wrapper.getTaxonNode().getTitleCache().toLowerCase().contains(text.toLowerCase()))
263
                        .collect(Collectors.toList()));
264
            }
265
        }
266
        filterByTaxonNode(result);
267

    
268
    }
269

    
270
    private void loadSpecimens(){
271
        ArrayList<SpecimenNodeWrapper> specimenList = new ArrayList<>(CdmStore.getService(IDescriptiveDataSetService.class).loadSpecimens(matrix.getDescriptiveDataSet().getUuid()));
272
//        Collections.sort(specimenList, new Comparator<SpecimenNodeWrapper>() {
273
//
274
//            @Override
275
//            public int compare(SpecimenNodeWrapper o1, SpecimenNodeWrapper o2) {
276
//                if(o1 == null){
277
//                    if(o2 == null){
278
//                        return 0;
279
//                    }
280
//                    return -1;
281
//                }
282
//                if(o2==null){
283
//                    return 1;
284
//                }
285
//                try{
286
//                    return o1.getTaxonNode().getTitleCache().compareTo(o2.getTaxonNode().getTitleCache());
287
//                }
288
//                catch(NullPointerException e){
289
//                    return 0;
290
//                }
291
//            }
292
//        });
293
        matrix.setSpecimenCache(specimenList);
294
    }
295

    
296
    @Override
297
    protected void configureShell(Shell newShell) {
298
        super.configureShell(newShell);
299
        newShell.setText(Messages.SpecimenSelectionDialog_SELECT_SPECIMENS);
300
        newShell.setMinimumSize(500, 600);
301
        newShell.setSize(800, 600);
302
    }
303

    
304
    @Override
305
    protected void okPressed() {
306
        selectedSpecimens.clear();
307
        selectedSpecimens = ((IStructuredSelection)list.getSelection()).toList();
308
        super.okPressed();
309
    }
310

    
311
    @Override
312
    protected boolean isResizable() {
313
        return true;
314
    }
315

    
316
    public Collection<SpecimenNodeWrapper> getSpecimen(){
317
        return selectedSpecimens;
318
    }
319

    
320
    private class SpecimenListLabelProvider extends ColumnLabelProvider implements ITableLabelProvider {
321

    
322
        @Override
323
        public String getToolTipText(Object element) {
324
            if(element instanceof SpecimenNodeWrapper
325
                    && ((SpecimenNodeWrapper) element).getTaxonDescriptionUuid()==null){
326
                return "Does not have and IndividualsAssociation with the taxon";
327
            }
328
            return null;
329
        }
330

    
331
        @Override
332
        public Image getColumnImage(Object element, int columnIndex) {
333
            if(element instanceof SpecimenNodeWrapper && columnIndex == 2
334
                    && ((SpecimenNodeWrapper) element).getTaxonDescriptionUuid()==null){
335
                return ImageResources.getImage(ImageResources.WARNING_ICON);
336
            }
337
            return null;
338
        }
339

    
340
        @Override
341
        public String getColumnText(Object element, int columnIndex) {
342
            if(element instanceof SpecimenNodeWrapper){
343
                SpecimenNodeWrapper wrapper = (SpecimenNodeWrapper)element;
344
                switch (columnIndex) {
345
                case 0:
346
                    return wrapper.getTaxonNode().getTitleCache();
347
                case 1:
348
                    return wrapper.getType().getMessage();
349
                case 2:
350
                    return wrapper.getUuidAndTitleCache().getTitleCache();
351
                default:
352
                    break;
353
                }
354
            }
355
            return "";
356
        }
357
    }
358

    
359
    private void filterByTaxonNode( Collection<SpecimenNodeWrapper> specimenCache){
360
        Collection<SpecimenNodeWrapper> result = new ArrayList<>();
361
        if (specimenCache == null){
362
            specimenCache = matrix.getSpecimenCache();
363
        }
364
        if (treeIndexList != null){
365
            for (String treeIndex: this.treeIndexList){
366
                if (StringUtils.isNotBlank(treeIndex)){
367
                    result.addAll(specimenCache.stream()
368
                                .filter(wrapper->wrapper.getTaxonNode().getTreeIndex().startsWith(treeIndex))
369
                                .collect(Collectors.toList()));
370
                }
371
            }
372
        }else{
373
            result.addAll(specimenCache);
374
        }
375

    
376

    
377
        list.setInput(result);
378
    }
379
}
(19-19/19)