import com.google.gwt.user.client.Element;\r
import com.google.gwt.user.client.Event;\r
import com.google.gwt.user.client.Timer;\r
+import com.google.gwt.user.client.ui.HTML;\r
import com.google.gwt.user.client.ui.Widget;\r
import com.vaadin.terminal.gwt.client.ApplicationConnection;\r
import com.vaadin.terminal.gwt.client.BrowserInfo;\r
private int resolution;\r
private Double value;\r
private boolean vertical;\r
- private int size = -1;\r
+ private final int size = -1;\r
private boolean arrows;\r
\r
+ private final HTML feedback = new HTML("", false);\r
+ private final VOverlay feedbackPopup = new VOverlay(true, false, true) {\r
+ @Override\r
+ public void show() {\r
+ super.show();\r
+ updateFeedbackPosition();\r
+ }\r
+ };\r
+\r
/* DOM element for slider's base */\r
private final Element base;\r
private final int BASE_BORDER_WIDTH = 1;\r
| Event.ONMOUSEOUT);\r
DOM.sinkEvents(bigger, Event.ONMOUSEDOWN | Event.ONMOUSEUP\r
| Event.ONMOUSEOUT);\r
+\r
+ feedbackPopup.addStyleName(CLASSNAME + "-feedback");\r
+ feedbackPopup.setWidget(feedback);\r
}\r
\r
public void updateFromUIDL(UIDL uidl, ApplicationConnection client) {\r
resolution = uidl.getIntAttribute("resolution");\r
value = new Double(uidl.getDoubleVariable("value"));\r
\r
+ setFeedbackValue(value);\r
+\r
handleSize = uidl.getIntAttribute("hsize");\r
\r
buildBase();\r
}\r
}\r
\r
+ private void setFeedbackValue(double value) {\r
+ String currentValue = "" + value;\r
+ if (resolution == 0) {\r
+ currentValue = "" + new Double(value).intValue();\r
+ }\r
+ feedback.setText(currentValue);\r
+ }\r
+\r
+ private void updateFeedbackPosition() {\r
+ if (vertical) {\r
+ feedbackPopup.setPopupPosition(DOM.getAbsoluteLeft(handle)\r
+ + handle.getOffsetWidth(), DOM.getAbsoluteTop(handle)\r
+ + handle.getOffsetHeight() / 2\r
+ - feedbackPopup.getOffsetHeight() / 2);\r
+ } else {\r
+ feedbackPopup.setPopupPosition(DOM.getAbsoluteLeft(handle)\r
+ + handle.getOffsetWidth() / 2\r
+ - feedbackPopup.getOffsetWidth() / 2, DOM\r
+ .getAbsoluteTop(handle)\r
+ - feedbackPopup.getOffsetHeight());\r
+ }\r
+ }\r
+\r
private void buildBase() {\r
final String styleAttribute = vertical ? "height" : "width";\r
final String domProperty = vertical ? "offsetHeight" : "offsetWidth";\r
\r
final int range = baseSize - handleSize;\r
double v = value.doubleValue();\r
+\r
// Round value to resolution\r
if (resolution > 0) {\r
v = Math.round(v * Math.pow(10, resolution));\r
\r
DOM.setStyleAttribute(handle, styleAttribute, (Math.round(pos)) + "px");\r
\r
- // TODO give more detailed info when dragging and do roundup\r
- DOM.setElementAttribute(handle, "title", "" + v);\r
-\r
// Update value\r
this.value = new Double(v);\r
+ setFeedbackValue(v);\r
\r
if (updateToServer) {\r
updateValueToServer();\r
switch (DOM.eventGetType(event)) {\r
case Event.ONMOUSEDOWN:\r
if (!disabled && !readonly) {\r
+ feedbackPopup.show();\r
dragging = true;\r
+ DOM.setElementProperty(handle, "className", CLASSNAME\r
+ + "-handle " + CLASSNAME + "-handle-active");\r
DOM.setCapture(getElement());\r
DOM.eventPreventDefault(event); // prevent selecting text\r
DOM.eventCancelBubble(event, true);\r
break;\r
case Event.ONMOUSEMOVE:\r
if (dragging) {\r
- // DOM.setCapture(getElement());\r
setValueByEvent(event, false);\r
+ updateFeedbackPosition();\r
}\r
break;\r
case Event.ONMOUSEUP:\r
+ feedbackPopup.hide();\r
dragging = false;\r
+ DOM.setElementProperty(handle, "className", CLASSNAME + "-handle");\r
DOM.releaseCapture(getElement());\r
setValueByEvent(event, true);\r
break;\r
.eventGetClientX(event);\r
final String domProperty = vertical ? "offsetHeight" : "offsetWidth";\r
\r
- final double handleSize = Integer.parseInt(DOM.getElementProperty(\r
- handle, domProperty));\r
+ final int handleSize = Integer.parseInt(DOM.getElementProperty(handle,\r
+ domProperty));\r
final double baseSize = Integer.parseInt(DOM.getElementProperty(base,\r
domProperty));\r
final double baseOffset = vertical ? DOM.getAbsoluteTop(base)\r