From 882771ba41d37609ca1dc2074c5d566c5e100d39 Mon Sep 17 00:00:00 2001
From: pkupczyk <pkupczyk>
Date: Wed, 25 Jul 2012 13:30:39 +0000
Subject: [PATCH] SP-104 / BIS-64 and SP-132 / BIS-82 - Registration and edit
 forms improvements bugfixing: - experiment edit form marked as dirty on entry
 - cannot close experiment registration tab without choosing experiment type
 first - reverting doesn't close attachments on edit forms

SVN: 26205
---
 .../ui/widget/EntityRegistrationPanel.java    | 10 ++-
 .../ui/widget/FormPanelWithSavePoint.java     | 67 ++++++++++++-------
 ...ractGenericExperimentRegisterEditForm.java |  7 ++
 ...AbstractGenericSampleRegisterEditForm.java |  7 ++
 4 files changed, 66 insertions(+), 25 deletions(-)

diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/widget/EntityRegistrationPanel.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/widget/EntityRegistrationPanel.java
index 3e44d64e49b..0666c37dd91 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/widget/EntityRegistrationPanel.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/widget/EntityRegistrationPanel.java
@@ -194,7 +194,13 @@ abstract public class EntityRegistrationPanel<T extends ModelData, S extends Dro
     @Override
     public boolean shouldAskForCloseConfirmation()
     {
-        return ComponentWithCloseConfirmationUtil.shouldAskForCloseConfirmation(registrationWidget
-                .get());
+        if (registrationWidget != null)
+        {
+            return ComponentWithCloseConfirmationUtil
+                    .shouldAskForCloseConfirmation(registrationWidget.get());
+        } else
+        {
+            return false;
+        }
     }
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/widget/FormPanelWithSavePoint.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/widget/FormPanelWithSavePoint.java
index cb2d05ecd71..75a61fa58b5 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/widget/FormPanelWithSavePoint.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/widget/FormPanelWithSavePoint.java
@@ -32,6 +32,7 @@ import com.extjs.gxt.ui.client.util.Util;
 import com.extjs.gxt.ui.client.widget.Component;
 import com.extjs.gxt.ui.client.widget.Container;
 import com.extjs.gxt.ui.client.widget.form.Field;
