Project

General

Profile

Download (6.6 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.campanula.compatibility.ICdmFormElement;
31
import eu.etaxonomy.taxeditor.ui.element.AbstractCdmFormElement;
32
import eu.etaxonomy.taxeditor.ui.element.CdmFormFactory;
33
import eu.etaxonomy.taxeditor.ui.element.CdmPropertyChangeEvent;
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
}
(1-1/2)