Project

General

Profile

Download (5.3 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.workingSet.matrix;
10

    
11
import java.util.ArrayList;
12
import java.util.Collection;
13
import java.util.HashSet;
14
import java.util.List;
15
import java.util.Set;
16
import java.util.UUID;
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.LabelProvider;
22
import org.eclipse.jface.viewers.TableViewer;
23
import org.eclipse.swt.SWT;
24
import org.eclipse.swt.events.SelectionAdapter;
25
import org.eclipse.swt.events.SelectionEvent;
26
import org.eclipse.swt.layout.GridData;
27
import org.eclipse.swt.layout.GridLayout;
28
import org.eclipse.swt.widgets.Button;
29
import org.eclipse.swt.widgets.Composite;
30
import org.eclipse.swt.widgets.Control;
31
import org.eclipse.swt.widgets.Shell;
32
import org.eclipse.swt.widgets.Table;
33

    
34
import eu.etaxonomy.cdm.api.service.IOccurrenceService;
35
import eu.etaxonomy.cdm.api.service.ITaxonNodeService;
36
import eu.etaxonomy.cdm.api.service.config.FindOccurrencesConfigurator;
37
import eu.etaxonomy.cdm.filter.TaxonNodeFilter;
38
import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase;
39
import eu.etaxonomy.cdm.model.taxon.Taxon;
40
import eu.etaxonomy.taxeditor.model.ImageResources;
41
import eu.etaxonomy.taxeditor.store.CdmStore;
42

    
43
/**
44
 * @author pplitzner
45
 * @since Jan 3, 2018
46
 *
47
 */
48
public class SpecimenSelectionDialog extends Dialog {
49

    
50
    private TableViewer list;
51

    
52
    private Collection<SpecimenOrObservationBase> selectedSpecimens = new ArrayList<>();
53
    private CharacterMatrix matrix;
54

    
55
    protected SpecimenSelectionDialog(Shell parentShell, CharacterMatrix matrix) {
56
        super(parentShell);
57
        this.matrix = matrix;
58
    }
59

    
60
    @Override
61
    protected Control createDialogArea(Composite parent) {
62
        Composite composite = (Composite) super.createDialogArea(parent);
63
        composite.setLayout(new GridLayout());
64

    
65
        Button btnRefreshButton = new Button(composite, SWT.NONE);
66
        btnRefreshButton.setToolTipText("Refresh");
67
        btnRefreshButton.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
68
        btnRefreshButton.setImage(ImageResources.getImage(ImageResources.REFRESH));
69
        btnRefreshButton.addSelectionListener(new SelectionAdapter() {
70
            @Override
71
            public void widgetSelected(SelectionEvent e) {
72
                loadSpecimens();
73
                list.setInput(matrix.getSpecimenCache());
74
            }
75
        });
76
        list = new TableViewer(composite);
77
        Table table = list.getTable();
78
        table.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
79
        list.setContentProvider(new DescriptionContentProvider());
80
        list.setLabelProvider(new LabelProvider());
81

    
82
        //gather descriptions
83
        if(matrix.getSpecimenCache()==null){
84
            loadSpecimens();
85
        }
86
        list.setInput(matrix.getSpecimenCache());
87
        return composite;
88
    }
89

    
90
    private void loadSpecimens(){
91
        Set<SpecimenOrObservationBase> specimens = new HashSet<>();
92
        //set filter parameters
93
        TaxonNodeFilter filter = TaxonNodeFilter.NewRankInstance(matrix.getWorkingSet().getMinRank(), matrix.getWorkingSet().getMaxRank());
94
        matrix.getWorkingSet().getGeoFilter().forEach(area -> filter.orArea(area.getUuid()));
95
        matrix.getWorkingSet().getTaxonSubtreeFilter().forEach(node -> filter.orSubtree(node));
96

    
97
        ITaxonNodeService taxonNodeService = CdmStore.getService(ITaxonNodeService.class);
98
        List<UUID> filteredNodes = taxonNodeService.uuidList(filter);
99
        for (UUID uuid : filteredNodes) {
100
            //TODO implement occurrence service for taxon nodes
101
            // let it return UuidAndTitleCache
102
            Taxon taxon = taxonNodeService.load(uuid).getTaxon();
103
            if(taxon!=null){
104
                FindOccurrencesConfigurator config = new FindOccurrencesConfigurator();
105
                config.setAssociatedTaxonUuid(taxon.getUuid());
106
                specimens.addAll(CdmStore.getService(IOccurrenceService.class).findByTitle(config).getRecords());
107
            }
108
        }
109
        matrix.setSpecimenCache(specimens);
110
    }
111

    
112
    @Override
113
    protected void configureShell(Shell newShell) {
114
        super.configureShell(newShell);
115
        newShell.setText("Select specimens");
116
        newShell.setMinimumSize(500, 400);
117
    }
118

    
119
    /**
120
     * {@inheritDoc}
121
     */
122
    @Override
123
    protected void okPressed() {
124
        selectedSpecimens = ((IStructuredSelection)list.getSelection()).toList();
125
        super.okPressed();
126
    }
127

    
128
    public Collection<SpecimenOrObservationBase> getSpecimen(){
129
        return selectedSpecimens;
130
    }
131

    
132
    private class DescriptionContentProvider extends ArrayContentProvider{
133

    
134
        /**
135
         * {@inheritDoc}
136
         */
137
        @Override
138
        public Object[] getElements(Object inputElement) {
139
            return ((Collection<SpecimenOrObservationBase>) inputElement).stream().filter(specimen ->
140
                specimen.getDescriptions().stream().noneMatch(description ->
141
                matrix.getWorkingSet().getDescriptions().contains(description))).toArray();
142
        }
143
    }
144
}
(8-8/8)