cleanup
[cdm-vaadin.git] / src / main / java / eu / etaxonomy / vaadin / component / WeaklyRelatedEntityCombobox.java
index 328dc282df77677fa8c495269d95388dd5ac6a74..0c3bdbcd9c77074cbb285dd2b4cf2a91515295a5 100644 (file)
@@ -8,14 +8,20 @@
 */
 package eu.etaxonomy.vaadin.component;
 
+import java.util.Objects;
+import java.util.Optional;
 import java.util.UUID;
 
 import org.vaadin.viritin.fields.LazyComboBox.FilterableCountProvider;
 import org.vaadin.viritin.fields.LazyComboBox.FilterablePagingProvider;
 
 import com.vaadin.data.Property;
+import com.vaadin.data.Validator.InvalidValueException;
 import com.vaadin.data.fieldgroup.FieldGroup;
 import com.vaadin.data.util.converter.Converter.ConversionException;
+import com.vaadin.server.AbstractErrorMessage.ContentMode;
+import com.vaadin.server.ErrorMessage.ErrorLevel;
+import com.vaadin.server.UserError;
 import com.vaadin.ui.Button;
 import com.vaadin.ui.Button.ClickListener;
 import com.vaadin.ui.Component;
@@ -24,8 +30,8 @@ import com.vaadin.ui.Field;
 import com.vaadin.ui.themes.ValoTheme;
 
 import eu.etaxonomy.cdm.model.common.IdentifiableEntity;
-import eu.etaxonomy.cdm.persistence.hibernate.permission.CRUD;
-import eu.etaxonomy.cdm.service.FilterableStringRepresentationPagingProvider;
+import eu.etaxonomy.cdm.model.permission.CRUD;
+import eu.etaxonomy.cdm.service.IFilterableStringRepresentationPagingProvider;
 import eu.etaxonomy.cdm.service.UserHelperAccess;
 import eu.etaxonomy.cdm.vaadin.component.ButtonFactory;
 import eu.etaxonomy.cdm.vaadin.event.NestedButtonStateUpdater;
@@ -53,7 +59,7 @@ public class WeaklyRelatedEntityCombobox<V extends IdentifiableEntity<?>> extend
 
     private WeaklyRelatedEntityButtonUpdater buttonUpdater;
 
-    private FilterableStringRepresentationPagingProvider<UUID> filterablePagingProvider;
+    private IFilterableStringRepresentationPagingProvider<UUID> filterablePagingProvider;
 
     public WeaklyRelatedEntityCombobox(String caption, Class<V> type){
         this.type = type;
@@ -63,9 +69,17 @@ public class WeaklyRelatedEntityCombobox<V extends IdentifiableEntity<?>> extend
         addSizedComponents(lazySelect, container);
         buttonUpdater = new WeaklyRelatedEntityButtonUpdater(this);
         lazySelect.addValueChangeListener(buttonUpdater);
+        lazySelect.setValidationVisible(true);
         lazySelect.addValueChangeListener(e -> {
             // update the itemContainer immediately so that the edit button acts on the chosen item
-            lazySelect.commit();
+            // TODO In contrast to ToOneRelatedEntityCombobox where getValue() is overwritten to call
+            // commitSelect() calling this method would most probably remove all strings witch do not have a
+            // weakly related entity. Such behavior would be very unfriendly to users.
+            try {
+              lazySelect.commit();
+            } catch (InvalidValueException ie){
+                /* Ignore here */
+            }
         });
     }
 
@@ -102,8 +116,8 @@ public class WeaklyRelatedEntityCombobox<V extends IdentifiableEntity<?>> extend
      * {@inheritDoc}
      */
     @Override
