Project

General

Profile

Download (5.2 KB) Statistics
| Branch: | Tag: | Revision:
1
/**
2
 * Copyright (C) 2007 EDIT
3
 * European Distributed Institute of Taxonomy
4
 * http://www.e-taxonomy.eu
5
 *
6
 * The contents of this file are subject to the Mozilla Public License Version 1.1
7
 * See LICENSE.TXT at the top of this package for the full license terms.
8
 */
9

    
10
package eu.etaxonomy.taxeditor.ui.combo;
11

    
12
import java.util.ArrayList;
13
import java.util.Arrays;
14
import java.util.Collection;
15
import java.util.LinkedHashMap;
16
import java.util.List;
17
import java.util.Map.Entry;
18

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

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

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

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

    
44

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
117
		}
118

    
119
	};
120

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

    
123
	private final Class<T> enumType;
124

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

    
131
		populateTypes();
132

    
133
		combo.addSelectionListener(this);
134
	}
135

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

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

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

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

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

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