From 29ed89d61d619fe9367f5b8291c8ed0915cdeb63 Mon Sep 17 00:00:00 2001
From: pkupczyk <pkupczyk>
Date: Fri, 20 Jul 2012 13:41:00 +0000
Subject: [PATCH] SP-199 / BIS-115 : Novartis parent field presentation logic
 changes

SVN: 26166
---
 .../ui/field/MultilineItemsField.java         | 112 ++++++++++++++++++
 .../cisd/openbis/public/css/openbis.css       |   4 +
 2 files changed, 116 insertions(+)

diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/field/MultilineItemsField.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/field/MultilineItemsField.java
index eba5e0fd65d..bfeab10e79b 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/field/MultilineItemsField.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/field/MultilineItemsField.java
@@ -18,6 +18,18 @@ package ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.field;
 
 import java.util.List;
 
+import com.extjs.gxt.ui.client.event.Events;
+import com.extjs.gxt.ui.client.event.FieldEvent;
+import com.extjs.gxt.ui.client.event.Listener;
+import com.google.gwt.dom.client.DivElement;
+import com.google.gwt.dom.client.Document;
+import com.google.gwt.dom.client.TableCellElement;
+import com.google.gwt.dom.client.TableElement;
+import com.google.gwt.dom.client.TableRowElement;
+import com.google.gwt.dom.client.TextAreaElement;
+import com.google.gwt.user.client.Element;
+import com.google.gwt.user.client.Timer;
+
 import ch.systemsx.cisd.common.shared.basic.utils.StringUtils;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.GenericConstants;
 
@@ -28,16 +40,23 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.GenericCon
  */
 public class MultilineItemsField extends MultilineVarcharField
 {
+
+    private DivElement itemCounter;
+
+    private Timer itemCounterRefreshTimer;
+
     /** Constructor for default sized field (5 lines). */
     public MultilineItemsField(final String label, final boolean mandatory)
     {
         super(label, mandatory);
+        initItemCounterListeners();
     }
 
     /** Constructor for multiline field with given number of lines. */
     public MultilineItemsField(final String label, final boolean mandatory, int lines)
     {
         super(label, mandatory, lines);
+        initItemCounterListeners();
     }
 
     /**
@@ -50,6 +69,11 @@ public class MultilineItemsField extends MultilineVarcharField
         {
             return null;
         }
+        return getItems();
+    }
+
+    public final String[] getItems()
+    {
         String text = getValue();
         if (StringUtils.isBlank(text) == false)
         {
@@ -75,6 +99,60 @@ public class MultilineItemsField extends MultilineVarcharField
         setValue(sb.toString());
     }
 
+    private void initItemCounterListeners()
+    {
+        addListener(Events.Change, new Listener<FieldEvent>()
+            {
+                @Override
+                public void handleEvent(FieldEvent be)
+                {
+                    scheduleItemCounterRefresh();
+                }
+            });
+
+        addListener(Events.KeyUp, new Listener<FieldEvent>()
+            {
+                @Override
+                public void handleEvent(FieldEvent be)
+                {
+                    scheduleItemCounterRefresh();
+                }
+            });
+    }
+
+    private void scheduleItemCounterRefresh()
+    {
+        if (itemCounter != null && itemCounterRefreshTimer == null)
+        {
+            itemCounterRefreshTimer = new Timer()
+                {
+                    @Override
+                    public void run()
+                    {
+                        refreshItemCounter();
+                        itemCounterRefreshTimer = null;
+                    }
+                };
+            itemCounterRefreshTimer.schedule(300);
+        }
+    }
+
+    private void refreshItemCounter()
+    {
+        String[] items = getItems();
+        int count = 0;
+
+        for (String item : items)
+        {
+            if (!StringUtils.isBlank(item))
+            {
+                count++;
+            }
+        }
+
+        itemCounter.setInnerText("(" + count + ")");
+    }
+
     private static String createTextValue(List<String> items)
     {
         StringBuilder sb = new StringBuilder();
@@ -94,4 +172,38 @@ public class MultilineItemsField extends MultilineVarcharField
         sb.append(item);
     }
 
+    @Override
+    protected void onRender(Element target, int index)
+    {
+        if (el() == null)
+        {
+            Document doc = Document.get();
+            DivElement wrapper = doc.createDivElement();
+            TableElement table = doc.createTableElement();
+            table.setCellPadding(0);
+            table.setCellSpacing(0);
+            TableRowElement row = doc.createTRElement();
+            TextAreaElement textArea = doc.createTextAreaElement();
+            itemCounter = doc.createDivElement();
+            itemCounter.setClassName("textarea-item-counter");
+
+            TableCellElement textAreaCell = doc.createTDElement();
+            textAreaCell.appendChild(textArea);
+            TableCellElement itemCounterCell = doc.createTDElement();
+            itemCounterCell.appendChild(itemCounter);
+
+            row.appendChild(textAreaCell);
+            row.appendChild(itemCounterCell);
+            table.appendChild(row);
+            wrapper.appendChild(table);
+
+            setElement((Element) wrapper.cast(), target, index);
+            input = el().firstChild().firstChild().firstChild().firstChild();
+
+            refreshItemCounter();
+        }
+
+        super.onRender(target, index);
+    }
+
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/public/css/openbis.css b/openbis/source/java/ch/systemsx/cisd/openbis/public/css/openbis.css
index f46937cd134..d96b42b2a84 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/public/css/openbis.css
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/public/css/openbis.css
@@ -266,6 +266,10 @@ body,div,td,.default-text {
 	font-style: italic;
 }
 
+.textarea-item-counter {
+	margin-left: 5px;	
+}
+
 /*****************************
  * Movie buttons
  *****************************/
-- 
GitLab