From 261d9fa7dbb4109f756990dbca62cebe7fca7f9e Mon Sep 17 00:00:00 2001
From: buczekp <buczekp>
Date: Tue, 23 Jun 2009 19:51:42 +0000
Subject: [PATCH] [LMS-960] improved attachments manager implementation to
 allow adding fieldsests for attachments dynamically to GUI

SVN: 11510
---
 .../client/web/client/application/Dict.java   |  2 +-
 .../ui/file/AttachmentsFileFieldManager.java  | 75 +++++++++++++------
 .../application/ui/file/FileFieldManager.java |  3 +-
 .../AbstractProjectEditRegisterForm.java      | 21 +++---
 .../dataset/GenericDataSetViewer.java         |  5 +-
 ...ractGenericExperimentRegisterEditForm.java | 13 ++--
 .../GenericExperimentRegistrationForm.java    | 11 +--
 .../sample/GenericSampleEditForm.java         |  5 +-
 .../sample/GenericSampleRegistrationForm.java | 17 +++--
 .../cisd/openbis/public/common-dictionary.js  |  2 +-
 10 files changed, 89 insertions(+), 65 deletions(-)

diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/Dict.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/Dict.java
index 7a503c7b4ab..0a61fe54fbb 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/Dict.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/Dict.java
@@ -649,7 +649,7 @@ public abstract class Dict
 
     public static final String REASON = "reason";
 
-    public static final String ADD_MORE_ATTACHMENTS = "add_more_attachments";
+    public static final String ADD_ATTACHMENT = "add_attachment";
 
     public static final String DATA_SET_UPLOAD = "data_set_upload";
 
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/file/AttachmentsFileFieldManager.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/file/AttachmentsFileFieldManager.java
index f01bdac821a..17ebd3c75eb 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/file/AttachmentsFileFieldManager.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/file/AttachmentsFileFieldManager.java
@@ -21,7 +21,6 @@ import java.util.List;
 
 import com.extjs.gxt.ui.client.event.BaseEvent;
 import com.extjs.gxt.ui.client.event.Listener;
-import com.extjs.gxt.ui.client.widget.form.FieldSet;
 import com.extjs.gxt.ui.client.widget.form.FormPanel;
 import com.extjs.gxt.ui.client.widget.form.LabelField;
 import com.google.gwt.user.client.Event;
