c30985b9cb8108dfa083d43f3d47aec742d7aabf
[taxeditor.git] / eu.etaxonomy.taxeditor.editor / src / main / java / eu / etaxonomy / taxeditor / editor / view / checklist / edit / DistributionEditingSupport.java
1 package eu.etaxonomy.taxeditor.editor.view.checklist.edit;
2
3 import java.util.Arrays;
4 import java.util.List;
5 import java.util.Set;
6 import java.util.SortedSet;
7
8 import org.apache.log4j.Logger;
9 import org.eclipse.jface.viewers.ArrayContentProvider;
10 import org.eclipse.jface.viewers.CellEditor;
11 import org.eclipse.jface.viewers.ComboBoxViewerCellEditor;
12 import org.eclipse.jface.viewers.EditingSupport;
13 import org.eclipse.jface.viewers.LabelProvider;
14 import org.eclipse.jface.viewers.TableViewer;
15 import org.eclipse.swt.SWT;
16 import org.eclipse.swt.widgets.Composite;
17 import org.eclipse.swt.widgets.TableColumn;
18
19 import eu.etaxonomy.cdm.api.service.IDescriptionService;
20 import eu.etaxonomy.cdm.model.common.DefinedTermBase;
21 import eu.etaxonomy.cdm.model.description.DescriptionElementBase;
22 import eu.etaxonomy.cdm.model.description.Distribution;
23 import eu.etaxonomy.cdm.model.description.PresenceAbsenceTermBase;
24 import eu.etaxonomy.cdm.model.description.TaxonDescription;
25 import eu.etaxonomy.cdm.model.location.NamedArea;
26 import eu.etaxonomy.cdm.model.taxon.Taxon;
27 import eu.etaxonomy.taxeditor.editor.view.checklist.ChecklistEditor;
28 import eu.etaxonomy.taxeditor.editor.view.checklist.ChecklistLabelProvider;
29 import eu.etaxonomy.taxeditor.store.CdmStore;
30
31 public final class DistributionEditingSupport extends EditingSupport {
32
33 private ComboBoxViewerCellEditor cellEditor = null;
34 private final TableViewer viewer;
35 private final ChecklistEditor editor;
36 private final IDescriptionService descriptionService;
37 private final int columnIndex;
38
39 private static final Logger logger = Logger.getLogger(DistributionEditingSupport.class);
40
41 public DistributionEditingSupport(TableViewer viewer, ChecklistEditor checklistEditor, int columnIndex) {
42 super(viewer);
43 this.viewer = viewer;
44 this.columnIndex = columnIndex;
45 descriptionService = CdmStore.getService(IDescriptionService.class);
46 editor = checklistEditor;
47 cellEditor = new ComboBoxViewerCellEditor((Composite) viewer.getControl(), SWT.READ_ONLY);
48 cellEditor.setLabelProvider(new LabelProvider());
49 cellEditor.setContentProvider(new ArrayContentProvider());
50 // TODO set input
51 List<PresenceAbsenceTermBase> input = CdmStore.getTermManager()
52 .getPreferredTerms(PresenceAbsenceTermBase.class);
53 cellEditor.setInput(input);
54 }
55
56 @Override
57 protected CellEditor getCellEditor(Object element) {
58 return cellEditor;
59 }
60
61 @Override
62 protected boolean canEdit(Object element) {
63 return true;
64 }
65
66 @Override
67 protected Object getValue(Object element) {
68 if (element instanceof Taxon) {
69 Taxon taxon = (Taxon) element;
70 Distribution distributionForColumn = getDistributionForColumn(taxon);
71 if (distributionForColumn != null) {
72 distributionForColumn.getStatus().getTitleCache();
73 }
74 // return PresenceAbsenceTerms
75 }
76 return null;
77 }
78
79 @Override
80 protected void setValue(Object element, Object value) {
81 if (element instanceof Taxon && value instanceof PresenceAbsenceTermBase) {
82 Taxon taxon = (Taxon) element;
83 PresenceAbsenceTermBase occurenceStatus = (PresenceAbsenceTermBase) value;
84 Distribution distribution = getDistributionForColumn(taxon);
85 if (distribution != null) {
86 // change status for already exsiting distribution
87 distribution.setStatus(occurenceStatus);
88 } else {
89 createDistributionForColumn(taxon, occurenceStatus);
90 }
91 // viewer.update(distribution, null);
92 viewer.update(element, null);
93 viewer.refresh();
94 editor.setDirty(true);
95 editor.changed(element);
96 viewer.refresh();
97 }
98 }
99
100 private static final List<String> DESC_INIT_STRATEGY = Arrays.asList(new String[] { "descriptions",
101 "descriptions.*", "description.state" });
102
103 /**
104 *
105 * @param taxon
106 * @return
107 */
108 private Distribution getDistributionForColumn(Taxon taxon) {
109 List<TaxonDescription> listTaxonDescriptions = descriptionService.listTaxonDescriptions(taxon, null, null,
110 null, null, null, DESC_INIT_STRATEGY);
111 TableColumn column = viewer.getTable().getColumn(columnIndex);
112 for (TaxonDescription td : listTaxonDescriptions) {
113 for (DescriptionElementBase deb : td.getElements()) {
114 if (deb instanceof Distribution) {
115 Distribution distribution = (Distribution) deb;
116 if (column.getText().equalsIgnoreCase(distribution.getArea().getTitleCache())) {
117 return distribution;
118 }
119 }
120 }
121 }
122 return null;
123 }
124
125 private void createDistributionForColumn(Taxon taxon, PresenceAbsenceTermBase occurenceStatus) {
126 TableColumn column = viewer.getTable().getColumn(columnIndex);
127
128 ChecklistLabelProvider labelProvider = new ChecklistLabelProvider();
129 List<DefinedTermBase<?>> namedAreas = labelProvider.getNamedAreas();
130 SortedSet<DefinedTermBase<?>> terms = (SortedSet<DefinedTermBase<?>>) labelProvider.getTermsOrderedByLabels(
131 namedAreas, CdmStore.getDefaultLanguage());
132
133 if (terms != null) {
134 for (DefinedTermBase term : terms) {
135 if (column.getText().equalsIgnoreCase(term.getTitleCache())) {
136 NamedArea area = (NamedArea) term;
137 Distribution distribution = Distribution.NewInstance(area, occurenceStatus);
138 Set<TaxonDescription> descriptions = taxon.getDescriptions();
139 if (descriptions != null) {
140 for (TaxonDescription desc : descriptions) {
141 // add to first taxon description
142 desc.addElement(distribution);
143 break;
144 }
145 } else {// there are no TaxonDescription yet.
146 TaxonDescription td = TaxonDescription.NewInstance(taxon);
147 td.addElement(distribution);
148 }
149 }
150 }
151 }
152
153 return;
154 }
155 }