Project

General

Profile

Download (9.77 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.List;
6
import java.util.Set;
7
import java.util.SortedSet;
8

    
9
import javax.inject.Inject;
10

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

    
27
import eu.etaxonomy.cdm.model.common.DefinedTermBase;
28
import eu.etaxonomy.cdm.model.common.TermType;
29
import eu.etaxonomy.cdm.model.description.DescriptionElementBase;
30
import eu.etaxonomy.cdm.model.description.Distribution;
31
import eu.etaxonomy.cdm.model.description.PresenceAbsenceTerm;
32
import eu.etaxonomy.cdm.model.description.TaxonDescription;
33
import eu.etaxonomy.cdm.model.location.NamedArea;
34
import eu.etaxonomy.cdm.model.taxon.Taxon;
35
import eu.etaxonomy.taxeditor.preference.PreferencesUtil;
36
import eu.etaxonomy.taxeditor.store.CdmStore;
37

    
38
public final class DistributionEditingSupportE4 extends EditingSupport {
39

    
40
    private ComboBoxViewerCellEditor cellEditor = null;
41
    private final TableViewer viewer;
42
    private final ChecklistEditorE4 editor;
43
//    private final IDescriptionService descriptionService;
44
    private final int columnIndex;
45

    
46
    @Inject
47
    private ESelectionService selService;
48
    private ISelectionChangedListener selectionChangedListener;
49

    
50
    private static final Logger logger = Logger.getLogger(DistributionEditingSupportE4.class);
51

    
52
    public DistributionEditingSupportE4(TableViewer viewer, ChecklistEditorE4 checklistEditor, int columnIndex) {
53
        super(viewer);
54
        this.viewer = viewer;
55
        this.columnIndex = columnIndex;
56

    
57
//        descriptionService = CdmStore.getService(IDescriptionService.class);
58
        editor = checklistEditor;
59
        cellEditor = new ComboBoxViewerCellEditor((Composite) viewer.getControl(), SWT.READ_ONLY);
60
        cellEditor.setLabelProvider(new LabelProvider(){
61
        	 @Override
62
        	   public String getText(Object element) {
63
        	     if (element instanceof PresenceAbsenceTerm) {
64
        	    	 PresenceAbsenceTerm  status = (PresenceAbsenceTerm)element;
65
        	    	 String result = null;
66
        	    	 if (PreferencesUtil.isShowSymbolInChecklistEditor() && !StringUtils.isBlank(status.getSymbol())){
67
        	    		 result = status.getTitleCache() + "("+ status.getSymbol()+")";
68
        	    	 }else{
69
        	    		 result = status.getTitleCache();
70
        	    	 }
71
        	    	 return result;
72
        	     }
73
        	     return null;
74
        	   }
75
        });
76
//        selectionChangedListener = (event -> selService.setSelection(event));
77
//        cellEditor.addListener(selectionChangedListener);
78

    
79
        cellEditor.setContentProvider(new ArrayContentProvider());
80

    
81
        // TODO set input
82
//        List<PresenceAbsenceTermBase> input = CdmStore.getTermManager()
83
//                .getPreferredTerms(PresenceAbsenceTermBase.class);
84
//        selectionChangedListener = (event -> selService.setSelection(event));
85
//        viewer.addSelectionChangedListener(selectionChangedListener);
86
        List<DefinedTermBase<?>> inputAll = new ArrayList<>();
87
        PresenceAbsenceTerm noneTerm = PresenceAbsenceTerm.NewInstance();
88
        noneTerm.setTitleCache(" ", true);
89
        inputAll.add(noneTerm);
90
        List<DefinedTermBase<?>> input = CdmStore.getTermManager().getPreferredTerms(TermType.PresenceAbsenceTerm);
91
        inputAll.addAll(1, input);
92
        cellEditor.setInput(inputAll);
93

    
94
    }
95

    
96
    @Override
97
    protected CellEditor getCellEditor(Object element) {
98
        return cellEditor;
99
    }
100

    
101
    @Override
102
    protected boolean canEdit(Object element) {
103
        return true;
104
    }
105

    
106
    @Override
107
    protected Object getValue(Object element) {
108
        if (element instanceof Taxon) {
109
            Taxon taxon = (Taxon) element;
110
            String result = null;
111
            Distribution distributionForColumn = getDistributionForColumn(taxon);
112

    
113
            if (distributionForColumn != null) {
114
                PresenceAbsenceTerm status = distributionForColumn.getStatus();
115
                if (PreferencesUtil.isShowIdInVocabularyInChecklistEditor()){
116
                    if (status.getIdInVocabulary() != null){
117
                        result =  status.getIdInVocabulary();
118
                    } else{
119
                        result = status.getTitleCache();
120
                    }
121
                } else{
122
                    result = status.getTitleCache();
123
                }
124
                if (PreferencesUtil.isShowSymbolInChecklistEditor() && status.getSymbol() != null){
125
                	result.concat(" ("+ status.getSymbol() + ")");
126
                }
127
            }
128

    
129
           fireStateChanged(distributionForColumn);
130
            return result;
131
        }
132
        return null;
133
    }
134

    
135
    protected void fireStateChanged(Distribution dist) {
136
    	if (dist!= null){
137
	    	ISelection selection = new StructuredSelection(dist);
138
//	    	selService.setSelection(selection);
139
    	}
140
    }
141

    
142
    @Override
143
    protected void setValue(Object element, Object value) {
144
    	if (element instanceof Taxon && value instanceof PresenceAbsenceTerm) {
145
            Taxon taxon = (Taxon) element;
146
            PresenceAbsenceTerm occurenceStatus = (PresenceAbsenceTerm) value;
147
            Distribution distribution = getDistributionForColumn(taxon);
148

    
149
            if (distribution != null) {
150
                // change status for already exsiting distribution
151
                if (occurenceStatus.getTitleCache().equals(" ")){
152
                    TaxonDescription descr = (TaxonDescription)distribution.getInDescription();
153
                    descr.removeElement(distribution);
154
                }else{
155
                    distribution.setStatus(occurenceStatus);
156
                }
157
            } else {
158
                createDistributionForColumn(taxon, occurenceStatus);
159
            }
160
            // viewer.update(distribution, null);
161
//            viewer.update(element, null);
162
//            viewer.refresh();
163
//            editor.setDirty(true);
164
            editor.changed(element);
165
            viewer.refresh();
166
        }
167
    }
168

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

    
172
    /**
173
     *
174
     * @param taxon
175
     * @return
176
     */
177
    private Distribution getDistributionForColumn(Taxon taxon) {
178
//        List<TaxonDescription> listTaxonDescriptions = descriptionService.listTaxonDescriptions(taxon, null, null,
179
//                null, null, null, DESC_INIT_STRATEGY);
180
        Set<TaxonDescription> listTaxonDescriptions = taxon.getDescriptions();
181
        TableColumn column = viewer.getTable().getColumn(columnIndex);
182
        for (TaxonDescription td : listTaxonDescriptions) {
183
            for (DescriptionElementBase deb : td.getElements()) {
184
                if (deb instanceof Distribution) {
185
                    Distribution distribution = (Distribution) deb;
186
                    if (distribution.getArea() != null){
187
                        if (PreferencesUtil.isShowIdInVocabularyInChecklistEditor()){
188
                            if (column.getText().equalsIgnoreCase(distribution.getArea().getIdInVocabulary())) {
189
                                return distribution;
190
                            }
191
                        }else{
192
                            if (column.getText().equalsIgnoreCase(distribution.getArea().getTitleCache())) {
193
                                return distribution;
194
                            }
195
                        }
196
                    }
197
                }
198
            }
199
        }
200
        return null;
201
    }
202

    
203
    private void createDistributionForColumn(Taxon taxon, PresenceAbsenceTerm occurenceStatus) {
204
        TableColumn column = viewer.getTable().getColumn(columnIndex);
205

    
206
        SortedSet<DefinedTermBase> namedAreas = this.editor.getLabelProvider().getNamedAreas();
207

    
208

    
209
        if (namedAreas != null) {
210
            for (DefinedTermBase term : namedAreas) {
211
                boolean sameArea = true;
212
                if (!PreferencesUtil.isShowIdInVocabularyInChecklistEditor()){
213
                    sameArea = column.getText().equalsIgnoreCase(term.getTitleCache());
214
                } else{
215
                	if (term.getIdInVocabulary() != null){
216
                		sameArea = column.getText().equalsIgnoreCase(term.getIdInVocabulary());
217
                	} else{
218
                		sameArea = column.getText().equalsIgnoreCase(term.getTitleCache());
219
                	}
220
                }
221
                if (sameArea) {
222
                    NamedArea area = (NamedArea) term;
223
                    Distribution distribution = Distribution.NewInstance(area, occurenceStatus);
224
                    Set<TaxonDescription> descriptions = taxon.getDescriptions();
225
                    if (!descriptions.isEmpty()) {
226
                        for (TaxonDescription desc : descriptions) {
227
                            // add to first taxon description
228
                            desc.addElement(distribution);
229
                            break;
230
                        }
231
                    } else {// there are no TaxonDescription yet.
232
                        TaxonDescription td = TaxonDescription.NewInstance(taxon);
233
                        td.addElement(distribution);
234
                        break;
235
                    }
236
                }
237
            }
238
        }
239

    
240
        return;
241
    }
242

    
243

    
244
}
(3-3/4)