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
.common
.IEnumTerm
;
25 import eu
.etaxonomy
.cdm
.model
.common
.OriginalSourceType
;
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
.preference
.Resources
;
31 import eu
.etaxonomy
.taxeditor
.store
.StoreUtil
;
32 import eu
.etaxonomy
.taxeditor
.ui
.element
.AbstractCdmFormElement
;
33 import eu
.etaxonomy
.taxeditor
.ui
.element
.CdmFormFactory
;
34 import eu
.etaxonomy
.taxeditor
.ui
.element
.ICdmFormElement
;
35 import eu
.etaxonomy
.taxeditor
.ui
.element
.IEnableableFormElement
;
36 import eu
.etaxonomy
.taxeditor
.ui
.element
.ISelectable
;
37 import eu
.etaxonomy
.taxeditor
.ui
.mvc
.interfaces
.CdmCompositeController
;
44 public class EnumTermComboController
<T
extends IEnumTerm
<T
>> extends AbstractCdmFormElement
implements SelectionListener
,
45 IEnableableFormElement
, ISelectable
, CdmCompositeController
{
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 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
;
135 * Constructor for AbstractEnumComboElement.
139 * a {@link eu.etaxonomy.taxeditor.ui.element.CdmFormFactory}
141 * @param parentElement
142 * a {@link eu.etaxonomy.taxeditor.ui.element.ICdmFormElement}
145 * a {@link java.lang.String} object.
149 public EnumTermComboController(Combo combo
, CdmFormFactory formFactory
,
150 ICdmFormElement parentElement
, Class
<T
> enumType
, int style
) {
151 super(formFactory
, (Composite
)null);
152 this.enumType
= enumType
;
156 setVisibleItemCount(DEFAULT_VISIBLE_ITEMS
);
160 combo
.addSelectionListener(this);
164 private String
getDefaultLabelString() {
165 if(enumType
.equals(ReferenceType
.class)){
166 return "Reference Type";
167 } else if (enumType
.equals(NomenclaturalCode
.class)){
168 return "Nomenclatural Code";
169 } else if(enumType
.equals(OriginalSourceType
.class)) {
170 return "Orig. Source Type";
171 } else if(enumType
.equals(SpecimenOrObservationType
.class)) {
172 return "Spec./Obs. Type";
182 private void populateTypes(){
183 Collection
<T
> elementsForClass
= getElementsForClass(enumType
);
184 // special hierarchical order for specimens
185 if(enumType
.equals(SpecimenOrObservationType
.class)){
186 LinkedHashMap
<T
, String
> orderedTerms
= AbstractUtility
.orderTerms(elementsForClass
);
187 for(Entry
<T
, String
> keyLabelPair
: orderedTerms
.entrySet()){
188 elementTypeList
.add(keyLabelPair
.getKey());
189 combo
.add(keyLabelPair
.getValue());
194 for(T enumElement
: getElementsForClass(enumType
)){
195 elementTypeList
.add(enumElement
);
196 combo
.add(((Enum
) enumElement
).name());
203 * Setter for the field <code>selection</code>.
207 * the selection to set
209 public void setSelection(T selection
) {
210 this.selection
= selection
;
211 combo
.select(elementTypeList
.indexOf(selection
));
216 * addSelectionListener
220 * a {@link org.eclipse.swt.events.SelectionListener} object.
222 public void addSelectionListener(SelectionListener listener
) {
223 combo
.addSelectionListener(listener
);
228 * removeSelectionListener
232 * a {@link org.eclipse.swt.events.SelectionListener} object.
234 public void removeSelectionListener(SelectionListener listener
) {
235 combo
.removeSelectionListener(listener
);
240 public void setSelected(boolean selected
) {
241 setBackground(selected ? SELECTED
: getPersistentBackground());
246 * Getter for the field <code>selection</code>.
249 * @return the selection
251 public T
getSelection() {
257 public void setEnabled(boolean enabled
) {
258 combo
.setEnabled(enabled
);
262 * @see eu.etaxonomy.taxeditor.ui.element.IEnableableFormElement#isEnabled()
265 public boolean isEnabled() {
266 return combo
.isEnabled();
273 * org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt
274 * .events.SelectionEvent)
278 public void widgetSelected(SelectionEvent e
) {
279 selection
= elementTypeList
.get(combo
.getSelectionIndex());
284 public void setIrrelevant(boolean irrelevant
) {
285 String colorId
= irrelevant ? Resources
.COLOR_COMPOSITE_IRRELEVANT
286 : Resources
.COLOR_COMPOSITE_BACKGROUND
;
288 Color color
= StoreUtil
.getColor(colorId
);
289 combo
.setBackground(color
);
294 public void setBackground(Color color
) {
295 // label.setBackground(color);
300 public void widgetDefaultSelected(SelectionEvent e
) {
303 public void setVisibleItemCount(int visibleItems
){
304 combo
.setVisibleItemCount(visibleItems
);
307 private Collection
<T
> getElementsForClass(Class
<T
> clazz
){
308 CdmEnumDataHolder
<T
> dataHolder
= getCdmEnumDataHolderForClass(clazz
);
309 if (dataHolder
!= null) {
310 return dataHolder
.getElements();
315 private CdmEnumDataHolder
<T
> getCdmEnumDataHolderForClass(Class
<T
> clazz
){
316 for (CdmEnumDataHolder dataHolder
: cdmEnumDataHolders
) {
317 if (dataHolder
.getClazz().equals(clazz
)){
324 private interface CdmEnumDataHolder
<T
> {
327 Collection
<T
> getElements();