Project

General

Profile

Download (8.61 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
import org.eclipse.ui.forms.widgets.TableWrapData;
23

    
24
import eu.etaxonomy.cdm.model.media.ExternalLinkType;
25
import eu.etaxonomy.cdm.model.name.NameRelationship;
26
import eu.etaxonomy.cdm.model.name.NomenclaturalCode;
27
import eu.etaxonomy.cdm.model.name.NomenclaturalCodeEdition;
28
import eu.etaxonomy.cdm.model.name.TaxonName;
29
import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationType;
30
import eu.etaxonomy.cdm.model.reference.OriginalSourceType;
31
import eu.etaxonomy.cdm.model.term.IEnumTerm;
32
import eu.etaxonomy.taxeditor.model.AbstractUtility;
33
import eu.etaxonomy.taxeditor.ui.element.CdmFormFactory;
34
import eu.etaxonomy.taxeditor.ui.element.CdmPropertyChangeEvent;
35
import eu.etaxonomy.taxeditor.ui.element.ICdmFormElement;
36
import eu.etaxonomy.taxeditor.ui.section.name.NameRelationshipDetailElement;
37
import eu.etaxonomy.taxeditor.ui.section.name.NomenclaturalStatusElement;
38
import eu.etaxonomy.taxeditor.ui.section.name.NomenclaturalStatusSection;
39

    
40
/**
41
 * @author n.hoffmann
42
 * @created Mar 16, 2010
43
 */
44
public class EnumComboElement<T extends IEnumTerm<T>> extends
45
		AbstractComboElement<T>  {
46

    
47
	//TODO RL
48
	public void setVisible(boolean b){
49
		combo.setVisible(b);
50
	}
51

    
52

    
53
	 private  static  CdmEnumDataHolder[] cdmEnumDataHolders = {
54
		new CdmEnumDataHolder<NomenclaturalCode>(){
55

    
56
			@Override
57
			public String getName() {
58
				return "Nomenclatural Code";
59
			}
60

    
61
			@Override
62
			public Collection<NomenclaturalCode> getElements() {
63
				Collection<NomenclaturalCode> result = new ArrayList<>(Arrays.asList(NomenclaturalCode.values()));
64
            	result.remove(NomenclaturalCode.ICVCN);
65
                return  result;
66

    
67
			}
68

    
69
			@Override
70
			public Class<NomenclaturalCode> getClazz() {
71
				return NomenclaturalCode.class;
72
			}
73

    
74
		},
75
		new CdmEnumDataHolder<ReferenceType>(){
76

    
77
			@Override
78
			public String getName() {
79
				return "Reference Type";
80
			}
81

    
82
			@Override
83
			public Collection<ReferenceType> getElements() {
84
				return Arrays.asList(ReferenceType.values());
85
			}
86

    
87
			@Override
88
			public Class<ReferenceType> getClazz() {
89
				return ReferenceType.class;
90
			}
91

    
92
		},
93
		new CdmEnumDataHolder<SpecimenOrObservationType>(){
94

    
95
			@Override
96
			public String getName() {
97
				return "Specimen / Observation Type";
98
			}
99

    
100
			@Override
101
			public Collection<SpecimenOrObservationType> getElements() {
102
				return Arrays.asList(SpecimenOrObservationType.values());
103
			}
104

    
105
			@Override
106
			public Class<SpecimenOrObservationType> getClazz() {
107
				return SpecimenOrObservationType.class;
108
			}
109

    
110
		},
111
		new CdmEnumDataHolder<ExternalLinkType>(){
112

    
113
            @Override
114
            public String getName() {
115
                return "Type";
116
            }
117

    
118
            @Override
119
            public Collection<ExternalLinkType> getElements() {
120
                return Arrays.asList(ExternalLinkType.values());
121
            }
122

    
123
            @Override
124
            public Class<ExternalLinkType> getClazz() {
125
                return ExternalLinkType.class;
126
            }
127

    
128
        },
129
		new CdmEnumDataHolder<OriginalSourceType>(){
130

    
131
			@Override
132
			public String getName() {
133
				return "Original Source Type";
134
			}
135

    
136
			@Override
137
			public Collection<OriginalSourceType> getElements() {
138
				return Arrays.asList(OriginalSourceType.values());
139
			}
140

    
141
			@Override
142
			public Class<OriginalSourceType> getClazz() {
143
				return OriginalSourceType.class;
144
			}
145

    
146
		},
147
        new CdmEnumDataHolder<NomenclaturalCodeEdition>(){
148

    
149
            @Override
150
            public String getName() {
151
                return "Nomenclatural Code Edition";
152
            }
153

    
154
            @Override
155
            public Collection<NomenclaturalCodeEdition> getElements() {
156
                return Arrays.asList(NomenclaturalCodeEdition.values());
157
            }
158

    
159
            @Override
160
            public Class<NomenclaturalCodeEdition> getClazz() {
161
                return NomenclaturalCodeEdition.class;
162
            }
163

    
164
        }
165

    
166
	};
167

    
168
	protected List<T> elementTypeList = new ArrayList<>();
169

    
170
	private final Class<T> enumType;
171

    
172
	public EnumComboElement(CdmFormFactory formFactory,
173
			ICdmFormElement parentElement, Class<T> enumType, Comparator<T> comparator, int style) {
174
		super(formFactory, parentElement);
175
		this.enumType = enumType;
176
		label.setText(getDefaultLabelString());
177
		populateTypes(comparator);
178
		combo.addSelectionListener(this);
179
	}
180

    
181
	public void setIndent(int indent) {
182
    	TableWrapData layoutData = new TableWrapData();
183
        layoutData.indent = indent;
184
        label.setLayoutData(layoutData);
185

    
186
        getLayoutComposite().layout();
187
	}
188

    
189

    
190
	private String getDefaultLabelString() {
191
		if(enumType.equals(ReferenceType.class)){
192
			return "Reference Type";
193
		} else if (enumType.equals(NomenclaturalCode.class)){
194
			return "Nomenclatural Code";
195
		} else if(enumType.equals(OriginalSourceType.class)) {
196
			return "Orig. Source Type";
197
		} else if(enumType.equals(SpecimenOrObservationType.class)) {
198
			return "Spec./Obs. Type";
199
		} else if(enumType.equals(ExternalLinkType.class)) {
200
            return "Type";
201
        } else if(enumType.equals(NomenclaturalCodeEdition.class)) {
202
            return "Code Edition";
203
        }
204
		return "No Label";
205
	}
206

    
207
    private void populateTypes(Comparator<T> comparator){
208
        List<T> elementsForClass = new ArrayList<T>(getElementsForClass(enumType));
209
        if(comparator!=null){
210
            Collections.sort(elementsForClass, comparator);
211
        }
212
        // special hierarchical order for specimens
213
        if(enumType.equals(SpecimenOrObservationType.class)){
214
            LinkedHashMap<T, String> orderedTerms = AbstractUtility.orderTerms(elementsForClass);
215
            for(Entry<T, String> keyLabelPair : orderedTerms.entrySet()){
216
                elementTypeList.add(keyLabelPair.getKey());
217
                combo.add(keyLabelPair.getValue());
218
            }
219
        }else if(enumType.equals(NomenclaturalCodeEdition.class)){
220
            NomenclaturalCode code = null;
221

    
222
            ICdmFormElement parentElement = getParentElement();
223
            if (parentElement instanceof NameRelationshipDetailElement){
224
                NameRelationship rel = ((NameRelationshipDetailElement)parentElement).getEntity();
225
                code = rel.getToName().getNomenclaturalCode();
226
            }else if (parentElement instanceof NomenclaturalStatusElement){
227
                ICdmFormElement parent = ((NomenclaturalStatusElement)parentElement).getParentElement();
228
                TaxonName name = ((NomenclaturalStatusSection)parent).getEntity();
229
                code = name.getNomenclaturalCode();
230
            }
231
            List<NomenclaturalCodeEdition> elements = NomenclaturalCodeEdition.forCode(code);
232
            LinkedHashMap<NomenclaturalCodeEdition, String> orderedTerms = AbstractUtility.orderTerms(elements);
233
            for (NomenclaturalCodeEdition codeEdition: elements){
234
                    elementTypeList.add((T)codeEdition);
235
                    combo.add(codeEdition.getMessage());
236
            }
237
        }
238
        // default order
239
        else{
240
            for(T enumElement : elementsForClass){
241
                elementTypeList.add(enumElement);
242
                if (enumElement instanceof IEnumTerm)  {
243
                    combo.add(((IEnumTerm) enumElement).getMessage());
244
                }else{
245
                    combo.add(((Enum) enumElement).name());
246
                }
247
            }
248
        }
249
	}
250

    
251
	@Override
252
    public void setSelection(T selection) {
253
		this.selection = selection;
254
		combo.select(elementTypeList.indexOf(selection));
255
	}
256
	/** {@inheritDoc} */
257
	@Override
258
    public void widgetSelected(SelectionEvent e) {
259
		selection = elementTypeList.get(combo.getSelectionIndex());
260
		firePropertyChangeEvent(new CdmPropertyChangeEvent(this, e));
261
	}
262

    
263
	private Collection<T> getElementsForClass(Class<T> clazz){
264
		CdmEnumDataHolder<T> dataHolder = getCdmEnumDataHolderForClass(clazz);
265
		if (dataHolder != null) {
266
			return dataHolder.getElements();
267
		}
268
		return null;
269
	}
270

    
271
	private CdmEnumDataHolder<T> getCdmEnumDataHolderForClass(Class<T> clazz){
272
		for (CdmEnumDataHolder dataHolder : cdmEnumDataHolders) {
273
			if (dataHolder.getClazz().equals(clazz)){
274
				return dataHolder;
275
			}
276
		}
277
		return null;
278
	}
279

    
280
	private interface CdmEnumDataHolder<T> {
281
		Class<T> getClazz();
282
		String getName();
283
		Collection<T> getElements();
284
	}
285
}
(3-3/7)