]> source.dussan.org Git - vaadin-framework.git/commitdiff
Added support for long/float/double variables and attributes.
authorJouni Koivuviita <jouni.koivuviita@itmill.com>
Thu, 2 Aug 2007 13:15:31 +0000 (13:15 +0000)
committerJouni Koivuviita <jouni.koivuviita@itmill.com>
Thu, 2 Aug 2007 13:15:31 +0000 (13:15 +0000)
Slider component implementation robust (vertical version still missing).

svn changeset:1943/svn branch:trunk

src/com/itmill/toolkit/terminal/gwt/client/ApplicationConnection.java
src/com/itmill/toolkit/terminal/gwt/client/ui/ISlider.java
src/com/itmill/toolkit/terminal/gwt/public/component-themes/slider/css/slider.css
src/com/itmill/toolkit/terminal/gwt/server/CommunicationManager.java
src/com/itmill/toolkit/terminal/gwt/server/JsonPaintTarget.java
src/com/itmill/toolkit/ui/Slider.java

index d52cab71731db93cfcbf11c9cf6f4a7026020014..b50b05ef61eabb79ce460ff686d5f2e77ea4a6a4 100755 (executable)
@@ -222,6 +222,21 @@ public class ApplicationConnection implements EntryPoint {
                        int newValue, boolean immediate) {
                addVariableToQueue(paintableId, variableName, "" + newValue, immediate, 'i');
        }
