Project

General

Profile

Download (9.31 KB) Statistics
| Branch: | Tag: | Revision:
1
/**
2
 * Copyright (C) 2014 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
package eu.etaxonomy.taxeditor.ui.mvc.combo;
10

    
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;
17

    
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;
23

    
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;
38

    
39
/**
40
 * @author pplitzner
41
 * @date 29.01.2014
42
 *
43
 */
44
public class EnumTermComboController<T extends IEnumTerm<T>> extends AbstractCdmFormElement implements SelectionListener,
45
IEnableableFormElement, ISelectable, CdmCompositeController {
46

    
47
    private static CdmEnumDataHolder[] cdmEnumDataHolders = {
48
        new CdmEnumDataHolder<NomenclaturalCode>(){
49

    
50
            @Override
51
            public String getName() {
52
                return "Nomenclatural Code";
53
            }
54

    
55
            @Override
56
            public Collection<NomenclaturalCode> getElements() {
57
                return  Arrays.asList(NomenclaturalCode.values());
58
            }
59

    
60
            @Override
61
            public Class<NomenclaturalCode> getClazz() {
62
                return NomenclaturalCode.class;
63
            }
64

    
65
        },
66
        new CdmEnumDataHolder<ReferenceType>(){
67

    
68
            @Override
69
            public String getName() {
70
                return "Reference Type";
71
            }
72

    
73
            @Override
74
            public Collection<ReferenceType> getElements() {
75
                return Arrays.asList(ReferenceType.values());
76
            }
77

    
78
            @Override
79
            public Class<ReferenceType> getClazz() {
80
                return ReferenceType.class;
81
            }
82

    
83
        },
84
        new CdmEnumDataHolder<SpecimenOrObservationType>(){
85

    
86
            @Override
87
            public String getName() {
88
                return "Specimen / Observation Type";
89
            }
90

    
91
            @Override
92
            public Collection<SpecimenOrObservationType> getElements() {
93
                return Arrays.asList(SpecimenOrObservationType.values());
94
            }
95

    
96
            @Override
97
            public Class<SpecimenOrObservationType> getClazz() {
98
                return SpecimenOrObservationType.class;
99
            }
100

    
101
        },
102
        new CdmEnumDataHolder<OriginalSourceType>(){
103

    
104
            @Override
105
            public String getName() {
106
                return "Original Source Type";
107
            }
108

    
109
            @Override
110
            public Collection<OriginalSourceType> getElements() {
111
                return Arrays.asList(OriginalSourceType.values());
112
            }
113

    
114
            @Override
115
            public Class<OriginalSourceType> getClazz() {
116
                return OriginalSourceType.class;
117
            }
118

    
119
        }
120

    
121
    };
122

    
123
    private static final int DEFAULT_VISIBLE_ITEMS = 10;
124

    
125
    protected T selection;
126

    
127
    protected List<T> elementTypeList = new ArrayList<T>();
128

    
129
    protected Combo combo;
130

    
131
    private final Class<T> enumType;
132

    
133
    /**
134
     * <p>
135
     * Constructor for AbstractEnumComboElement.
136
     * </p>
137
     *
138
     * @param formFactory
139
     *            a {@link eu.etaxonomy.taxeditor.ui.element.CdmFormFactory}
140
     *            object.
141
     * @param parentElement
142
     *            a {@link eu.etaxonomy.taxeditor.ui.element.ICdmFormElement}
143
     *            object.
144
     * @param labelString
145
     *            a {@link java.lang.String} object.
146
     * @param <T>
147
     *            a T object.
148
     */
149
    public EnumTermComboController(Combo combo, CdmFormFactory formFactory,
150
            ICdmFormElement parentElement, Class<T> enumType, int style) {
151
        super(formFactory, (Composite)null);
152
        this.enumType = enumType;
153
        // create combo
154
        this.combo = combo;
155
        addControl(combo);
156
        setVisibleItemCount(DEFAULT_VISIBLE_ITEMS);
157

    
158
        populateTypes();
159

    
160
        combo.addSelectionListener(this);
161

    
162
    }
163

    
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";
173
        }
174
        return "No Label";
175
    }
176

    
177
    /**
178
     * <p>
179
     * populateTypes
180
     * </p>
181
     */
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());
190
            }
