ref #10316: TermNodeDto should not contain termtreedto, only some
[taxeditor.git] / eu.etaxonomy.taxeditor.store / src / main / java / eu / etaxonomy / taxeditor / ui / element / RepresentationElement.java
index b17f8e903cc3c1a6e299eed1666c2e498137da7b..00397d71bae1a1fad4f968c82d981cbb592ef15d 100644 (file)
@@ -1,4 +1,3 @@
-// $Id$
 /**
 * Copyright (C) 2016 EDIT
 * European Distributed Institute of Taxonomy
@@ -16,137 +15,128 @@ package eu.etaxonomy.taxeditor.ui.element;
  */
 
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
+import java.util.Set;
 
 import org.eclipse.jface.util.PropertyChangeEvent;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
 import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
 import org.eclipse.swt.widgets.Button;
 
 import eu.etaxonomy.cdm.model.common.Language;
-import eu.etaxonomy.cdm.model.common.Representation;
-import eu.etaxonomy.cdm.model.common.TermBase;
-import eu.etaxonomy.cdm.model.common.TermType;
+import eu.etaxonomy.cdm.model.term.Representation;
+import eu.etaxonomy.cdm.model.term.TermBase;
+import eu.etaxonomy.cdm.model.term.TermType;
+import eu.etaxonomy.cdm.persistence.dto.AbstractTermDto;
 import eu.etaxonomy.taxeditor.model.DefaultTermComparator;
+import eu.etaxonomy.taxeditor.model.ImageResources;
 import eu.etaxonomy.taxeditor.preference.PreferencesUtil;
 import eu.etaxonomy.taxeditor.store.CdmStore;
-import eu.etaxonomy.taxeditor.ui.combo.TermComboElement;
+import eu.etaxonomy.taxeditor.ui.combo.term.TermComboElement;
 
