-// $Id$
/**
* Copyright (C) 2007 EDIT
- * European Distributed Institute of Taxonomy
+ * European Distributed Institute of Taxonomy
* http://www.e-taxonomy.eu
- *
+ *
* The contents of this file are subject to the Mozilla Public License Version 1.1
* See LICENSE.TXT at the top of this package for the full license terms.
*/
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.LinkedHashMap;
import java.util.List;
+import java.util.Map.Entry;
-import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.widgets.Combo;
-import org.eclipse.swt.widgets.Label;
-import eu.etaxonomy.cdm.model.common.IDefinedTerm;
+import eu.etaxonomy.cdm.model.term.IEnumTerm;
+import eu.etaxonomy.cdm.model.common.OriginalSourceType;
+import eu.etaxonomy.cdm.model.media.ExternalLinkType;
import eu.etaxonomy.cdm.model.name.NomenclaturalCode;
+import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationType;
import eu.etaxonomy.cdm.model.reference.ReferenceType;
-import eu.etaxonomy.taxeditor.preference.Resources;
-import eu.etaxonomy.taxeditor.store.StoreUtil;
-import eu.etaxonomy.taxeditor.ui.forms.AbstractCdmFormElement;
-import eu.etaxonomy.taxeditor.ui.forms.CdmFormFactory;
-import eu.etaxonomy.taxeditor.ui.forms.CdmPropertyChangeEvent;
-import eu.etaxonomy.taxeditor.ui.forms.ICdmFormElement;
-import eu.etaxonomy.taxeditor.ui.forms.IEnableableFormElement;
-import eu.etaxonomy.taxeditor.ui.forms.ISelectable;
+import eu.etaxonomy.taxeditor.model.AbstractUtility;
+import eu.etaxonomy.taxeditor.ui.element.CdmFormFactory;
+import eu.etaxonomy.taxeditor.ui.element.CdmPropertyChangeEvent;
+import eu.etaxonomy.taxeditor.ui.element.ICdmFormElement;
/**
- * <p>
- * Abstract AbstractEnumComboElement class.
- * </p>
- *
* @author n.hoffmann
* @created Mar 16, 2010
- * @version 1.0
*/
-public class EnumComboElement<T extends IDefinedTerm> extends
- AbstractCdmFormElement implements SelectionListener,
- IEnableableFormElement, ISelectable {
+public class EnumComboElement<T extends IEnumTerm<T>> extends
+ AbstractComboElement<T> {
- private static CdmEnumDataHolder[] cdmEnumDataHolders = {
+ //TODO RL
+ public void setVisible(boolean b){
+ combo.setVisible(b);
+ }
+
+
+ private static CdmEnumDataHolder[] cdmEnumDataHolders = {
new CdmEnumDataHolder<NomenclaturalCode>(){
-
+
@Override
public String getName() {
return "Nomenclatural Code";
@Override
public Collection<NomenclaturalCode> getElements() {
- return Arrays.asList(NomenclaturalCode.values());
+ Collection<NomenclaturalCode> result = new ArrayList<>(Arrays.asList(NomenclaturalCode.values()));
+ result.remove(NomenclaturalCode.ICVCN);
+ return result;
+
}
@Override
public Class<NomenclaturalCode> getClazz() {
return NomenclaturalCode.class;
}
-
+
},
new CdmEnumDataHolder<ReferenceType>(){
public Class<ReferenceType> getClazz() {
return ReferenceType.class;
}
-
+
+ },
+ new CdmEnumDataHolder<SpecimenOrObservationType>(){
+
+ @Override
+ public String getName() {
+ return "Specimen / Observation Type";
+ }
+
+ @Override
+ public Collection<SpecimenOrObservationType> getElements() {
+ return Arrays.asList(SpecimenOrObservationType.values());
+ }
+
+ @Override
+ public Class<SpecimenOrObservationType> getClazz() {
+ return SpecimenOrObservationType.class;
+ }
+
+ },
+ new CdmEnumDataHolder<ExternalLinkType>(){
+
+ @Override
+ public String getName() {
+ return "Type";
+ }
+
+ @Override
+ public Collection<ExternalLinkType> getElements() {
+ return Arrays.asList(ExternalLinkType.values());
+ }
+
+ @Override
+ public Class<ExternalLinkType> getClazz() {
+ return ExternalLinkType.class;
+ }
+
+ },
+ new CdmEnumDataHolder<OriginalSourceType>(){
+
+ @Override
+ public String getName() {
+ return "Original Source Type";
+ }
+
+ @Override
+ public Collection<OriginalSourceType> getElements() {
+ return Arrays.asList(OriginalSourceType.values());
+ }
+
+ @Override
+ public Class<OriginalSourceType> getClazz() {
+ return OriginalSourceType.class;
+ }
+
}
+
};
-
- private static final int DEFAULT_VISIBLE_ITEMS = 10;
-
- protected T selection;
-
- protected List<T> elementTypeList = new ArrayList<T>();
-
- private Label label;
- protected Combo combo;
-
- private Class<T> enumType;
-
- /**
- * <p>
- * Constructor for AbstractEnumComboElement.
- * </p>
- *
- * @param formFactory
- * a {@link eu.etaxonomy.taxeditor.ui.forms.CdmFormFactory}
- * object.
- * @param parentElement
- * a {@link eu.etaxonomy.taxeditor.ui.forms.ICdmFormElement}
- * object.
- * @param labelString
- * a {@link java.lang.String} object.
- * @param <T>
- * a T object.
- */
+
+ protected List<T> elementTypeList = new ArrayList<>();
+
+ private final Class<T> enumType;
+
public EnumComboElement(CdmFormFactory formFactory,
- ICdmFormElement parentElement, Class<T> enumType, int style) {
+ ICdmFormElement parentElement, Class<T> enumType, Comparator<T> comparator, int style) {
super(formFactory, parentElement);
this.enumType = enumType;
- label = formFactory.createLabel(getLayoutComposite(), getDefaultLabelString());
- addControl(label);
+ label.setText(getDefaultLabelString());
- // create combo
- combo = new Combo(getLayoutComposite(), SWT.BORDER | SWT.READ_ONLY);
- addControl(combo);
- combo.setLayoutData(CdmFormFactory.FILL_HORIZONTALLY());
- setVisibleItemCount(DEFAULT_VISIBLE_ITEMS);
-
- populateTypes();
+ populateTypes(comparator);
combo.addSelectionListener(this);
}
+
+
private String getDefaultLabelString() {
if(enumType.equals(ReferenceType.class)){
return "Reference Type";
- }else if (enumType.equals(NomenclaturalCode.class)){
+ } else if (enumType.equals(NomenclaturalCode.class)){
return "Nomenclatural Code";
+ } else if(enumType.equals(OriginalSourceType.class)) {
+ return "Orig. Source Type";
+ } else if(enumType.equals(SpecimenOrObservationType.class)) {
+ return "Spec./Obs. Type";
}
+ else if(enumType.equals(ExternalLinkType.class)) {
+ return "Type";
+ }
return "No Label";
}
- /**
- * <p>
- * populateTypes
- * </p>
- */
- private void populateTypes(){
- for(T enumElement : getElementsForClass(enumType)){
- elementTypeList.add(enumElement);
- combo.add(((Enum) enumElement).name());
- }
+ private void populateTypes(Comparator<T> comparator){
+ List<T> elementsForClass = new ArrayList<T>(getElementsForClass(enumType));
+ if(comparator!=null){
+ Collections.sort(elementsForClass, comparator);
+ }
+ // special hierarchical order for specimens
+ if(enumType.equals(SpecimenOrObservationType.class)){
+ LinkedHashMap<T, String> orderedTerms = AbstractUtility.orderTerms(elementsForClass);
+ for(Entry<T, String> keyLabelPair : orderedTerms.entrySet()){
+ elementTypeList.add(keyLabelPair.getKey());
+ combo.add(keyLabelPair.getValue());
+ }
+ }
+ // default order
+ else{
+ for(T enumElement : elementsForClass){
+ elementTypeList.add(enumElement);
+ combo.add(((Enum) enumElement).name());
+ }
+ }
}
- /**
- * <p>
- * Setter for the field <code>selection</code>.
- * </p>
- *
- * @param selection
- * the selection to set
- */
- public void setSelection(T selection) {
+ @Override
+ public void setSelection(T selection) {
this.selection = selection;
combo.select(elementTypeList.indexOf(selection));
}
-
- /**
- * <p>
- * addSelectionListener
- * </p>
- *
- * @param listener
- * a {@link org.eclipse.swt.events.SelectionListener} object.
- */
- public void addSelectionListener(SelectionListener listener) {
- combo.addSelectionListener(listener);
- }
-
- /**
- * <p>
- * removeSelectionListener
- * </p>
- *
- * @param listener
- * a {@link org.eclipse.swt.events.SelectionListener} object.
- */
- public void removeSelectionListener(SelectionListener listener) {
- combo.removeSelectionListener(listener);
- }
-
- /** {@inheritDoc} */
- public void setSelected(boolean selected) {
- setBackground(selected ? SELECTED : getPersistentBackground());
- }
-
- /**
- * <p>
- * Getter for the field <code>selection</code>.
- * </p>
- *
- * @return the selection
- */
- public T getSelection() {
- return selection;
- }
-
/** {@inheritDoc} */
- public void setEnabled(boolean enabled) {
- combo.setEnabled(enabled);
- }
-
- /*
- * (non-Javadoc)
- *
- * @see
- * org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt
- * .events.SelectionEvent)
- */
- /** {@inheritDoc} */
- public void widgetSelected(SelectionEvent e) {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
selection = elementTypeList.get(combo.getSelectionIndex());
firePropertyChangeEvent(new CdmPropertyChangeEvent(this, e));
}
- /** {@inheritDoc} */
- public void setIrrelevant(boolean irrelevant) {
- String colorId = irrelevant ? Resources.COLOR_COMPOSITE_IRRELEVANT
- : Resources.COLOR_COMPOSITE_BACKGROUND;
-
- Color color = StoreUtil.getColor(colorId);
- combo.setBackground(color);
- }
-
- /** {@inheritDoc} */
- @Override
- public void setBackground(Color color) {
- label.setBackground(color);
- }
-
- /** {@inheritDoc} */
- public void widgetDefaultSelected(SelectionEvent e) {
- }
-
- public void setVisibleItemCount(int visibleItems){
- combo.setVisibleItemCount(visibleItems);
- }
-
private Collection<T> getElementsForClass(Class<T> clazz){
CdmEnumDataHolder<T> dataHolder = getCdmEnumDataHolderForClass(clazz);
if (dataHolder != null) {
- return dataHolder.getElements();
+ return dataHolder.getElements();
}
return null;
}
-
+
private CdmEnumDataHolder<T> getCdmEnumDataHolderForClass(Class<T> clazz){
for (CdmEnumDataHolder dataHolder : cdmEnumDataHolders) {
if (dataHolder.getClazz().equals(clazz)){
}
return null;
}
-
+
private interface CdmEnumDataHolder<T> {
Class<T> getClazz();
String getName();