Project

General

Profile

Download (10.6 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.preference.TermDisplayEnum;
47
import eu.etaxonomy.taxeditor.store.CdmStore;
48

    
49
public final class DistributionEditingSupportE4 extends EditingSupport {
50

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

    
57
    private Taxon taxon;
58

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

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

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

    
68
        this.columnIndex = columnIndex;
69

    
70
        editor = checklistEditor;
71
        cellEditor = new ComboBoxViewerCellEditor((Composite) this.getViewer().getControl(), SWT.READ_ONLY);
72
        cellEditor.setLabelProvider(new LabelProvider(){
73
        	 @Override
74
        	   public String getText(Object element) {
75
        	     if (element instanceof PresenceAbsenceTerm) {
76
        	    	 PresenceAbsenceTerm  status = (PresenceAbsenceTerm)element;
77
        	    	 Representation rep = status.getPreferredRepresentation(CdmStore.getDefaultLanguage());
78
        	    	 String label = null;
79
        	    	 if (rep != null){
80
        	    	     label = rep.getLabel();
81

    
82
        	    	 }else{
83
        	    	     label = status.getTitleCache();
84
        	    	 }
85
        	    	 String result = null;
86
        	    	 String statusDisplay = PreferencesUtil.displayStatusInChecklistEditor();
87
        	    	 if (statusDisplay != null){
88
        	    	     if (statusDisplay.equals(TermDisplayEnum.Symbol1.getKey()) && !StringUtils.isBlank(status.getSymbol())){
89
        	    	         result = label + "("+ status.getSymbol()+")";
90
        	    	     }else if (statusDisplay.equals(TermDisplayEnum.IdInVocabulary.getKey()) && !StringUtils.isBlank(status.getIdInVocabulary())){
91
        	    	         result = label + "("+ status.getIdInVocabulary()+")";
92
        	    	     }else if (statusDisplay.equals(TermDisplayEnum.Symbol2.getKey()) && !StringUtils.isBlank(status.getSymbol2())){
93
                             result = label + "("+ status.getSymbol2()+")";
94
                         }else{
95
        	    	         result = label;
96
        	    	     }
97

    
98
        	    	 }else{
99
        	    	     result = label;
100
        	    	 }
101
//
102
//        	    	 if (PreferencesUtil.displayStatusInChecklistEditor() != null && !StringUtils.isBlank(status.getSymbol())){
103
//        	    		 result = label + "("+ status.getSymbol()+")";
104
//        	    	 }else{
105
//        	    		 result = label;
106
//        	    	 }
107
        	    	 return result;
108
        	     }
109
        	     return null;
110
        	   }
111
        });
112

    
113
        cellEditor.setContentProvider(new ArrayContentProvider());
114

    
115

    
116
        List<DefinedTermBase> inputAll = new ArrayList<>();
117
        PresenceAbsenceTerm noneTerm = PresenceAbsenceTerm.NewInstance();
118
        noneTerm.setTitleCache(" ", true);
119
        inputAll.add(noneTerm);
120
        Collection<DefinedTermBase> input = CdmStore.getTermManager().getPreferredTerms(TermType.PresenceAbsenceTerm);
121
        List<DefinedTermBase> inputList = new ArrayList(input);
122
        Comparator<DefinedTermBase> comp = new OrderedTermComparator<>();
123
        Collections.sort(inputList, comp);
124
        Collections.sort(inputList, Collections.reverseOrder());
125

    
126
        inputAll.addAll(1,inputList);
127

    
128

    
129
        cellEditor.setInput(inputAll);
130

    
131

    
132

    
133
    }
134

    
135
    @Override
136
    protected CellEditor getCellEditor(Object element) {
137
        return cellEditor;
138
    }
139

    
140
    @Override
141
    protected boolean canEdit(Object element) {
142
        return true;
143
    }
144

    
145
    @Override
146
    protected PresenceAbsenceTerm getValue(Object element) {
147

    
148
        if (element instanceof Taxon) {
149
            taxon = (Taxon) element;
150
            String result = null;
151
            Distribution distributionForColumn = getDistributionForColumn(taxon);
152

    
153
            if (distributionForColumn != null) {
154
                PresenceAbsenceTerm status = distributionForColumn.getStatus();
155
                return status;
156

    
157
            }
158

    
159
           //fireStateChanged();
160
            return null;
161
        }
162
        return null;
163
    }
164

    
165

    
166

    
167
    protected void fireStateChanged() {
168
    	ISelection selection = new StructuredSelection(getDistributionForColumn(taxon));
169
	   getViewer().setSelection(selection);
170

    
171
    }
172

    
173
    @Override
174
    protected void setValue(Object element, Object value) {
175
    	if (element instanceof Taxon && value instanceof PresenceAbsenceTerm) {
176

    
177
            Taxon taxon = (Taxon) element;
178
            PresenceAbsenceTerm occurenceStatus = (PresenceAbsenceTerm) value;
179
            Distribution distribution = getDistributionForColumn(taxon);
180
            boolean changed = false;
181
            if (distribution != null) {
182
                // change status for already exsiting distribution
183
                if (occurenceStatus.getTitleCache().equals(" ")){
184
                    TaxonDescription descr = (TaxonDescription)distribution.getInDescription();
185
                    descr.removeElement(distribution);
186
                    changed = true;
187
                }else{
188
                    if (distribution.getStatus() == null || !distribution.getStatus().equals(occurenceStatus)){
189
                        changed = true;
190
                        distribution.setStatus(occurenceStatus);
191
                    }
192

    
193
                }
194
            } else {
195
                if (!occurenceStatus.getTitleCache().equals(" ")){
196
                    createDistributionForColumn(taxon, occurenceStatus);
197
                    changed = true;
198
                }
199
            }
200

    
201
            if (changed){
202
                editor.changed(element);
203
            }
204
            getViewer().refresh();
205

    
206
            EventUtility.postEvent(WorkbenchEventConstants.REFRESH_TAXON_DETAILS, true);
207
        }
208
    }
209

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

    
213
    /**
214
     *
215
     * @param taxon
216
     * @return
217
     */
218
    private Distribution getDistributionForColumn(Taxon taxon) {
219

    
220
        Set<TaxonDescription> listTaxonDescriptions = taxon.getDescriptions();
221
        TableColumn column = ((TableViewer)getViewer()).getTable().getColumn(columnIndex);
222
        for (TaxonDescription td : listTaxonDescriptions) {
223
            for (DescriptionElementBase deb : td.getElements()) {
224
                if (deb instanceof Distribution) {
225
                    Distribution distribution = (Distribution) deb;
226
                    UUID areaUuid = null;
227
                    for (Map.Entry<UUID,Integer> entry: editor.getAreaPosition().entrySet()){
228
                        if (entry.getValue().intValue()== columnIndex){
229
                            areaUuid = entry.getKey();
230
                            break;
231
                        }
232
                    }
233
                    if (distribution.getArea() != null){
234
                        if (distribution.getArea().getUuid().equals(areaUuid)){
235
                            return distribution;
236

    
237
                        }
238
                    }
239
                }
240
            }
241
        }
242
        return null;
243
    }
244

    
245
    private void createDistributionForColumn(Taxon taxon, PresenceAbsenceTerm occurenceStatus) {
246
        TableColumn column = ((TableViewer)this.getViewer()).getTable().getColumn(columnIndex);
247

    
248
        SortedSet<DefinedTermBase> namedAreas = this.editor.getLabelProvider().getNamedAreas(false);
249

    
250

    
251
        if (namedAreas != null) {
252
            for (DefinedTermBase term : namedAreas) {
253
                Integer areaIndex = editor.getAreaPosition().get(term.getUuid());
254
                if (areaIndex == columnIndex){
255
                    NamedArea area = (NamedArea) term;
256
                    Distribution distribution = Distribution.NewInstance(area, occurenceStatus);
257
                    if (editor.getDefaultSource() != null){
258
                        DescriptionElementSource source = DescriptionElementSource.NewPrimarySourceInstance(editor.getDefaultSource(), "");
259
                        distribution.addSource(source);
260
                    }
261
                    Set<TaxonDescription> descriptions = taxon.getDescriptions();
262
                    if (!descriptions.isEmpty()) {
263
                        for (TaxonDescription desc : descriptions) {
264
                            // add to first taxon description
265
                            desc.addElement(distribution);
266
                            break;
267
                        }
268
                    } else {// there are no TaxonDescription yet.
269
                        TaxonDescription td = TaxonDescription.NewInstance(taxon);
270
                        td.addElement(distribution);
271
                        break;
272
                    }
273

    
274
                }
275

    
276
            }
277
        }
278

    
279
        return;
280
    }
281

    
282

    
283
}
(3-3/5)