// 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
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
// 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
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
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
};\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
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
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
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
\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
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
} 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
}\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
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
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
*/\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