Refactoring of selection elements. Additional minor refactoring. Fixed a bug with...
[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.List;
17
18 import org.eclipse.swt.SWT;
19 import org.eclipse.swt.events.SelectionEvent;
20 import org.eclipse.swt.events.SelectionListener;
21 import org.eclipse.swt.graphics.Color;
22 import org.eclipse.swt.widgets.Combo;
23 import org.eclipse.swt.widgets.Label;
24
25 import eu.etaxonomy.cdm.model.common.IDefinedTerm;
26 import eu.etaxonomy.cdm.model.name.NomenclaturalCode;
27 import eu.etaxonomy.cdm.model.reference.ReferenceType;
28 import eu.etaxonomy.taxeditor.preference.Resources;
29 import eu.etaxonomy.taxeditor.store.StoreUtil;
30 import eu.etaxonomy.taxeditor.ui.element.AbstractCdmFormElement;
31 import eu.etaxonomy.taxeditor.ui.element.CdmFormFactory;
32 import eu.etaxonomy.taxeditor.ui.element.CdmPropertyChangeEvent;
33 import eu.etaxonomy.taxeditor.ui.element.ICdmFormElement;
34 import eu.etaxonomy.taxeditor.ui.element.IEnableableFormElement;
35 import eu.etaxonomy.taxeditor.ui.element.ISelectable;
36 import eu.etaxonomy.taxeditor.ui.element.LayoutConstants;
37
38 /**
39 * <p>
40 * Abstract AbstractEnumComboElement class.
41 * </p>
42 *
43 * @author n.hoffmann
44 * @created Mar 16, 2010
45 * @version 1.0
46 */
47 public class EnumComboElement<T extends IDefinedTerm> extends
48 AbstractCdmFormElement implements SelectionListener,
49 IEnableableFormElement, ISelectable {
50
51 private static CdmEnumDataHolder[] cdmEnumDataHolders = {
52 new CdmEnumDataHolder<NomenclaturalCode>(){
53
54 @Override
55 public String getName() {
56 return "Nomenclatural Code";
57 }
58
59 @Override
60 public Collection<NomenclaturalCode> getElements() {
61 return Arrays.asList(NomenclaturalCode.values());
62 }
63
64 @Override
65 public Class<NomenclaturalCode> getClazz() {
66 return NomenclaturalCode.class;
67 }
68
69 },
70 new CdmEnumDataHolder<ReferenceType>(){
71
72 @Override
73 public String getName() {
74 return "Reference Type";
75 }
76
77 @Override
78 public Collection<ReferenceType> getElements() {
79 return Arrays.asList(ReferenceType.values());
80 }
81
82 @Override
83 public Class<ReferenceType> getClazz() {
84 return ReferenceType.class;
85 }
86
87 }
88 };
89
90 private static final int DEFAULT_VISIBLE_ITEMS = 10;
91
92 protected T selection;
93
94 protected List<T> elementTypeList = new ArrayList<T>();
95
96 private Label label;
97 protected Combo combo;
98
99 private Class<T> enumType;
100
101 /**
102 * <p>
103 * Constructor for AbstractEnumComboElement.
104 * </p>
105 *
106 * @param formFactory
107 * a {@link eu.etaxonomy.taxeditor.ui.element.CdmFormFactory}
108 * object.
109 * @param parentElement
110 * a {@link eu.etaxonomy.taxeditor.ui.element.ICdmFormElement}
111 * object.
112 * @param labelString
113 * a {@link java.lang.String} object.
114 * @param <T>
115 * a T object.
116 */
117 public EnumComboElement(CdmFormFactory formFactory,
118 ICdmFormElement parentElement, Class<T> enumType, int style) {
119 super(formFactory, parentElement);
120 this.enumType = enumType;
121 label = formFactory.createLabel(getLayoutComposite(), getDefaultLabelString());
122 addControl(label);
123
124 // create combo
125 combo = new Combo(getLayoutComposite(), SWT.BORDER | SWT.READ_ONLY);
126 addControl(combo);
127 combo.setLayoutData(LayoutConstants.FILL_HORIZONTALLY());
128 setVisibleItemCount(DEFAULT_VISIBLE_ITEMS);
129
130 populateTypes();
131
132 combo.addSelectionListener(this);
133 }
134
135 private String getDefaultLabelString() {
136 if(enumType.equals(ReferenceType.class)){
137 return "Reference Type";
138 }else if (enumType.equals(NomenclaturalCode.class)){
139 return "Nomenclatural Code";
140 }
141 return "No Label";
142 }
143
144 /**
145 * <p>
146 * populateTypes
147 * </p>
148 */
149 private void populateTypes(){
150 for(T enumElement : getElementsForClass(enumType)){
151 elementTypeList.add(enumElement);
152 combo.add(((Enum) enumElement).name());
153 }
154 }
155
156 /**
157 * <p>
158 * Setter for the field <code>selection</code>.
159 * </p>
160 *
161 * @param selection
162 * the selection to set
163 */
164 public void setSelection(T selection) {
165 this.selection = selection;
166 combo.select(elementTypeList.indexOf(selection));
167 }
168
169 /**
170 * <p>
171 * addSelectionListener
172 * </p>
173 *
174 * @param listener
175 * a {@link org.eclipse.swt.events.SelectionListener} object.
176 */
177 public void addSelectionListener(SelectionListener listener) {
178 combo.addSelectionListener(listener);
179 }
180
181 /**
182 * <p>
183 * removeSelectionListener
184 * </p>
185 *
186 * @param listener
187 * a {@link org.eclipse.swt.events.SelectionListener} object.
188 */
189 public void removeSelectionListener(SelectionListener listener) {
190 combo.removeSelectionListener(listener);
191 }
192
193 /** {@inheritDoc} */
194 public void setSelected(boolean selected) {
195 setBackground(selected ? SELECTED : getPersistentBackground());
196 }
197
198 /**
199 * <p>
200 * Getter for the field <code>selection</code>.
201 * </p>
202 *
203 * @return the selection
204 */
205 public T getSelection() {
206 return selection;
207 }
208
209 /** {@inheritDoc} */
210 public void setEnabled(boolean enabled) {
211 combo.setEnabled(enabled);
212 }
213
214 /*
215 * (non-Javadoc)
216 *
217 * @see
218 * org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt
219 * .events.SelectionEvent)
220 */
221 /** {@inheritDoc} */
222 public void widgetSelected(SelectionEvent e) {
223 selection = elementTypeList.get(combo.getSelectionIndex());
224 firePropertyChangeEvent(new CdmPropertyChangeEvent(this, e));
225 }
226
227 /** {@inheritDoc} */
228 public void setIrrelevant(boolean irrelevant) {
229 String colorId = irrelevant ? Resources.COLOR_COMPOSITE_IRRELEVANT
230 : Resources.COLOR_COMPOSITE_BACKGROUND;
231
232 Color color = StoreUtil.getColor(colorId);
233 combo.setBackground(color);
234 }
235
236 /** {@inheritDoc} */
237 @Override
238 public void setBackground(Color color) {
239 label.setBackground(color);
240 }
241
242 /** {@inheritDoc} */
243 public void widgetDefaultSelected(SelectionEvent e) {
244 }
245
246 public void setVisibleItemCount(int visibleItems){
247 combo.setVisibleItemCount(visibleItems);
248 }
249
250 private Collection<T> getElementsForClass(Class<T> clazz){
251 CdmEnumDataHolder<T> dataHolder = getCdmEnumDataHolderForClass(clazz);
252 if (dataHolder != null) {
253 return dataHolder.getElements();
254 }
255 return null;
256 }
257
258 private CdmEnumDataHolder<T> getCdmEnumDataHolderForClass(Class<T> clazz){
259 for (CdmEnumDataHolder dataHolder : cdmEnumDataHolders) {
260 if (dataHolder.getClazz().equals(clazz)){
261 return dataHolder;
262 }
263 }
264 return null;
265 }
266
267 private interface CdmEnumDataHolder<T> {
268 Class<T> getClazz();
269 String getName();
270 Collection<T> getElements();
271 }
272 }