Project

General

Profile

Download (5.57 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.editor.l10n.Messages;
41
import eu.etaxonomy.taxeditor.model.ImageResources;
42
import eu.etaxonomy.taxeditor.store.CdmStore;
43

    
44
/**
45
 * Dialog to choose specimens for the character matrix.<br>
46
 * Filters specimens that have already been added.
47
 * @author pplitzner
48
 * @since Jan 3, 2018
49
 *
50
 */
51
public class SpecimenSelectionDialog extends Dialog {
52

    
53
    private TableViewer list;
54

    
55
    private Collection<SpecimenOrObservationBase> selectedSpecimens = new ArrayList<>();
56
    private CharacterMatrix matrix;
57

    
58
    protected SpecimenSelectionDialog(Shell parentShell, CharacterMatrix matrix) {
59
        super(parentShell);
60
        this.matrix = matrix;
61
    }
62

    
63
    @Override
64
    protected Control createDialogArea(Composite parent) {
65
        Composite composite = (Composite) super.createDialogArea(parent);
66
        composite.setLayout(new GridLayout());
67

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

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

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

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

    
116
    @Override
117
    protected void configureShell(Shell newShell) {
118
        super.configureShell(newShell);
119
        newShell.setText(Messages.SpecimenSelectionDialog_SELECT_SPECIMENS);
120
        newShell.setMinimumSize(500, 400);
121
    }
122

    
123
    /**
124
     * {@inheritDoc}
125
     */
126
    @Override
127
    protected void okPressed() {
128
        selectedSpecimens = ((IStructuredSelection)list.getSelection()).toList();
129
        super.okPressed();
130
    }
131

    
132
    public Collection<SpecimenOrObservationBase> getSpecimen(){
133
        return selectedSpecimens;
134
    }
135

    
136
    private class DescriptionContentProvider extends ArrayContentProvider{
137

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