2 * Copyright (C) 2014 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.
9 package eu
.etaxonomy
.taxeditor
.ui
.mvc
.combo
;
11 import java
.util
.ArrayList
;
12 import java
.util
.Arrays
;
13 import java
.util
.Collection
;
14 import java
.util
.LinkedHashMap
;
15 import java
.util
.List
;
16 import java
.util
.Map
.Entry
;
18 import org
.eclipse
.swt
.events
.SelectionEvent
;
19 import org
.eclipse
.swt
.events
.SelectionListener
;
20 import org
.eclipse
.swt
.graphics
.Color
;
21 import org
.eclipse
.swt
.widgets
.Combo
;
22 import org
.eclipse
.swt
.widgets
.Composite
;
24 import eu
.etaxonomy
.cdm
.model
.name
.NomenclaturalCode
;
25 import eu
.etaxonomy
.cdm
.model
.occurrence
.SpecimenOrObservationType
;
26 import eu
.etaxonomy
.cdm
.model
.reference
.OriginalSourceType
;
27 import eu
.etaxonomy
.cdm
.model
.reference
.ReferenceType
;
28 import eu
.etaxonomy
.cdm
.model
.term
.IEnumTerm
;
29 import eu
.etaxonomy
.taxeditor
.model
.AbstractUtility
;
30 import eu
.etaxonomy
.taxeditor
.ui
.element
.AbstractRelevanceFormElement
;
31 import eu
.etaxonomy
.taxeditor
.ui
.element
.CdmFormFactory
;
32 import eu
.etaxonomy
.taxeditor
.ui
.element
.ICdmFormElement
;
33 import eu
.etaxonomy
.taxeditor
.ui
.element
.IEnableableFormElement
;
34 import eu
.etaxonomy
.taxeditor
.ui
.element
.ISelectable
;
35 import eu
.etaxonomy
.taxeditor
.ui
.mvc
.interfaces
.CdmCompositeController
;
41 public class EnumTermComboController
<T
extends IEnumTerm
<T
>>
42 extends AbstractRelevanceFormElement
43 implements SelectionListener
, IEnableableFormElement
, ISelectable
, CdmCompositeController
{
45 private static CdmEnumDataHolder
<?
>[] cdmEnumDataHolders
= {
46 new CdmEnumDataHolder
<NomenclaturalCode
>(){
49 public String
getName() {
50 return "Nomenclatural Code";
54 public Collection
<NomenclaturalCode
> getElements() {
55 Collection
<NomenclaturalCode
> result
= Arrays
.asList(NomenclaturalCode
.values());
56 result
.remove(NomenclaturalCode
.ICVCN
);
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 private static final int DEFAULT_VISIBLE_ITEMS
= 10;
125 protected T selection
;
127 protected List
<T
> elementTypeList
= new ArrayList
<T
>();
129 protected Combo combo
;
131 private final Class
<T
> enumType
;
134 * Constructor for AbstractEnumComboElement.
136 public EnumTermComboController(Combo combo
, CdmFormFactory formFactory
,
137 ICdmFormElement parentElement
, Class
<T
> enumType
, int style
) {
138 super(formFactory
, (Composite
)null);
139 this.enumType
= enumType
;
143 setVisibleItemCount(DEFAULT_VISIBLE_ITEMS
);
147 combo
.addSelectionListener(this);
153 private void populateTypes(){
154 Collection
<T
> elementsForClass
= getElementsForClass(enumType
);
155 // special hierarchical order for specimens
156 if(enumType
.equals(SpecimenOrObservationType
.class)){
157 LinkedHashMap
<T
, String
> orderedTerms
= AbstractUtility
.orderTerms(elementsForClass
);
158 for(Entry
<T
, String
> keyLabelPair
: orderedTerms
.entrySet()){
159 elementTypeList
.add(keyLabelPair
.getKey());
160 combo
.add(keyLabelPair
.getValue());
165 for(T enumElement
: getElementsForClass(enumType
)){
166 elementTypeList
.add(enumElement
);
167 combo
.add(((Enum
) enumElement
).name());
172 public void setSelection(T selection
) {
173 this.selection
= selection
;
174 combo
.select(elementTypeList
.indexOf(selection
));
177 public void addSelectionListener(SelectionListener listener
) {
178 combo
.addSelectionListener(listener
);
181 public void removeSelectionListener(SelectionListener listener
) {
182 combo
.removeSelectionListener(listener
);
186 public void setSelected(boolean selected
) {
187 setBackground(selected ? SELECTED
: getPersistentBackground());
190 public T
getSelection() {
195 public void setEnabled(boolean enabled
) {
196 combo
.setEnabled(enabled
);
200 public boolean isEnabled() {
201 return combo
.isEnabled();
205 public void widgetSelected(SelectionEvent e
) {
206 selection
= elementTypeList
.get(combo
.getSelectionIndex());
210 public void updateCacheRelevance() {
211 Color color
= cacheRelevance().getColor();
212 combo
.setBackground(color
);
216 public void setBackground(Color color
) {
217 // label.setBackground(color);
221 public void widgetDefaultSelected(SelectionEvent e
) {
224 public void setVisibleItemCount(int visibleItems
){
225 combo
.setVisibleItemCount(visibleItems
);
228 private Collection
<T
> getElementsForClass(Class
<T
> clazz
){
229 CdmEnumDataHolder
<T
> dataHolder
= getCdmEnumDataHolderForClass(clazz
);
230 if (dataHolder
!= null) {
231 return dataHolder
.getElements();
236 private CdmEnumDataHolder
<T
> getCdmEnumDataHolderForClass(Class
<T
> clazz
){
237 for (CdmEnumDataHolder
<?
> dataHolder
: cdmEnumDataHolders
) {
238 if (dataHolder
.getClazz().equals(clazz
)){
239 return (CdmEnumDataHolder
<T
>)dataHolder
;
245 private interface CdmEnumDataHolder
<T
> {
248 Collection
<T
> getElements();