1 /* 2 * Copyright (C) 2008, 2011 Apple Inc. All Rights Reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * 1. Redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer. 9 * 2. Redistributions in binary form must reproduce the above copyright 10 * notice, this list of conditions and the following disclaimer in the 11 * documentation and/or other materials provided with the distribution. 12 * 13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY 14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR 17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24 */ 25 26 #ifndef ScrollableArea_h 27 #define ScrollableArea_h 28 29 #include "IntRect.h" 30 #include "Scrollbar.h" 31 #include <wtf/Vector.h> 32 33 namespace WebCore { 34 35 class FloatPoint; 36 class GraphicsContext; 37 class PlatformGestureEvent; 38 class PlatformWheelEvent; 39 class ScrollAnimator; 40 #if USE(ACCELERATED_COMPOSITING) 41 class GraphicsLayer; 42 #endif 43 44 class ScrollableArea { 45 public: 46 ScrollableArea(); 47 virtual ~ScrollableArea(); 48 49 bool scroll(ScrollDirection, ScrollGranularity, float multiplier = 1); 50 void scrollToOffsetWithoutAnimation(const FloatPoint&); 51 void scrollToOffsetWithoutAnimation(ScrollbarOrientation, float offset); 52 void scrollToXOffsetWithoutAnimation(float x); 53 void scrollToYOffsetWithoutAnimation(float x); 54 55 void handleWheelEvent(PlatformWheelEvent&); 56 #if ENABLE(GESTURE_EVENTS) 57 void handleGestureEvent(const PlatformGestureEvent&); 58 #endif 59 60 // Functions for controlling if you can scroll past the end of the document. constrainsScrollingToContentEdge()61 bool constrainsScrollingToContentEdge() const { return m_constrainsScrollingToContentEdge; } setConstrainsScrollingToContentEdge(bool constrainsScrollingToContentEdge)62 void setConstrainsScrollingToContentEdge(bool constrainsScrollingToContentEdge) { m_constrainsScrollingToContentEdge = constrainsScrollingToContentEdge; } 63 setVerticalScrollElasticity(ScrollElasticity scrollElasticity)64 void setVerticalScrollElasticity(ScrollElasticity scrollElasticity) { m_verticalScrollElasticity = scrollElasticity; } verticalScrollElasticity()65 ScrollElasticity verticalScrollElasticity() const { return m_verticalScrollElasticity; } 66 setHorizontalScrollElasticity(ScrollElasticity scrollElasticity)67 void setHorizontalScrollElasticity(ScrollElasticity scrollElasticity) { m_horizontalScrollElasticity = scrollElasticity; } horizontalScrollElasticity()68 ScrollElasticity horizontalScrollElasticity() const { return m_horizontalScrollElasticity; } 69 inLiveResize()70 bool inLiveResize() const { return m_inLiveResize; } 71 void willStartLiveResize(); 72 void willEndLiveResize(); 73 74 void didAddVerticalScrollbar(Scrollbar*); 75 void willRemoveVerticalScrollbar(Scrollbar*); 76 void didAddHorizontalScrollbar(Scrollbar*); 77 void willRemoveHorizontalScrollbar(Scrollbar*); 78 79 bool hasOverlayScrollbars() const; recommendedScrollbarOverlayStyle()80 virtual ScrollbarOverlayStyle recommendedScrollbarOverlayStyle() const { return ScrollbarOverlayStyleDefault; } 81 scrollAnimator()82 ScrollAnimator* scrollAnimator() const { return m_scrollAnimator.get(); } scrollOrigin()83 const IntPoint& scrollOrigin() const { return m_scrollOrigin; } 84 85 virtual bool isActive() const = 0; 86 virtual int scrollSize(ScrollbarOrientation) const = 0; 87 virtual int scrollPosition(Scrollbar*) const = 0; 88 void invalidateScrollbar(Scrollbar*, const IntRect&); 89 virtual bool isScrollCornerVisible() const = 0; 90 virtual IntRect scrollCornerRect() const = 0; 91 void invalidateScrollCorner(); getTickmarks(Vector<IntRect> &)92 virtual void getTickmarks(Vector<IntRect>&) const { } 93 94 // This function should be overriden by subclasses to perform the actual 95 // scroll of the content. 96 virtual void setScrollOffset(const IntPoint&) = 0; 97 98 // Convert points and rects between the scrollbar and its containing view. 99 // The client needs to implement these in order to be aware of layout effects 100 // like CSS transforms. convertFromScrollbarToContainingView(const Scrollbar * scrollbar,const IntRect & scrollbarRect)101 virtual IntRect convertFromScrollbarToContainingView(const Scrollbar* scrollbar, const IntRect& scrollbarRect) const 102 { 103 return scrollbar->Widget::convertToContainingView(scrollbarRect); 104 } convertFromContainingViewToScrollbar(const Scrollbar * scrollbar,const IntRect & parentRect)105 virtual IntRect convertFromContainingViewToScrollbar(const Scrollbar* scrollbar, const IntRect& parentRect) const 106 { 107 return scrollbar->Widget::convertFromContainingView(parentRect); 108 } convertFromScrollbarToContainingView(const Scrollbar * scrollbar,const IntPoint & scrollbarPoint)109 virtual IntPoint convertFromScrollbarToContainingView(const Scrollbar* scrollbar, const IntPoint& scrollbarPoint) const 110 { 111 return scrollbar->Widget::convertToContainingView(scrollbarPoint); 112 } convertFromContainingViewToScrollbar(const Scrollbar * scrollbar,const IntPoint & parentPoint)113 virtual IntPoint convertFromContainingViewToScrollbar(const Scrollbar* scrollbar, const IntPoint& parentPoint) const 114 { 115 return scrollbar->Widget::convertFromContainingView(parentPoint); 116 } 117 horizontalScrollbar()118 virtual Scrollbar* horizontalScrollbar() const { return 0; } verticalScrollbar()119 virtual Scrollbar* verticalScrollbar() const { return 0; } 120 scrollPosition()121 virtual IntPoint scrollPosition() const { ASSERT_NOT_REACHED(); return IntPoint(); } minimumScrollPosition()122 virtual IntPoint minimumScrollPosition() const { ASSERT_NOT_REACHED(); return IntPoint(); } maximumScrollPosition()123 virtual IntPoint maximumScrollPosition() const { ASSERT_NOT_REACHED(); return IntPoint(); } 124 virtual IntRect visibleContentRect(bool = false) const { ASSERT_NOT_REACHED(); return IntRect(); } visibleHeight()125 virtual int visibleHeight() const { ASSERT_NOT_REACHED(); return 0; } visibleWidth()126 virtual int visibleWidth() const { ASSERT_NOT_REACHED(); return 0; } contentsSize()127 virtual IntSize contentsSize() const { ASSERT_NOT_REACHED(); return IntSize(); } overhangAmount()128 virtual IntSize overhangAmount() const { ASSERT_NOT_REACHED(); return IntSize(); } currentMousePosition()129 virtual IntPoint currentMousePosition() const { return IntPoint(); } didCompleteRubberBand(const IntSize &)130 virtual void didCompleteRubberBand(const IntSize&) const { ASSERT_NOT_REACHED(); } shouldSuspendScrollAnimations()131 virtual bool shouldSuspendScrollAnimations() const { return true; } scrollbarStyleChanged()132 virtual void scrollbarStyleChanged() { } setVisibleScrollerThumbRect(const IntRect &)133 virtual void setVisibleScrollerThumbRect(const IntRect&) { } 134 disconnectFromPage()135 virtual void disconnectFromPage() { } 136 137 private: 138 // NOTE: Only called from the ScrollAnimator. 139 friend class ScrollAnimator; 140 void setScrollOffsetFromAnimation(const IntPoint&); 141 142 OwnPtr<ScrollAnimator> m_scrollAnimator; 143 bool m_constrainsScrollingToContentEdge; 144 145 bool m_inLiveResize; 146 147 ScrollElasticity m_verticalScrollElasticity; 148 ScrollElasticity m_horizontalScrollElasticity; 149 150 protected: 151 virtual void invalidateScrollbarRect(Scrollbar*, const IntRect&) = 0; 152 virtual void invalidateScrollCornerRect(const IntRect&) = 0; 153 154 #if USE(ACCELERATED_COMPOSITING) layerForHorizontalScrollbar()155 virtual GraphicsLayer* layerForHorizontalScrollbar() const { return 0; } layerForVerticalScrollbar()156 virtual GraphicsLayer* layerForVerticalScrollbar() const { return 0; } layerForScrollCorner()157 virtual GraphicsLayer* layerForScrollCorner() const { return 0; } 158 #endif 159 bool hasLayerForHorizontalScrollbar() const; 160 bool hasLayerForVerticalScrollbar() const; 161 bool hasLayerForScrollCorner() const; 162 163 // There are 8 possible combinations of writing mode and direction. Scroll origin will be non-zero in the x or y axis 164 // if there is any reversed direction or writing-mode. The combinations are: 165 // writing-mode / direction scrollOrigin.x() set scrollOrigin.y() set 166 // horizontal-tb / ltr NO NO 167 // horizontal-tb / rtl YES NO 168 // horizontal-bt / ltr NO YES 169 // horizontal-bt / rtl YES YES 170 // vertical-lr / ltr NO NO 171 // vertical-lr / rtl NO YES 172 // vertical-rl / ltr YES NO 173 // vertical-rl / rtl YES YES 174 IntPoint m_scrollOrigin; 175 }; 176 177 } // namespace WebCore 178 179 #endif // ScrollableArea_h 180