diff options
author | Ben Murdoch <benm@google.com> | 2009-08-11 17:01:47 +0100 |
---|---|---|
committer | Ben Murdoch <benm@google.com> | 2009-08-11 18:21:02 +0100 |
commit | 0bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5 (patch) | |
tree | 2943df35f62d885c89d01063cc528dd73b480fea /WebCore/rendering/RenderSlider.cpp | |
parent | 7e7a70bfa49a1122b2597a1e6367d89eb4035eca (diff) | |
download | external_webkit-0bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5.zip external_webkit-0bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5.tar.gz external_webkit-0bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5.tar.bz2 |
Merge in WebKit r47029.
Diffstat (limited to 'WebCore/rendering/RenderSlider.cpp')
-rw-r--r-- | WebCore/rendering/RenderSlider.cpp | 135 |
1 files changed, 86 insertions, 49 deletions
diff --git a/WebCore/rendering/RenderSlider.cpp b/WebCore/rendering/RenderSlider.cpp index f1e35e5..8a19d97 100644 --- a/WebCore/rendering/RenderSlider.cpp +++ b/WebCore/rendering/RenderSlider.cpp @@ -125,47 +125,57 @@ public: bool inDragMode() const { return m_inDragMode; } virtual void defaultEventHandler(Event*); + virtual void detach(); private: virtual bool isShadowNode() const { return true; } virtual Node* shadowParentNode() { return m_shadowParent; } + FloatPoint m_offsetToThumb; Node* m_shadowParent; - FloatPoint m_initialClickPoint; // initial click point in RenderSlider-local coordinates - int m_initialPosition; bool m_inDragMode; }; SliderThumbElement::SliderThumbElement(Document* document, Node* shadowParent) : HTMLDivElement(divTag, document) , m_shadowParent(shadowParent) - , m_initialPosition(0) , m_inDragMode(false) { } void SliderThumbElement::defaultEventHandler(Event* event) { + if (!event->isMouseEvent()) { + HTMLDivElement::defaultEventHandler(event); + return; + } + + MouseEvent* mouseEvent = static_cast<MouseEvent*>(event); + bool isLeftButton = mouseEvent->button() == LeftButton; const AtomicString& eventType = event->type(); - if (eventType == eventNames().mousedownEvent && event->isMouseEvent() && static_cast<MouseEvent*>(event)->button() == LeftButton) { - MouseEvent* mouseEvent = static_cast<MouseEvent*>(event); - RenderSlider* slider; - if (document()->frame() && renderer() && - (slider = static_cast<RenderSlider*>(renderer()->parent())) && - slider->mouseEventIsInThumb(mouseEvent)) { - - // Cache the initial point where the mouse down occurred, in slider coordinates - m_initialClickPoint = slider->absoluteToLocal(mouseEvent->absoluteLocation(), false, true); - // Cache the initial position of the thumb. - m_initialPosition = slider->currentPosition(); - m_inDragMode = true; - - document()->frame()->eventHandler()->setCapturingMouseEventsNode(m_shadowParent); - - event->setDefaultHandled(); - return; + + if (eventType == eventNames().mousedownEvent && isLeftButton) { + if (document()->frame() && renderer()) { + RenderSlider* slider = toRenderSlider(renderer()->parent()); + if (slider) { + if (slider->mouseEventIsInThumb(mouseEvent)) { + // We selected the thumb, we want the cursor to always stay at + // the same position relative to the thumb. + m_offsetToThumb = slider->mouseEventOffsetToThumb(mouseEvent); + } else { + // We are outside the thumb, move the thumb to the point were + // we clicked. We'll be exactly at the center of the thumb. + m_offsetToThumb.setX(0); + m_offsetToThumb.setY(0); + } + + m_inDragMode = true; + document()->frame()->eventHandler()->setCapturingMouseEventsNode(m_shadowParent); + event->setDefaultHandled(); + return; + } } - } else if (eventType == eventNames().mouseupEvent && event->isMouseEvent() && static_cast<MouseEvent*>(event)->button() == LeftButton) { + } else if (eventType == eventNames().mouseupEvent && isLeftButton) { if (m_inDragMode) { if (Frame* frame = document()->frame()) frame->eventHandler()->setCapturingMouseEventsNode(0); @@ -173,24 +183,31 @@ void SliderThumbElement::defaultEventHandler(Event* event) event->setDefaultHandled(); return; } - } else if (eventType == eventNames().mousemoveEvent && event->isMouseEvent()) { + } else if (eventType == eventNames().mousemoveEvent) { if (m_inDragMode && renderer() && renderer()->parent()) { - // Move the slider - MouseEvent* mouseEvent = static_cast<MouseEvent*>(event); - RenderSlider* slider = static_cast<RenderSlider*>(renderer()->parent()); - - FloatPoint curPoint = slider->absoluteToLocal(mouseEvent->absoluteLocation(), false, true); - IntPoint eventOffset(m_initialPosition + curPoint.x() - m_initialClickPoint.x() + renderBox()->width() / 2, - m_initialPosition + curPoint.y() - m_initialClickPoint.y() + renderBox()->height() / 2); - slider->setValueForPosition(slider->positionForOffset(eventOffset)); - event->setDefaultHandled(); - return; + RenderSlider* slider = toRenderSlider(renderer()->parent()); + if (slider) { + FloatPoint curPoint = slider->absoluteToLocal(mouseEvent->absoluteLocation(), false, true); + IntPoint eventOffset(curPoint.x() + m_offsetToThumb.x(), curPoint.y() + m_offsetToThumb.y()); + slider->setValueForPosition(slider->positionForOffset(eventOffset)); + event->setDefaultHandled(); + return; + } } } HTMLDivElement::defaultEventHandler(event); } +void SliderThumbElement::detach() +{ + if (m_inDragMode) { + if (Frame* frame = document()->frame()) + frame->eventHandler()->setCapturingMouseEventsNode(0); + } + HTMLDivElement::detach(); +} + RenderSlider::RenderSlider(HTMLInputElement* element) : RenderBlock(element) { @@ -272,6 +289,30 @@ PassRefPtr<RenderStyle> RenderSlider::createThumbStyle(const RenderStyle* parent return style.release(); } +IntRect RenderSlider::thumbRect() +{ + if (!m_thumb) + return IntRect(); + + IntRect thumbRect; + RenderBox* thumb = toRenderBox(m_thumb->renderer()); + + thumbRect.setWidth(thumb->style()->width().calcMinValue(contentWidth())); + thumbRect.setHeight(thumb->style()->height().calcMinValue(contentHeight())); + + double fraction = sliderPosition(static_cast<HTMLInputElement*>(node())); + IntRect contentRect = contentBoxRect(); + if (style()->appearance() == SliderVerticalPart) { + thumbRect.setX(contentRect.x() + (contentRect.width() - thumbRect.width()) / 2); + thumbRect.setY(contentRect.y() + static_cast<int>(nextafter((contentRect.height() - thumbRect.height()) + 1, 0) * (1 - fraction))); + } else { + thumbRect.setX(contentRect.x() + static_cast<int>(nextafter((contentRect.width() - thumbRect.width()) + 1, 0) * fraction)); + thumbRect.setY(contentRect.y() + (contentRect.height() - thumbRect.height()) / 2); + } + + return thumbRect; +} + void RenderSlider::layout() { ASSERT(needsLayout()); @@ -311,23 +352,8 @@ void RenderSlider::layout() thumb->layoutIfNeeded(); - IntRect thumbRect; - - thumbRect.setWidth(thumb->style()->width().calcMinValue(contentWidth())); - thumbRect.setHeight(thumb->style()->height().calcMinValue(contentHeight())); - - double fraction = sliderPosition(static_cast<HTMLInputElement*>(node())); - IntRect contentRect = contentBoxRect(); - if (style()->appearance() == SliderVerticalPart) { - thumbRect.setX(contentRect.x() + (contentRect.width() - thumbRect.width()) / 2); - thumbRect.setY(contentRect.y() + static_cast<int>(nextafter((contentRect.height() - thumbRect.height()) + 1, 0) * (1 - fraction))); - } else { - thumbRect.setX(contentRect.x() + static_cast<int>(nextafter((contentRect.width() - thumbRect.width()) + 1, 0) * fraction)); - thumbRect.setY(contentRect.y() + (contentRect.height() - thumbRect.height()) / 2); - } - - thumb->setFrameRect(thumbRect); - + IntRect rect = thumbRect(); + thumb->setFrameRect(rect); if (thumb->checkForRepaintDuringLayout()) thumb->repaintDuringLayoutIfMoved(oldThumbRect); @@ -391,6 +417,17 @@ bool RenderSlider::mouseEventIsInThumb(MouseEvent* evt) return thumbBounds.contains(roundedIntPoint(localPoint)); } +FloatPoint RenderSlider::mouseEventOffsetToThumb(MouseEvent* evt) +{ + ASSERT(m_thumb && m_thumb->renderer()); + FloatPoint localPoint = m_thumb->renderBox()->absoluteToLocal(evt->absoluteLocation(), false, true); + IntRect thumbBounds = m_thumb->renderBox()->borderBoxRect(); + FloatPoint offset; + offset.setX(thumbBounds.x() + thumbBounds.width() / 2 - localPoint.x()); + offset.setY(thumbBounds.y() + thumbBounds.height() / 2 - localPoint.y()); + return offset; +} + void RenderSlider::setValueForPosition(int position) { if (!m_thumb || !m_thumb->renderer()) |