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