+       
+       public void updateVariable(String paintableId, String variableName,
+                       long newValue, boolean immediate) {
+               addVariableToQueue(paintableId, variableName, "" + newValue, immediate, 'l');
+       }
+       
+       public void updateVariable(String paintableId, String variableName,
+                       float newValue, boolean immediate) {
+               addVariableToQueue(paintableId, variableName, "" + newValue, immediate, 'f');
+       }
+       
+       public void updateVariable(String paintableId, String variableName,
+                       double newValue, boolean immediate) {
+               addVariableToQueue(paintableId, variableName, "" + newValue, immediate, 'd');
+       }
 
        public void updateVariable(String paintableId, String variableName,
                        boolean newValue, boolean immediate) {
index abef6c45240ad766005252b24735f7e6cfc575cf..94d176817b9a481982971b9a763c3a7b623deed8 100644 (file)
@@ -69,16 +69,18 @@ public class ISlider extends Widget implements Paintable {
                // Hide initially\r
                DOM.setStyleAttribute(smaller, "display", "none");\r
                DOM.setStyleAttribute(bigger, "display", "none");\r
+               DOM.setStyleAttribute(handle, "visibility", "hidden");\r
                \r
                DOM.sinkEvents(base, Event.ONMOUSEDOWN);\r
                DOM.sinkEvents(handle, Event.MOUSEEVENTS);\r
-               DOM.sinkEvents(smaller, Event.ONMOUSEDOWN);\r
-               DOM.sinkEvents(bigger, Event.ONMOUSEDOWN);\r
+               DOM.sinkEvents(smaller, Event.ONMOUSEDOWN | Event.ONMOUSEUP);\r
+               DOM.sinkEvents(bigger, Event.ONMOUSEDOWN | Event.ONMOUSEUP);\r
        }\r
 \r
        public void updateFromUIDL(UIDL uidl, ApplicationConnection client) {\r
                \r
                this.client = client;\r
+               this.id = uidl.getId();\r
                \r
                // Ensure correct implementation (handle own caption)\r
                if (client.updateComponent(this, uidl, false))\r
@@ -123,37 +125,35 @@ public class ISlider extends Widget implements Paintable {
                        Timer delay = new Timer() {\r
                                public void run() {\r
                                        buildHandle();\r
-                                       setValue(value, true);\r
+                                       setValue(value, false, false);\r
                                }\r
                        };\r
                        delay.schedule(100);\r
                } else {\r
                        buildHandle();\r
-                       setValue(value, true);\r
+                       setValue(value, false, false);\r
                }\r
        }\r
 \r
        private void buildBase() {\r
                if(vertical) {\r
-                       if(size > -1)\r
-                               DOM.setStyleAttribute(base, "height", size + "px");\r
-                       else DOM.setStyleAttribute(base, "height", "120px");\r
+                       // TODO\r
                } else {\r
                        if(size > -1)\r
-                               DOM.setStyleAttribute(base, "width", size + "px");\r
+                               DOM.setStyleAttribute(getElement(), "width", size + "px");\r
                        else {\r
                                Element p = DOM.getParent(getElement());\r
                                if(Integer.parseInt(DOM.getAttribute(p, "offsetWidth")) > 50)\r
-                                       DOM.setStyleAttribute(base, "width", "auto");\r
+                                       DOM.setStyleAttribute(getElement(), "width", "auto");\r
                                else {\r
                                        // Set minimum of 50px width and adjust after all \r
                                        // components have (supposedly) been drawn completely.\r
-                                       DOM.setStyleAttribute(base, "width", "50px");\r
+                                       DOM.setStyleAttribute(getElement(), "width", "50px");\r
                                        Timer adjust = new Timer() {\r
                                                public void run() {\r
                                                        Element p = DOM.getParent(getElement());\r
                                                        if(Integer.parseInt(DOM.getAttribute(p, "offsetWidth")) > 50)\r
-                                                               DOM.setStyleAttribute(base, "width", "auto");\r
+                                                               DOM.setStyleAttribute(getElement(), "width", "auto");\r
                                                }\r
                                        };\r
                                        adjust.schedule(100);\r
@@ -163,7 +163,7 @@ public class ISlider extends Widget implements Paintable {
                // Allow absolute positioning of handle\r
                DOM.setStyleAttribute(base, "position", "relative");\r
                \r
-               // TODO attach listeners for clicking on base, focusing and arrow keys\r
+               // TODO attach listeners for focusing and arrow keys\r
        }\r
        \r
        private void buildHandle() {\r
@@ -177,12 +177,21 @@ public class ISlider extends Widget implements Paintable {
                        DOM.setStyleAttribute(handle, "top", (t/2)+"px");\r
                        DOM.setStyleAttribute(handle, "left", "0px");\r
                        int w = (int) (Double.parseDouble(DOM.getAttribute(base, "offsetWidth")) / 100 * handleSize);\r
+                       if(handleSize == -1) {\r
+                               int baseW = Integer.parseInt(DOM.getAttribute(base, "offsetWidth"));\r
+                               double range = (max - min) * (resolution+1) * 1.5;\r
+                               w = (int) (baseW - range);\r
+                       }\r
+                       if(w < 3)\r
+                               w = 3;\r
                        DOM.setStyleAttribute(handle, "width", w+"px");\r
                }\r
                \r
+               DOM.setStyleAttribute(handle, "visibility", "visible");\r
+               \r
        }\r
        \r
-       private void setValue(Double value, boolean animate) {\r
+       private void setValue(Double value, boolean animate, boolean updateToServer) {\r
                if(vertical) {\r
                        // TODO\r
                } else {\r
@@ -191,17 +200,21 @@ public class ISlider extends Widget implements Paintable {
                        int range = baseWidth - handleWidth;\r
                        double v = value.doubleValue();\r
                        double valueRange = max - min;\r
-                       final double pos = range * ((v - min) / valueRange);\r
+                       double p = 0;\r
+                       if(valueRange != 0)\r
+                               p = range * ((v - min) / valueRange);\r
+                       final double pos = p;\r
+                               \r
                        \r
                        String styleLeft = DOM.getStyleAttribute(handle, "left");\r
                        int left = Integer.parseInt(styleLeft.substring(0, styleLeft.length()-2));\r
 \r
-                       if((int)pos != left && animate) {\r
+                       if((int)(Math.round(pos)) != left && animate) {\r
                                if(anim != null)\r
                                        anim.cancel();\r
                                anim = new Timer() {\r
                                        private int left;\r
-                                       private int goal = (int)pos;\r
+                                       private int goal = (int) Math.round(pos);\r
                                        private int dir = 0;\r
                                        public void run() {\r
                                                String styleLeft = DOM.getStyleAttribute(handle, "left");\r
@@ -221,32 +234,68 @@ public class ISlider extends Widget implements Paintable {
                                };\r
                                anim.scheduleRepeating(50);\r
                        } else DOM.setStyleAttribute(handle, "left", pos+"px");\r
-                       DOM.setAttribute(handle, "title", ""+v);\r
+                       //DOM.setAttribute(handle, "title", ""+v);\r
                }\r
                \r
                this.value = value;\r
+               \r
+               if(updateToServer)\r
+                       client.updateVariable(id, "value", value.doubleValue(), immediate);\r
        }\r
 \r
        public void onBrowserEvent(Event event) {\r
+               if(disabled || readonly)\r
+                       return;\r
                Element targ = DOM.eventGetTarget(event);\r
                if(dragging || DOM.compare(targ, handle)) {\r
                        processHandleEvent(event);\r
+                       \r
                } else if(DOM.compare(targ, smaller)) {\r
-                       if(DOM.eventGetType(event) == Event.ONMOUSEDOWN)\r
-                               decrease();\r
+                       // Decrease value by resolution\r
+                       if(DOM.eventGetType(event) == Event.ONMOUSEDOWN) {\r
+                               setValue(new Double(value.doubleValue()-Math.pow(10, -resolution)), false, true);\r
+                               if(anim != null)\r
+                                       anim.cancel();\r
+                               anim = new Timer() {\r
+                                       public void run() {\r
+                                               if(value.doubleValue()-Math.pow(10, -resolution) > min)\r
+                                                       setValue(new Double(value.doubleValue()-Math.pow(10, -resolution)), false, true);\r
+                                       }\r
+                               };\r
+                               anim.scheduleRepeating(100);\r
+                               DOM.eventCancelBubble(event, true);\r
+                       } else if(DOM.eventGetType(event) == Event.ONMOUSEUP) {\r
+                               anim.cancel();\r
+                       }\r
+                       \r
                } else if(DOM.compare(targ, bigger)) {\r
-                       if(DOM.eventGetType(event) == Event.ONMOUSEDOWN)\r
-                               increase();\r
-               } else {\r
+                       // Increase value by resolution\r
+                       if(DOM.eventGetType(event) == Event.ONMOUSEDOWN) {\r
+                               setValue(new Double(value.doubleValue()+Math.pow(10, -resolution)), false, true);\r
+                               if(anim != null)\r
+                                       anim.cancel();\r
+                               anim = new Timer() {\r
+                                       public void run() {\r
+                                               if(value.doubleValue()-Math.pow(10, -resolution) < max)\r
+                                                       setValue(new Double(value.doubleValue()+Math.pow(10, -resolution)), false, true);\r
+                                       }\r
+                               };\r
+                               anim.scheduleRepeating(100);\r
+                               DOM.eventCancelBubble(event, true);\r
+                       } else if(DOM.eventGetType(event) == Event.ONMOUSEUP) {\r
+                               anim.cancel();\r
+                       }\r
+                       \r
+               } else\r
                        processBaseEvent(event);\r
-               }\r
        }\r
        \r
        private void processHandleEvent(Event event) {\r
                switch (DOM.eventGetType(event)) {\r
                case Event.ONMOUSEDOWN:\r
                        if(!disabled && !readonly) {\r
-                               anim.cancel();\r
+                               if(anim != null)\r
+                                       anim.cancel();\r
                                dragging = true;\r
                                DOM.setCapture(handle);\r
                                DOM.eventPreventDefault(event); // prevent selecting text\r
@@ -255,12 +304,14 @@ public class ISlider extends Widget implements Paintable {
                        break;\r
                case Event.ONMOUSEMOVE:\r
                        if (dragging) {\r
-                               setValueByEvent(event, false);\r
+                               DOM.setCapture(handle);\r
+                               setValueByEvent(event, false, false);\r
                        }\r
                        break;\r
                case Event.ONMOUSEUP:\r
                        dragging = false;\r
                        DOM.releaseCapture(handle);\r
+                       setValueByEvent(event, true, true);\r
                        break;\r
                default:\r
                        break;\r
@@ -270,15 +321,15 @@ public class ISlider extends Widget implements Paintable {
        private void processBaseEvent(Event event) {\r
                if(DOM.eventGetType(event) == Event.ONMOUSEDOWN) {\r
                        if(!disabled && !readonly && !dragging) {\r
-                               setValueByEvent(event, true);\r
+                               setValueByEvent(event, true, true);\r
                                DOM.eventCancelBubble(event, true);\r
                        }\r
                }\r
        }\r
        \r
-       private void setValueByEvent(Event event, boolean animate) {\r
+       private void setValueByEvent(Event event, boolean animate, boolean roundup) {\r
                int x = DOM.eventGetClientX(event);\r
-               int y = DOM.eventGetClientY(event);\r
+               //int y = DOM.eventGetClientY(event);\r
                double v = min; // Fallback to min\r
                if(vertical) {\r
                        // TODO\r
@@ -294,37 +345,15 @@ public class ISlider extends Widget implements Paintable {
                else if(v > max)\r
                        v = max;\r
                \r
-               if(resolution > 0) {\r
-                       v = (int)(v * (double)Math.pow(10, resolution));\r
-                       v = v / (double)Math.pow(10, resolution);\r
-                       setValue(new Double(v), animate);\r
-               } else\r
-                       setValue(new Double((int)v), animate);\r
+               if(roundup) {\r
+                       if(resolution > 0) {\r
+                               v = (int)(v * (double)Math.pow(10, resolution));\r
+                               v = v / (double)Math.pow(10, resolution);\r
+                       } else\r
+                               v = Math.round(v);\r
+               }\r
                \r
-       }\r
-       \r
-       private void decrease() {\r
-               double diff = (max-min)/max*10 + (max-min)/10;\r
-               double v = value.doubleValue()-diff;\r
-               if(resolution > 0) {\r
-                       v = (int)(v * (double)Math.pow(10, resolution));\r
-                       v = v / (double)Math.pow(10, resolution);\r
-               } else v = (int)v;\r
-               if(v < min)\r
-                       v = min;\r
-               setValue(new Double(v), true);\r
-       }\r
-       \r
-       private void increase() {\r
-               double diff = (max-min)/max*10 + (max-min)/10;\r
-               double v = value.doubleValue()+diff;\r
-               if(resolution > 0) {\r
-                       v = (int)(v * (double)Math.pow(10, resolution));\r
-                       v = v / (double)Math.pow(10, resolution);\r
-               } else v = (int)v;\r
-               if(v > max)\r
-                       v = max;\r
-               setValue(new Double(v), true);\r
+               setValue(new Double(v), animate, roundup);\r
        }\r
 \r
 }\r
index 1cbbb90d01771b0481aeeff4516e6993a054adfd..a11ec6e3f4fcd2e10336cebfa54c633366e36e3b 100644 (file)
@@ -1,14 +1,93 @@
 .i-slider {\r
-\r
+       background: #c3d0dd url(../img/bg.png) repeat-x;\r
+       border: 1px solid #29528a;\r
+       border-left: none;\r
+       border-right: none;\r
+       height: 14px;\r
+}\r
+.i-slider:before {\r
+       display: block;\r
+       width: 1px;\r
+       height: 14px;\r
+       background-color: #29528a;\r
+       border-top: 1px solid #b9c8dc;\r
+       border-bottom: 1px solid #b9c8dc;\r
+       margin: -1px 0 -15px -1px;\r
+       content: "";\r
+}\r
+.i-slider:after {\r
+       display: block;\r
+       width: 1px;\r
+       height: 14px;\r
+       background-color: #29528a;\r
+       border-top: 1px solid #b9c8dc;\r
+       border-bottom: 1px solid #b9c8dc;\r
+       margin: -15px 0 0 100%;\r
+       content: "";\r
 }\r
-\r
 .i-slider-base {\r
-       background: #eee;\r
-       height: 10px;\r
+       background: #c3d0dd url(../img/bg.png) repeat-x;\r
+       height: 14px;\r
+       margin: 0 1px;\r
+       overflow: hidden;\r
 }\r
-\r
 .i-slider-handle {\r
-       background: #ccc;\r
+       background: #fff url(../img/handle-bg.png) repeat-x;\r
+       border: 1px solid #29528a;\r
        height: 10px;\r
        overflow: hidden;\r
+}\r
+.i-slider-bigger {\r
+       background: #dde4ef url(../img/arrow-right.png);\r
+       float: right;\r
+       width: 14px;\r
+       height: 14px;\r
+       overflow: hidden;\r
+       margin: 0 0 0 1px;\r
+}\r
+.i-slider-bigger:hover {\r
+       background-image: url(../img/arrow-right-over.png);\r
+}\r
+.i-slider-smaller {\r
+       background: #dde4ef url(../img/arrow-left.png);\r
+       float: left;\r
+       width: 14px;\r
+       height: 14px;\r
+       overflow: hidden;\r
+       margin: 0 1px 0 0;\r
+}\r
+.i-slider-smaller:hover {\r
+       background-image: url(../img/arrow-left-over.png);\r
+}\r
+\r
+\r
+\r
+/*-----------------\r
+  Vertical styles \r
+  -----------------*/\r
+\r
+.i-slider-vertical {\r
+\r
+}\r
+.i-slider-vertical .i-slider-base {\r
+       \r
+}\r
+.i-slider-vertical .i-slider-handle {\r
+\r
+}\r
+.i-slider-vertical .i-slider-bigger {\r
+\r
+}\r
+\r
+\r
+\r
+/*--------------------\r
+  IE specific styles\r
+  -------------------*/\r
+\r
+* html .i-slider {\r
+       border: 1px solid #29528a;\r
+}\r
+*+html .i-slider {\r
+       border: 1px solid #29528a;\r
 }
\ No newline at end of file
index 2e81ed08651cf24fee84c89addf98ec3f17e7cf5..f588c62b1068c40d54d816f7932602578ee3cc5f 100644 (file)
@@ -29,7 +29,6 @@
 package com.itmill.toolkit.terminal.gwt.server;
 
 import java.io.BufferedWriter;
-import java.io.FileInputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.InputStreamReader;
@@ -57,7 +56,6 @@ import java.util.WeakHashMap;
 
 import javax.servlet.ServletException;
 import javax.servlet.ServletOutputStream;
-import javax.servlet.http.HttpServlet;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
@@ -65,7 +63,6 @@ import com.itmill.toolkit.Application;
 import com.itmill.toolkit.Application.WindowAttachEvent;
 import com.itmill.toolkit.Application.WindowDetachEvent;
 import com.itmill.toolkit.terminal.DownloadStream;
-import com.itmill.toolkit.terminal.PaintTarget;
 import com.itmill.toolkit.terminal.Paintable;
 import com.itmill.toolkit.terminal.URIHandler;
 import com.itmill.toolkit.terminal.VariableOwner;
@@ -452,6 +449,14 @@ public class CommunicationManager implements Paintable.RepaintRequestListener,
                case 'i':
                        val = Integer.valueOf(strValue);
                        break;
+               case 'l':
+                       val = Long.valueOf(strValue);
+               case 'f':
+                       val = Float.valueOf(strValue);
+                       break;
+               case 'd':
+                       val = Double.valueOf(strValue);
+                       break;
                case 'b':
                        val = Boolean.valueOf(strValue);
                        break;
index b5fd6fcd4a45f0439f3b647cd65b84588cbe2def..17fb67a6205515d831313cddce99974d0d0dfcf9 100644 (file)
@@ -434,7 +434,7 @@ public class JsonPaintTarget implements PaintTarget {
        }
        
        /**
-        * Adds a float attribute to component. Atributes must be added before any
+        * Adds a double attribute to component. Atributes must be added before any
         * content is written.
         * 
         * @param name
@@ -561,12 +561,12 @@ public class JsonPaintTarget implements PaintTarget {
         * @throws PaintException
         *             if the paint operation failed.
         */
-       public void addVariable(VariableOwner owner, String name, double value) throws PaintException {
-               tag.addVariable(new DoubleVariable(owner, name, value));
+       public void addVariable(VariableOwner owner, String name, float value) throws PaintException {
+               tag.addVariable(new FloatVariable(owner, name, value));
        }
        
        /**
-        * Adds a float type variable.
+        * Adds a double type variable.
         * 
         * @param owner
         *            the Listener for variable changes.
@@ -578,8 +578,8 @@ public class JsonPaintTarget implements PaintTarget {
         * @throws PaintException
         *             if the paint operation failed.
         */
-       public void addVariable(VariableOwner owner, String name, float value) throws PaintException {
-               tag.addVariable(new FloatVariable(owner, name, value));
+       public void addVariable(VariableOwner owner, String name, double value) throws PaintException {
+               tag.addVariable(new DoubleVariable(owner, name, value));
        }
 
        /**
index 41ecb63d1088b743f058669b60b19d5ab299f132..5210093104f188abfcc6e79135eb4feaece893b7 100644 (file)
@@ -35,7 +35,8 @@ public class Slider extends AbstractField {
        \r
        /**\r
         * Handle size in percents related to base size.\r
-        * Must be a value between 1-100.\r
+        * Must be a value between 1-99. Other values are converted to nearest bound.\r
+        * A negative value sets the width to auto (client calculates).\r
         */\r
        private int handleSize = -1;\r
        \r
@@ -86,13 +87,11 @@ public class Slider extends AbstractField {
        public void setMax(double max) {\r
                this.max = max;\r
                try {\r
-                       if((new Float(getValue().toString())).floatValue() > max)\r
-                               super.setValue(new Float(min));\r
+                       if((new Double(getValue().toString())).doubleValue() > max)\r
+                               super.setValue(new Double(min));\r
                } catch(ClassCastException e) {\r
-                       super.setValue(new Float(max));\r
+                       super.setValue(new Double(max));\r
                }\r
-               if(handleSize == -1)\r
-                       handleSize = (int) ((max-min)/max*10 + (max-min)/10);\r
                requestRepaint();\r
        }\r
 \r
@@ -112,8 +111,6 @@ public class Slider extends AbstractField {
                } catch(ClassCastException e) {\r
                        super.setValue(new Double(min));\r
                }\r
-               if(handleSize == -1)\r
-                       handleSize = (int) ((max-min)/max*10 + (max-min)/10);\r
                requestRepaint();\r
        }\r
 \r
@@ -172,9 +169,13 @@ public class Slider extends AbstractField {
        }\r
 \r
        public void setHandleSize(int handleSize) {\r
-               if(handleSize > 100 || handleSize < 1)\r
-                       return;\r
-               this.handleSize = handleSize;\r
+               if(handleSize < 0)\r
+                       this.handleSize = -1;\r
+               else if(handleSize > 99)\r
+                       this.handleSize = 99;\r
+               else if(handleSize < 1)\r
+                       this.handleSize = 1;\r
+               else this.handleSize = handleSize;\r
                requestRepaint();\r
        }\r
        \r
@@ -195,7 +196,10 @@ public class Slider extends AbstractField {
                super.paintContent(target);\r
                \r
                target.addAttribute("min", min);\r
-               target.addAttribute("max", max);\r
+               if(max > min)\r
+                       target.addAttribute("max", max);\r
+               else\r
+                       target.addAttribute("max", min);\r
                target.addAttribute("resolution", resolution);\r
                \r
                if(resolution > 0)\r
@@ -212,7 +216,10 @@ public class Slider extends AbstractField {
                if(size > -1)\r
                        target.addAttribute("size", size);\r
                \r
-               target.addAttribute("hsize", handleSize);\r
+               if(min != max && min < max)\r
+                       target.addAttribute("hsize", handleSize);\r
+               else\r
+                       target.addAttribute("hsize", 100);\r
                \r
        }\r
 \r
@@ -225,13 +232,20 @@ public class Slider extends AbstractField {
         */\r
        public void changeVariables(Object source, Map variables) {\r
                if (variables.containsKey("value")) {\r
-                       Object newValue = variables.get("value");\r
-                       if(resolution > 0)\r
-                               newValue = new Double(newValue.toString());\r
-                       else \r
-                               newValue = new Integer(newValue.toString());\r
+                       Object value = variables.get("value");\r
+                       Double newValue = new Double(value.toString());\r
                        if(newValue != null && newValue != getValue() && !newValue.equals(getValue())) {\r
-                               setValue(newValue, true);\r
+                               try {\r
+                                       setValue(newValue, true);\r
+                               } catch(ValueOutOfBoundsException e) {\r
+                                       // Convert to nearest bound\r
+                                       double out = e.getValue().doubleValue();\r
+                                       if(out < min)\r
+                                               out = min;\r
+                                       if(out > max)\r
+                                               out = max;\r
+                                       super.setValue(new Double(out), false);\r
+                               }\r
                        }\r
                }\r
        }\r