Project

General

Profile

Download (8.71 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.Arrays;
13
import java.util.Collection;
14
import java.util.List;
15
import java.util.stream.Collectors;
16
import java.util.stream.Stream;
17

    
18
import org.eclipse.jface.dialogs.Dialog;
19
import org.eclipse.jface.layout.GridDataFactory;
20
import org.eclipse.jface.viewers.ArrayContentProvider;
21
import org.eclipse.jface.viewers.IStructuredSelection;
22
import org.eclipse.jface.viewers.ITableLabelProvider;
23
import org.eclipse.jface.viewers.LabelProvider;
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.events.FocusEvent;
28
import org.eclipse.swt.events.FocusListener;
29
import org.eclipse.swt.events.SelectionAdapter;
30
import org.eclipse.swt.events.SelectionEvent;
31
import org.eclipse.swt.graphics.Image;
32
import org.eclipse.swt.layout.GridData;
33
import org.eclipse.swt.layout.GridLayout;
34
import org.eclipse.swt.widgets.Button;
35
import org.eclipse.swt.widgets.Composite;
36
import org.eclipse.swt.widgets.Control;
37
import org.eclipse.swt.widgets.Label;
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.IWorkingSetService;
43
import eu.etaxonomy.cdm.api.service.dto.RowWrapperDTO;
44
import eu.etaxonomy.cdm.common.CdmUtils;
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.ui.combo.taxon.TaxonNodeCombo;
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 final List<String> NODE_PROPERTY_PATH = Arrays.asList(new String[] {
62
            "taxon",
63
            "taxon.name",
64
    });
65

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

    
68
    private TableViewer list;
69

    
70
    private Collection<RowWrapperDTO> selectedSpecimens = new ArrayList<>();
71
    private CharacterMatrix matrix;
72
    private Text txtTextFilter;
73

    
74
    private TaxonNodeCombo comboTaxon;
75

    
76
    protected SpecimenSelectionDialog(Shell parentShell, CharacterMatrix matrix) {
77
        super(parentShell);
78
        this.matrix = matrix;
79
    }
80

    
81
    @Override
82
    protected Control createDialogArea(Composite parent) {
83
        Composite composite = (Composite) super.createDialogArea(parent);
84
        GridLayout gl_composite = new GridLayout();
85
        composite.setLayout(gl_composite);
86

    
87
        Composite composite_1 = new Composite(composite, SWT.NONE);
88
        composite_1.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false, 1, 1));
89
        composite_1.setLayout(new GridLayout(4, false));
90

    
91
        Label lblNewLabel = new Label(composite_1, SWT.NONE);
92
        lblNewLabel.setText("Taxon");
93

    
94
        comboTaxon = new TaxonNodeCombo(composite_1, SWT.NONE);
95
        comboTaxon.setInput(matrix.getWorkingSet().getTaxonSubtreeFilter());
96
        comboTaxon.addSelectionChangedListener(e->applyFilter());
97

    
98
        txtTextFilter = new Text(composite_1, SWT.BORDER);
99
        txtTextFilter.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
100
        txtTextFilter.setText(TEXT_FILTER_DEFAULT);
