Project

General

Profile

Download (5.53 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.Collections;
16
import java.util.Comparator;
17
import java.util.LinkedHashMap;
18
import java.util.List;
19
import java.util.Map.Entry;
20

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

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

    
33
/**
34
 * @author n.hoffmann
35
 * @created Mar 16, 2010
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
				Collection<NomenclaturalCode> result = new ArrayList<>(Arrays.asList(NomenclaturalCode.values()));
57
            	result.remove(NomenclaturalCode.ICVCN);
58
                return  result;
59
				
60
			}
61

    
62
			@Override
63
			public Class<NomenclaturalCode> getClazz() {
64
				return NomenclaturalCode.class;
65
			}
66

    
67
		},
68
		new CdmEnumDataHolder<ReferenceType>(){
69

    
70
			@Override
71
			public String getName() {
72
				return "Reference Type";
73
			}
74

    
75
			@Override
76
			public Collection<ReferenceType> getElements() {
77
				return Arrays.asList(ReferenceType.values());
78
			}
79

    
80
			@Override
81
			public Class<ReferenceType> getClazz() {
82
				return ReferenceType.class;
83
			}
84

    
85
		},
86
		new CdmEnumDataHolder<SpecimenOrObservationType>(){
87

    
88
			@Override
89
			public String getName() {
90
				return "Specimen / Observation Type";
91
			}
92

    
93
			@Override
94
			public Collection<SpecimenOrObservationType> getElements() {
95
				return Arrays.asList(SpecimenOrObservationType.values());
96
			}
97

    
98
			@Override
99
			public Class<SpecimenOrObservationType> getClazz() {
100
				return SpecimenOrObservationType.class;
101
			}
102

    
103
		},
104
		new CdmEnumDataHolder<OriginalSourceType>(){
105

    
106
			@Override
107
			public String getName() {
108
				return "Original Source Type";
109
			}
110

    
111
			@Override
112
			public Collection<OriginalSourceType> getElements() {
113
				return Arrays.asList(OriginalSourceType.values());
114
			}
115

    
116
			@Override
117
			public Class<OriginalSourceType> getClazz() {
118
				return OriginalSourceType.class;
119
			}
120

    
121
		}
122

    
123
	};
124

    
125
	protected List<T> elementTypeList = new ArrayList<>();
126

    
127
	private final Class<T> enumType;
128

    
129
	public EnumComboElement(CdmFormFactory formFactory,
130
			ICdmFormElement parentElement, Class<T> enumType, Comparator<T> comparator, int style) {
131
		super(formFactory, parentElement);
132
		this.enumType = enumType;
133
		label.setText(getDefaultLabelString());
134

    
135
		populateTypes(comparator);
136

    
137
		combo.addSelectionListener(this);
138
	}
139

    
140

    
141

    
142
	private String getDefaultLabelString() {
143
		if(enumType.equals(ReferenceType.class)){
144
			return "Reference Type";
145
		} else if (enumType.equals(NomenclaturalCode.class)){
146
			return "Nomenclatural Code";
147
		} else if(enumType.equals(OriginalSourceType.class)) {
148
			return "Orig. Source Type";
149
		} else if(enumType.equals(SpecimenOrObservationType.class)) {
150
			return "Spec./Obs. Type";
151
		}
152
		return "No Label";
153
	}
154

    
155
    private void populateTypes(Comparator<T> comparator){
156
        List<T> elementsForClass = new ArrayList<T>(getElementsForClass(enumType));
157
        if(comparator!=null){
158
            Collections.sort(elementsForClass, comparator);
159
        }
160
        // special hierarchical order for specimens
161
        if(enumType.equals(SpecimenOrObservationType.class)){
162
            LinkedHashMap<T, String> orderedTerms = AbstractUtility.orderTerms(elementsForClass);
163
            for(Entry<T, String> keyLabelPair : orderedTerms.entrySet()){
164
                elementTypeList.add(keyLabelPair.getKey());
165
                combo.add(keyLabelPair.getValue());
166
            }
167
        }
168
        // default order
169
        else{
170
            for(T enumElement : elementsForClass){
171
                elementTypeList.add(enumElement);
172
                combo.add(((Enum) enumElement).name());
173
            }
174
        }
175
	}
176

    
177
	@Override
178
    public void setSelection(T selection) {
179
		this.selection = selection;
180
		combo.select(elementTypeList.indexOf(selection));
181
	}
182
	/** {@inheritDoc} */
183
	@Override
184
    public void widgetSelected(SelectionEvent e) {
185
		selection = elementTypeList.get(combo.getSelectionIndex());
186
		firePropertyChangeEvent(new CdmPropertyChangeEvent(this, e));
187
	}
188

    
189
	private Collection<T> getElementsForClass(Class<T> clazz){
190
		CdmEnumDataHolder<T> dataHolder = getCdmEnumDataHolderForClass(clazz);
191
		if (dataHolder != null) {
192
			return dataHolder.getElements();
193
		}
194
		return null;
195
	}
196

    
197
	private CdmEnumDataHolder<T> getCdmEnumDataHolderForClass(Class<T> clazz){
198
		for (CdmEnumDataHolder dataHolder : cdmEnumDataHolders) {
199
			if (dataHolder.getClazz().equals(clazz)){
200
				return dataHolder;
201
			}
202
		}
203
		return null;
204
	}
205

    
206
	private interface CdmEnumDataHolder<T> {
207
		Class<T> getClazz();
208
		String getName();
209
		Collection<T> getElements();
210
	}
211
}
(3-3/9)