DOM.setStyleAttribute(bigger, "display", "none");\r
DOM.setStyleAttribute(handle, "visibility", "hidden");\r
\r
- DOM.sinkEvents(getElement(), Event.MOUSEEVENTS);\r
+ DOM.sinkEvents(getElement(), Event.MOUSEEVENTS | Event.ONMOUSEWHEEL);\r
DOM.sinkEvents(base, Event.ONCLICK);\r
DOM.sinkEvents(handle, Event.MOUSEEVENTS);\r
DOM.sinkEvents(smaller, Event.ONMOUSEDOWN | Event.ONMOUSEUP\r
DeferredCommand.addCommand(new Command() {\r
public void execute() {\r
Element p = DOM.getParent(getElement());\r
- if (DOM.getElementPropertyInt(p, domProperty) > 50)\r
+ if (DOM.getElementPropertyInt(p, domProperty) > (MIN_SIZE + 5)) {\r
if (vertical) {\r
setHeight();\r
} else\r
DOM.setStyleAttribute(base, styleAttribute, "");\r
+ // Ensure correct position\r
+ setValue(value, false, false);\r
+ }\r
}\r
});\r
}\r
} else\r
DOM.setStyleAttribute(base, styleAttribute, size + "px");\r
\r
- // TODO attach listeners for focusing and arrow keys + scroll wheel\r
+ // TODO attach listeners for focusing and arrow keys\r
}\r
\r
private void buildHandle() {\r
}\r
\r
private void setValue(Double value, boolean animate, boolean updateToServer) {\r
+ if (value.doubleValue() < min)\r
+ value = new Double(min);\r
+ else if (value.doubleValue() > max)\r
+ value = new Double(max);\r
+\r
+ // Update handle position\r
final String styleAttribute = vertical ? "marginTop" : "marginLeft";\r
String domProperty = vertical ? "offsetHeight" : "offsetWidth";\r
int handleSize = Integer.parseInt(DOM.getElementProperty(handle,\r
if (p < 0)\r
p = 0;\r
if (vertical)\r
+ // IE6 rounding behaves a little unstable, reduce one pixel so the\r
+ // containing element (base) won't expand without limits\r
p = range - p - (Util.isIE6() ? 1 : 0);\r
final double pos = p;\r
\r
} else\r
DOM.setStyleAttribute(handle, styleAttribute, ((int) pos) + "px");\r
\r
+ // TODO give more detailed info when dragging and do roundup\r
DOM.setElementAttribute(handle, "title", "" + v);\r
\r
- if (value.doubleValue() < min)\r
- value = new Double(min);\r
- else if (value.doubleValue() > max)\r
- value = new Double(max);\r
-\r
this.value = value;\r
\r
if (updateToServer)\r
if (disabled || readonly)\r
return;\r
Element targ = DOM.eventGetTarget(event);\r
- if (dragging || DOM.compare(targ, handle)) {\r
+\r
+ if (DOM.eventGetType(event) == Event.ONMOUSEWHEEL) {\r
+ processMouseWheelEvent(event);\r
+ } else if (dragging || DOM.compare(targ, handle))\r
processHandleEvent(event);\r
- } else if (DOM.compare(targ, smaller)) {\r
- decreaseValue(event);\r
- } else if (DOM.compare(targ, bigger)) {\r
- increaseValue(event);\r
- } else\r
+ else if (DOM.compare(targ, smaller))\r
+ decreaseValue(event, true);\r
+ else if (DOM.compare(targ, bigger))\r
+ increaseValue(event, true);\r
+ else\r
processBaseEvent(event);\r
}\r
\r
+ private void processMouseWheelEvent(Event event) {\r
+ int dir = DOM.eventGetMouseWheelVelocityY(event);\r
+ if (dir < 0)\r
+ increaseValue(event, false);\r
+ else\r
+ decreaseValue(event, false);\r
+ DOM.eventPreventDefault(event);\r
+ DOM.eventCancelBubble(event, true);\r
+ }\r
+\r
private void processHandleEvent(Event event) {\r
switch (DOM.eventGetType(event)) {\r
case Event.ONMOUSEDOWN:\r
}\r
}\r
\r
- private void decreaseValue(Event event) {\r
- if (DOM.eventGetType(event) == Event.ONMOUSEDOWN) {\r
- setValue(\r
- new Double(value.doubleValue() - Math.pow(10, -resolution)),\r
- false, true);\r
+ private void decreaseValue(Event event, boolean animate) {\r
+ setValue(new Double(value.doubleValue() - Math.pow(10, -resolution)),\r
+ false, true);\r
+ if (DOM.eventGetType(event) == Event.ONMOUSEDOWN && animate) {\r
if (anim != null)\r
anim.cancel();\r
anim = new Timer() {\r
};\r
anim.scheduleRepeating(100);\r
DOM.eventCancelBubble(event, true);\r
- } else\r
+ } else if (anim != null)\r
anim.cancel();\r
}\r
\r
- private void increaseValue(Event event) {\r
- if (DOM.eventGetType(event) == Event.ONMOUSEDOWN) {\r
- setValue(\r
- new Double(value.doubleValue() + Math.pow(10, -resolution)),\r
- false, true);\r
+ private void increaseValue(Event event, boolean animate) {\r
+ setValue(new Double(value.doubleValue() + Math.pow(10, -resolution)),\r
+ false, true);\r
+ if (DOM.eventGetType(event) == Event.ONMOUSEDOWN && animate) {\r
if (anim != null)\r
anim.cancel();\r
anim = new Timer() {\r
};\r
anim.scheduleRepeating(100);\r
DOM.eventCancelBubble(event, true);\r
- } else\r
+ } else if (anim != null)\r
anim.cancel();\r
}\r
\r