summaryrefslogtreecommitdiffstats
path: root/Source/WebCore/html/shadow/SliderThumbElement.cpp
diff options
context:
space:
mode:
authorBen Murdoch <benm@google.com>2011-05-16 16:25:10 +0100
committerBen Murdoch <benm@google.com>2011-05-23 18:54:14 +0100
commitab9e7a118cf1ea2e3a93dce683b2ded3e7291ddb (patch)
treedb769fadd053248f85db67434a5b275224defef7 /Source/WebCore/html/shadow/SliderThumbElement.cpp
parent52e2557aeb8477967e97fd24f20f8f407a10fa15 (diff)
downloadexternal_webkit-ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddb.zip
external_webkit-ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddb.tar.gz
external_webkit-ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddb.tar.bz2
Merge WebKit at r76408: Initial merge by git.
Change-Id: I5b91decbd693ccbf5c1b8354b37cd68cc9a1ea53
Diffstat (limited to 'Source/WebCore/html/shadow/SliderThumbElement.cpp')
-rw-r--r--Source/WebCore/html/shadow/SliderThumbElement.cpp84
1 files changed, 83 insertions, 1 deletions
diff --git a/Source/WebCore/html/shadow/SliderThumbElement.cpp b/Source/WebCore/html/shadow/SliderThumbElement.cpp
index d598da9..ad93261 100644
--- a/Source/WebCore/html/shadow/SliderThumbElement.cpp
+++ b/Source/WebCore/html/shadow/SliderThumbElement.cpp
@@ -35,9 +35,15 @@
#include "Event.h"
#include "Frame.h"
+#include "HTMLInputElement.h"
+#include "HTMLParserIdioms.h"
#include "MouseEvent.h"
#include "RenderSlider.h"
#include "RenderTheme.h"
+#include "StepRange.h"
+#include <wtf/MathExtras.h>
+
+using namespace std;
#if PLATFORM(ANDROID) && ENABLE(TOUCH_EVENTS)
#include "TouchEvent.h"
@@ -52,7 +58,6 @@ public:
virtual void layout();
};
-
RenderSliderThumb::RenderSliderThumb(Node* node)
: RenderBlock(node)
{
@@ -84,6 +89,70 @@ RenderObject* SliderThumbElement::createRenderer(RenderArena* arena, RenderStyle
return new (arena) RenderSliderThumb(this);
}
+void SliderThumbElement::dragFrom(const IntPoint& point)
+{
+ setPosition(point);
+ startDragging();
+}
+
+void SliderThumbElement::setPosition(const IntPoint& point)
+{
+ HTMLInputElement* input = static_cast<HTMLInputElement*>(shadowHost());
+ ASSERT(input);
+
+ if (!input->renderer() || !renderer())
+ return;
+
+ IntPoint offset = roundedIntPoint(input->renderer()->absoluteToLocal(point, false, true));
+ RenderStyle* sliderStyle = input->renderer()->style();
+ bool isVertical = sliderStyle->appearance() == SliderVerticalPart || sliderStyle->appearance() == MediaVolumeSliderPart;
+
+ int trackSize;
+ int position;
+ int currentPosition;
+ if (isVertical) {
+ trackSize = input->renderBox()->contentHeight() - renderBox()->height();
+ position = offset.y() - renderBox()->height() / 2;
+ currentPosition = renderBox()->y() - input->renderBox()->contentBoxRect().y();
+ } else {
+ trackSize = input->renderBox()->contentWidth() - renderBox()->width();
+ position = offset.x() - renderBox()->width() / 2;
+ currentPosition = renderBox()->x() - input->renderBox()->contentBoxRect().x();
+ }
+ position = max(0, min(position, trackSize));
+ if (position == currentPosition)
+ return;
+
+ StepRange range(input);
+ double fraction = static_cast<double>(position) / trackSize;
+ if (isVertical)
+ fraction = 1 - fraction;
+ double value = range.clampValue(range.valueFromProportion(fraction));
+
+ // FIXME: This is no longer being set from renderer. Consider updating the method name.
+ input->setValueFromRenderer(serializeForNumberType(value));
+ renderer()->setNeedsLayout(true);
+ input->dispatchFormControlChangeEvent();
+}
+
+void SliderThumbElement::startDragging()
+{
+ if (Frame* frame = document()->frame()) {
+ frame->eventHandler()->setCapturingMouseEventsNode(this);
+ m_inDragMode = true;
+ }
+}
+
+void SliderThumbElement::stopDragging()
+{
+ if (!m_inDragMode)
+ return;
+
+ if (Frame* frame = document()->frame())
+ frame->eventHandler()->setCapturingMouseEventsNode(0);
+ m_inDragMode = false;
+}
+
void SliderThumbElement::defaultEventHandler(Event* event)
{
if (!event->isMouseEvent()
@@ -99,6 +168,7 @@ void SliderThumbElement::defaultEventHandler(Event* event)
bool isLeftButton = mouseEvent->button() == LeftButton;
const AtomicString& eventType = event->type();
+<<<<<<< HEAD
if (eventType == eventNames().mousedownEvent && isLeftButton
#if PLATFORM(ANDROID) && ENABLE(TOUCH_EVENTS)
|| eventType == eventNames().touchstartEvent
@@ -164,6 +234,18 @@ void SliderThumbElement::defaultEventHandler(Event* event)
return;
}
}
+=======
+ if (eventType == eventNames().mousedownEvent && isLeftButton) {
+ startDragging();
+ return;
+ } else if (eventType == eventNames().mouseupEvent && isLeftButton) {
+ stopDragging();
+ return;
+ } else if (eventType == eventNames().mousemoveEvent) {
+ if (m_inDragMode)
+ setPosition(mouseEvent->absoluteLocation());
+ return;
+>>>>>>> WebKit.org at r76408
}
HTMLDivElement::defaultEventHandler(event);