Project

General

Profile

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

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

    
44
/**
45
 * @author n.hoffmann
46
 * @created Mar 16, 2010
47
 */
48
public class EnumComboElement<T extends IEnumTerm<T>> extends
49
		AbstractComboElement<T>  {
50

    
51
	//TODO RL
52
	public void setVisible(boolean b){
53
		combo.setVisible(b);
54
	}
55

    
56

    
57
	 private  static  CdmEnumDataHolder[] cdmEnumDataHolders = {
58
		new CdmEnumDataHolder<NomenclaturalCode>(){
59

    
60
			@Override
61
			public String getName() {
62
				return "Nomenclatural Code";
63
			}
64

    
65
			@Override
66
			public Collection<NomenclaturalCode> getElements() {
67
				Collection<NomenclaturalCode> result = new ArrayList<>(Arrays.asList(NomenclaturalCode.values()));
68
            	result.remove(NomenclaturalCode.ICVCN);
69
                return  result;
70
			}
71

    
72
			@Override
73
			public Class<NomenclaturalCode> getClazz() {
74
				return NomenclaturalCode.class;
75
			}
76
		},
77
		new CdmEnumDataHolder<ReferenceType>(){
78

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

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

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

    
94
		},
95
		new CdmEnumDataHolder<SpecimenOrObservationType>(){
96

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

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

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

    
112
		},
113
		new CdmEnumDataHolder<ExternalLinkType>(){
114

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

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

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

    
130
        },
131
		new CdmEnumDataHolder<OriginalSourceType>(){
132

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

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

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

    
148
		},
149
        new CdmEnumDataHolder<NomenclaturalCodeEdition>(){
150

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

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

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

    
166
        },
167
		new CdmEnumDataHolder<TaxonNodeStatus>(){
168

    
169
            @Override
170
            public String getName() {
171
                return "Taxon Node Status";
172
            }
173

    
174
            @Override
175
            public Collection<TaxonNodeStatus> getElements() {
176
                return Arrays.asList(TaxonNodeStatus.values());
177
            }
178

    
179
            @Override
180
            public Class<TaxonNodeStatus> getClazz() {
181
                return TaxonNodeStatus.class;
182
            }
183

    
184
        }
185

    
186
	};
187

    
188
	protected List<T> elementTypeList = new ArrayList<>();
189

    
190
	private final Class<T> enumType;
191

    
192
	public EnumComboElement(CdmFormFactory formFactory,
193
			ICdmFormElement parentElement, Class<T> enumType, Comparator<T> comparator, int style, boolean hasNullValue) {
194
		super(formFactory, parentElement, hasNullValue);
195
		this.enumType = enumType;
196
		label.setText(getDefaultLabelString());
197
		populateTypes(comparator);
198
		combo.addSelectionListener(this);
199
		addContentProposalAdapter();
200
	}
201

    
202
	public void setIndent(int indent) {
203
    	TableWrapData layoutData = new TableWrapData();
204
        layoutData.indent = indent;
205
        label.setLayoutData(layoutData);
206

    
207
        getLayoutComposite().layout();
208
	}
209

    
210
	public Combo getCombo(){
211
	    return combo;
212
	}
213

    
214

    
215
	private String getDefaultLabelString() {
216
		if(enumType.equals(ReferenceType.class)){
217
			return "Reference Type";
218
		} else if (enumType.equals(NomenclaturalCode.class)){
219
			return "Nomenclatural Code";
220
		} else if(enumType.equals(OriginalSourceType.class)) {
221
			return "Orig. Source Type";
222
		} else if(enumType.equals(SpecimenOrObservationType.class)) {
223
			return "Spec./Obs. Type";
224
		} else if(enumType.equals(ExternalLinkType.class)) {
225
            return "Type";
226
        } else if(enumType.equals(NomenclaturalCodeEdition.class)) {
227
            return "Code Edition";
228
        }else if(enumType.equals(TaxonNodeStatus.class)) {
229
            return Messages.EnumCombo_Placement_status;
230
        }
231
		return "No Label";
232
	}
233

    
234
    private void populateTypes(Comparator<T> comparator){
235
        List<T> elementsForClass = new ArrayList<T>(getElementsForClass(enumType));
236
        if(comparator!=null){
237
            Collections.sort(elementsForClass, comparator);
238
        }
239
        int index = 0;
240
        if (hasNullValue){
241
            combo.add("", index);
242
            index++;
243
        }
244
        // special hierarchical order for specimens
245
        if(enumType.equals(SpecimenOrObservationType.class)){
246
            LinkedHashMap<T, String> orderedTerms = AbstractUtility.orderTerms(elementsForClass);
247
            for(Entry<T, String> keyLabelPair : orderedTerms.entrySet()){
248
                elementTypeList.add(keyLabelPair.getKey());
249
                combo.add(keyLabelPair.getValue(), index);
250
                index++;
251
            }
252
        }else if(enumType.equals(NomenclaturalCodeEdition.class)){
253
            NomenclaturalCode code = null;
254

    
255
            ICdmFormElement parentElement = getParentElement();
256
            if (parentElement instanceof NameRelationshipDetailElement){
257
                NameRelationship rel = ((NameRelationshipDetailElement)parentElement).getEntity();
258
                code = rel.getToName().getNameType();
259
            }else if (parentElement instanceof NomenclaturalStatusElement){
260
                ICdmFormElement parent = ((NomenclaturalStatusElement)parentElement).getParentElement();
261
                TaxonName name = ((NomenclaturalStatusSection)parent).getEntity();
262
                code = name.getNameType();
263
            }
264
            List<NomenclaturalCodeEdition> elements = NomenclaturalCodeEdition.forCode(code);
265
            LinkedHashMap<NomenclaturalCodeEdition, String> orderedTerms = AbstractUtility.orderTerms(elements);
266
            for (NomenclaturalCodeEdition codeEdition: elements){
267
                    elementTypeList.add((T)codeEdition);
268
                    combo.add(codeEdition.getLabel(), index);
269
                    index++;
270
            }
271
        }
272
        // default order
273
        else{
274
            for(T enumElement : elementsForClass){
275
                elementTypeList.add(enumElement);
276
                if (enumElement instanceof IEnumTerm)  {
277
                    combo.add(((IEnumTerm) enumElement).getLabel(), index);
278
                    index++;
279
                }else{
280
                    combo.add(((Enum) enumElement).name(), index);
281
                    index++;
282
                }
283
            }
284
        }
285
	}
286

    
287
	@Override
288
    public void setSelection(T selection) {
289
		this.selection = selection;
290
		int index = elementTypeList.indexOf(selection);
291
		if (hasNullValue && selection != null){
292
		    index++;
293
		}
294
		combo.select(index);
295
	}
296
	/** {@inheritDoc} */
297
	@Override
298
    public void widgetSelected(SelectionEvent e) {
299

    
300
        int index = combo.getSelectionIndex();
301
        if (index == -2){
302
            return;
303
        }
304
        if (hasNullValue ){
305
            index--;
306
        }
307
        if (index<0){
308
            selection = null;
309
        }else{
310
            selection = elementTypeList.get(index);
311
        }
312

    
313
		firePropertyChangeEvent(new CdmPropertyChangeEvent(this, e));
314
	}
315

    
316
	private Collection<T> getElementsForClass(Class<T> clazz){
317
		CdmEnumDataHolder<T> dataHolder = getCdmEnumDataHolderForClass(clazz);
318
		if (dataHolder != null) {
319
			return dataHolder.getElements();
320
		}
321
		return null;
322
	}
323

    
324
	private CdmEnumDataHolder<T> getCdmEnumDataHolderForClass(Class<T> clazz){
325
		for (CdmEnumDataHolder dataHolder : cdmEnumDataHolders) {
326
			if (dataHolder.getClazz().equals(clazz)){
327
				return dataHolder;
328
			}
329
		}
330
		return null;
331
	}
332

    
333
	private interface CdmEnumDataHolder<T> {
334
		Class<T> getClazz();
335
		String getName();
336
		Collection<T> getElements();
337
	}
338

    
339

    
340
}
(3-3/8)