fix #8162 adapt terms to new package structure in TaxEditor
[taxeditor.git] / eu.etaxonomy.taxeditor.store / src / main / java / eu / etaxonomy / taxeditor / ui / combo / EnumComboElement.java
index 3371a6ae531dbfcd310698b2fd49384153095cda..db58614b5990c247ea37c31714578e71d7780804 100644 (file)
@@ -1,9 +1,8 @@
-// $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.
  */
@@ -13,47 +12,41 @@ package eu.etaxonomy.taxeditor.ui.combo;
 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.common.IEnumTerm;
+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.element.AbstractCdmFormElement;
+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;
-import eu.etaxonomy.taxeditor.ui.element.IEnableableFormElement;
-import eu.etaxonomy.taxeditor.ui.element.ISelectable;
-import eu.etaxonomy.taxeditor.ui.element.LayoutConstants;
 
 /**
- * <p>
- * Abstract AbstractEnumComboElement class.
- * </p>
- * 
  * @author n.hoffmann
  * @created Mar 16, 2010
- * @version 1.0
  */
-public class EnumComboElement<T extends IEnumTerm> 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";
@@ -61,14 +54,17 @@ public class EnumComboElement<T extends IEnumTerm> extends
 
                        @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>(){
 
@@ -86,7 +82,7 @@ public class EnumComboElement<T extends IEnumTerm> extends
                        public Class<ReferenceType> getClazz() {
                                return ReferenceType.class;
                        }
-                       
+
                },
                new CdmEnumDataHolder<SpecimenOrObservationType>(){
 
@@ -104,8 +100,26 @@ public class EnumComboElement<T extends IEnumTerm> extends
                        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
@@ -122,56 +136,28 @@ public class EnumComboElement<T extends IEnumTerm> extends
                        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.element.CdmFormFactory}
-        *            object.
-        * @param parentElement
-        *            a {@link eu.etaxonomy.taxeditor.ui.element.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);
-
-               // create combo
-               combo = new Combo(getLayoutComposite(), SWT.BORDER | SWT.READ_ONLY);
-               addControl(combo);
-               combo.setLayoutData(LayoutConstants.FILL_HORIZONTALLY());
-               setVisibleItemCount(DEFAULT_VISIBLE_ITEMS);
+               label.setText(getDefaultLabelString());
 
-               populateTypes();
+               populateTypes(comparator);
 
                combo.addSelectionListener(this);
        }
 
+
+
        private String getDefaultLabelString() {
                if(enumType.equals(ReferenceType.class)){
                        return "Reference Type";
@@ -182,123 +168,54 @@ public class EnumComboElement<T extends IEnumTerm> extends
                } 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)){
@@ -307,7 +224,7 @@ public class EnumComboElement<T extends IEnumTerm> extends
                }
                return null;
        }
-       
+
        private interface CdmEnumDataHolder<T> {
                Class<T> getClazz();
                String getName();