Project

General

Profile

Download (5.2 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.LinkedHashMap;
17
import java.util.List;
18
import java.util.Map.Entry;
19

    
20
import org.eclipse.swt.events.SelectionEvent;
21

    
22
import eu.etaxonomy.cdm.model.common.IEnumTerm;
23
import eu.etaxonomy.cdm.model.common.OriginalSourceType;
24
import eu.etaxonomy.cdm.model.name.NomenclaturalCode;
25
import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationType;
26
import eu.etaxonomy.cdm.model.reference.ReferenceType;
27
import eu.etaxonomy.taxeditor.model.AbstractUtility;
28
import eu.etaxonomy.taxeditor.ui.element.CdmFormFactory;
29
import eu.etaxonomy.taxeditor.ui.element.CdmPropertyChangeEvent;
30
import eu.etaxonomy.taxeditor.ui.element.ICdmFormElement;
31

    
32
/**
33
 * @author n.hoffmann
34
 * @created Mar 16, 2010
35
 * @version 1.0
36
 */
37
public class EnumComboElement<T extends IEnumTerm<T>> extends
38
		AbstractComboElement<T>  {
39

    
40
	//TODO RL
41
	public void setVisible(boolean b){
42
		combo.setVisible(b);
43
	}
44

    
45

    
46
	private static CdmEnumDataHolder[] cdmEnumDataHolders = {
47
		new CdmEnumDataHolder<NomenclaturalCode>(){
48

    
49
			@Override
50
			public String getName() {
51
				return "Nomenclatural Code";
52
			}
53

    
54
			@Override
55
			public Collection<NomenclaturalCode> getElements() {
56
				return  Arrays.asList(NomenclaturalCode.values());
57
			}
58

    
59
			@Override
60
			public Class<NomenclaturalCode> getClazz() {
61
				return NomenclaturalCode.class;
62
			}
63

    
64
		},
65
		new CdmEnumDataHolder<ReferenceType>(){
66

    
67
			@Override
68
			public String getName() {
69
				return "Reference Type";
70
			}
71

    
72
			@Override
73
			public Collection<ReferenceType> getElements() {
74
				return Arrays.asList(ReferenceType.values());
75
			}
76

    
77
			@Override
78
			public Class<ReferenceType> getClazz() {
79
				return ReferenceType.class;
80
			}
81

    
82
		},
83
		new CdmEnumDataHolder<SpecimenOrObservationType>(){
84

    
85
			@Override
86
			public String getName() {
87
				return "Specimen / Observation Type";
88
			}
89

    
90
			@Override
91
			public Collection<SpecimenOrObservationType> getElements() {
92
				return Arrays.asList(SpecimenOrObservationType.values());
93
			}
94

    
95
			@Override
96
			public Class<SpecimenOrObservationType> getClazz() {
97
				return SpecimenOrObservationType.class;
98
			}
99

    
100
		},
101
		new CdmEnumDataHolder<OriginalSourceType>(){
102

    
103
			@Override
104
			public String getName() {
105
				return "Original Source Type";
106
			}
107

    
108
			@Override
109
			public Collection<OriginalSourceType> getElements() {
110
				return Arrays.asList(OriginalSourceType.values());
111
			}
112

    
113
			@Override
114
			public Class<OriginalSourceType> getClazz() {
115
				return OriginalSourceType.class;
116
			}
117

    
118
		}
119

    
120
	};
121

    
122
	protected List<T> elementTypeList = new ArrayList<T>();
123

    
124
	private final Class<T> enumType;
125

    
126
	public EnumComboElement(CdmFormFactory formFactory,
127
			ICdmFormElement parentElement, Class<T> enumType, int style) {
128
		super(formFactory, parentElement);
129
		this.enumType = enumType;
130
		label.setText(getDefaultLabelString());
131

    
132
		populateTypes();
133

    
134
		combo.addSelectionListener(this);
135
	}
136

    
137
	private String getDefaultLabelString() {
138
		if(enumType.equals(ReferenceType.class)){
139
			return "Reference Type";
140
		} else if (enumType.equals(NomenclaturalCode.class)){
141
			return "Nomenclatural Code";
142
		} else if(enumType.equals(OriginalSourceType.class)) {
143
			return "Orig. Source Type";
144
		} else if(enumType.equals(SpecimenOrObservationType.class)) {
145
			return "Spec./Obs. Type";
146
		}
147
		return "No Label";
148
	}
149

    
150
    private void populateTypes(){
151
        Collection<T> elementsForClass = getElementsForClass(enumType);
152
        // special hierarchical order for specimens
153
        if(enumType.equals(SpecimenOrObservationType.class)){
154
            LinkedHashMap<T, String> orderedTerms = AbstractUtility.orderTerms(elementsForClass);
155
            for(Entry<T, String> keyLabelPair : orderedTerms.entrySet()){
156
                elementTypeList.add(keyLabelPair.getKey());
157
                combo.add(keyLabelPair.getValue());
158
            }
159
        }
160
        // default order
161
        else{
162
            for(T enumElement : getElementsForClass(enumType)){
163
                elementTypeList.add(enumElement);
164
                combo.add(((Enum) enumElement).name());
165
            }
166
        }
167
	}
168

    
169
	@Override
170
    public void setSelection(T selection) {
171
		this.selection = selection;
172
		combo.select(elementTypeList.indexOf(selection));
173
	}
174
	/** {@inheritDoc} */
175
	@Override
176
    public void widgetSelected(SelectionEvent e) {
177
		selection = elementTypeList.get(combo.getSelectionIndex());
178
		firePropertyChangeEvent(new CdmPropertyChangeEvent(this, e));
179
	}
180

    
181
	private Collection<T> getElementsForClass(Class<T> clazz){
182
		CdmEnumDataHolder<T> dataHolder = getCdmEnumDataHolderForClass(clazz);
183
		if (dataHolder != null) {
184
			return dataHolder.getElements();
185
		}
186
		return null;
187
	}
188

    
189
	private CdmEnumDataHolder<T> getCdmEnumDataHolderForClass(Class<T> clazz){
190
		for (CdmEnumDataHolder dataHolder : cdmEnumDataHolders) {
191
			if (dataHolder.getClazz().equals(clazz)){
192
				return dataHolder;
193
			}
194
		}
195
		return null;
196
	}
197

    
198
	private interface CdmEnumDataHolder<T> {
199
		Class<T> getClazz();
200
		String getName();
201
		Collection<T> getElements();
202
	}
203
}
(2-2/4)