From b88e9d23a54a5e8a63272a4b4e90eb1151dbfd29 Mon Sep 17 00:00:00 2001 From: Jouni Koivuviita Date: Mon, 30 Jul 2007 13:22:40 +0000 Subject: [PATCH] Slider component updated with proper implementation and styles. svn changeset:1925/svn branch:trunk --- .../itmill/toolkit/terminal/PaintTarget.java | 30 +++ .../toolkit/terminal/gwt/client/UIDL.java | 23 ++ .../terminal/gwt/client/ui/ISlider.java | 242 +++++++++++++----- .../slider/img/arrow-left-over.png | Bin 0 -> 355 bytes .../slider/img/arrow-left.png | Bin 0 -> 353 bytes .../slider/img/arrow-right-over.png | Bin 0 -> 354 bytes .../slider/img/arrow-right.png | Bin 0 -> 349 bytes .../public/component-themes/slider/img/bg.png | Bin 0 -> 192 bytes .../component-themes/slider/img/handle-bg.png | Bin 0 -> 160 bytes .../slider/img/handle-left.png | Bin 0 -> 184 bytes .../slider/img/handle-right.png | Bin 0 -> 184 bytes .../terminal/gwt/server/JsonPaintTarget.java | 46 ++++ src/com/itmill/toolkit/ui/Slider.java | 169 ++++++------ 13 files changed, 362 insertions(+), 148 deletions(-) create mode 100644 src/com/itmill/toolkit/terminal/gwt/public/component-themes/slider/img/arrow-left-over.png create mode 100644 src/com/itmill/toolkit/terminal/gwt/public/component-themes/slider/img/arrow-left.png create mode 100644 src/com/itmill/toolkit/terminal/gwt/public/component-themes/slider/img/arrow-right-over.png create mode 100644 src/com/itmill/toolkit/terminal/gwt/public/component-themes/slider/img/arrow-right.png create mode 100644 src/com/itmill/toolkit/terminal/gwt/public/component-themes/slider/img/bg.png create mode 100644 src/com/itmill/toolkit/terminal/gwt/public/component-themes/slider/img/handle-bg.png create mode 100644 src/com/itmill/toolkit/terminal/gwt/public/component-themes/slider/img/handle-left.png create mode 100644 src/com/itmill/toolkit/terminal/gwt/public/component-themes/slider/img/handle-right.png diff --git a/src/com/itmill/toolkit/terminal/PaintTarget.java b/src/com/itmill/toolkit/terminal/PaintTarget.java index 750fc42282..941c19ec2f 100644 --- a/src/com/itmill/toolkit/terminal/PaintTarget.java +++ b/src/com/itmill/toolkit/terminal/PaintTarget.java @@ -176,6 +176,20 @@ public interface PaintTarget { * if the paint operation failed. */ public void addAttribute(String name, float value) throws PaintException; + + /** + * Adds a double attribute to component. Atributes must be added before any + * content is written. + * + * @param name + * the Attribute name. + * @param value + * the Attribute value. + * + * @throws PaintException + * if the paint operation failed. + */ + public void addAttribute(String name, double value) throws PaintException; /** * Adds a string attribute to component. Atributes must be added before any @@ -254,6 +268,22 @@ public interface PaintTarget { */ public void addVariable(VariableOwner owner, String name, float value) throws PaintException; + + /** + * Adds a double type variable. + * + * @param owner + * the Listener for variable changes. + * @param name + * the Variable name. + * @param value + * the Variable initial value. + * + * @throws PaintException + * if the paint operation failed. + */ + public void addVariable(VariableOwner owner, String name, double value) + throws PaintException; /** * Adds a boolean type variable. diff --git a/src/com/itmill/toolkit/terminal/gwt/client/UIDL.java b/src/com/itmill/toolkit/terminal/gwt/client/UIDL.java index 910deb0b57..3dc4997e0b 100644 --- a/src/com/itmill/toolkit/terminal/gwt/client/UIDL.java +++ b/src/com/itmill/toolkit/terminal/gwt/client/UIDL.java @@ -61,6 +61,22 @@ public class UIDL { double num = ((JSONNumber) val).getValue(); return (long) num; } + + public float getFloatAttribute(String name) { + JSONValue val = ((JSONObject) json.get(1)).get(name); + if (val == null) + return 0; + double num = ((JSONNumber) val).getValue(); + return (float) num; + } + + public double getDoubleAttribute(String name) { + JSONValue val = ((JSONObject) json.get(1)).get(name); + if (val == null) + return 0; + double num = ((JSONNumber) val).getValue(); + return (double) num; + } public boolean getBooleanAttribute(String name) { JSONValue val = ((JSONObject) json.get(1)).get(name); @@ -317,6 +333,13 @@ public class UIDL { throw new IllegalArgumentException("No such variable: " + name); return (float) t.getValue(); } + + public double getDoubleVariable(String name) { + JSONNumber t = (JSONNumber) getVariableHash().get(name); + if (t == null) + throw new IllegalArgumentException("No such variable: " + name); + return (double) t.getValue(); + } public boolean getBooleanVariable(String name) { JSONBoolean t = (JSONBoolean) getVariableHash().get(name); 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 1232eaaac1..abef6c4524 100644 --- a/src/com/itmill/toolkit/terminal/gwt/client/ui/ISlider.java +++ b/src/com/itmill/toolkit/terminal/gwt/client/ui/ISlider.java @@ -1,13 +1,9 @@ package com.itmill.toolkit.terminal.gwt.client.ui; -import java.util.HashSet; - import com.google.gwt.user.client.DOM; import com.google.gwt.user.client.Element; import com.google.gwt.user.client.Event; import com.google.gwt.user.client.Timer; -import com.google.gwt.user.client.ui.MouseListener; -import com.google.gwt.user.client.ui.SourcesMouseEvents; import com.google.gwt.user.client.ui.Widget; import com.itmill.toolkit.terminal.gwt.client.ApplicationConnection; import com.itmill.toolkit.terminal.gwt.client.Paintable; @@ -26,13 +22,13 @@ public class ISlider extends Widget implements Paintable { private boolean readonly; private int handleSize; - private float min; - private float max; + private double min; + private double max; private int resolution; - private Object value; - private HashSet values; + private Double value; private boolean vertical; private int size = -1; + private boolean arrows; /* DOM element for slider's base */ private Element base; @@ -40,21 +36,44 @@ public class ISlider extends Widget implements Paintable { /* DOM element for slider's handle */ private Element handle; - private boolean dragging; + /* DOM element for decrement arrow */ + private Element smaller; + + /* DOM element for increment arrow */ + private Element bigger; + + /* Temporary dragging/animation variables */ + private boolean dragging = false; + private Timer anim; public ISlider() { super(); - setElement(DOM.createElement("div")); - base = DOM.createElement("div"); - DOM.appendChild(getElement(), base); - handle = DOM.createElement("div"); - DOM.appendChild(base, handle); + + setElement(DOM.createDiv()); + base = DOM.createDiv(); + handle = DOM.createDiv(); + smaller = DOM.createDiv(); + bigger = DOM.createDiv(); + setStyleName(CLASSNAME); DOM.setAttribute(base, "className", CLASSNAME+"-base"); DOM.setAttribute(handle, "className", CLASSNAME+"-handle"); + DOM.setAttribute(smaller, "className", CLASSNAME+"-smaller"); + DOM.setAttribute(bigger, "className", CLASSNAME+"-bigger"); + + DOM.appendChild(getElement(), bigger); + DOM.appendChild(getElement(), smaller); + DOM.appendChild(getElement(), base); + DOM.appendChild(base, handle); + + // Hide initially + DOM.setStyleAttribute(smaller, "display", "none"); + DOM.setStyleAttribute(bigger, "display", "none"); - DOM.sinkEvents(base, Event.MOUSEEVENTS); + DOM.sinkEvents(base, Event.ONMOUSEDOWN); DOM.sinkEvents(handle, Event.MOUSEEVENTS); + DOM.sinkEvents(smaller, Event.ONMOUSEDOWN); + DOM.sinkEvents(bigger, Event.ONMOUSEDOWN); } public void updateFromUIDL(UIDL uidl, ApplicationConnection client) { @@ -70,22 +89,27 @@ public class ISlider extends Widget implements Paintable { readonly = uidl.getBooleanAttribute("readonly"); vertical = uidl.hasAttribute("vertical"); + arrows = uidl.hasAttribute("arrows"); + + if(arrows) { + DOM.setStyleAttribute(smaller, "display", "block"); + DOM.setStyleAttribute(bigger, "display", "block"); + if(vertical) { + int arrowSize = Integer.parseInt(DOM.getAttribute(smaller, "offsetWidth")); + DOM.setStyleAttribute(bigger, "marginLeft", arrowSize+"px"); + DOM.setStyleAttribute(bigger, "marginRight", arrowSize+"px"); + } + } if(vertical) addStyleName(CLASSNAME+"-vertical"); else removeStyleName(CLASSNAME+"-vertical"); - if(uidl.hasAttribute("values")) { - values = uidl.getStringArrayAttributeAsSet("values"); - value = uidl.getStringVariable("value"); - } else { - min = uidl.getLongAttribute("min"); - max = uidl.getLongAttribute("max"); - resolution = uidl.getIntAttribute("resolution"); - value = new Float(uidl.getFloatVariable("value")); - values = null; - } + min = uidl.getDoubleAttribute("min"); + max = uidl.getDoubleAttribute("max"); + resolution = uidl.getIntAttribute("resolution"); + value = new Double(uidl.getDoubleVariable("value")); handleSize = uidl.getIntAttribute("hsize"); @@ -99,13 +123,13 @@ public class ISlider extends Widget implements Paintable { Timer delay = new Timer() { public void run() { buildHandle(); - setHandlePosition(value); + setValue(value, true); } }; delay.schedule(100); } else { buildHandle(); - setHandlePosition(value); + setValue(value, true); } } @@ -117,7 +141,24 @@ public class ISlider extends Widget implements Paintable { } else { if(size > -1) DOM.setStyleAttribute(base, "width", size + "px"); - else DOM.setStyleAttribute(base, "width", "100%"); + else { + Element p = DOM.getParent(getElement()); + if(Integer.parseInt(DOM.getAttribute(p, "offsetWidth")) > 50) + DOM.setStyleAttribute(base, "width", "auto"); + else { + // Set minimum of 50px width and adjust after all + // components have (supposedly) been drawn completely. + DOM.setStyleAttribute(base, "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"); + } + }; + adjust.schedule(100); + } + } } // Allow absolute positioning of handle DOM.setStyleAttribute(base, "position", "relative"); @@ -135,68 +176,86 @@ public class ISlider extends Widget implements Paintable { int t = Integer.parseInt(DOM.getAttribute(base, "offsetHeight")) - Integer.parseInt(DOM.getAttribute(handle, "offsetHeight")); DOM.setStyleAttribute(handle, "top", (t/2)+"px"); DOM.setStyleAttribute(handle, "left", "0px"); - int w = (int) (Float.parseFloat(DOM.getAttribute(base, "offsetWidth")) / 100 * handleSize); + int w = (int) (Double.parseDouble(DOM.getAttribute(base, "offsetWidth")) / 100 * handleSize); DOM.setStyleAttribute(handle, "width", w+"px"); } } - private void setHandlePosition(Object value) { + private void setValue(Double value, boolean animate) { if(vertical) { // TODO } else { - if(values == null) { - int handleWidth = Integer.parseInt(DOM.getAttribute(handle, "offsetWidth")); - int baseWidth = Integer.parseInt(DOM.getAttribute(base, "offsetWidth")); - int range = baseWidth - handleWidth; - float v = ((Float)value).floatValue(); - float valueRange = max - min; - float pos = range * ((v - min) / valueRange); - DOM.setStyleAttribute(handle, "left", pos+"px"); - DOM.setAttribute(handle, "title", ""+v); - } + int handleWidth = Integer.parseInt(DOM.getAttribute(handle, "offsetWidth")); + int baseWidth = Integer.parseInt(DOM.getAttribute(base, "offsetWidth")); + int range = baseWidth - handleWidth; + double v = value.doubleValue(); + double valueRange = max - min; + final double pos = range * ((v - min) / valueRange); + + String styleLeft = DOM.getStyleAttribute(handle, "left"); + int left = Integer.parseInt(styleLeft.substring(0, styleLeft.length()-2)); + + if((int)pos != left && animate) { + if(anim != null) + anim.cancel(); + anim = new Timer() { + private int left; + private int goal = (int)pos; + private int dir = 0; + public void run() { + String styleLeft = DOM.getStyleAttribute(handle, "left"); + left = Integer.parseInt(styleLeft.substring(0, styleLeft.length()-2)); + + // Determine direction + if(dir == 0) + dir = (goal-left)/Math.abs(goal-left); + + if((dir > 0 && left >= goal) || (dir < 0 && left <= goal)) { + this.cancel(); + return; + } + int increment = (goal - left) / 2; + DOM.setStyleAttribute(handle, "left", (left+increment)+"px"); + } + }; + anim.scheduleRepeating(50); + } else DOM.setStyleAttribute(handle, "left", pos+"px"); + DOM.setAttribute(handle, "title", ""+v); } + this.value = value; } public void onBrowserEvent(Event event) { - if(dragging || DOM.compare(DOM.eventGetTarget(event), handle)) + Element targ = DOM.eventGetTarget(event); + if(dragging || DOM.compare(targ, handle)) { processHandleEvent(event); - else + } else if(DOM.compare(targ, smaller)) { + if(DOM.eventGetType(event) == Event.ONMOUSEDOWN) + decrease(); + } else if(DOM.compare(targ, bigger)) { + if(DOM.eventGetType(event) == Event.ONMOUSEDOWN) + increase(); + } else { processBaseEvent(event); + } } private void processHandleEvent(Event event) { switch (DOM.eventGetType(event)) { case Event.ONMOUSEDOWN: - client.console.log("Slider handle: mousedown"); if(!disabled && !readonly) { + anim.cancel(); dragging = true; DOM.setCapture(handle); DOM.eventPreventDefault(event); // prevent selecting text + DOM.eventCancelBubble(event, true); } break; case Event.ONMOUSEMOVE: if (dragging) { - int x = DOM.eventGetClientX(event); - int y = DOM.eventGetClientY(event); - if(vertical) { - // TODO - } else { - if(values == null) { - client.console.log("Slider handle: dragging..." + x); - float handleW = Integer.parseInt(DOM.getAttribute(handle, "offsetWidth")); - float baseX = DOM.getAbsoluteLeft(base); - float baseW = Integer.parseInt(DOM.getAttribute(base, "offsetWidth")); - float v = ((x-baseX)/(baseW-baseX)) * (max-min) + min; - if(resolution > 0) { - setHandlePosition(new Float(v)); - } else - setHandlePosition(new Float((int)v)); - } else { - // TODO - } - } + setValueByEvent(event, false); } break; case Event.ONMOUSEUP: @@ -209,8 +268,63 @@ public class ISlider extends Widget implements Paintable { } private void processBaseEvent(Event event) { - // TODO - super.onBrowserEvent(event); + if(DOM.eventGetType(event) == Event.ONMOUSEDOWN) { + if(!disabled && !readonly && !dragging) { + setValueByEvent(event, true); + DOM.eventCancelBubble(event, true); + } + } + } + + private void setValueByEvent(Event event, boolean animate) { + int x = DOM.eventGetClientX(event); + int y = DOM.eventGetClientY(event); + double v = min; // Fallback to min + if(vertical) { + // TODO + } else { + double handleW = Integer.parseInt(DOM.getAttribute(handle, "offsetWidth")); + double baseX = DOM.getAbsoluteLeft(base) + handleW/2; + double baseW = Integer.parseInt(DOM.getAttribute(base, "offsetWidth")); + v = ((x-baseX)/(baseW-handleW)) * (max-min) + min; + } + + if(v < min) + v = min; + 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); + + } + + 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); } } diff --git a/src/com/itmill/toolkit/terminal/gwt/public/component-themes/slider/img/arrow-left-over.png b/src/com/itmill/toolkit/terminal/gwt/public/component-themes/slider/img/arrow-left-over.png new file mode 100644 index 0000000000000000000000000000000000000000..a87df4b79ed3b623834ffaa621f5a3919f1957cf GIT binary patch literal 355 zcmV-p0i6DcP)B^ZWnd==1LN|LE`gB0p{9>-T?_vN}|L%GTnPr@nuYu7H=bhMcyW zs=}PE#ZzjKpRva$LvT7(emhowkfgoL)#RF~!#7fVM_`AAn6yo0i;AGR+T-y#RDPJN z!j7oXuDj9S=JBGl$b*`-n6%(9Om}I2pPe;8NB{r;Wl2OqRCwBS&PNi1Fc3u1CTm2_ zCPxS0{`a%QN>Ihy%ptRN~y z@Cvr@NjlnP1Tar^ILNa=Q>E9LLsxyVUcUSbFaRkX1#Ri6gg*cP002ovPDHLkV1i+u Br#1ip literal 0 HcmV?d00001 diff --git a/src/com/itmill/toolkit/terminal/gwt/public/component-themes/slider/img/arrow-left.png b/src/com/itmill/toolkit/terminal/gwt/public/component-themes/slider/img/arrow-left.png new file mode 100644 index 0000000000000000000000000000000000000000..de77d453fef9922bebc27298f596f04f3d3f2e1e GIT binary patch literal 353 zcmV-n0iOPeP)tTGOn6%)mywr-Ixr3UuRB@Y^sl=40zKEW@hMcyavB#XQ z#jL#2fS0pecc5c^rP12x-{Hj|Ku zd5-sgK-E^wIlfK(cUSo0o_C#=Zo=b`w~;y}9F_$OeN=RiQWh=|xg7EbAw-x~JUN69 zoBhW(%_B^ZWnd==1LN|LE`gB0p{9>-T?_vN}|L%GTnPr@nuYu7H=bhMcyW zs=}PE#ZzjKpRva$LvT7(emhowkfgoL)#RF~!#7fVM_`AAn6yo0i;AGR+T-y#RDPJN z!j7oXuDj9S=JBGl$b*`-n6%(9Om}I2pPe;8NB{r;WJyFpRCwB4&dUNqP!xsXMUL7W zB)MM;mAwD^*^Kt_js7)TfV99j_Ichf5`KymYoHE@udJbW_u2!)jcFp%H3v$MtTGOn6%)mywr-Ixr3UuRB@Y^sl=40zKEW@hMcyavB#XQ z#jL#2fS0pecc5c^rP12x-{5f-;NZ z$gKST2an6Ye7wrX2Z`Ka-00000NkvXXu0mjfHFU4` literal 0 HcmV?d00001 diff --git a/src/com/itmill/toolkit/terminal/gwt/public/component-themes/slider/img/bg.png b/src/com/itmill/toolkit/terminal/gwt/public/component-themes/slider/img/bg.png new file mode 100644 index 0000000000000000000000000000000000000000..0c4400b27d58eba8ce26a54caa32b0433a18a0be GIT binary patch literal 192 zcmeAS@N?(olHy`uVBq!ia0vp^j6lrC!3-pC&TY#BQY`6?zK#qG>ra@ocD)4hB}-f* zN`mv#O3D+9QW+dm@{>{(JaZG%Q-e|yQz{EjrrH1%sRa0hxX#&l?Cz7-3%8!!di2Wi z%lB99Ik*4p?YWzdZ#Z~q*U1}8cbq+d`JD?p8m*z^u#Q;wJcM0#G%Br>mdKI;Vst05%s%RR910 literal 0 HcmV?d00001 diff --git a/src/com/itmill/toolkit/terminal/gwt/public/component-themes/slider/img/handle-bg.png b/src/com/itmill/toolkit/terminal/gwt/public/component-themes/slider/img/handle-bg.png new file mode 100644 index 0000000000000000000000000000000000000000..027f520cd4be77a06e50c1ebf1c2253d0cc2af7b GIT binary patch literal 160 zcmeAS@N?(olHy`uVBq!ia0vp^j6lrA!3-pwc#c#6DVB6cUq=Rp^(V|(yIunMk|nMY zCBgY=CFO}lsSJ)O`AMk?p1FzXsX?iUDV2pMQ*D5X_yc@GT>t<7fB)IX7w><6`}hCu zllRlzJZAu<#64XcLn>}1B{VRnv8l1Sv5B#gTe~DWM4f D)det* literal 0 HcmV?d00001 diff --git a/src/com/itmill/toolkit/terminal/gwt/public/component-themes/slider/img/handle-left.png b/src/com/itmill/toolkit/terminal/gwt/public/component-themes/slider/img/handle-left.png new file mode 100644 index 0000000000000000000000000000000000000000..703acb94b654621b782e5140103f6d8b918ed1d8 GIT binary patch literal 184 zcmeAS@N?(olHy`uVBq!ia0vp^OhC-T!3-qpljfuWDVB6cUq=Rp^(V|(yIunMk|nMY zCBgY=CFO}lsSJ)O`AMk?p1FzXsX?iUDV2pMQ*D5Xqyv0HTs4Eb{{R2qICIyF_rK?C zJa+fV`{S4IfBX0U{ max) super.setValue(new Float(min)); } catch(ClassCastException e) { super.setValue(new Float(max)); } + if(handleSize == -1) + handleSize = (int) ((max-min)/max*10 + (max-min)/10); requestRepaint(); } - public float getMin() { + public double getMin() { return min; } @@ -80,15 +104,16 @@ public class Slider extends AbstractField { * Set the minimum value of the Slider. As a side-effect nullifies the "values" Set. * @param max */ - public void setMin(float min) { + public void setMin(double min) { this.min = min; - this.values = null; try { - if((new Float(getValue().toString())).floatValue() < min) - super.setValue(new Float(min)); + if((new Double(getValue().toString())).doubleValue() < min) + super.setValue(new Double(min)); } catch(ClassCastException e) { - super.setValue(new Float(min)); + super.setValue(new Double(min)); } + if(handleSize == -1) + handleSize = (int) ((max-min)/max*10 + (max-min)/10); requestRepaint(); } @@ -112,47 +137,24 @@ public class Slider extends AbstractField { requestRepaint(); } - public Set getValues() { - return values; - } - - public void setValues(Set values) { - this.values = values; - requestRepaint(); - } - - public void setValue(Float value, boolean repaintIsNotNeeded) throws ValueOutOfBoundsException { - float v = new Float(value.toString()).floatValue(); - Object newValue; + public void setValue(Double value, boolean repaintIsNotNeeded) throws ValueOutOfBoundsException { + double v = new Double(value.toString()).doubleValue(); + double newValue; if(resolution>0) { // Round up to resolution - newValue = new Float(v * (resolution*10) / (resolution*10)); - if(min > ((Float)newValue).floatValue() || max < ((Float)newValue).floatValue()) + newValue = (int) (v * (double) Math.pow(10, resolution)); + newValue = newValue / (double) Math.pow(10, resolution); + if(min > newValue || max < newValue) throw new ValueOutOfBoundsException(value); } else { - newValue = new Float((int) v); - if(min > ((Float)newValue).intValue() || max < ((Float)newValue).intValue()) + newValue = (int) v; + if(min > newValue || max < newValue) throw new ValueOutOfBoundsException(value); } - super.setValue(newValue, repaintIsNotNeeded); + super.setValue(new Double(newValue), repaintIsNotNeeded); } - public void setValue(Float value)throws ValueOutOfBoundsException { - setValue(value, false); - } - - public void setValue(String value, boolean repaintIsNotNeeded) throws ValueOutOfBoundsException { - if(this.values != null) { - String v = new String(value.toString()); - if(this.values.contains(v)) - super.setValue(v, repaintIsNotNeeded); - else throw new ValueOutOfBoundsException(value); - } else { - // TODO - } - } - - public void setValue(String value) throws ValueOutOfBoundsException { + public void setValue(Double value) throws ValueOutOfBoundsException { setValue(value, false); } @@ -175,6 +177,15 @@ public class Slider extends AbstractField { this.handleSize = handleSize; requestRepaint(); } + + public void setArrows(boolean visible) { + arrows = visible; + requestRepaint(); + } + + public boolean arrowsVisible() { + return arrows; + } public String getTag() { return "slider"; @@ -182,26 +193,22 @@ public class Slider extends AbstractField { public void paintContent(PaintTarget target) throws PaintException { super.paintContent(target); - - if(values == null) { - - target.addAttribute("min", (long) min); - target.addAttribute("max", (long) max); - target.addAttribute("resolution", resolution); - - if(resolution > 0) - target.addVariable(this, "value", ((Float)getValue()).floatValue()); - else - target.addVariable(this, "value", ((Float)getValue()).intValue()); - } else { - target.addVariable(this, "value", getValue().toString()); - target.addAttribute("values", values.toArray(new String[values.size()])); - } + target.addAttribute("min", min); + target.addAttribute("max", max); + target.addAttribute("resolution", resolution); + if(resolution > 0) + target.addVariable(this, "value", ((Double)getValue()).doubleValue()); + else + target.addVariable(this, "value", ((Double)getValue()).intValue()); + if(orientation == ORIENTATION_VERTICAL) target.addAttribute("vertical", true); + if(arrows) + target.addAttribute("arrows", true); + if(size > -1) target.addAttribute("size", size); @@ -219,16 +226,12 @@ public class Slider extends AbstractField { public void changeVariables(Object source, Map variables) { if (variables.containsKey("value")) { Object newValue = variables.get("value"); - if(values == null) { - if(resolution >0) - newValue = new Long(newValue.toString()); - else - newValue = new Integer(newValue.toString()); - if(newValue != null && newValue != getValue() && !newValue.equals(getValue())) { - setValue(newValue); - } - } else { - // TODO + if(resolution > 0) + newValue = new Double(newValue.toString()); + else + newValue = new Integer(newValue.toString()); + if(newValue != null && newValue != getValue() && !newValue.equals(getValue())) { + setValue(newValue, true); } } } @@ -240,7 +243,7 @@ public class Slider extends AbstractField { */ private static final long serialVersionUID = -6451298598644446340L; - private Object value; + private Double value; /** * Constructs an ValueOutOfBoundsException with the specified @@ -248,20 +251,18 @@ public class Slider extends AbstractField { * * @param valueOutOfBounds */ - public ValueOutOfBoundsException(Object valueOutOfBounds) { + public ValueOutOfBoundsException(Double valueOutOfBounds) { this.value = valueOutOfBounds; } - public Object getValue() { + public Double getValue() { return this.value; } } public Class getType() { - if(values == null) - return Float.class; - return String.class; + return Double.class; } } -- 2.39.5