-public class RepresentationElement  extends AbstractCdmFormElement implements
-SelectionListener{
+
+public class RepresentationElement extends AbstractCdmFormElement implements IEnableableFormElement{
 
         protected TermComboElement<Language> combo_language;
 
         protected TextWithLabelElement element_Label;
         protected TextWithLabelElement element_abbrevLabel;
+        protected TextWithLabelElement element_plural;
         protected TextWithLabelElement element_text;
 
         protected Button button;
 
         protected Representation selectedRepresentation;
         protected TermBase term;
+        protected AbstractTermDto termDto;
 
-       // protected final boolean isTranslationWizard;
+               private Button removeRepresentation;
 
+               boolean isEnabled = true;
 
-        /**
-         * <p>
-         * Constructor for MultilanguageTextElement.
-         * </p>
-         *
-         * @param formFactory
-         *            a {@link eu.etaxonomy.taxeditor.ui.element.CdmFormFactory}
-         *            object.
-         * @param formElement
-         *            a {@link eu.etaxonomy.taxeditor.ui.element.ICdmFormElement}
-         *            object.
-         *
-         * @param term
-         *            a {@link eu.etaxonomy.cdm.model.common.TermBase} object.
-         * @param textHeight
-         *            a {@link java.lang.Integer} object.
-         * @param style
-         *            a int.
-         */
         public RepresentationElement(CdmFormFactory formFactory,
                 ICdmFormElement formElement, TermBase term,
                 Integer textHeight, int style, boolean fill) {
+            this(formFactory, formElement, null, term, textHeight, style, fill);
+        }
+
+        public RepresentationElement(CdmFormFactory formFactory,
+                ICdmFormElement formElement, Representation representation, TermBase term,
+                Integer textHeight, int style, boolean fill) {
             super(formFactory, formElement);
 
             formFactory.addPropertyChangeListener(this);
-
+            setSelectedRepresentation(representation);
             element_Label = this.formFactory.createTextWithLabelElement(formElement, "Label", null, style);
-            element_abbrevLabel = this.formFactory
-                    .createTextWithLabelElement(formElement, "abbrev. Label",
-                            null, style);
+            element_abbrevLabel = this.formFactory.createTextWithLabelElement(formElement, "abbrev. Label", null, style);
+            element_plural = this.formFactory.createTextWithLabelElement(formElement, "Plural", null, style);
             element_text = this.formFactory.createMultiLineTextWithLabel(formElement, "Description", textHeight, style);
             if (PreferencesUtil.isMultilanguageTextEditingCapability()) {
                 createRepresentationEditingElements(formElement, style);
             }
             setTerm(term, fill);
+            //if(representation!=null){
+            
+           //}
 
         }
 
-        /**
-         * <p>
-         * Constructor for MultilanguageTextElement.
-         * </p>
-         *
-         * @param formFactory
-         *            a {@link eu.etaxonomy.taxeditor.ui.element.CdmFormFactory}
-         *            object.
-         * @param formElement
-         *            a {@link eu.etaxonomy.taxeditor.ui.element.ICdmFormElement}
-         *            object.
-         * @param representation
-         *            a {@link eu.etaxonomy.cdm.model.common.Representation} object.
-         * @param term
-         *            a {@link eu.etaxonomy.cdm.model.common.TermBase} object.
-         * @param textHeight
-         *            a {@link java.lang.Integer} object.
-         * @param style
-         *            a int.
-         */
         public RepresentationElement(CdmFormFactory formFactory,
-                ICdmFormElement formElement, Representation representation, TermBase term,
+                ICdmFormElement formElement, Representation representation, AbstractTermDto term,
                 Integer textHeight, int style, boolean fill) {
             super(formFactory, formElement);
 
             formFactory.addPropertyChangeListener(this);
-
+            if(representation!=null){
+                setSelectedRepresentation(representation);
+            }
             element_Label = this.formFactory.createTextWithLabelElement(formElement, "Label", null, style);
-            element_abbrevLabel = this.formFactory
-                    .createTextWithLabelElement(formElement, "abbrev. Label",
-                            null, style);
+            element_abbrevLabel = this.formFactory.createTextWithLabelElement(formElement, "abbrev. Label", null, style);
+            element_plural = this.formFactory.createTextWithLabelElement(formElement, "Plural", null, style);
             element_text = this.formFactory.createMultiLineTextWithLabel(formElement, "Description", textHeight, style);
             if (PreferencesUtil.isMultilanguageTextEditingCapability()) {
                 createRepresentationEditingElements(formElement, style);
+                
             }
-            setTerm(term, fill);
-            setSelectedRepresentation(representation);
-
+            setTermDto(term, fill);
+            if(representation!=null){
+                setSelectedRepresentation(representation);
+            }
+            
 
         }
 
         protected void createRepresentationEditingElements(
                 ICdmFormElement formElement, int style) {
-
+               removeRepresentation = formFactory.createButton(getLayoutComposite(), null,
+                               SWT.PUSH);
+               removeRepresentation.setImage(ImageResources
+                               .getImage(ImageResources.TRASH_ICON));
+               removeRepresentation.setToolTipText("Remove representation");
+               removeRepresentation.addSelectionListener(new DeleteListener(this));
+               addControl(removeRepresentation);
+               boolean addNullValue = false;
+               if (this.selectedRepresentation == null) {
+                   addNullValue = true;
+               }
             combo_language = formFactory.createDefinedTermComboElement(TermType.Language, formElement,
-                            "", null, true, style);
-
-            combo_language.addSelectionListener(this);
+                            "", null, addNullValue, style);
 
-            addControl(formFactory.createLabel(getLayoutComposite(), ""));
-
-
-        }
+       }
 
         public List<Language> getLanguages() {
 
             ArrayList<Language> languageList = new ArrayList<Language>();
-            for (Representation rep: term.getRepresentations()){
+            Set<Representation> reps = null;
+            if (term != null){
+                reps = term.getRepresentations();
+            }else{
+                reps = termDto.getRepresentations();
+            }
+
+            for (Representation rep: reps){
                 languageList.add(rep.getLanguage());
             }
 
@@ -155,98 +145,107 @@ SelectionListener{
             return languageList;
         }
 
-        /*
-         * (non-Javadoc)
-         *
-         * @see
-         * org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt
-         * .events.SelectionEvent)
-         */
-        /** {@inheritDoc} */
-        @Override
-        public void widgetSelected(SelectionEvent e) {
-            Language selectedLanguage = combo_language.getSelection();
-            if (selectedLanguage != null) {
-                selectedRepresentation = getTerm().getRepresentation(
-                        selectedLanguage);
-                if (selectedRepresentation == null){
-                    selectedRepresentation = Representation.NewInstance("", "", "", selectedLanguage);
-                }
-                element_Label.setText(selectedRepresentation.getLabel());
-                element_abbrevLabel.setText(selectedRepresentation.getAbbreviatedLabel());
-                element_text.setText(selectedRepresentation.getDescription());
-
+        public void setTerm(
+                TermBase term, boolean update) {
+            this.term = term;
+            if (term.getRepresentations().isEmpty()){
+               //if the term has no representation at all, create a default one.
+               Representation rep = Representation.NewInstance("", "empty representation", "", PreferencesUtil.getGlobalLanguage());
+               term.addRepresentation(rep);
             }
 
+//            if (selectedRepresentation != null) {
+//               combo_language.setTerms(getLanguages());
+//
+//            } else{
+//              setEnabledControls(false);
+//                 if (PreferencesUtil.isMultilanguageTextEditingCapability()) {
+//                      removeRepresentation.setEnabled(false);
+//                 }
+//            }
+            if (update){
+               updateControls();
+            }
         }
 
-        /*
-         * (non-Javadoc)
-         *
-         * @see
-         * org.eclipse.swt.events.SelectionListener#widgetDefaultSelected(org.eclipse
-         * .swt.events.SelectionEvent)
-         */
-        /** {@inheritDoc} */
-        @Override
-        public void widgetDefaultSelected(SelectionEvent e) {
-        }
-
-        /**
-         * <p>
-         * Setter for the field <code>multilanguageText</code>.
-         * </p>
-         *
-         * @param multilanguageText
-         *            the multilanguageText to set
-         */
-        public void setTerm(
-                TermBase term, boolean update) {
-            this.term = term;
+        public void setTermDto(
+                       AbstractTermDto term, boolean update) {
+            this.termDto = term;
+            if (term.getRepresentations().isEmpty()){
+                //if the term has no representation at all, create a default one.
+                Representation rep = Representation.NewInstance("", "empty representation", "", PreferencesUtil.getGlobalLanguage());
+                term.addRepresentation(rep);
+            }
 
-            if (selectedRepresentation != null) {
+            if (selectedRepresentation != null && combo_language != null) {
                combo_language.setTerms(getLanguages());
-            }
+
+            } 
+//            else if (!term.getRepresentations().isEmpty()){
+//                 setEnabledControls(false);
+//                 if (PreferencesUtil.isMultilanguageTextEditingCapability()) {
+//                     removeRepresentation.setEnabled(false);
+//                 }
+//            }
             if (update){
-               updateControls();
+                updateControls();
             }
         }
 
-        /**
-         *
-         */
+        private void setEnabledControls(boolean enabled){
+            element_Label.setEnabled(enabled);
+            element_abbrevLabel.setEnabled(enabled);
+            element_plural.setEnabled(enabled);
+            element_text.setEnabled(enabled);
+        }
+
+        @Override
+        public void setEnabled(boolean isEnabled){
+            this.isEnabled = isEnabled;
+            setEnabledControls(isEnabled);
+
+        }
+
+        @Override
+        public boolean isEnabled(){
+            return isEnabled;
+        }
+
         protected void updateControls() {
-            Representation preferredRepresentation = term
+            Representation preferredRepresentation = null;
+            if (term != null){
+                 preferredRepresentation = term
                     .getPreferredRepresentation(PreferencesUtil.getGlobalLanguage() );
+            }else{
+                 preferredRepresentation = termDto
+                        .getPreferredRepresentation(PreferencesUtil.getGlobalLanguage() );
+            }
 
-            element_Label.setText(preferredRepresentation.getLabel());
-            element_abbrevLabel.setText(preferredRepresentation.getAbbreviatedLabel());
-            element_text.setText(preferredRepresentation.getDescription());
+            element_Label.setText(preferredRepresentation != null? preferredRepresentation.getLabel(): null);
+            element_abbrevLabel.setText(preferredRepresentation != null? preferredRepresentation.getAbbreviatedLabel(): null);
+            element_plural.setText(preferredRepresentation != null? preferredRepresentation.getPlural(): null);
+            element_text.setText(preferredRepresentation != null? preferredRepresentation.getDescription(): null);
             selectedRepresentation = preferredRepresentation;
             if (PreferencesUtil.isMultilanguageTextEditingCapability()) {
                 combo_language.setSelection(preferredRepresentation == null?CdmStore.getDefaultLanguage():preferredRepresentation.getLanguage());
+                boolean removePossible = false;
+                if (term != null){
+                    removePossible = term.getRepresentations().size() > 1 ;
+                }else{
+                    removePossible = termDto.getRepresentations().size() > 1 ;
+                }
+                removeRepresentation.setEnabled(removePossible);
+
             }
         }
 
-        /**
-         * <p>
-         * Getter for the field <code>multilanguageText</code>.
-         * </p>
-         *
-         * @return the multilanguageText
-         */
         public TermBase getTerm() {
             return term;
         }
+        public AbstractTermDto getTermDto() {
+            return termDto;
+        }
 
-        /*
-         * (non-Javadoc)
-         *
-         * @see
-         * eu.etaxonomy.taxeditor.forms.AbstractCdmFormElement#propertyChange(org
-         * .eclipse.jface.util.PropertyChangeEvent)
-         */
-        /** {@inheritDoc} */
         @Override
         public void propertyChange(PropertyChangeEvent event) {
             if (event == null) {
@@ -259,6 +258,12 @@ SelectionListener{
                         .getText();
                 selectedRepresentation.setAbbreviatedLabel(abbrevLabel);
                 firePropertyChangeEvent(new CdmPropertyChangeEvent(this, event));
+            }
+            else if (eventSource == element_plural){
+                String plural = ((TextWithLabelElement) eventSource)
+                        .getText();
+                selectedRepresentation.setPlural(plural);
+                firePropertyChangeEvent(new CdmPropertyChangeEvent(this, event));
             } else if (eventSource == element_Label){
                 String label = ((TextWithLabelElement) eventSource)
                         .getText();
@@ -271,24 +276,82 @@ SelectionListener{
                 firePropertyChangeEvent(new CdmPropertyChangeEvent(this, event));
             } else if (eventSource == button){
                firePropertyChangeEvent(new CdmPropertyChangeEvent(this, event));
+            } else if (eventSource == combo_language){
+                if (combo_language.getSelection() != null){
+                    setEnabledControls(true);
+                    boolean removePossible = false;
+                    if (term != null){
+                        removePossible = term.getRepresentations().size() > 1 ;
+                    }else{
+                        removePossible = termDto.getRepresentations().size() > 1 ;
+                    }
+                    removeRepresentation.setEnabled(removePossible);
+
+                    Language selectedLanguage = combo_language.getSelection();
+                    if (selectedLanguage != null) {
+                       if (getTerm() != null){
+                               selectedRepresentation = getTerm().getRepresentation(selectedLanguage);
+                       }else{
+                               selectedRepresentation = getTermDto().getRepresentation(selectedLanguage);
+                       }
+                        if (selectedRepresentation == null){
+                            selectedRepresentation = Representation.NewInstance("", "", "", selectedLanguage);
+                        }
+                        element_Label.setText(selectedRepresentation.getLabel());
+                        element_abbrevLabel.setText(selectedRepresentation.getAbbreviatedLabel());
+                        element_plural.setText(selectedRepresentation.getPlural());
+                        element_text.setText(selectedRepresentation.getDescription());
+
+                    }else {
+                        setEnabledControls(false);
+                    }
+                } else{
+                    setEnabledControls(false);
+                    removeRepresentation.setEnabled(false);
+                }
+                //firePropertyChangeEvent(new CdmPropertyChangeEvent(this, event));
+                firePropertyChangeEvent(event);
             }
         }
 
-        /**
-         * @return the selectedRepresentation
-         */
         public Representation getSelectedRepresentation() {
             return selectedRepresentation;
         }
 
-        /**
-         * @param selectedRepresentation the selectedRepresentation to set
-         */
         public void setSelectedRepresentation(Representation selectedRepresentation) {
-            if (selectedRepresentation == null){
-                selectedRepresentation = Representation.NewInstance("", "", "", null);
-            }
+//            if (selectedRepresentation == null){
+//                selectedRepresentation = Representation.NewInstance("", "", "", null);
+//            }
             this.selectedRepresentation = selectedRepresentation;
+            
+        }
+
+        private class DeleteListener extends SelectionAdapter {
+
+               private final RepresentationElement element;
+
+               public DeleteListener(RepresentationElement element) {
+                       this.element = element;
+               }
+
+               @Override
+               public void widgetSelected(SelectionEvent e) {
+                   if (term != null){
+                       term.removeRepresentation(selectedRepresentation);
+                   }else {
+                       termDto.getRepresentations().remove(selectedRepresentation);
+                   }
+                       firePropertyChangeEvent(new CdmPropertyChangeEvent(
+                                       this, e));
+                       updateControls();
+               }
+       }
+
+        /**
+         * @param isEnabled
+         */
+        public void setLanguageComboEnabled(boolean isEnabled) {
+            this.combo_language.setEnabled(isEnabled);            
         }
     }