Project

General

Profile

Download (6.51 KB) Statistics
| Branch: | Tag: | Revision:
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
}
(2-2/3)