+import com.extjs.gxt.ui.client.widget.form.MultiField;
 
 /**
  * @author pkupczyk
@@ -54,9 +55,28 @@ public class FormPanelWithSavePoint extends ClickableFormPanel
         addListener(Events.Add, new Listener<ContainerEvent>()
             {
                 @Override
-                public void handleEvent(ContainerEvent e)
+                public void handleEvent(ContainerEvent ce)
                 {
-                    addDirtyCheckField(e.getItem());
+                    List<Field<?>> fields = new ArrayList<Field<?>>();
+                    getDirtyCheckFields(ce.getItem(), fields);
+
+                    for (Field<?> field : fields)
+                    {
+                        field.addListener(Events.Change, new Listener<FieldEvent>()
+                            {
+                                @Override
+                                public void handleEvent(FieldEvent fe)
+                                {
+                                    DirtyChangeEvent dirtyChangedEvent =
+                                            new DirtyChangeEvent(FormPanelWithSavePoint.this);
+
+                                    for (Listener<DirtyChangeEvent> dirtyChangeListener : dirtyChangeListeners)
+                                    {
+                                        dirtyChangeListener.handleEvent(dirtyChangedEvent);
+                                    }
+                                }
+                            });
+                    }
                 }
             });
     }
@@ -64,7 +84,8 @@ public class FormPanelWithSavePoint extends ClickableFormPanel
     public void setSavePoint()
     {
         dirtyCheckSavePointValues.clear();
-        for (Field field : getFields())
+
+        for (Field field : getDirtyCheckFields())
         {
             setSavePointValue(field);
         }
@@ -79,7 +100,7 @@ public class FormPanelWithSavePoint extends ClickableFormPanel
 
     public void resetToSavePoint()
     {
-        for (Field field : getFields())
+        for (Field field : getDirtyCheckFields())
         {
             field.setValue(getSavePointValue(field));
         }
@@ -101,31 +122,31 @@ public class FormPanelWithSavePoint extends ClickableFormPanel
         }
     }
 
-    private void addDirtyCheckField(Component component)
+    private List<Field<?>> getDirtyCheckFields()
     {
-        if (component instanceof Field<?>)
-        {
-            Field<?> field = (Field<?>) component;
-            field.addListener(Events.Change, new Listener<FieldEvent>()
-                {
-                    @Override
-                    public void handleEvent(FieldEvent e)
-                    {
-                        DirtyChangeEvent dirtyChangedEvent =
-                                new DirtyChangeEvent(FormPanelWithSavePoint.this);
+        List<Field<?>> fields = new ArrayList<Field<?>>();
+        getDirtyCheckFields(this, fields);
+        return fields;
+    }
 
-                        for (Listener<DirtyChangeEvent> dirtyChangeListener : dirtyChangeListeners)
-                        {
-                            dirtyChangeListener.handleEvent(dirtyChangedEvent);
-                        }
-                    }
-                });
+    private void getDirtyCheckFields(Component component, List<Field<?>> fields)
+    {
+        if (component instanceof MultiField<?>)
+        {
+            MultiField<?> multifield = (MultiField<?>) component;
+            for (Component item : multifield.getAll())
+            {
+                getDirtyCheckFields(item, fields);
+            }
+        } else if (component instanceof Field<?>)
+        {
+            fields.add((Field<?>) component);
         } else if (component instanceof Container<?>)
         {
             Container<Component> container = (Container<Component>) component;
             for (Component item : container.getItems())
             {
-                addDirtyCheckField(item);
+                getDirtyCheckFields(item, fields);
             }
         }
     }
@@ -137,7 +158,7 @@ public class FormPanelWithSavePoint extends ClickableFormPanel
 
     public boolean isDirtyForSavePoint()
     {
-        for (Field<?> field : getFields())
+        for (Field<?> field : getDirtyCheckFields())
         {
             if (dirtyCheckIgnoredFields.contains(field) == false)
             {
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/experiment/AbstractGenericExperimentRegisterEditForm.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/experiment/AbstractGenericExperimentRegisterEditForm.java
index b92fcec069e..b6a98ca3d75 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/experiment/AbstractGenericExperimentRegisterEditForm.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/experiment/AbstractGenericExperimentRegisterEditForm.java
@@ -228,6 +228,13 @@ abstract public class AbstractGenericExperimentRegisterEditForm extends
         attachmentsManager.resetAttachmentFieldSetsInPanel(formPanel);
     }
 
+    @Override
+    protected void revertPanel()
+    {
+        super.revertPanel();
+        attachmentsManager.resetAttachmentFieldSetsInPanel(formPanel);
+    }
+
     private static LabelField createTemplateField(String label,
             final SampleTypeSelectionWidget typeSelection, final CheckBox autoGenerate)
     {
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/AbstractGenericSampleRegisterEditForm.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/AbstractGenericSampleRegisterEditForm.java
index 4fbcaa6c3ea..0a2244a987d 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/AbstractGenericSampleRegisterEditForm.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/AbstractGenericSampleRegisterEditForm.java
@@ -285,6 +285,13 @@ abstract public class AbstractGenericSampleRegisterEditForm extends
         attachmentsManager.resetAttachmentFieldSetsInPanel(formPanel);
     }
 
+    @Override
+    protected void revertPanel()
+    {
+        super.revertPanel();
+        attachmentsManager.resetAttachmentFieldSetsInPanel(formPanel);
+    }
+
     @Override
     protected String getGeneratedCodePrefix()
     {
-- 
GitLab