c73a79271dd28a31c3c9bf4ff0432fae903857f6
[taxeditor.git] / eu.etaxonomy.taxeditor.store / src / main / java / eu / etaxonomy / taxeditor / ui / combo / EnumComboElement.java
1 // $Id$
2 /**
3 * Copyright (C) 2007 EDIT
4 * European Distributed Institute of Taxonomy
5 * http://www.e-taxonomy.eu
6 *
7 * The contents of this file are subject to the Mozilla Public License Version 1.1
8 * See LICENSE.TXT at the top of this package for the full license terms.
9 */
10
11 package eu.etaxonomy.taxeditor.ui.combo;
12
13 import java.util.ArrayList;
14 import java.util.Arrays;
15 import java.util.Collection;
16 import java.util.LinkedHashMap;
17 import java.util.List;
18 import java.util.Map.Entry;
19
20 import org.eclipse.swt.SWT;
21 import org.eclipse.swt.events.SelectionEvent;
22 import org.eclipse.swt.events.SelectionListener;
23 import org.eclipse.swt.graphics.Color;
24 import org.eclipse.swt.widgets.Combo;
25 import org.eclipse.swt.widgets.Label;
26
27 import eu.etaxonomy.cdm.model.common.IEnumTerm;
28 import eu.etaxonomy.cdm.model.common.OriginalSourceType;
29 import eu.etaxonomy.cdm.model.name.NomenclaturalCode;
30 import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationType;
31 import eu.etaxonomy.cdm.model.reference.ReferenceType;
32 import eu.etaxonomy.taxeditor.model.AbstractUtility;
33 import eu.etaxonomy.taxeditor.preference.Resources;
34 import eu.etaxonomy.taxeditor.store.StoreUtil;
35 import eu.etaxonomy.taxeditor.ui.element.AbstractCdmFormElement;
36 import eu.etaxonomy.taxeditor.ui.element.CdmFormFactory;
37 import eu.etaxonomy.taxeditor.ui.element.CdmPropertyChangeEvent;
38 import eu.etaxonomy.taxeditor.ui.element.ICdmFormElement;
39 import eu.etaxonomy.taxeditor.ui.element.IEnableableFormElement;
40 import eu.etaxonomy.taxeditor.ui.element.ISelectable;
41 import eu.etaxonomy.taxeditor.ui.element.LayoutConstants;
42
43 /**
44 * <p>
45 * Abstract AbstractEnumComboElement class.
46 * </p>
47 *
48 * @author n.hoffmann
49 * @created Mar 16, 2010
50 * @version 1.0
51 */
52 public class EnumComboElement<T extends IEnumTerm<T>> extends
53 AbstractCdmFormElement implements SelectionListener,
54 IEnableableFormElement, ISelectable {
55
56 private static CdmEnumDataHolder[] cdmEnumDataHolders = {
57 new CdmEnumDataHolder<NomenclaturalCode>(){
58
59 @Override
60 public String getName() {
61 return "Nomenclatural Code";
62 }
63
64 @Override
65 public Collection<NomenclaturalCode> getElements() {
66 return Arrays.asList(NomenclaturalCode.values());
67 }
68
69 @Override
70 public Class<NomenclaturalCode> getClazz() {
71 return NomenclaturalCode.class;
72 }
73
74 },
75 new CdmEnumDataHolder<ReferenceType>(){
76
77 @Override
78 public String getName() {
79 return "Reference Type";
80 }
81
82 @Override
83 public Collection<ReferenceType> getElements() {
84 return Arrays.asList(ReferenceType.values());
85 }
86
87 @Override
88 public Class<ReferenceType> getClazz() {
89 return ReferenceType.class;
90 }
91
92 },
93 new CdmEnumDataHolder<SpecimenOrObservationType>(){
94
95 @Override
96 public String getName() {
97 return "Specimen / Observation Type";
98 }
99
100 @Override
101 public Collection<SpecimenOrObservationType> getElements() {
102 return Arrays.asList(SpecimenOrObservationType.values());
103 }
104
105 @Override
106 public Class<SpecimenOrObservationType> getClazz() {
107 return SpecimenOrObservationType.class;
108 }
109
110 },
111 new CdmEnumDataHolder<OriginalSourceType>(){
112
113 @Override
114 public String getName() {
115 return "Original Source Type";
116 }
117
118 @Override
119 public Collection<OriginalSourceType> getElements() {
120 return Arrays.asList(OriginalSourceType.values());
121 }
122
123 @Override
124 public Class<OriginalSourceType> getClazz() {
125 return OriginalSourceType.class;
126 }
127
128 }
129
130 };
131
132 private static final int DEFAULT_VISIBLE_ITEMS = 10;
133
134 protected T selection;
135
136 protected List<T> elementTypeList = new ArrayList<T>();
137
138 private final Label label;
139 protected Combo combo;
140
141 private final Class<T> enumType;
142
143 /**
144 * <p>
145 * Constructor for AbstractEnumComboElement.
146 * </p>
147 *
148 * @param formFactory
149 * a {@link eu.etaxonomy.taxeditor.ui.element.CdmFormFactory}
150 * object.
151 * @param parentElement
152 * a {@link eu.etaxonomy.taxeditor.ui.element.ICdmFormElement}
153 * object.
154 * @param labelString
155 * a {@link java.lang.String} object.
156 * @param <T>
157 * a T object.
158 */
159 public EnumComboElement(CdmFormFactory formFactory,
160 ICdmFormElement parentElement, Class<T> enumType, int style) {
161 super(formFactory, parentElement);
162 this.enumType = enumType;
163 label = formFactory.createLabel(getLayoutComposite(), getDefaultLabelString());
164 addControl(label);
165
166 // create combo
167 combo = new Combo(getLayoutComposite(), SWT.BORDER | SWT.READ_ONLY);
168 addControl(combo);
169 combo.setLayoutData(LayoutConstants.FILL_HORIZONTALLY());
170 setVisibleItemCount(DEFAULT_VISIBLE_ITEMS);
171
172 populateTypes();
173
174 combo.addSelectionListener(this);
175 }
176
177 private String getDefaultLabelString() {
178 if(enumType.equals(ReferenceType.class)){
179 return "Reference Type";
180 } else if (enumType.equals(NomenclaturalCode.class)){
181 return "Nomenclatural Code";
182 } else if(enumType.equals(OriginalSourceType.class)) {
183 return "Orig. Source Type";
184 } else if(enumType.equals(SpecimenOrObservationType.class)) {
185 return "Spec./Obs. Type";
186 }
187 return "No Label";
188 }
189
190 /**
191 * <p>
192 * populateTypes
193 * </p>
194 */
195 private void populateTypes(){
196 Collection<T> elementsForClass = getElementsForClass(enumType);
197 LinkedHashMap<T, String> orderedTerms = AbstractUtility.orderTerms(elementsForClass);
198 for(Entry<T, String> keyLabelPair : orderedTerms.entrySet()){
199 elementTypeList.add(keyLabelPair.getKey());
200 combo.add(keyLabelPair.getValue());
201 }
202 }
203
204 /**
205 * <p>
206 * Setter for the field <code>selection</code>.
207 * </p>
208 *
209 * @param selection
210 * the selection to set
211 */
212 public void setSelection(T selection) {
213 this.selection = selection;
214 combo.select(elementTypeList.indexOf(selection));
215 }
216
217 /**
218 * <p>
219 * addSelectionListener
220 * </p>
221 *
222 * @param listener
223 * a {@link org.eclipse.swt.events.SelectionListener} object.
224 */
225 public void addSelectionListener(SelectionListener listener) {
226 combo.addSelectionListener(listener);
227 }
228
229 /**
230 * <p>
231 * removeSelectionListener
232 * </p>
233 *
234 * @param listener
235 * a {@link org.eclipse.swt.events.SelectionListener} object.
236 */
237 public void removeSelectionListener(SelectionListener listener) {
238 combo.removeSelectionListener(listener);
239 }
240
241 /** {@inheritDoc} */
242 @Override
243 public void setSelected(boolean selected) {
244 setBackground(selected ? SELECTED : getPersistentBackground());
245 }
246
247 /**
248 * <p>
249 * Getter for the field <code>selection</code>.
250 * </p>
251 *
252 * @return the selection
253 */
254 public T getSelection() {
255 return selection;
256 }
257
258 /** {@inheritDoc} */
259 @Override
260 public void setEnabled(boolean enabled) {
261 combo.setEnabled(enabled);
262 }
263
264 /*
265 * (non-Javadoc)
266 *
267 * @see
268 * org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt
269 * .events.SelectionEvent)
270 */
271 /** {@inheritDoc} */
272 @Override
273 public void widgetSelected(SelectionEvent e) {
274 selection = elementTypeList.get(combo.getSelectionIndex());
275 firePropertyChangeEvent(new CdmPropertyChangeEvent(this, e));
276 }
277
278 /** {@inheritDoc} */
279 @Override
280 public void setIrrelevant(boolean irrelevant) {
281 String colorId = irrelevant ? Resources.COLOR_COMPOSITE_IRRELEVANT
282 : Resources.COLOR_COMPOSITE_BACKGROUND;
283
284 Color color = StoreUtil.getColor(colorId);
285 combo.setBackground(color);
286 }
287
288 /** {@inheritDoc} */
289 @Override
290 public void setBackground(Color color) {
291 label.setBackground(color);
292 }
293
294 /** {@inheritDoc} */
295 @Override
296 public void widgetDefaultSelected(SelectionEvent e) {
297 }
298
299 public void setVisibleItemCount(int visibleItems){
300 combo.setVisibleItemCount(visibleItems);
301 }
302
303 private Collection<T> getElementsForClass(Class<T> clazz){
304 CdmEnumDataHolder<T> dataHolder = getCdmEnumDataHolderForClass(clazz);
305 if (dataHolder != null) {
306 return dataHolder.getElements();
307 }
308 return null;
309 }
310
311 private CdmEnumDataHolder<T> getCdmEnumDataHolderForClass(Class<T> clazz){
312 for (CdmEnumDataHolder dataHolder : cdmEnumDataHolders) {
313 if (dataHolder.getClazz().equals(clazz)){
314 return dataHolder;
315 }
316 }
317 return null;
318 }
319
320 private interface CdmEnumDataHolder<T> {
321 Class<T> getClazz();
322 String getName();
323 Collection<T> getElements();
324 }
325 }