191
        }
192
        // default order
193
        else{
194
            for(T enumElement : getElementsForClass(enumType)){
195
                elementTypeList.add(enumElement);
196
                combo.add(((Enum) enumElement).name());
197
            }
198
        }
199
    }
200

    
201
    /**
202
     * <p>
203
     * Setter for the field <code>selection</code>.
204
     * </p>
205
     *
206
     * @param selection
207
     *            the selection to set
208
     */
209
    public void setSelection(T selection) {
210
        this.selection = selection;
211
        combo.select(elementTypeList.indexOf(selection));
212
    }
213

    
214
    /**
215
     * <p>
216
     * addSelectionListener
217
     * </p>
218
     *
219
     * @param listener
220
     *            a {@link org.eclipse.swt.events.SelectionListener} object.
221
     */
222
    public void addSelectionListener(SelectionListener listener) {
223
        combo.addSelectionListener(listener);
224
    }
225

    
226
    /**
227
     * <p>
228
     * removeSelectionListener
229
     * </p>
230
     *
231
     * @param listener
232
     *            a {@link org.eclipse.swt.events.SelectionListener} object.
233
     */
234
    public void removeSelectionListener(SelectionListener listener) {
235
        combo.removeSelectionListener(listener);
236
    }
237

    
238
    /** {@inheritDoc} */
239
    @Override
240
    public void setSelected(boolean selected) {
241
        setBackground(selected ? SELECTED : getPersistentBackground());
242
    }
243

    
244
    /**
245
     * <p>
246
     * Getter for the field <code>selection</code>.
247
     * </p>
248
     *
249
     * @return the selection
250
     */
251
    public T getSelection() {
252
        return selection;
253
    }
254

    
255
    /** {@inheritDoc} */
256
    @Override
257
    public void setEnabled(boolean enabled) {
258
        combo.setEnabled(enabled);
259
    }
260

    
261
    /* (non-Javadoc)
262
     * @see eu.etaxonomy.taxeditor.ui.element.IEnableableFormElement#isEnabled()
263
     */
264
    @Override
265
    public boolean isEnabled() {
266
        return combo.isEnabled();
267
    }
268

    
269
    /*
270
     * (non-Javadoc)
271
     *
272
     * @see
273
     * org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt
274
     * .events.SelectionEvent)
275
     */
276
    /** {@inheritDoc} */
277
    @Override
278
    public void widgetSelected(SelectionEvent e) {
279
        selection = elementTypeList.get(combo.getSelectionIndex());
280
    }
281

    
282
    /** {@inheritDoc} */
283
    @Override
284
    public void setIrrelevant(boolean irrelevant) {
285
        String colorId = irrelevant ? Resources.COLOR_COMPOSITE_IRRELEVANT
286
                : Resources.COLOR_COMPOSITE_BACKGROUND;
287

    
288
        Color color = StoreUtil.getColor(colorId);
289
        combo.setBackground(color);
290
    }
291

    
292
    /** {@inheritDoc} */
293
    @Override
294
    public void setBackground(Color color) {
295
//        label.setBackground(color);
296
    }
297

    
298
    /** {@inheritDoc} */
299
    @Override
300
    public void widgetDefaultSelected(SelectionEvent e) {
301
    }
302

    
303
    public void setVisibleItemCount(int visibleItems){
304
        combo.setVisibleItemCount(visibleItems);
305
    }
306

    
307
    private Collection<T> getElementsForClass(Class<T> clazz){
308
        CdmEnumDataHolder<T> dataHolder = getCdmEnumDataHolderForClass(clazz);
309
        if (dataHolder != null) {
310
            return dataHolder.getElements();
311
        }
312
        return null;
313
    }
314

    
315
    private CdmEnumDataHolder<T> getCdmEnumDataHolderForClass(Class<T> clazz){
316
        for (CdmEnumDataHolder dataHolder : cdmEnumDataHolders) {
317
            if (dataHolder.getClazz().equals(clazz)){
318
                return dataHolder;
319
            }
320
        }
321
        return null;
322
    }
323

    
324
    private interface CdmEnumDataHolder<T> {
325
        Class<T> getClazz();
326
        String getName();
327
        Collection<T> getElements();
328
    }
329
}
(2-2/2)