Project

General

Profile

Download (6.13 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.media.ExternalLinkType;
26
import eu.etaxonomy.cdm.model.name.NomenclaturalCode;
27
import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationType;
28
import eu.etaxonomy.cdm.model.reference.ReferenceType;
29
import eu.etaxonomy.taxeditor.model.AbstractUtility;
30
import eu.etaxonomy.taxeditor.ui.element.CdmFormFactory;
31
import eu.etaxonomy.taxeditor.ui.element.CdmPropertyChangeEvent;
32
import eu.etaxonomy.taxeditor.ui.element.ICdmFormElement;
33

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

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

    
46

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

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

    
55
			@Override
56
			public Collection<NomenclaturalCode> getElements() {
57
				Collection<NomenclaturalCode> result = new ArrayList<>(Arrays.asList(NomenclaturalCode.values()));
58
            	result.remove(NomenclaturalCode.ICVCN);
59
                return  result;
60

    
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
		new CdmEnumDataHolder<SpecimenOrObservationType>(){
88

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

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

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

    
104
		},
105
		new CdmEnumDataHolder<ExternalLinkType>(){
106

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

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

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

    
122
        },
123
		new CdmEnumDataHolder<OriginalSourceType>(){
124

    
125
			@Override
126
			public String getName() {
127
				return "Original Source Type";
128
			}
129

    
130
			@Override
131
			public Collection<OriginalSourceType> getElements() {
132
				return Arrays.asList(OriginalSourceType.values());
133
			}
134

    
135
			@Override
136
			public Class<OriginalSourceType> getClazz() {
137
				return OriginalSourceType.class;
138
			}
139

    
140
		}
141

    
142
	};
143

    
144
	protected List<T> elementTypeList = new ArrayList<>();
145

    
146
	private final Class<T> enumType;
147

    
148
	public EnumComboElement(CdmFormFactory formFactory,
149
			ICdmFormElement parentElement, Class<T> enumType, Comparator<T> comparator, int style) {
150
		super(formFactory, parentElement);
151
		this.enumType = enumType;
152
		label.setText(getDefaultLabelString());
153

    
154
		populateTypes(comparator);
155

    
156
		combo.addSelectionListener(this);
157
	}
158

    
159

    
160

    
161
	private String getDefaultLabelString() {
162
		if(enumType.equals(ReferenceType.class)){
163
			return "Reference Type";
164
		} else if (enumType.equals(NomenclaturalCode.class)){
165
			return "Nomenclatural Code";
166
		} else if(enumType.equals(OriginalSourceType.class)) {
167
			return "Orig. Source Type";
168
		} else if(enumType.equals(SpecimenOrObservationType.class)) {
169
			return "Spec./Obs. Type";
170
		}
171
		else if(enumType.equals(ExternalLinkType.class)) {
172
            return "Type";
173
        }
174
		return "No Label";
175
	}
176

    
177
    private void populateTypes(Comparator<T> comparator){
178
        List<T> elementsForClass = new ArrayList<T>(getElementsForClass(enumType));
179
        if(comparator!=null){
180
            Collections.sort(elementsForClass, comparator);
181
        }
182
        // special hierarchical order for specimens
183
        if(enumType.equals(SpecimenOrObservationType.class)){
184
            LinkedHashMap<T, String> orderedTerms = AbstractUtility.orderTerms(elementsForClass);
185
            for(Entry<T, String> keyLabelPair : orderedTerms.entrySet()){
186
                elementTypeList.add(keyLabelPair.getKey());
187
                combo.add(keyLabelPair.getValue());
188
            }
189
        }
190
        // default order
191
        else{
192
            for(T enumElement : elementsForClass){
193
                elementTypeList.add(enumElement);
194
                combo.add(((Enum) enumElement).name());
195
            }
196
        }
197
	}
198

    
199
	@Override
200
    public void setSelection(T selection) {
201
		this.selection = selection;
202
		combo.select(elementTypeList.indexOf(selection));
203
	}
204
	/** {@inheritDoc} */
205
	@Override
206
    public void widgetSelected(SelectionEvent e) {
207
		selection = elementTypeList.get(combo.getSelectionIndex());
208
		firePropertyChangeEvent(new CdmPropertyChangeEvent(this, e));
209
	}
210

    
211
	private Collection<T> getElementsForClass(Class<T> clazz){
212
		CdmEnumDataHolder<T> dataHolder = getCdmEnumDataHolderForClass(clazz);
213
		if (dataHolder != null) {
214
			return dataHolder.getElements();
215
		}
216
		return null;
217
	}
218

    
219
	private CdmEnumDataHolder<T> getCdmEnumDataHolderForClass(Class<T> clazz){
220
		for (CdmEnumDataHolder dataHolder : cdmEnumDataHolders) {
221
			if (dataHolder.getClazz().equals(clazz)){
222
				return dataHolder;
223
			}
224
		}
225
		return null;
226
	}
227

    
228
	private interface CdmEnumDataHolder<T> {
229
		Class<T> getClazz();
230
		String getName();
231
		Collection<T> getElements();
232
	}
233
}
(3-3/11)