@@ -38,12 +37,25 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewAttachment;
  */
 public class AttachmentsFileFieldManager extends FileFieldManager<AttachmentFileUploadField>
 {
+    // by default there are no attachment field sets created
+    private static final int DEFAULT_NUMBER_OF_ATTACHMENTS = 0;
 
-    public AttachmentsFileFieldManager(final String sessionKey, final int initialNumberOfFields,
+    private final int initialNumberOfFields;
+
+    private LabelField addAttachmentLink;
+
+    public AttachmentsFileFieldManager(final String sessionKey,
+            final IMessageProvider messageProvider)
+    {
+        this(sessionKey, DEFAULT_NUMBER_OF_ATTACHMENTS, messageProvider);
+    }
+
+    private AttachmentsFileFieldManager(final String sessionKey, final int initialNumberOfFields,
             final IMessageProvider messageProvider)
     {
         super(sessionKey, initialNumberOfFields, messageProvider.getMessage(Dict.FILE),
                 messageProvider);
+        this.initialNumberOfFields = initialNumberOfFields;
     }
 
     @Override
@@ -54,21 +66,39 @@ public class AttachmentsFileFieldManager extends FileFieldManager<AttachmentFile
 
     public void addAttachmentFieldSetsToPanel(FormPanel panel)
     {
-        boolean first = true;
-        for (AttachmentFileUploadField attachmentField : this.getFields())
+        addAttachmentLink =
+                createAddAttachmentLink(messageProvider.getMessage(Dict.ADD_ATTACHMENT), panel);
+        panel.add(addAttachmentLink);
+        for (AttachmentFileUploadField attachmentField : getFields())
         {
-            FieldSet fieldSet = attachmentField.getFieldSet();
-            if (first)
-            {
-                fieldSet.add(createAddMoreAttachmentsLink(messageProvider
-                        .getMessage(Dict.ADD_MORE_ATTACHMENTS)));
-                first = false;
-            } else
-            {
-                fieldSet.hide();
-            }
-            panel.add(fieldSet);
+            addFileFieldsetToPanel(attachmentField, panel);
+        }
+    }
+
+    public void resetAttachmentFieldSetsInPanel(FormPanel panel)
+    {
+        for (AttachmentFileUploadField attachmentField : getFields())
+        {
+            removeFileFieldsetFromPanel(attachmentField, panel);
         }
+        getFields().clear();
+        for (int i = 0; i < initialNumberOfFields; i++)
+        {
+            AttachmentFileUploadField newField = addField();
+            addFileFieldsetToPanel(newField, panel);
+        }
+        panel.layout();
+    }
+
+    private void removeFileFieldsetFromPanel(AttachmentFileUploadField attachmentField,
+            FormPanel panel)
+    {
+        panel.remove(attachmentField.getFieldSet());
+    }
+
+    private void addFileFieldsetToPanel(AttachmentFileUploadField attachmentField, FormPanel panel)
+    {
+        panel.add(attachmentField.getFieldSet());
     }
 
     public List<NewAttachment> extractAttachments()
@@ -85,19 +115,20 @@ public class AttachmentsFileFieldManager extends FileFieldManager<AttachmentFile
         return result;
     }
 
-    private LabelField createAddMoreAttachmentsLink(String label)
+    @SuppressWarnings("unchecked")
+    private LabelField createAddAttachmentLink(final String label, final FormPanel panel)
     {
-        final LabelField result = new LabelField(LinkRenderer.renderAsLink(label));
+        final String link = LinkRenderer.renderAsLink(label);
+        final LabelField result = new LabelField(link);
+        result.setOriginalValue(link);
         result.sinkEvents(Event.ONCLICK);
         result.addListener(Event.ONCLICK, new Listener<BaseEvent>()
             {
                 public void handleEvent(BaseEvent be)
                 {
-                    for (AttachmentFileUploadField attachmentField : getFields())
-                    {
-                        attachmentField.getFieldSet().show();
-                    }
-                    result.hide();
+                    AttachmentFileUploadField newField = addField();
+                    addFileFieldsetToPanel(newField, panel);
+                    panel.layout();
                 }
             });
         return result;
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/file/FileFieldManager.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/file/FileFieldManager.java
index d68752447f1..de1a92a4a31 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/file/FileFieldManager.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/file/FileFieldManager.java
@@ -73,8 +73,7 @@ public abstract class FileFieldManager<T extends FileUploadField>
         return fileFields;
     }
 
-    @SuppressWarnings("unused")
-    private FileUploadField addField()
+    protected T addField()
     {
         int counter = fileFields.size();
         T field = createFileUploadField(counter);
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/project/AbstractProjectEditRegisterForm.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/project/AbstractProjectEditRegisterForm.java
index d4bc3ffc658..11f3763e063 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/project/AbstractProjectEditRegisterForm.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/project/AbstractProjectEditRegisterForm.java
@@ -47,8 +47,6 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewAttachment;
 abstract class AbstractProjectEditRegisterForm extends AbstractRegistrationForm
 {
 
-    private static final int DEFAULT_NUMBER_OF_ATTACHMENTS = 3;
-
     final IViewContext<ICommonClientServiceAsync> viewContext;
 
     protected CodeField projectCodeField;
@@ -57,7 +55,7 @@ abstract class AbstractProjectEditRegisterForm extends AbstractRegistrationForm
 
     protected GroupSelectionWidget groupField;
 
-    private AttachmentsFileFieldManager attachmentManager;
+    private AttachmentsFileFieldManager attachmentsManager;
 
     protected final String sessionKey;
 
@@ -77,9 +75,7 @@ abstract class AbstractProjectEditRegisterForm extends AbstractRegistrationForm
         super(viewContext, createId(projectIdOrNull), DEFAULT_LABEL_WIDTH + 20, DEFAULT_FIELD_WIDTH);
         this.viewContext = viewContext;
         sessionKey = createId(projectIdOrNull);
-        attachmentManager =
-                new AttachmentsFileFieldManager(sessionKey, DEFAULT_NUMBER_OF_ATTACHMENTS,
-                        viewContext);
+        attachmentsManager = new AttachmentsFileFieldManager(sessionKey, viewContext);
         projectCodeField = createProjectCodeField();
         groupField = createGroupField();
         projectDescriptionField = createProjectDescriptionField();
@@ -123,12 +119,19 @@ abstract class AbstractProjectEditRegisterForm extends AbstractRegistrationForm
         return field;
     }
 
+    @Override
+    protected void resetPanel()
+    {
+        super.resetPanel();
+        attachmentsManager.resetAttachmentFieldSetsInPanel(formPanel);
+    }
+
     private final void addFormFields()
     {
         formPanel.add(projectCodeField);
         formPanel.add(groupField);
         formPanel.add(projectDescriptionField);
-        attachmentManager.addAttachmentFieldSetsToPanel(formPanel);
+        attachmentsManager.addAttachmentFieldSetsToPanel(formPanel);
         formPanel.addListener(Events.Submit, new FormPanelListener(infoBox)
             {
                 @Override
@@ -156,7 +159,7 @@ abstract class AbstractProjectEditRegisterForm extends AbstractRegistrationForm
                 {
                     if (formPanel.isValid())
                     {
-                        if (attachmentManager.filesDefined() > 0)
+                        if (attachmentsManager.filesDefined() > 0)
                         {
                             setUploadEnabled(false);
                             formPanel.submit();
@@ -194,7 +197,7 @@ abstract class AbstractProjectEditRegisterForm extends AbstractRegistrationForm
 
     protected List<NewAttachment> extractAttachments()
     {
-        return attachmentManager.extractAttachments();
+        return attachmentsManager.extractAttachments();
     }
 
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/dataset/GenericDataSetViewer.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/dataset/GenericDataSetViewer.java
index 0193a4f3a5b..f79077f4c19 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/dataset/GenericDataSetViewer.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/dataset/GenericDataSetViewer.java
@@ -172,7 +172,7 @@ public final class GenericDataSetViewer extends
 
     /**
      * Holder of a {@link Button} that goes to external data browsing on selection. The button is
-     * disabled until this holder is set up with {@link #setupData(ExternalData)}.
+     * disabled until data is successfully loaded by the viewer.
      */
     private class BrowseButtonHolder
     {
@@ -188,7 +188,7 @@ public final class GenericDataSetViewer extends
             Button result = new Button(viewContext.getMessage(Dict.BUTTON_VIEW));
             result.setTitle(viewContext.getMessage(Dict.TOOLTIP_VIEW_DATASET));
             result.setId(createChildId(VIEW_BUTTON_ID_SUFFIX));
-            result.setEnabled(false);
+            result.disable();
             return result;
         }
 
@@ -208,7 +208,6 @@ public final class GenericDataSetViewer extends
                         DataSetUtils.showDataSet(data, viewContext.getModel());
                     }
                 });
-            button.enable();
         }
     }
 
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 275f9fa6b75..10cf10cf3e0 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
@@ -69,8 +69,6 @@ abstract public class AbstractGenericExperimentRegisterEditForm
         extends
         AbstractGenericEntityRegistrationForm<ExperimentType, ExperimentTypePropertyType, ExperimentProperty>
 {
-    private static final int DEFAULT_NUMBER_OF_ATTACHMENTS = 3;
-
     protected AttachmentsFileFieldManager attachmentsManager;
 
     protected String attachmentsSessionKey;
@@ -211,6 +209,13 @@ abstract public class AbstractGenericExperimentRegisterEditForm
         attachmentsManager.addAttachmentFieldSetsToPanel(panel);
     }
 
+    @Override
+    protected void resetPanel()
+    {
+        super.resetPanel();
+        attachmentsManager.resetAttachmentFieldSetsInPanel(formPanel);
+    }
+
     private static LabelField createTemplateField(String label,
             final SampleTypeSelectionWidget typeSelection, final CheckBox autoGenerate)
     {
@@ -272,9 +277,7 @@ abstract public class AbstractGenericExperimentRegisterEditForm
                 createTemplateField(viewContext.getMessage(Dict.FILE_TEMPLATE_LABEL),
                         importSampleTypeSelection, autoGenerateCodes);
 
-        attachmentsManager =
-                new AttachmentsFileFieldManager(attachmentsSessionKey,
-                        DEFAULT_NUMBER_OF_ATTACHMENTS, viewContext);
+        attachmentsManager = new AttachmentsFileFieldManager(attachmentsSessionKey, viewContext);
         formPanel.addListener(Events.Submit, new FormPanelListener(infoBox)
             {
                 @Override
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/experiment/GenericExperimentRegistrationForm.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/experiment/GenericExperimentRegistrationForm.java
index c9972939418..3f6661581f1 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/experiment/GenericExperimentRegistrationForm.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/experiment/GenericExperimentRegistrationForm.java
@@ -53,10 +53,7 @@ public final class GenericExperimentRegistrationForm extends
     protected void resetFieldsAfterSave()
     {
         codeField.reset();
-        for (FileUploadField attachmentField : attachmentsManager.getFields())
-        {
-            attachmentField.reset();
-        }
+        attachmentsManager.resetAttachmentFieldSetsInPanel(formPanel);
         for (FileUploadField importSamplesField : importSamplesFileManager.getFields())
         {
             importSamplesField.reset();
@@ -89,12 +86,6 @@ public final class GenericExperimentRegistrationForm extends
 
     }
 
-    @Override
-    protected void resetPanel()
-    {
-        super.resetPanel();
-    }
-
     @Override
     protected void save()
     {
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/GenericSampleEditForm.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/GenericSampleEditForm.java
index b7a2fbc73ec..b241777c5cb 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/GenericSampleEditForm.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/GenericSampleEditForm.java
@@ -59,7 +59,6 @@ import ch.systemsx.cisd.openbis.plugin.generic.client.web.client.application.exp
 public final class GenericSampleEditForm extends
         AbstractGenericEntityRegistrationForm<SampleType, SampleTypePropertyType, SampleProperty>
 {
-    private static final int DEFAULT_NUMBER_OF_ATTACHMENTS = 3;
 
     private AttachmentsFileFieldManager attachmentsManager;
 
@@ -178,9 +177,7 @@ public final class GenericSampleEditForm extends
     {
         experimentFieldOrNull =
                 canAttachToExperiment(originalSample) ? createExperimentField() : null;
-        attachmentsManager =
-                new AttachmentsFileFieldManager(sessionKey, DEFAULT_NUMBER_OF_ATTACHMENTS,
-                        viewContext);
+        attachmentsManager = new AttachmentsFileFieldManager(sessionKey, viewContext);
         formPanel.addListener(Events.Submit, new FormPanelListener(infoBox)
             {
                 @Override
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/GenericSampleRegistrationForm.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/GenericSampleRegistrationForm.java
index 2446333e810..560afa94562 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/GenericSampleRegistrationForm.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/GenericSampleRegistrationForm.java
@@ -24,7 +24,6 @@ import java.util.List;
 import com.extjs.gxt.ui.client.Events;
 import com.extjs.gxt.ui.client.event.ButtonEvent;
 import com.extjs.gxt.ui.client.event.SelectionListener;
-import com.extjs.gxt.ui.client.widget.form.FileUploadField;
 import com.extjs.gxt.ui.client.widget.form.FormPanel;
 import com.extjs.gxt.ui.client.widget.form.TextField;
 
@@ -66,8 +65,6 @@ public final class GenericSampleRegistrationForm extends
 
     public static final String ID_SUFFIX_PARENT = "parent";
 
-    private static final int DEFAULT_NUMBER_OF_ATTACHMENTS = 3;
-
     public static final String SESSION_KEY =
             createSimpleId(REGISTRATION_IDENTIFIER, EntityKind.SAMPLE);
 
@@ -80,7 +77,7 @@ public final class GenericSampleRegistrationForm extends
     private TextField<String> parent;
 
     private AttachmentsFileFieldManager attachmentsManager =
-            new AttachmentsFileFieldManager(SESSION_KEY, DEFAULT_NUMBER_OF_ATTACHMENTS, viewContext);
+            new AttachmentsFileFieldManager(SESSION_KEY, viewContext);
 
     public GenericSampleRegistrationForm(
             final IViewContext<IGenericClientServiceAsync> viewContext, final SampleType sampleType)
@@ -113,10 +110,7 @@ public final class GenericSampleRegistrationForm extends
     protected void resetFieldsAfterSave()
     {
         codeField.reset();
-        for (FileUploadField attachmentField : attachmentsManager.getFields())
-        {
-            attachmentField.reset();
-        }
+        attachmentsManager.resetAttachmentFieldSetsInPanel(formPanel);
     }
 
     public final void registerSample()
@@ -228,6 +222,13 @@ public final class GenericSampleRegistrationForm extends
         attachmentsManager.addAttachmentFieldSetsToPanel(panel);
     }
 
+    @Override
+    protected void resetPanel()
+    {
+        super.resetPanel();
+        attachmentsManager.resetAttachmentFieldSetsInPanel(formPanel);
+    }
+
     @Override
     protected PropertiesEditor<SampleType, SampleTypePropertyType, SampleProperty> createPropertiesEditor(
             String string, IViewContext<ICommonClientServiceAsync> context)
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/public/common-dictionary.js b/openbis/source/java/ch/systemsx/cisd/openbis/public/common-dictionary.js
index d07337fb6ce..f40fb59dfdf 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/public/common-dictionary.js
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/public/common-dictionary.js
@@ -31,7 +31,7 @@ var common = {
   url: "URL",
   reason: "Reason",
   delete_confirmation_message_with_reason: "You are deleting {0} {1}(s).<br><br>Please enter a reason or cancel deletion.",
-  add_more_attachments: "Add more attachments",
+  add_attachment: "Add attachment",
   
   //
   // Field
-- 
GitLab