Project

General

Profile

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

    
3
import java.util.Arrays;
4
import java.util.List;
5
import java.util.Set;
6
import java.util.SortedSet;
7

    
8
import javax.inject.Inject;
9

    
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.ICellEditorListener;
19
import org.eclipse.jface.viewers.ISelection;
20
import org.eclipse.jface.viewers.ISelectionChangedListener;
21
import org.eclipse.jface.viewers.LabelProvider;
22
import org.eclipse.jface.viewers.SelectionChangedEvent;
23
import org.eclipse.jface.viewers.StructuredSelection;
24
import org.eclipse.jface.viewers.TableViewer;
25
import org.eclipse.swt.SWT;
26
import org.eclipse.swt.widgets.Composite;
27
import org.eclipse.swt.widgets.TableColumn;
28

    
29
import eu.etaxonomy.cdm.api.service.IDescriptionService;
30
import eu.etaxonomy.cdm.model.common.DefinedTermBase;
31
import eu.etaxonomy.cdm.model.common.TermType;
32
import eu.etaxonomy.cdm.model.description.DescriptionElementBase;
33
import eu.etaxonomy.cdm.model.description.Distribution;
34
import eu.etaxonomy.cdm.model.description.PresenceAbsenceTerm;
35
import eu.etaxonomy.cdm.model.description.TaxonDescription;
36
import eu.etaxonomy.cdm.model.location.NamedArea;
37
import eu.etaxonomy.cdm.model.taxon.Taxon;
38
import eu.etaxonomy.taxeditor.editor.SimpleSelectionProvider;
39
import eu.etaxonomy.taxeditor.editor.view.checklist.ChecklistEditor;
40
import eu.etaxonomy.taxeditor.editor.view.checklist.edit.CdmComboBoxViewerCellEditor;
41
import eu.etaxonomy.taxeditor.preference.PreferencesUtil;
42
import eu.etaxonomy.taxeditor.store.CdmStore;
43

    
44
public final class DistributionEditingSupportE4 extends EditingSupport {
45

    
46
    private ComboBoxViewerCellEditor cellEditor = null;
47
    private final TableViewer viewer;
48
    private final ChecklistEditorE4 editor;
49
//    private final IDescriptionService descriptionService;
50
    private final int columnIndex;
51
     
52
    @Inject
53
    private ESelectionService selService;
54
    private ISelectionChangedListener selectionChangedListener;
55
    
56
    private static final Logger logger = Logger.getLogger(DistributionEditingSupportE4.class);
57

    
58
    public DistributionEditingSupportE4(TableViewer viewer, ChecklistEditorE4 checklistEditor, int columnIndex) {
59
        super(viewer);
60
        this.viewer = viewer;
61
        this.columnIndex = columnIndex;
62
       
63
//        descriptionService = CdmStore.getService(IDescriptionService.class);
64
        editor = checklistEditor;
65
        cellEditor = new ComboBoxViewerCellEditor((Composite) viewer.getControl(), SWT.READ_ONLY);
66
        cellEditor.setLabelProvider(new LabelProvider(){
67
        	 @Override
68
        	   public String getText(Object element) {
69
        	     if (element instanceof PresenceAbsenceTerm) {
70
        	    	 PresenceAbsenceTerm  status = (PresenceAbsenceTerm)element;
71
        	    	 String result = null;
72
        	    	 if (PreferencesUtil.isShowSymbolInChecklistEditor() && !StringUtils.isBlank(status.getSymbol())){
73
        	    		 result = status.getTitleCache() + "("+ status.getSymbol()+")";
74
        	    	 }else{
75
        	    		 result = status.getTitleCache();
76
        	    	 }
77
        	    	 return result;
78
        	     }
79
        	     return null;
80
        	   }
81
        });
82
//        selectionChangedListener = (event -> selService.setSelection(event));
83
//        cellEditor.addListener(selectionChangedListener);
84
        cellEditor.setContentProvider(new ArrayContentProvider());
85
        // TODO set input
86
//        List<PresenceAbsenceTermBase> input = CdmStore.getTermManager()
87
//                .getPreferredTerms(PresenceAbsenceTermBase.class);
88
        selectionChangedListener = (event -> selService.setSelection(event));
89
        viewer.addSelectionChangedListener(selectionChangedListener);
90
        List<DefinedTermBase<?>> input = CdmStore.getTermManager().getPreferredTerms(TermType.PresenceAbsenceTerm);
91
        cellEditor.setInput(input);
92
    }
93

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

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

    
104
    @Override
105
    protected Object getValue(Object element) {
106
        if (element instanceof Taxon) {
107
            Taxon taxon = (Taxon) element;
108
            String result = null;
109
            Distribution distributionForColumn = getDistributionForColumn(taxon);
110
           
111
            if (distributionForColumn != null) {
112
                PresenceAbsenceTerm status = distributionForColumn.getStatus();
113
                if (PreferencesUtil.isShowIdInVocabularyInChecklistEditor()){
114
                    if (status.getIdInVocabulary() != null){
115
                        result =  status.getIdInVocabulary();
116
                    } else{
117
                        result = status.getTitleCache();
118
                    }
119
                } else{
120
                    result = status.getTitleCache();
121
                }
122
                if (PreferencesUtil.isShowSymbolInChecklistEditor() && status.getSymbol() != null){
123
                	result.concat(" ("+ status.getSymbol() + ")");
124
                }
125
            }
126
            
127
           fireStateChanged(distributionForColumn);
128
            return result;
129
        }
130
        return null;
131
    }
132

    
133
    protected void fireStateChanged(Distribution dist) {
134
    	if (dist!= null){
135
	    	ISelection selection = new StructuredSelection(dist);
136
	    	selService.setSelection(selection);
137
    	}
138
    }
139
    
140
    @Override
141
    protected void setValue(Object element, Object value) {
142
    	if (element instanceof Taxon && value instanceof PresenceAbsenceTerm) {
143
            Taxon taxon = (Taxon) element;
144
            PresenceAbsenceTerm occurenceStatus = (PresenceAbsenceTerm) value;
145
            Distribution distribution = getDistributionForColumn(taxon);
146
            if (distribution != null) {
147
                // change status for already exsiting distribution
148
                distribution.setStatus(occurenceStatus);
149
            } else {
150
                createDistributionForColumn(taxon, occurenceStatus);
151
            }
152
            // viewer.update(distribution, null);
153
//            viewer.update(element, null);
154
//            viewer.refresh();
155
//            editor.setDirty(true);
156
            editor.changed(element);
157
            viewer.refresh();
158
        }
159
    }
160

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

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

    
195
    private void createDistributionForColumn(Taxon taxon, PresenceAbsenceTerm occurenceStatus) {
196
        TableColumn column = viewer.getTable().getColumn(columnIndex);
197

    
198
        SortedSet<DefinedTermBase> namedAreas = this.editor.getLabelProvider().getNamedAreas();
199

    
200

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

    
232
        return;
233
    }
234

    
235
	
236
}
(3-3/3)