Merge branch 'release/5.31.0'
[taxeditor.git] / eu.etaxonomy.taxeditor.store / src / main / java / eu / etaxonomy / taxeditor / ui / combo / EnumComboElement.java
index 23b110a044a76d230e0f5cb8272d523f43a53cc9..cc84141ef834ef0ec688010f7d6551209afd0fad 100644 (file)
@@ -6,7 +6,6 @@
  * 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.
  */
-
 package eu.etaxonomy.taxeditor.ui.combo;
 
 import java.util.ArrayList;
@@ -19,31 +18,41 @@ import java.util.List;
 import java.util.Map.Entry;
 
 import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.ui.forms.widgets.TableWrapData;
 
-import eu.etaxonomy.cdm.model.common.IEnumTerm;
-import eu.etaxonomy.cdm.model.common.OriginalSourceType;
+import eu.etaxonomy.cdm.model.media.ExternalLinkType;
+import eu.etaxonomy.cdm.model.name.NameRelationship;
 import eu.etaxonomy.cdm.model.name.NomenclaturalCode;
+import eu.etaxonomy.cdm.model.name.NomenclaturalCodeEdition;
+import eu.etaxonomy.cdm.model.name.TaxonName;
 import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationType;
+import eu.etaxonomy.cdm.model.reference.OriginalSourceType;
 import eu.etaxonomy.cdm.model.reference.ReferenceType;
+import eu.etaxonomy.cdm.model.taxon.TaxonNodeStatus;
+import eu.etaxonomy.cdm.model.term.IEnumTerm;
+import eu.etaxonomy.taxeditor.l10n.Messages;
 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.section.name.NameRelationshipDetailElement;
+import eu.etaxonomy.taxeditor.ui.section.name.NomenclaturalStatusElement;
+import eu.etaxonomy.taxeditor.ui.section.name.NomenclaturalStatusSection;
 
 /**
  * @author n.hoffmann
  * @created Mar 16, 2010
  */
-public class EnumComboElement<T extends IEnumTerm<T>> extends
-               AbstractComboElement<T>  {
+public class EnumComboElement<T extends IEnumTerm<T>>
+        extends AbstractComboElement<T>  {
 
        //TODO RL
        public void setVisible(boolean b){
                combo.setVisible(b);
        }
 
-
-        private  static  CdmEnumDataHolder[] cdmEnumDataHolders = {
+       private  static  CdmEnumDataHolder[] cdmEnumDataHolders = {
                new CdmEnumDataHolder<NomenclaturalCode>(){
 
                        @Override
@@ -56,14 +65,12 @@ public class EnumComboElement<T extends IEnumTerm<T>> extends
                                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>(){
 
@@ -74,7 +81,14 @@ public class EnumComboElement<T extends IEnumTerm<T>> extends
 
                        @Override
                        public Collection<ReferenceType> getElements() {
-                               return Arrays.asList(ReferenceType.values());
+                           List<ReferenceType> list = Arrays.asList(ReferenceType.values());
+                           Collections.sort(list, new Comparator<ReferenceType>() {
+                           @Override
+                           public int compare(ReferenceType rt1, ReferenceType rt2){
+                               return rt1.getLabel().compareTo(rt2.getLabel());
+                           }
+                       });
+                               return list;
                        }
 
                        @Override
@@ -101,6 +115,24 @@ public class EnumComboElement<T extends IEnumTerm<T>> extends
                        }
 
                },
+               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
@@ -118,8 +150,43 @@ public class EnumComboElement<T extends IEnumTerm<T>> extends
                                return OriginalSourceType.class;
                        }
 
-               }
+               },
+        new CdmEnumDataHolder<NomenclaturalCodeEdition>(){
+
+            @Override
+            public String getName() {
+                return "Nomenclatural Code Edition";
+            }
+
+            @Override
+            public Collection<NomenclaturalCodeEdition> getElements() {
+                return Arrays.asList(NomenclaturalCodeEdition.values());
+            }
+
+            @Override
+            public Class<NomenclaturalCodeEdition> getClazz() {
+                return NomenclaturalCodeEdition.class;
+            }
+
+        },
+               new CdmEnumDataHolder<TaxonNodeStatus>(){
+
+            @Override
+            public String getName() {
+                return "Taxon Node Status";
+            }
+
+            @Override
+            public Collection<TaxonNodeStatus> getElements() {
+                return Arrays.asList(TaxonNodeStatus.values());
+            }
+
+            @Override
+            public Class<TaxonNodeStatus> getClazz() {
+                return TaxonNodeStatus.class;
+            }
 
+        }
        };
 
        protected List<T> elementTypeList = new ArrayList<>();
