Project

General

Profile

Download (9.45 KB) Statistics
| Branch: | Tag: | Revision:
1
package eu.etaxonomy.taxeditor.editor.view.checklist.e4;
2

    
3
import java.util.ArrayList;
4
import java.util.Arrays;
5
import java.util.Collection;
6
import java.util.Collections;
7
import java.util.Comparator;
8
import java.util.List;
9
import java.util.Map;
10
import java.util.Set;
11
import java.util.SortedSet;
12
import java.util.UUID;
13

    
14
import javax.inject.Inject;
15

    
16
import org.apache.commons.lang.StringUtils;
17
import org.apache.log4j.Logger;
18
import org.eclipse.e4.ui.workbench.modeling.ESelectionService;
19
import org.eclipse.jface.viewers.ArrayContentProvider;
20
import org.eclipse.jface.viewers.CellEditor;
21
import org.eclipse.jface.viewers.ComboBoxViewerCellEditor;
22
import org.eclipse.jface.viewers.EditingSupport;
23
import org.eclipse.jface.viewers.ISelection;
24
import org.eclipse.jface.viewers.ISelectionChangedListener;
25
import org.eclipse.jface.viewers.LabelProvider;
26
import org.eclipse.jface.viewers.StructuredSelection;
27
import org.eclipse.jface.viewers.TableViewer;
28
import org.eclipse.swt.SWT;
29
import org.eclipse.swt.widgets.Composite;
30
import org.eclipse.swt.widgets.TableColumn;
31

    
32
import eu.etaxonomy.cdm.model.common.DefinedTermBase;
33
import eu.etaxonomy.cdm.model.common.OrderedTermComparator;
34
import eu.etaxonomy.cdm.model.common.Representation;
35
import eu.etaxonomy.cdm.model.common.TermType;
36
import eu.etaxonomy.cdm.model.description.DescriptionElementBase;
37
import eu.etaxonomy.cdm.model.description.DescriptionElementSource;
38
import eu.etaxonomy.cdm.model.description.Distribution;
39
import eu.etaxonomy.cdm.model.description.PresenceAbsenceTerm;
40
import eu.etaxonomy.cdm.model.description.TaxonDescription;
41
import eu.etaxonomy.cdm.model.location.NamedArea;
42
import eu.etaxonomy.cdm.model.taxon.Taxon;
43
import eu.etaxonomy.taxeditor.event.EventUtility;
44
import eu.etaxonomy.taxeditor.event.WorkbenchEventConstants;
45
import eu.etaxonomy.taxeditor.preference.PreferencesUtil;
46
import eu.etaxonomy.taxeditor.store.CdmStore;
47

    
48
public final class DistributionEditingSupportE4 extends EditingSupport {
49

    
50
    private ComboBoxViewerCellEditor cellEditor = null;
51
    //private final TableViewer viewer;
52
    private final ChecklistEditorE4 editor;
53
//    private final IDescriptionService descriptionService;
54
    private final int columnIndex;
55

    
56
    private Taxon taxon;
57

    
58
    @Inject
59
    private ESelectionService selService;
60
    private ISelectionChangedListener selectionChangedListener;
61

    
62
    private static final Logger logger = Logger.getLogger(DistributionEditingSupportE4.class);
63

    
64
    public DistributionEditingSupportE4(TableViewer viewer, ChecklistEditorE4 checklistEditor, int columnIndex) {
65
        super(viewer);
66

    
67
        this.columnIndex = columnIndex;
68

    
69
        editor = checklistEditor;
70
        cellEditor = new ComboBoxViewerCellEditor((Composite) this.getViewer().getControl(), SWT.READ_ONLY);
71
        cellEditor.setLabelProvider(new LabelProvider(){
72
        	 @Override
73
        	   public String getText(Object element) {
74
        	     if (element instanceof PresenceAbsenceTerm) {
75
        	    	 PresenceAbsenceTerm  status = (PresenceAbsenceTerm)element;
76
        	    	 Representation rep = status.getPreferredRepresentation(CdmStore.getDefaultLanguage());
77
        	    	 String label = null;
78
        	    	 if (rep != null){
79
        	    	     label = rep.getAbbreviatedLabel();
80
            	    	 if (label == null){
81
            	    	     label = rep.getLabel();
82
            	    	 }
83
        	    	 }else{
84
        	    	     label = status.getTitleCache();
85
        	    	 }
86
        	    	 String result = null;
87
        	    	 if (PreferencesUtil.isShowSymbolInChecklistEditor() && !StringUtils.isBlank(status.getSymbol())){
88
        	    		 result = label + "("+ status.getSymbol()+")";
89
        	    	 }else{
90
        	    		 result = label;
91
        	    	 }
92
        	    	 return result;
93
        	     }
94
        	     return null;
95
        	   }
96
        });
97

    
98
        cellEditor.setContentProvider(new ArrayContentProvider());
99

    
100

    
101
        List<DefinedTermBase> inputAll = new ArrayList<>();
102
        PresenceAbsenceTerm noneTerm = PresenceAbsenceTerm.NewInstance();
103
        noneTerm.setTitleCache(" ", true);
104
        inputAll.add(noneTerm);
105
        Collection<DefinedTermBase> input = CdmStore.getTermManager().getPreferredTerms(TermType.PresenceAbsenceTerm);
106
        List<DefinedTermBase> inputList = new ArrayList(input);
107
        Comparator<DefinedTermBase> comp = new OrderedTermComparator<>();
108
        Collections.sort(inputList, comp);
109
        Collections.sort(inputList, Collections.reverseOrder());
110

    
111
        inputAll.addAll(1,inputList);
112

    
113

    
114
        cellEditor.setInput(inputAll);
115

    
116

    
117

    
118
    }
119

    
120
    @Override
121
    protected CellEditor getCellEditor(Object element) {
122
        return cellEditor;
123
    }
124

    
125
    @Override
126
    protected boolean canEdit(Object element) {
127
        return true;
128
    }
129

    
130
    @Override
131
    protected PresenceAbsenceTerm getValue(Object element) {
132

    
133
        if (element instanceof Taxon) {
134
            taxon = (Taxon) element;
135
            String result = null;
136
            Distribution distributionForColumn = getDistributionForColumn(taxon);
137

    
138
            if (distributionForColumn != null) {
139
                PresenceAbsenceTerm status = distributionForColumn.getStatus();
140
                return status;
141

    
142
            }
143

    
144
           //fireStateChanged();
145
            return null;
146
        }
147
        return null;
148
    }
149

    
150

    
151

    
152
    protected void fireStateChanged() {
153
    	ISelection selection = new StructuredSelection(getDistributionForColumn(taxon));
154
	   getViewer().setSelection(selection);
155

    
156
    }
157

    
158
    @Override
159
    protected void setValue(Object element, Object value) {
160
    	if (element instanceof Taxon && value instanceof PresenceAbsenceTerm) {
161

    
162
            Taxon taxon = (Taxon) element;
163
            PresenceAbsenceTerm occurenceStatus = (PresenceAbsenceTerm) value;
164
            Distribution distribution = getDistributionForColumn(taxon);
165

    
166
            if (distribution != null) {
167
                // change status for already exsiting distribution
168
                if (occurenceStatus.getTitleCache().equals(" ")){
169
                    TaxonDescription descr = (TaxonDescription)distribution.getInDescription();
170
                    descr.removeElement(distribution);
171
                }else{
172
                    distribution.setStatus(occurenceStatus);
173
                }
174
            } else {
175
                if (!occurenceStatus.getTitleCache().equals(" ")){
176
                    createDistributionForColumn(taxon, occurenceStatus);
177
                }
178
            }
179

    
180

    
181
            editor.changed(element);
182
            getViewer().refresh();
183

    
184
            EventUtility.postEvent(WorkbenchEventConstants.REFRESH_TAXON_DETAILS, true);
185
        }
186
    }
187

    
188
    private static final List<String> DESC_INIT_STRATEGY = Arrays.asList(new String[] { "descriptions", //$NON-NLS-1$
189
            "descriptions.*", "description.state" }); //$NON-NLS-1$ //$NON-NLS-2$
190

    
191
    /**
192
     *
193
     * @param taxon
194
     * @return
195
     */
196
    private Distribution getDistributionForColumn(Taxon taxon) {
197

    
198
        Set<TaxonDescription> listTaxonDescriptions = taxon.getDescriptions();
199
        TableColumn column = ((TableViewer)getViewer()).getTable().getColumn(columnIndex);
200
        for (TaxonDescription td : listTaxonDescriptions) {
201
            for (DescriptionElementBase deb : td.getElements()) {
202
                if (deb instanceof Distribution) {
203
                    Distribution distribution = (Distribution) deb;
204
                    UUID areaUuid = null;
205
                    for (Map.Entry<UUID,Integer> entry: editor.getAreaPosition().entrySet()){
206
                        if (entry.getValue().intValue()== columnIndex){
207
                            areaUuid = entry.getKey();
208
                            break;
209
                        }
210
                    }
211
                    if (distribution.getArea() != null){
212
                        if (distribution.getArea().getUuid().equals(areaUuid)){
213
                            return distribution;
214

    
215
                        }
216
                    }
217
                }
218
            }
219
        }
220
        return null;
221
    }
222

    
223
    private void createDistributionForColumn(Taxon taxon, PresenceAbsenceTerm occurenceStatus) {
224
        TableColumn column = ((TableViewer)this.getViewer()).getTable().getColumn(columnIndex);
225

    
226
        SortedSet<DefinedTermBase> namedAreas = this.editor.getLabelProvider().getNamedAreas(false);
227

    
228

    
229
        if (namedAreas != null) {
230
            for (DefinedTermBase term : namedAreas) {
231
                Integer areaIndex = editor.getAreaPosition().get(term.getUuid());
232
                if (areaIndex == columnIndex){
233
                    NamedArea area = (NamedArea) term;
234
                    Distribution distribution = Distribution.NewInstance(area, occurenceStatus);
235
                    if (editor.getDefaultSource() != null){
236
                        DescriptionElementSource source = DescriptionElementSource.NewPrimarySourceInstance(editor.getDefaultSource(), "");
237
                        distribution.addSource(source);
238
                    }
239
                    Set<TaxonDescription> descriptions = taxon.getDescriptions();
240
                    if (!descriptions.isEmpty()) {
241
                        for (TaxonDescription desc : descriptions) {
242
                            // add to first taxon description
243
                            desc.addElement(distribution);
244
                            break;
245
                        }
246
                    } else {// there are no TaxonDescription yet.
247
                        TaxonDescription td = TaxonDescription.NewInstance(taxon);
248
                        td.addElement(distribution);
249
                        break;
250
                    }
251

    
252
                }
253

    
254
            }
255
        }
256

    
257
        return;
258
    }
259

    
260

    
261
}
(3-3/5)