-    public FieldGroup getFieldGroup() {
-        return null;
+    public Optional<FieldGroup> getFieldGroup() {
+        return Optional.empty();
     }
 
     /**
@@ -118,7 +132,7 @@ public class WeaklyRelatedEntityCombobox<V extends IdentifiableEntity<?>> extend
      */
     public void loadFrom(FilterablePagingProvider<String> filterablePagingProvider, FilterableCountProvider filterableCountProvider, int pageLength) {
 
-        this.filterablePagingProvider = (FilterableStringRepresentationPagingProvider<UUID>) filterablePagingProvider;
+        this.filterablePagingProvider = (IFilterableStringRepresentationPagingProvider<UUID>) filterablePagingProvider;
         lazySelect.loadFrom(filterablePagingProvider, filterableCountProvider, pageLength);
         buttonUpdater.updateButtons(getValue());
     }
@@ -172,16 +186,6 @@ public class WeaklyRelatedEntityCombobox<V extends IdentifiableEntity<?>> extend
         setValue(bean);
     }
 
-    /**
-     * Returns always currently selected item by
-     *
-     * {@inheritDoc}
-     */
-    @Override
-    public String getValue() {
-        lazySelect.commit();
-        return lazySelect.getValue();
-    }
 
     public UUID getIdForValue(){
         return filterablePagingProvider.idFor(getValue());
@@ -195,11 +199,33 @@ public class WeaklyRelatedEntityCombobox<V extends IdentifiableEntity<?>> extend
      */
     @Override
     public void setValue(String newFieldValue) throws com.vaadin.data.Property.ReadOnlyException, ConversionException {
-        lazySelect.refresh();
-        if(lazySelect.getOptions().contains(newFieldValue)){
-            lazySelect.setValue(newFieldValue);
+        if(!Objects.equals(newFieldValue, lazySelect.getValue())){
+            if(contains(newFieldValue)){
+                lazySelect.setValue(newFieldValue);
+                lazySelect.markAsDirty();
+            }
         }
-        lazySelect.markAsDirty();
+    }
+
+    @Override
+    public String getValue() {
+        return lazySelect.getValue();
+
+    }
+
+    /**
+     * @param newFieldValue
+     * @return
+     */
+    private boolean contains(String newFieldValue) {
+        UUID id = filterablePagingProvider.idFor(newFieldValue);
+        return id != null;
+    }
+
+
+    @Override
+    public boolean isValueInOptions(){
+        return lazySelect.getOptions().contains(lazySelect.getValue());
     }
 
     @Override
@@ -230,11 +256,43 @@ public class WeaklyRelatedEntityCombobox<V extends IdentifiableEntity<?>> extend
         }
     }
 
+    @Override
+    public void setRequired(boolean required) {
+        super.setRequired(required);
+        lazySelect.setRequired(required);
+    }
+
+    @Override
+    public void setImmediate(boolean immediate){
+        super.setImmediate(immediate);
+        lazySelect.setImmediate(immediate);
+    }
+
     @Override
     public void updateButtons(){
         buttonUpdater.updateButtons(getValue());
     }
 
+    @Override
+    public void commit() throws SourceException, InvalidValueException {
+        lazySelect.commit();
+    }
+
+    /**
+    *
+    */
+   public void commitSelect() {
+       try {
+           setComponentError(null);
+           lazySelect.commit();
+       } catch (InvalidValueException ex){
+           UserError componentError = new UserError(ex.getHtmlMessage(), ContentMode.HTML, ErrorLevel.ERROR);
+           lazySelect.setComponentError(componentError);
+       }
+   }
+
+
+
     /**
      * {@inheritDoc}
      * @deprecated NestedButtonStateUpdater should rather be instantiated in the RelatedEntityField instead of passing it as property
@@ -253,7 +311,6 @@ public class WeaklyRelatedEntityCombobox<V extends IdentifiableEntity<?>> extend
 
         public WeaklyRelatedEntityButtonUpdater(WeaklyRelatedEntityCombobox<V> toOneRelatedEntityField){
             this.toOneRelatedEntityField = toOneRelatedEntityField;
-            String stringValue = toOneRelatedEntityField.getValue();
             updateButtons(toOneRelatedEntityField.getValue());
             toOneRelatedEntityField.setEditButtonEnabled(false);
         }
@@ -288,6 +345,4 @@ public class WeaklyRelatedEntityCombobox<V extends IdentifiableEntity<?>> extend
         }
     }
 
-
-
 }