changes in distribution editor
[taxeditor.git] / eu.etaxonomy.taxeditor.editor / src / main / java / eu / etaxonomy / taxeditor / editor / view / checklist / e4 / DistributionEditingSupportE4.java
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 import org.apache.commons.lang.StringUtils;
11 import org.apache.log4j.Logger;
12 import org.eclipse.e4.ui.workbench.modeling.ESelectionService;
13 import org.eclipse.jface.viewers.ArrayContentProvider;
14 import org.eclipse.jface.viewers.CellEditor;
15 import org.eclipse.jface.viewers.ComboBoxViewerCellEditor;
16 import org.eclipse.jface.viewers.EditingSupport;
17 import org.eclipse.jface.viewers.ISelection;
18 import org.eclipse.jface.viewers.ISelectionChangedListener;
19 import org.eclipse.jface.viewers.LabelProvider;
20 import org.eclipse.jface.viewers.StructuredSelection;
21 import org.eclipse.jface.viewers.TableViewer;
22 import org.eclipse.swt.SWT;
23 import org.eclipse.swt.widgets.Composite;
24 import org.eclipse.swt.widgets.TableColumn;
25
26 import eu.etaxonomy.cdm.model.common.DefinedTermBase;
27 import eu.etaxonomy.cdm.model.common.TermType;
28 import eu.etaxonomy.cdm.model.description.DescriptionElementBase;
29 import eu.etaxonomy.cdm.model.description.Distribution;
30 import eu.etaxonomy.cdm.model.description.PresenceAbsenceTerm;
31 import eu.etaxonomy.cdm.model.description.TaxonDescription;
32 import eu.etaxonomy.cdm.model.location.NamedArea;
33 import eu.etaxonomy.cdm.model.taxon.Taxon;
34 import eu.etaxonomy.taxeditor.preference.PreferencesUtil;
35 import eu.etaxonomy.taxeditor.store.CdmStore;
36
37 public final class DistributionEditingSupportE4 extends EditingSupport {
38
39 private ComboBoxViewerCellEditor cellEditor = null;
40 private final TableViewer viewer;
41 private final ChecklistEditorE4 editor;
42 // private final IDescriptionService descriptionService;
43 private final int columnIndex;
44
45 @Inject
46 private ESelectionService selService;
47 private ISelectionChangedListener selectionChangedListener;
48
49 private static final Logger logger = Logger.getLogger(DistributionEditingSupportE4.class);
50
51 public DistributionEditingSupportE4(TableViewer viewer, ChecklistEditorE4 checklistEditor, int columnIndex) {
52 super(viewer);
53 this.viewer = viewer;
54 this.columnIndex = columnIndex;
55
56 // descriptionService = CdmStore.getService(IDescriptionService.class);
57 editor = checklistEditor;
58 cellEditor = new ComboBoxViewerCellEditor((Composite) viewer.getControl(), SWT.READ_ONLY);
59 cellEditor.setLabelProvider(new LabelProvider(){
60 @Override
61 public String getText(Object element) {
62 if (element instanceof PresenceAbsenceTerm) {
63 PresenceAbsenceTerm status = (PresenceAbsenceTerm)element;
64 String result = null;
65 if (PreferencesUtil.isShowSymbolInChecklistEditor() && !StringUtils.isBlank(status.getSymbol())){
66 result = status.getTitleCache() + "("+ status.getSymbol()+")";
67 }else{
68 result = status.getTitleCache();
69 }
70 return result;
71 }
72 return null;
73 }
74 });
75 // selectionChangedListener = (event -> selService.setSelection(event));
76 // cellEditor.addListener(selectionChangedListener);
77 cellEditor.setContentProvider(new ArrayContentProvider());
78 // TODO set input
79 // List<PresenceAbsenceTermBase> input = CdmStore.getTermManager()
80 // .getPreferredTerms(PresenceAbsenceTermBase.class);
81 // selectionChangedListener = (event -> selService.setSelection(event));
82 // viewer.addSelectionChangedListener(selectionChangedListener);
83 List<DefinedTermBase<?>> input = CdmStore.getTermManager().getPreferredTerms(TermType.PresenceAbsenceTerm);
84 cellEditor.setInput(input);
85 }
86
87 @Override
88 protected CellEditor getCellEditor(Object element) {
89 return cellEditor;
90 }
91
92 @Override
93 protected boolean canEdit(Object element) {
94 return true;
95 }
96
97 @Override
98 protected Object getValue(Object element) {
99 if (element instanceof Taxon) {
100 Taxon taxon = (Taxon) element;
101 String result = null;
102 Distribution distributionForColumn = getDistributionForColumn(taxon);
103
104 if (distributionForColumn != null) {
105 PresenceAbsenceTerm status = distributionForColumn.getStatus();
106 if (PreferencesUtil.isShowIdInVocabularyInChecklistEditor()){
107 if (status.getIdInVocabulary() != null){
108 result = status.getIdInVocabulary();
109 } else{
110 result = status.getTitleCache();
111 }
112 } else{
113 result = status.getTitleCache();
114 }
115 if (PreferencesUtil.isShowSymbolInChecklistEditor() && status.getSymbol() != null){
116 result.concat(" ("+ status.getSymbol() + ")");
117 }
118 }
119
120 fireStateChanged(distributionForColumn);
121 return result;
122 }
123 return null;
124 }
125
126 protected void fireStateChanged(Distribution dist) {
127 if (dist!= null){
128 ISelection selection = new StructuredSelection(dist);
129 // selService.setSelection(selection);
130 }
131 }
132
133 @Override
134 protected void setValue(Object element, Object value) {
135 if (element instanceof Taxon && value instanceof PresenceAbsenceTerm) {
136 Taxon taxon = (Taxon) element;
137 PresenceAbsenceTerm occurenceStatus = (PresenceAbsenceTerm) value;
138 Distribution distribution = getDistributionForColumn(taxon);
139 if (distribution != null) {
140 // change status for already exsiting distribution
141 distribution.setStatus(occurenceStatus);
142 } else {
143 createDistributionForColumn(taxon, occurenceStatus);
144 }
145 // viewer.update(distribution, null);
146 // viewer.update(element, null);
147 // viewer.refresh();
148 // editor.setDirty(true);
149 editor.changed(element);
150 viewer.refresh();
151 }
152 }
153
154 private static final List<String> DESC_INIT_STRATEGY = Arrays.asList(new String[] { "descriptions", //$NON-NLS-1$
155 "descriptions.*", "description.state" }); //$NON-NLS-1$ //$NON-NLS-2$
156
157 /**
158 *
159 * @param taxon
160 * @return
161 */
162 private Distribution getDistributionForColumn(Taxon taxon) {
163 // List<TaxonDescription> listTaxonDescriptions = descriptionService.listTaxonDescriptions(taxon, null, null,
164 // null, null, null, DESC_INIT_STRATEGY);
165 Set<TaxonDescription> listTaxonDescriptions = taxon.getDescriptions();
166 TableColumn column = viewer.getTable().getColumn(columnIndex);
167 for (TaxonDescription td : listTaxonDescriptions) {
168 for (DescriptionElementBase deb : td.getElements()) {
169 if (deb instanceof Distribution) {
170 Distribution distribution = (Distribution) deb;
171 if (distribution.getArea() != null){
172 if (PreferencesUtil.isShowIdInVocabularyInChecklistEditor()){
173 if (column.getText().equalsIgnoreCase(distribution.getArea().getIdInVocabulary())) {
174 return distribution;
175 }
176 }else{
177 if (column.getText().equalsIgnoreCase(distribution.getArea().getTitleCache())) {
178 return distribution;
179 }
180 }
181 }
182 }
183 }
184 }
185 return null;
186 }
187
188 private void createDistributionForColumn(Taxon taxon, PresenceAbsenceTerm occurenceStatus) {
189 TableColumn column = viewer.getTable().getColumn(columnIndex);
190
191 SortedSet<DefinedTermBase> namedAreas = this.editor.getLabelProvider().getNamedAreas();
192
193
194 if (namedAreas != null) {
195 for (DefinedTermBase term : namedAreas) {
196 boolean sameArea = true;
197 if (!PreferencesUtil.isShowIdInVocabularyInChecklistEditor()){
198 sameArea = column.getText().equalsIgnoreCase(term.getTitleCache());
199 } else{
200 if (term.getIdInVocabulary() != null){
201 sameArea = column.getText().equalsIgnoreCase(term.getIdInVocabulary());
202 } else{
203 sameArea = column.getText().equalsIgnoreCase(term.getTitleCache());
204 }
205 }
206 if (sameArea) {
207 NamedArea area = (NamedArea) term;
208 Distribution distribution = Distribution.NewInstance(area, occurenceStatus);
209 Set<TaxonDescription> descriptions = taxon.getDescriptions();
210 if (!descriptions.isEmpty()) {
211 for (TaxonDescription desc : descriptions) {
212 // add to first taxon description
213 desc.addElement(distribution);
214 break;
215 }
216 } else {// there are no TaxonDescription yet.
217 TaxonDescription td = TaxonDescription.NewInstance(taxon);
218 td.addElement(distribution);
219 break;
220 }
221 }
222 }
223 }
224
225 return;
226 }
227
228
229 }