101
        txtTextFilter.addFocusListener(new FocusListener() {
102

    
103
            @Override
104
            public void focusGained(FocusEvent e) {
105
                txtTextFilter.setForeground(AbstractUtility.getColor(Resources.SEARCH_VIEW_FOCUS));
106
                if (TEXT_FILTER_DEFAULT.equals(txtTextFilter.getText())) {
107
                    txtTextFilter.setText("");
108
                }
109
            }
110

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

    
121
        Button btnRefreshButton = new Button(composite_1, SWT.NONE);
122
        btnRefreshButton.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
123
        btnRefreshButton.setToolTipText(Messages.SpecimenSelectionDialog_REFRESH);
124
        btnRefreshButton.setImage(ImageResources.getImage(ImageResources.REFRESH));
125
        btnRefreshButton.addSelectionListener(new SelectionAdapter() {
126
            @Override
127
            public void widgetSelected(SelectionEvent e) {
128
                loadSpecimens();
129
                list.setInput(matrix.getSpecimenCache());
130
            }
131
        });
132
        //table
133
        list = new TableViewer(composite, SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION | SWT.MULTI);
134
        Table table = list.getTable();
135
        GridData gd_table = GridDataFactory.fillDefaults().create();
136
        gd_table.grabExcessHorizontalSpace = true;
137
        gd_table.grabExcessVerticalSpace = true;
138
        table.setLayoutData(gd_table);
139
        //table columns
140
        TableViewerColumn columnTaxon = new TableViewerColumn(list, SWT.NONE);
141
        columnTaxon.getColumn().setText("Taxon");
142
        columnTaxon.getColumn().setWidth(200);
143
        columnTaxon.getColumn().setResizable(true);
144
        columnTaxon.getColumn().setMoveable(true);
145
        TableViewerColumn columnSpecimen = new TableViewerColumn(list, SWT.NONE);
146
        columnSpecimen.getColumn().setText("Specimen");
147
        columnSpecimen.getColumn().setWidth(200);
148
        columnSpecimen.getColumn().setResizable(true);
149
        columnSpecimen.getColumn().setMoveable(true);
150
        table.setHeaderVisible(true);
151
        table.setLinesVisible(true);
152
        list.setContentProvider(new ArrayContentProvider());
153
        list.setLabelProvider(new SpecimenListLabelProvider());
154

    
155
        //gather specimens
156
        if(matrix.getSpecimenCache()==null){
157
            loadSpecimens();
158
        }
159
        list.setInput(matrix.getSpecimenCache());
160
        return composite;
161
    }
162

    
163
    private void applyFilter(){
164
        Stream<RowWrapperDTO> filteredWrappers =matrix.getSpecimenCache().stream();
165
        if(comboTaxon.getSelection()!=null){
166
            filteredWrappers =
167
                    filteredWrappers
168
                    .filter(wrapper->wrapper.getTaxonNode().equals(comboTaxon.getSelection()));
169
        }
170
        if(!txtTextFilter.getForeground().equals(AbstractUtility.getColor(Resources.SEARCH_VIEW_FOREGROUND))
171
                &&!CdmUtils.isBlank(txtTextFilter.getText())){
172
            filteredWrappers =
173
                    filteredWrappers
174
                    .filter(wrapper->wrapper.getSpecimen().getTitleCache().toLowerCase().contains(txtTextFilter.getText().toLowerCase()));
175
        }
176
        list.setInput(filteredWrappers.collect(Collectors.toList()));
177
    }
178

    
179
    private void loadSpecimens(){
180
        Collection<RowWrapperDTO> specimenCache = CdmStore.getService(IWorkingSetService.class).loadSpecimens(matrix.getWorkingSet());
181
        matrix.setSpecimenCache(specimenCache);
182
    }
183

    
184
    @Override
185
    protected void configureShell(Shell newShell) {
186
        super.configureShell(newShell);
187
        newShell.setText(Messages.SpecimenSelectionDialog_SELECT_SPECIMENS);
188
        newShell.setMinimumSize(500, 400);
189
    }
190

    
191
    @Override
192
    protected void okPressed() {
193
        selectedSpecimens.clear();
194
        selectedSpecimens = ((IStructuredSelection)list.getSelection()).toList();
195
        super.okPressed();
196
    }
197

    
198
    @Override
199
    protected boolean isResizable() {
200
        return true;
201
    }
202

    
203
    public Collection<RowWrapperDTO> getSpecimen(){
204
        return selectedSpecimens;
205
    }
206

    
207
    private class SpecimenListLabelProvider extends LabelProvider implements ITableLabelProvider{
208

    
209
        @Override
210
        public Image getColumnImage(Object element, int columnIndex) {
211
            return null;
212
        }
213

    
214
        @Override
215
        public String getColumnText(Object element, int columnIndex) {
216
            if(element instanceof RowWrapperDTO){
217
                RowWrapperDTO wrapper = (RowWrapperDTO)element;
218
                switch (columnIndex) {
219
                case 0:
220
                    return wrapper.getTaxonNode().getTaxon().getName().getTitleCache();
221
                case 1:
222
                    return wrapper.getSpecimen().getTitleCache();
223
                default:
224
                    break;
225
                }
226
            }
227
            return "";
228
        }
229
    }
230
}
(9-9/9)