From: Jouni Koivuviita Date: Thu, 2 Aug 2007 13:15:31 +0000 (+0000) Subject: Added support for long/float/double variables and attributes. X-Git-Tag: 6.7.0.beta1~6144 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=29870aebfd57cca07ca91050c69b700ba0856b1f;p=vaadin-framework.git Added support for long/float/double variables and attributes. Slider component implementation robust (vertical version still missing). svn changeset:1943/svn branch:trunk --- diff --git a/src/com/itmill/toolkit/terminal/gwt/client/ApplicationConnection.java b/src/com/itmill/toolkit/terminal/gwt/client/ApplicationConnection.java index d52cab7173..b50b05ef61 100755 --- a/src/com/itmill/toolkit/terminal/gwt/client/ApplicationConnection.java +++ b/src/com/itmill/toolkit/terminal/gwt/client/ApplicationConnection.java @@ -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) { diff --git a/src/com/itmill/toolkit/terminal/gwt/client/ui/ISlider.java b/src/com/itmill/toolkit/terminal/gwt/client/ui/ISlider.java index abef6c4524..94d176817b 100644 --- a/src/com/itmill/toolkit/terminal/gwt/client/ui/ISlider.java +++ b/src/com/itmill/toolkit/terminal/gwt/client/ui/ISlider.java @@ -69,16 +69,18 @@ public class ISlider extends Widget implements Paintable { // Hide initially DOM.setStyleAttribute(smaller, "display", "none"); DOM.setStyleAttribute(bigger, "display", "none"); + DOM.setStyleAttribute(handle, "visibility", "hidden"); DOM.sinkEvents(base, Event.ONMOUSEDOWN); DOM.sinkEvents(handle, Event.MOUSEEVENTS); - DOM.sinkEvents(smaller, Event.ONMOUSEDOWN); - DOM.sinkEvents(bigger, Event.ONMOUSEDOWN); + DOM.sinkEvents(smaller, Event.ONMOUSEDOWN | Event.ONMOUSEUP); + DOM.sinkEvents(bigger, Event.ONMOUSEDOWN | Event.ONMOUSEUP); } public void updateFromUIDL(UIDL uidl, ApplicationConnection client) { this.client = client; + this.id = uidl.getId(); // Ensure correct implementation (handle own caption) if (client.updateComponent(this, uidl, false)) @@ -123,37 +125,35 @@ public class ISlider extends Widget implements Paintable { Timer delay = new Timer() { public void run() { buildHandle(); - setValue(value, true); + setValue(value, false, false); } }; delay.schedule(100); } else { buildHandle(); - setValue(value, true); + setValue(value, false, false); } } private void buildBase() { if(vertical) { - if(size > -1) - DOM.setStyleAttribute(base, "height", size + "px"); - else DOM.setStyleAttribute(base, "height", "120px"); + // TODO } else { if(size > -1) - DOM.setStyleAttribute(base, "width", size + "px"); + DOM.setStyleAttribute(getElement(), "width", size + "px"); else { Element p = DOM.getParent(getElement()); if(Integer.parseInt(DOM.getAttribute(p, "offsetWidth")) > 50) - DOM.setStyleAttribute(base, "width", "auto"); + DOM.setStyleAttribute(getElement(), "width", "auto"); else { // Set minimum of 50px width and adjust after all // components have (supposedly) been drawn completely. - DOM.setStyleAttribute(base, "width", "50px"); + DOM.setStyleAttribute(getElement(), "width", "50px"); Timer adjust = new Timer() { public void run() { Element p = DOM.getParent(getElement()); if(Integer.parseInt(DOM.getAttribute(p, "offsetWidth")) > 50) - DOM.setStyleAttribute(base, "width", "auto"); + DOM.setStyleAttribute(getElement(), "width", "auto"); } }; adjust.schedule(100); @@ -163,7 +163,7 @@ public class ISlider extends Widget implements Paintable { // Allow absolute positioning of handle DOM.setStyleAttribute(base, "position", "relative"); - // TODO attach listeners for clicking on base, focusing and arrow keys + // TODO attach listeners for focusing and arrow keys } private void buildHandle() { @@ -177,12 +177,21 @@ public class ISlider extends Widget implements Paintable { DOM.setStyleAttribute(handle, "top", (t/2)+"px"); DOM.setStyleAttribute(handle, "left", "0px"); int w = (int) (Double.parseDouble(DOM.getAttribute(base, "offsetWidth")) / 100 * handleSize); + if(handleSize == -1) { + int baseW = Integer.parseInt(DOM.getAttribute(base, "offsetWidth")); + double range = (max - min) * (resolution+1) * 1.5; + w = (int) (baseW - range); + } + if(w < 3) + w = 3; DOM.setStyleAttribute(handle, "width", w+"px"); } + DOM.setStyleAttribute(handle, "visibility", "visible"); + } - private void setValue(Double value, boolean animate) { + private void setValue(Double value, boolean animate, boolean updateToServer) { if(vertical) { // TODO } else { @@ -191,17 +200,21 @@ public class ISlider extends Widget implements Paintable { int range = baseWidth - handleWidth; double v = value.doubleValue(); double valueRange = max - min; - final double pos = range * ((v - min) / valueRange); + double p = 0; + if(valueRange != 0) + p = range * ((v - min) / valueRange); + final double pos = p; + String styleLeft = DOM.getStyleAttribute(handle, "left"); int left = Integer.parseInt(styleLeft.substring(0, styleLeft.length()-2)); - if((int)pos != left && animate) { + if((int)(Math.round(pos)) != left && animate) { if(anim != null) anim.cancel(); anim = new Timer() { private int left; - private int goal = (int)pos; + private int goal = (int) Math.round(pos); private int dir = 0; public void run() { String styleLeft = DOM.getStyleAttribute(handle, "left"); @@ -221,32 +234,68 @@ public class ISlider extends Widget implements Paintable { }; anim.scheduleRepeating(50); } else DOM.setStyleAttribute(handle, "left", pos+"px"); - DOM.setAttribute(handle, "title", ""+v); + //DOM.setAttribute(handle, "title", ""+v); } this.value = value; + + if(updateToServer) + client.updateVariable(id, "value", value.doubleValue(), immediate); } public void onBrowserEvent(Event event) { + if(disabled || readonly) + return; Element targ = DOM.eventGetTarget(event); if(dragging || DOM.compare(targ, handle)) { processHandleEvent(event); + } else if(DOM.compare(targ, smaller)) { - if(DOM.eventGetType(event) == Event.ONMOUSEDOWN) - decrease(); + // Decrease value by resolution + if(DOM.eventGetType(event) == Event.ONMOUSEDOWN) { + setValue(new Double(value.doubleValue()-Math.pow(10, -resolution)), false, true); + if(anim != null) + anim.cancel(); + anim = new Timer() { + public void run() { + if(value.doubleValue()-Math.pow(10, -resolution) > min) + setValue(new Double(value.doubleValue()-Math.pow(10, -resolution)), false, true); + } + }; + anim.scheduleRepeating(100); + DOM.eventCancelBubble(event, true); + } else if(DOM.eventGetType(event) == Event.ONMOUSEUP) { + anim.cancel(); + } + } else if(DOM.compare(targ, bigger)) { - if(DOM.eventGetType(event) == Event.ONMOUSEDOWN) - increase(); - } else { + // Increase value by resolution + if(DOM.eventGetType(event) == Event.ONMOUSEDOWN) { + setValue(new Double(value.doubleValue()+Math.pow(10, -resolution)), false, true); + if(anim != null) + anim.cancel(); + anim = new Timer() { + public void run() { + if(value.doubleValue()-Math.pow(10, -resolution) < max) + setValue(new Double(value.doubleValue()+Math.pow(10, -resolution)), false, true); + } + }; + anim.scheduleRepeating(100); + DOM.eventCancelBubble(event, true); + } else if(DOM.eventGetType(event) == Event.ONMOUSEUP) { + anim.cancel(); + } + + } else processBaseEvent(event); - } } private void processHandleEvent(Event event) { switch (DOM.eventGetType(event)) { case Event.ONMOUSEDOWN: if(!disabled && !readonly) { - anim.cancel(); + if(anim != null) + anim.cancel(); dragging = true; DOM.setCapture(handle); DOM.eventPreventDefault(event); // prevent selecting text @@ -255,12 +304,14 @@ public class ISlider extends Widget implements Paintable { break; case Event.ONMOUSEMOVE: if (dragging) { - setValueByEvent(event, false); + DOM.setCapture(handle); + setValueByEvent(event, false, false); } break; case Event.ONMOUSEUP: dragging = false; DOM.releaseCapture(handle); + setValueByEvent(event, true, true); break; default: break; @@ -270,15 +321,15 @@ public class ISlider extends Widget implements Paintable { private void processBaseEvent(Event event) { if(DOM.eventGetType(event) == Event.ONMOUSEDOWN) { if(!disabled && !readonly && !dragging) { - setValueByEvent(event, true); + setValueByEvent(event, true, true); DOM.eventCancelBubble(event, true); } } } - private void setValueByEvent(Event event, boolean animate) { + private void setValueByEvent(Event event, boolean animate, boolean roundup) { int x = DOM.eventGetClientX(event); - int y = DOM.eventGetClientY(event); + //int y = DOM.eventGetClientY(event); double v = min; // Fallback to min if(vertical) { // TODO @@ -294,37 +345,15 @@ public class ISlider extends Widget implements Paintable { else if(v > max) v = max; - if(resolution > 0) { - v = (int)(v * (double)Math.pow(10, resolution)); - v = v / (double)Math.pow(10, resolution); - setValue(new Double(v), animate); - } else - setValue(new Double((int)v), animate); + if(roundup) { + if(resolution > 0) { + v = (int)(v * (double)Math.pow(10, resolution)); + v = v / (double)Math.pow(10, resolution); + } else + v = Math.round(v); + } - } - - private void decrease() { - double diff = (max-min)/max*10 + (max-min)/10; - double v = value.doubleValue()-diff; - if(resolution > 0) { - v = (int)(v * (double)Math.pow(10, resolution)); - v = v / (double)Math.pow(10, resolution); - } else v = (int)v; - if(v < min) - v = min; - setValue(new Double(v), true); - } - - private void increase() { - double diff = (max-min)/max*10 + (max-min)/10; - double v = value.doubleValue()+diff; - if(resolution > 0) { - v = (int)(v * (double)Math.pow(10, resolution)); - v = v / (double)Math.pow(10, resolution); - } else v = (int)v; - if(v > max) - v = max; - setValue(new Double(v), true); + setValue(new Double(v), animate, roundup); } } diff --git a/src/com/itmill/toolkit/terminal/gwt/public/component-themes/slider/css/slider.css b/src/com/itmill/toolkit/terminal/gwt/public/component-themes/slider/css/slider.css index 1cbbb90d01..a11ec6e3f4 100644 --- a/src/com/itmill/toolkit/terminal/gwt/public/component-themes/slider/css/slider.css +++ b/src/com/itmill/toolkit/terminal/gwt/public/component-themes/slider/css/slider.css @@ -1,14 +1,93 @@ .i-slider { - + background: #c3d0dd url(../img/bg.png) repeat-x; + border: 1px solid #29528a; + border-left: none; + border-right: none; + height: 14px; +} +.i-slider:before { + display: block; + width: 1px; + height: 14px; + background-color: #29528a; + border-top: 1px solid #b9c8dc; + border-bottom: 1px solid #b9c8dc; + margin: -1px 0 -15px -1px; + content: ""; +} +.i-slider:after { + display: block; + width: 1px; + height: 14px; + background-color: #29528a; + border-top: 1px solid #b9c8dc; + border-bottom: 1px solid #b9c8dc; + margin: -15px 0 0 100%; + content: ""; } - .i-slider-base { - background: #eee; - height: 10px; + background: #c3d0dd url(../img/bg.png) repeat-x; + height: 14px; + margin: 0 1px; + overflow: hidden; } - .i-slider-handle { - background: #ccc; + background: #fff url(../img/handle-bg.png) repeat-x; + border: 1px solid #29528a; height: 10px; overflow: hidden; +} +.i-slider-bigger { + background: #dde4ef url(../img/arrow-right.png); + float: right; + width: 14px; + height: 14px; + overflow: hidden; + margin: 0 0 0 1px; +} +.i-slider-bigger:hover { + background-image: url(../img/arrow-right-over.png); +} +.i-slider-smaller { + background: #dde4ef url(../img/arrow-left.png); + float: left; + width: 14px; + height: 14px; + overflow: hidden; + margin: 0 1px 0 0; +} +.i-slider-smaller:hover { + background-image: url(../img/arrow-left-over.png); +} + + + +/*----------------- + Vertical styles + -----------------*/ + +.i-slider-vertical { + +} +.i-slider-vertical .i-slider-base { + +} +.i-slider-vertical .i-slider-handle { + +} +.i-slider-vertical .i-slider-bigger { + +} + + + +/*-------------------- + IE specific styles + -------------------*/ + +* html .i-slider { + border: 1px solid #29528a; +} +*+html .i-slider { + border: 1px solid #29528a; } \ No newline at end of file diff --git a/src/com/itmill/toolkit/terminal/gwt/server/CommunicationManager.java b/src/com/itmill/toolkit/terminal/gwt/server/CommunicationManager.java index 2e81ed0865..f588c62b10 100644 --- a/src/com/itmill/toolkit/terminal/gwt/server/CommunicationManager.java +++ b/src/com/itmill/toolkit/terminal/gwt/server/CommunicationManager.java @@ -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; diff --git a/src/com/itmill/toolkit/terminal/gwt/server/JsonPaintTarget.java b/src/com/itmill/toolkit/terminal/gwt/server/JsonPaintTarget.java index b5fd6fcd4a..17fb67a620 100644 --- a/src/com/itmill/toolkit/terminal/gwt/server/JsonPaintTarget.java +++ b/src/com/itmill/toolkit/terminal/gwt/server/JsonPaintTarget.java @@ -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)); } /** diff --git a/src/com/itmill/toolkit/ui/Slider.java b/src/com/itmill/toolkit/ui/Slider.java index 41ecb63d10..5210093104 100644 --- a/src/com/itmill/toolkit/ui/Slider.java +++ b/src/com/itmill/toolkit/ui/Slider.java @@ -35,7 +35,8 @@ public class Slider extends AbstractField { /** * Handle size in percents related to base size. - * Must be a value between 1-100. + * Must be a value between 1-99. Other values are converted to nearest bound. + * A negative value sets the width to auto (client calculates). */ private int handleSize = -1; @@ -86,13 +87,11 @@ public class Slider extends AbstractField { public void setMax(double max) { this.max = max; try { - if((new Float(getValue().toString())).floatValue() > max) - super.setValue(new Float(min)); + if((new Double(getValue().toString())).doubleValue() > max) + super.setValue(new Double(min)); } catch(ClassCastException e) { - super.setValue(new Float(max)); + super.setValue(new Double(max)); } - if(handleSize == -1) - handleSize = (int) ((max-min)/max*10 + (max-min)/10); requestRepaint(); } @@ -112,8 +111,6 @@ public class Slider extends AbstractField { } catch(ClassCastException e) { super.setValue(new Double(min)); } - if(handleSize == -1) - handleSize = (int) ((max-min)/max*10 + (max-min)/10); requestRepaint(); } @@ -172,9 +169,13 @@ public class Slider extends AbstractField { } public void setHandleSize(int handleSize) { - if(handleSize > 100 || handleSize < 1) - return; - this.handleSize = handleSize; + if(handleSize < 0) + this.handleSize = -1; + else if(handleSize > 99) + this.handleSize = 99; + else if(handleSize < 1) + this.handleSize = 1; + else this.handleSize = handleSize; requestRepaint(); } @@ -195,7 +196,10 @@ public class Slider extends AbstractField { super.paintContent(target); target.addAttribute("min", min); - target.addAttribute("max", max); + if(max > min) + target.addAttribute("max", max); + else + target.addAttribute("max", min); target.addAttribute("resolution", resolution); if(resolution > 0) @@ -212,7 +216,10 @@ public class Slider extends AbstractField { if(size > -1) target.addAttribute("size", size); - target.addAttribute("hsize", handleSize); + if(min != max && min < max) + target.addAttribute("hsize", handleSize); + else + target.addAttribute("hsize", 100); } @@ -225,13 +232,20 @@ public class Slider extends AbstractField { */ public void changeVariables(Object source, Map variables) { if (variables.containsKey("value")) { - Object newValue = variables.get("value"); - if(resolution > 0) - newValue = new Double(newValue.toString()); - else - newValue = new Integer(newValue.toString()); + Object value = variables.get("value"); + Double newValue = new Double(value.toString()); if(newValue != null && newValue != getValue() && !newValue.equals(getValue())) { - setValue(newValue, true); + try { + setValue(newValue, true); + } catch(ValueOutOfBoundsException e) { + // Convert to nearest bound + double out = e.getValue().doubleValue(); + if(out < min) + out = min; + if(out > max) + out = max; + super.setValue(new Double(out), false); + } } } }