@@ -127,17 +194,26 @@ public class EnumComboElement<T extends IEnumTerm<T>> extends
        private final Class<T> enumType;
 
        public EnumComboElement(CdmFormFactory formFactory,
-                       ICdmFormElement parentElement, Class<T> enumType, Comparator<T> comparator, int style) {
-               super(formFactory, parentElement);
+                       ICdmFormElement parentElement, Class<T> enumType, Comparator<T> comparator, int style, boolean hasNullValue) {
+               super(formFactory, parentElement, hasNullValue);
                this.enumType = enumType;
                label.setText(getDefaultLabelString());
-
                populateTypes(comparator);
-
                combo.addSelectionListener(this);
+               addContentProposalAdapter();
        }
 
+       public void setIndent(int indent) {
+       TableWrapData layoutData = new TableWrapData();
+        layoutData.indent = indent;
+        label.setLayoutData(layoutData);
 
+        getLayoutComposite().layout();
+       }
+
+       public Combo getCombo(){
+           return combo;
+       }
 
        private String getDefaultLabelString() {
                if(enumType.equals(ReferenceType.class)){
@@ -148,28 +224,72 @@ public class EnumComboElement<T extends IEnumTerm<T>> extends
                        return "Orig. Source Type";
                } else if(enumType.equals(SpecimenOrObservationType.class)) {
                        return "Spec./Obs. Type";
-               }
+               } else if(enumType.equals(ExternalLinkType.class)) {
+            return "Type";
+        } else if(enumType.equals(NomenclaturalCodeEdition.class)) {
+            return "Code Edition";
+        }else if(enumType.equals(TaxonNodeStatus.class)) {
+            return Messages.EnumCombo_Placement_status;
+        }
                return "No Label";
        }
 
     private void populateTypes(Comparator<T> comparator){
         List<T> elementsForClass = new ArrayList<T>(getElementsForClass(enumType));
+        if (enumType.equals(SpecimenOrObservationType.class)){
+            elementsForClass.remove(SpecimenOrObservationType.FieldUnit);
+        }
         if(comparator!=null){
             Collections.sort(elementsForClass, comparator);
         }
+        int index = 0;
+        if (hasNullValue){
+            combo.add("", index);
+            index++;
+        }
         // 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());
+                combo.add(keyLabelPair.getValue(), index);
+                combo.setData(keyLabelPair.getValue(), keyLabelPair.getKey());
+                index++;
+            }
+        }else if(enumType.equals(NomenclaturalCodeEdition.class)){
+            NomenclaturalCode code = null;
+
+            ICdmFormElement parentElement = getParentElement();
+            if (parentElement instanceof NameRelationshipDetailElement){
+                NameRelationship rel = ((NameRelationshipDetailElement)parentElement).getEntity();
+                code = rel.getToName().getNameType();
+            }else if (parentElement instanceof NomenclaturalStatusElement){
+                ICdmFormElement parent = ((NomenclaturalStatusElement)parentElement).getParentElement();
+                TaxonName name = ((NomenclaturalStatusSection)parent).getEntity();
+                code = name.getNameType();
+            }
+            List<NomenclaturalCodeEdition> elements = NomenclaturalCodeEdition.forCode(code);
+            LinkedHashMap<NomenclaturalCodeEdition, String> orderedTerms = AbstractUtility.orderTerms(elements);
+            for (NomenclaturalCodeEdition codeEdition: elements){
+                    elementTypeList.add((T)codeEdition);
+                    combo.add(codeEdition.getLabel(), index);
+                    combo.setData(codeEdition.getLabel(), (T)codeEdition);
+                    index++;
             }
         }
         // default order
         else{
             for(T enumElement : elementsForClass){
                 elementTypeList.add(enumElement);
-                combo.add(((Enum) enumElement).name());
+                if (enumElement instanceof IEnumTerm)  {
+                    combo.add(((IEnumTerm) enumElement).getLabel(), index);
+                    combo.setData(((IEnumTerm) enumElement).getLabel(), enumElement);
+                    index++;
+                }else{
+                    combo.add(((Enum) enumElement).name(), index);
+                    combo.setData(((Enum) enumElement).name(), enumElement);
+                    index++;
+                }
             }
         }
        }
@@ -177,12 +297,29 @@ public class EnumComboElement<T extends IEnumTerm<T>> extends
        @Override
     public void setSelection(T selection) {
                this.selection = selection;
-               combo.select(elementTypeList.indexOf(selection));
+               int index = elementTypeList.indexOf(selection);
+               if (hasNullValue && selection != null){
+                   index++;
+               }
+               combo.select(index);
        }
-       /** {@inheritDoc} */
+
        @Override
     public void widgetSelected(SelectionEvent e) {
-               selection = elementTypeList.get(combo.getSelectionIndex());
+
+        int index = combo.getSelectionIndex();
+        if (index == -2){
+            return;
+        }
+        if (hasNullValue ){
+            index--;
+        }
+        if (index<0){
+            selection = null;
+        }else{
+            selection = elementTypeList.get(index);
+        }
+
                firePropertyChangeEvent(new CdmPropertyChangeEvent(this, e));
        }
 
@@ -208,4 +345,4 @@ public class EnumComboElement<T extends IEnumTerm<T>> extends
                String getName();
                Collection<T> getElements();
        }
-}
+}
\ No newline at end of file