2 * Copyright (C) 2007 EDIT
3 * European Distributed Institute of Taxonomy
4 * http://www.e-taxonomy.eu
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.
10 package eu
.etaxonomy
.taxeditor
.ui
.combo
;
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
;
21 import org
.eclipse
.swt
.events
.SelectionEvent
;
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
;
35 * @created Mar 16, 2010
38 public class EnumComboElement
<T
extends IEnumTerm
<T
>> extends
39 AbstractComboElement
<T
> {
42 public void setVisible(boolean b
){
47 private static CdmEnumDataHolder
[] cdmEnumDataHolders
= {
48 new CdmEnumDataHolder
<NomenclaturalCode
>(){
51 public String
getName() {
52 return "Nomenclatural Code";
56 public Collection
<NomenclaturalCode
> getElements() {
57 return Arrays
.asList(NomenclaturalCode
.values());
61 public Class
<NomenclaturalCode
> getClazz() {
62 return NomenclaturalCode
.class;
66 new CdmEnumDataHolder
<ReferenceType
>(){
69 public String
getName() {
70 return "Reference Type";
74 public Collection
<ReferenceType
> getElements() {
75 return Arrays
.asList(ReferenceType
.values());
79 public Class
<ReferenceType
> getClazz() {
80 return ReferenceType
.class;
84 new CdmEnumDataHolder
<SpecimenOrObservationType
>(){
87 public String
getName() {
88 return "Specimen / Observation Type";
92 public Collection
<SpecimenOrObservationType
> getElements() {
93 return Arrays
.asList(SpecimenOrObservationType
.values());
97 public Class
<SpecimenOrObservationType
> getClazz() {
98 return SpecimenOrObservationType
.class;
102 new CdmEnumDataHolder
<OriginalSourceType
>(){
105 public String
getName() {
106 return "Original Source Type";
110 public Collection
<OriginalSourceType
> getElements() {
111 return Arrays
.asList(OriginalSourceType
.values());
115 public Class
<OriginalSourceType
> getClazz() {
116 return OriginalSourceType
.class;
123 protected List
<T
> elementTypeList
= new ArrayList
<T
>();
125 private final Class
<T
> enumType
;
127 public EnumComboElement(CdmFormFactory formFactory
,
128 ICdmFormElement parentElement
, Class
<T
> enumType
, Comparator
<T
> comparator
, int style
) {
129 super(formFactory
, parentElement
);
130 this.enumType
= enumType
;
131 label
.setText(getDefaultLabelString());
133 populateTypes(comparator
);
135 combo
.addSelectionListener(this);
140 private String
getDefaultLabelString() {
141 if(enumType
.equals(ReferenceType
.class)){
142 return "Reference Type";
143 } else if (enumType
.equals(NomenclaturalCode
.class)){
144 return "Nomenclatural Code";
145 } else if(enumType
.equals(OriginalSourceType
.class)) {
146 return "Orig. Source Type";
147 } else if(enumType
.equals(SpecimenOrObservationType
.class)) {
148 return "Spec./Obs. Type";
153 private void populateTypes(Comparator
<T
> comparator
){
154 List
<T
> elementsForClass
= new ArrayList
<T
>(getElementsForClass(enumType
));
155 if(comparator
!=null){
156 Collections
.sort(elementsForClass
, comparator
);
158 // special hierarchical order for specimens
159 if(enumType
.equals(SpecimenOrObservationType
.class)){
160 LinkedHashMap
<T
, String
> orderedTerms
= AbstractUtility
.orderTerms(elementsForClass
);
161 for(Entry
<T
, String
> keyLabelPair
: orderedTerms
.entrySet()){
162 elementTypeList
.add(keyLabelPair
.getKey());
163 combo
.add(keyLabelPair
.getValue());
168 for(T enumElement
: elementsForClass
){
169 elementTypeList
.add(enumElement
);
170 combo
.add(((Enum
) enumElement
).name());
176 public void setSelection(T selection
) {
177 this.selection
= selection
;
178 combo
.select(elementTypeList
.indexOf(selection
));
182 public void widgetSelected(SelectionEvent e
) {
183 selection
= elementTypeList
.get(combo
.getSelectionIndex());
184 firePropertyChangeEvent(new CdmPropertyChangeEvent(this, e
));
187 private Collection
<T
> getElementsForClass(Class
<T
> clazz
){
188 CdmEnumDataHolder
<T
> dataHolder
= getCdmEnumDataHolderForClass(clazz
);
189 if (dataHolder
!= null) {
190 return dataHolder
.getElements();
195 private CdmEnumDataHolder
<T
> getCdmEnumDataHolderForClass(Class
<T
> clazz
){
196 for (CdmEnumDataHolder dataHolder
: cdmEnumDataHolders
) {
197 if (dataHolder
.getClazz().equals(clazz
)){
204 private interface CdmEnumDataHolder
<T
> {
207 Collection
<T
> getElements();