ref #9680: adapt edtior to cdmlib changes in agent searches
[taxeditor.git] / eu.etaxonomy.taxeditor.store / src / main / java / eu / etaxonomy / taxeditor / ui / mvc / combo / EnumTermComboController.java
1 /**
2 * Copyright (C) 2014 EDIT
3 * European Distributed Institute of Taxonomy
4 * http://www.e-taxonomy.eu
5 *
6 * The contents of this file are subject to the Mozilla Public License Version 1.1
7 * See LICENSE.TXT at the top of this package for the full license terms.
8 */
9 package eu.etaxonomy.taxeditor.ui.mvc.combo;
10
11 import java.util.ArrayList;
12 import java.util.Arrays;
13 import java.util.Collection;
14 import java.util.LinkedHashMap;
15 import java.util.List;
16 import java.util.Map.Entry;
17
18 import org.eclipse.swt.events.SelectionEvent;
19 import org.eclipse.swt.events.SelectionListener;
20 import org.eclipse.swt.graphics.Color;
21 import org.eclipse.swt.widgets.Combo;
22 import org.eclipse.swt.widgets.Composite;
23
24 import eu.etaxonomy.cdm.model.name.NomenclaturalCode;
25 import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationType;
26 import eu.etaxonomy.cdm.model.reference.OriginalSourceType;
27 import eu.etaxonomy.cdm.model.reference.ReferenceType;
28 import eu.etaxonomy.cdm.model.term.IEnumTerm;
29 import eu.etaxonomy.taxeditor.model.AbstractUtility;
30 import eu.etaxonomy.taxeditor.ui.element.AbstractRelevanceFormElement;
31 import eu.etaxonomy.taxeditor.ui.element.CdmFormFactory;
32 import eu.etaxonomy.taxeditor.ui.element.ICdmFormElement;
33 import eu.etaxonomy.taxeditor.ui.element.IEnableableFormElement;
34 import eu.etaxonomy.taxeditor.ui.element.ISelectable;
35 import eu.etaxonomy.taxeditor.ui.mvc.interfaces.CdmCompositeController;
36
37 /**
38 * @author pplitzner
39 * @date 29.01.2014
40 */
41 public class EnumTermComboController<T extends IEnumTerm<T>>
42 extends AbstractRelevanceFormElement
43 implements SelectionListener, IEnableableFormElement, ISelectable, CdmCompositeController {
44
45 private static CdmEnumDataHolder<?>[] cdmEnumDataHolders = {
46 new CdmEnumDataHolder<NomenclaturalCode>(){
47
48 @Override
49 public String getName() {
50 return "Nomenclatural Code";
51 }
52
53 @Override
54 public Collection<NomenclaturalCode> getElements() {
55 Collection<NomenclaturalCode> result = Arrays.asList(NomenclaturalCode.values());
56 result.remove(NomenclaturalCode.ICVCN);
57 return result;
58 }
59
60 @Override
61 public Class<NomenclaturalCode> getClazz() {
62 return NomenclaturalCode.class;
63 }
64
65 },
66 new CdmEnumDataHolder<ReferenceType>(){
67
68 @Override
69 public String getName() {
70 return "Reference Type";
71 }
72
73 @Override
74 public Collection<ReferenceType> getElements() {
75 return Arrays.asList(ReferenceType.values());
76 }
77
78 @Override
79 public Class<ReferenceType> getClazz() {
80 return ReferenceType.class;
81 }
82
83 },
84 new CdmEnumDataHolder<SpecimenOrObservationType>(){
85
86 @Override
87 public String getName() {
88 return "Specimen / Observation Type";
89 }
90
91 @Override
92 public Collection<SpecimenOrObservationType> getElements() {
93 return Arrays.asList(SpecimenOrObservationType.values());
94 }
95
96 @Override
97 public Class<SpecimenOrObservationType> getClazz() {
98 return SpecimenOrObservationType.class;
99 }
100
101 },
102 new CdmEnumDataHolder<OriginalSourceType>(){
103
104 @Override
105 public String getName() {
106 return "Original Source Type";
107 }
108
109 @Override
110 public Collection<OriginalSourceType> getElements() {
111 return Arrays.asList(OriginalSourceType.values());
112 }
113
114 @Override
115 public Class<OriginalSourceType> getClazz() {
116 return OriginalSourceType.class;
117 }
118
119 }
120
121 };
122
123 private static final int DEFAULT_VISIBLE_ITEMS = 10;
124
125 protected T selection;
126
127 protected List<T> elementTypeList = new ArrayList<T>();
128
129 protected Combo combo;
130
131 private final Class<T> enumType;
132
133 /**
134 * Constructor for AbstractEnumComboElement.
135 */
136 public EnumTermComboController(Combo combo, CdmFormFactory formFactory,
137 ICdmFormElement parentElement, Class<T> enumType, int style) {
138 super(formFactory, (Composite)null);
139 this.enumType = enumType;
140 // create combo
141 this.combo = combo;
142 addControl(combo);
143 setVisibleItemCount(DEFAULT_VISIBLE_ITEMS);
144
145 populateTypes();
146
147 combo.addSelectionListener(this);
148 }
149
150 /**
151 * populateTypes
152 */
153 private void populateTypes(){
154 Collection<T> elementsForClass = getElementsForClass(enumType);
155 // special hierarchical order for specimens
156 if(enumType.equals(SpecimenOrObservationType.class)){
157 LinkedHashMap<T, String> orderedTerms = AbstractUtility.orderTerms(elementsForClass);
158 for(Entry<T, String> keyLabelPair : orderedTerms.entrySet()){
159 elementTypeList.add(keyLabelPair.getKey());
160 combo.add(keyLabelPair.getValue());
161 }
162 }
163 // default order
164 else{
165 for(T enumElement : getElementsForClass(enumType)){
166 elementTypeList.add(enumElement);
167 combo.add(((Enum) enumElement).name());
168 }
169 }
170 }
171
172 public void setSelection(T selection) {
173 this.selection = selection;
174 combo.select(elementTypeList.indexOf(selection));
175 }
176
177 public void addSelectionListener(SelectionListener listener) {
178 combo.addSelectionListener(listener);
179 }
180
181 public void removeSelectionListener(SelectionListener listener) {
182 combo.removeSelectionListener(listener);
183 }
184
185 @Override
186 public void setSelected(boolean selected) {
187 setBackground(selected ? SELECTED : getPersistentBackground());
188 }
189
190 public T getSelection() {
191 return selection;
192 }
193
194 @Override
195 public void setEnabled(boolean enabled) {
196 combo.setEnabled(enabled);
197 }
198
199 @Override
200 public boolean isEnabled() {
201 return combo.isEnabled();
202 }
203
204 @Override
205 public void widgetSelected(SelectionEvent e) {
206 selection = elementTypeList.get(combo.getSelectionIndex());
207 }
208
209 @Override
210 public void updateCacheRelevance() {
211 Color color = cacheRelevance().getColor();
212 combo.setBackground(color);
213 }
214
215 @Override
216 public void setBackground(Color color) {
217 // label.setBackground(color);
218 }
219
220 @Override
221 public void widgetDefaultSelected(SelectionEvent e) {
222 }
223
224 public void setVisibleItemCount(int visibleItems){
225 combo.setVisibleItemCount(visibleItems);
226 }
227
228 private Collection<T> getElementsForClass(Class<T> clazz){
229 CdmEnumDataHolder<T> dataHolder = getCdmEnumDataHolderForClass(clazz);
230 if (dataHolder != null) {
231 return dataHolder.getElements();
232 }
233 return null;
234 }
235
236 private CdmEnumDataHolder<T> getCdmEnumDataHolderForClass(Class<T> clazz){
237 for (CdmEnumDataHolder<?> dataHolder : cdmEnumDataHolders) {
238 if (dataHolder.getClazz().equals(clazz)){
239 return (CdmEnumDataHolder<T>)dataHolder;
240 }
241 }
242 return null;
243 }
244
245 private interface CdmEnumDataHolder<T> {
246 Class<T> getClazz();
247 String getName();
248 Collection<T> getElements();
249 }
250 }