Index: Source/core/platform/ScrollbarTheme.cpp |
diff --git a/Source/core/platform/ScrollbarTheme.cpp b/Source/core/platform/ScrollbarTheme.cpp |
deleted file mode 100644 |
index 1d6707b28094f3f5bbb6073068f4c99ce5766d30..0000000000000000000000000000000000000000 |
--- a/Source/core/platform/ScrollbarTheme.cpp |
+++ /dev/null |
@@ -1,327 +0,0 @@ |
-/* |
- * Copyright (C) 2011 Apple Inc. All Rights Reserved. |
- * |
- * Redistribution and use in source and binary forms, with or without |
- * modification, are permitted provided that the following conditions |
- * are met: |
- * 1. Redistributions of source code must retain the above copyright |
- * notice, this list of conditions and the following disclaimer. |
- * 2. Redistributions in binary form must reproduce the above copyright |
- * notice, this list of conditions and the following disclaimer in the |
- * documentation and/or other materials provided with the distribution. |
- * |
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY |
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR |
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY |
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
- */ |
- |
-#include "config.h" |
-#include "core/platform/ScrollbarTheme.h" |
- |
-#include "RuntimeEnabledFeatures.h" |
-#include "core/platform/mock/ScrollbarThemeMock.h" |
-#include "core/platform/mock/ScrollbarThemeOverlayMock.h" |
-#include "platform/scroll/ScrollbarThemeClient.h" |
- |
-namespace WebCore { |
- |
-ScrollbarTheme* ScrollbarTheme::theme() |
-{ |
- if (ScrollbarTheme::mockScrollbarsEnabled()) { |
- if (RuntimeEnabledFeatures::overlayScrollbarsEnabled()) { |
- DEFINE_STATIC_LOCAL(ScrollbarThemeOverlayMock, overlayMockTheme, ()); |
- return &overlayMockTheme; |
- } |
- |
- DEFINE_STATIC_LOCAL(ScrollbarThemeMock, mockTheme, ()); |
- return &mockTheme; |
- } |
- return nativeTheme(); |
-} |
- |
-bool ScrollbarTheme::gMockScrollbarsEnabled = false; |
- |
-void ScrollbarTheme::setMockScrollbarsEnabled(bool flag) |
-{ |
- gMockScrollbarsEnabled = flag; |
-} |
- |
-bool ScrollbarTheme::mockScrollbarsEnabled() |
-{ |
- return gMockScrollbarsEnabled; |
-} |
- |
-bool ScrollbarTheme::paint(ScrollbarThemeClient* scrollbar, GraphicsContext* graphicsContext, const IntRect& damageRect) |
-{ |
- // Create the ScrollbarControlPartMask based on the damageRect |
- ScrollbarControlPartMask scrollMask = NoPart; |
- |
- IntRect backButtonStartPaintRect; |
- IntRect backButtonEndPaintRect; |
- IntRect forwardButtonStartPaintRect; |
- IntRect forwardButtonEndPaintRect; |
- if (hasButtons(scrollbar)) { |
- backButtonStartPaintRect = backButtonRect(scrollbar, BackButtonStartPart, true); |
- if (damageRect.intersects(backButtonStartPaintRect)) |
- scrollMask |= BackButtonStartPart; |
- backButtonEndPaintRect = backButtonRect(scrollbar, BackButtonEndPart, true); |
- if (damageRect.intersects(backButtonEndPaintRect)) |
- scrollMask |= BackButtonEndPart; |
- forwardButtonStartPaintRect = forwardButtonRect(scrollbar, ForwardButtonStartPart, true); |
- if (damageRect.intersects(forwardButtonStartPaintRect)) |
- scrollMask |= ForwardButtonStartPart; |
- forwardButtonEndPaintRect = forwardButtonRect(scrollbar, ForwardButtonEndPart, true); |
- if (damageRect.intersects(forwardButtonEndPaintRect)) |
- scrollMask |= ForwardButtonEndPart; |
- } |
- |
- IntRect startTrackRect; |
- IntRect thumbRect; |
- IntRect endTrackRect; |
- IntRect trackPaintRect = trackRect(scrollbar, true); |
- if (damageRect.intersects(trackPaintRect)) |
- scrollMask |= TrackBGPart; |
- bool thumbPresent = hasThumb(scrollbar); |
- if (thumbPresent) { |
- IntRect track = trackRect(scrollbar); |
- splitTrack(scrollbar, track, startTrackRect, thumbRect, endTrackRect); |
- if (damageRect.intersects(thumbRect)) |
- scrollMask |= ThumbPart; |
- if (damageRect.intersects(startTrackRect)) |
- scrollMask |= BackTrackPart; |
- if (damageRect.intersects(endTrackRect)) |
- scrollMask |= ForwardTrackPart; |
- } |
- |
- // Paint the scrollbar background (only used by custom CSS scrollbars). |
- paintScrollbarBackground(graphicsContext, scrollbar); |
- |
- // Paint the back and forward buttons. |
- if (scrollMask & BackButtonStartPart) |
- paintButton(graphicsContext, scrollbar, backButtonStartPaintRect, BackButtonStartPart); |
- if (scrollMask & BackButtonEndPart) |
- paintButton(graphicsContext, scrollbar, backButtonEndPaintRect, BackButtonEndPart); |
- if (scrollMask & ForwardButtonStartPart) |
- paintButton(graphicsContext, scrollbar, forwardButtonStartPaintRect, ForwardButtonStartPart); |
- if (scrollMask & ForwardButtonEndPart) |
- paintButton(graphicsContext, scrollbar, forwardButtonEndPaintRect, ForwardButtonEndPart); |
- |
- if (scrollMask & TrackBGPart) |
- paintTrackBackground(graphicsContext, scrollbar, trackPaintRect); |
- |
- if ((scrollMask & ForwardTrackPart) || (scrollMask & BackTrackPart)) { |
- // Paint the track pieces above and below the thumb. |
- if (scrollMask & BackTrackPart) |
- paintTrackPiece(graphicsContext, scrollbar, startTrackRect, BackTrackPart); |
- if (scrollMask & ForwardTrackPart) |
- paintTrackPiece(graphicsContext, scrollbar, endTrackRect, ForwardTrackPart); |
- |
- paintTickmarks(graphicsContext, scrollbar, trackPaintRect); |
- } |
- |
- // Paint the thumb. |
- if (scrollMask & ThumbPart) |
- paintThumb(graphicsContext, scrollbar, thumbRect); |
- |
- return true; |
-} |
- |
-ScrollbarPart ScrollbarTheme::hitTest(ScrollbarThemeClient* scrollbar, const IntPoint& position) |
-{ |
- ScrollbarPart result = NoPart; |
- if (!scrollbar->enabled()) |
- return result; |
- |
- IntPoint testPosition = scrollbar->convertFromContainingWindow(position); |
- testPosition.move(scrollbar->x(), scrollbar->y()); |
- |
- if (!scrollbar->frameRect().contains(testPosition)) |
- return NoPart; |
- |
- result = ScrollbarBGPart; |
- |
- IntRect track = trackRect(scrollbar); |
- if (track.contains(testPosition)) { |
- IntRect beforeThumbRect; |
- IntRect thumbRect; |
- IntRect afterThumbRect; |
- splitTrack(scrollbar, track, beforeThumbRect, thumbRect, afterThumbRect); |
- if (thumbRect.contains(testPosition)) |
- result = ThumbPart; |
- else if (beforeThumbRect.contains(testPosition)) |
- result = BackTrackPart; |
- else if (afterThumbRect.contains(testPosition)) |
- result = ForwardTrackPart; |
- else |
- result = TrackBGPart; |
- } else if (backButtonRect(scrollbar, BackButtonStartPart).contains(testPosition)) { |
- result = BackButtonStartPart; |
- } else if (backButtonRect(scrollbar, BackButtonEndPart).contains(testPosition)) { |
- result = BackButtonEndPart; |
- } else if (forwardButtonRect(scrollbar, ForwardButtonStartPart).contains(testPosition)) { |
- result = ForwardButtonStartPart; |
- } else if (forwardButtonRect(scrollbar, ForwardButtonEndPart).contains(testPosition)) { |
- result = ForwardButtonEndPart; |
- } |
- return result; |
-} |
- |
-void ScrollbarTheme::invalidatePart(ScrollbarThemeClient* scrollbar, ScrollbarPart part) |
-{ |
- if (part == NoPart) |
- return; |
- |
- IntRect result; |
- switch (part) { |
- case BackButtonStartPart: |
- result = backButtonRect(scrollbar, BackButtonStartPart, true); |
- break; |
- case BackButtonEndPart: |
- result = backButtonRect(scrollbar, BackButtonEndPart, true); |
- break; |
- case ForwardButtonStartPart: |
- result = forwardButtonRect(scrollbar, ForwardButtonStartPart, true); |
- break; |
- case ForwardButtonEndPart: |
- result = forwardButtonRect(scrollbar, ForwardButtonEndPart, true); |
- break; |
- case TrackBGPart: |
- result = trackRect(scrollbar, true); |
- break; |
- case ScrollbarBGPart: |
- result = scrollbar->frameRect(); |
- break; |
- default: { |
- IntRect beforeThumbRect, thumbRect, afterThumbRect; |
- splitTrack(scrollbar, trackRect(scrollbar), beforeThumbRect, thumbRect, afterThumbRect); |
- if (part == BackTrackPart) |
- result = beforeThumbRect; |
- else if (part == ForwardTrackPart) |
- result = afterThumbRect; |
- else |
- result = thumbRect; |
- } |
- } |
- result.moveBy(-scrollbar->location()); |
- scrollbar->invalidateRect(result); |
-} |
- |
-void ScrollbarTheme::splitTrack(ScrollbarThemeClient* scrollbar, const IntRect& unconstrainedTrackRect, IntRect& beforeThumbRect, IntRect& thumbRect, IntRect& afterThumbRect) |
-{ |
- // This function won't even get called unless we're big enough to have some combination of these three rects where at least |
- // one of them is non-empty. |
- IntRect trackRect = constrainTrackRectToTrackPieces(scrollbar, unconstrainedTrackRect); |
- int thumbPos = thumbPosition(scrollbar); |
- if (scrollbar->orientation() == HorizontalScrollbar) { |
- thumbRect = IntRect(trackRect.x() + thumbPos, trackRect.y(), thumbLength(scrollbar), scrollbar->height()); |
- beforeThumbRect = IntRect(trackRect.x(), trackRect.y(), thumbPos + thumbRect.width() / 2, trackRect.height()); |
- afterThumbRect = IntRect(trackRect.x() + beforeThumbRect.width(), trackRect.y(), trackRect.maxX() - beforeThumbRect.maxX(), trackRect.height()); |
- } else { |
- thumbRect = IntRect(trackRect.x(), trackRect.y() + thumbPos, scrollbar->width(), thumbLength(scrollbar)); |
- beforeThumbRect = IntRect(trackRect.x(), trackRect.y(), trackRect.width(), thumbPos + thumbRect.height() / 2); |
- afterThumbRect = IntRect(trackRect.x(), trackRect.y() + beforeThumbRect.height(), trackRect.width(), trackRect.maxY() - beforeThumbRect.maxY()); |
- } |
-} |
- |
-// Returns the size represented by track taking into account scrolling past |
-// the end of the document. |
-static float usedTotalSize(ScrollbarThemeClient* scrollbar) |
-{ |
- float overhangAtStart = -scrollbar->currentPos(); |
- float overhangAtEnd = scrollbar->currentPos() + scrollbar->visibleSize() - scrollbar->totalSize(); |
- float overhang = std::max(0.0f, std::max(overhangAtStart, overhangAtEnd)); |
- return scrollbar->totalSize() + overhang; |
-} |
- |
-int ScrollbarTheme::thumbPosition(ScrollbarThemeClient* scrollbar) |
-{ |
- if (scrollbar->enabled()) { |
- float size = usedTotalSize(scrollbar) - scrollbar->visibleSize(); |
- // Avoid doing a floating point divide by zero and return 1 when usedTotalSize == visibleSize. |
- if (!size) |
- return 1; |
- float pos = std::max(0.0f, scrollbar->currentPos()) * (trackLength(scrollbar) - thumbLength(scrollbar)) / size; |
- return (pos < 1 && pos > 0) ? 1 : pos; |
- } |
- return 0; |
-} |
- |
-int ScrollbarTheme::thumbLength(ScrollbarThemeClient* scrollbar) |
-{ |
- if (!scrollbar->enabled()) |
- return 0; |
- |
- float overhang = 0; |
- if (scrollbar->currentPos() < 0) |
- overhang = -scrollbar->currentPos(); |
- else if (scrollbar->visibleSize() + scrollbar->currentPos() > scrollbar->totalSize()) |
- overhang = scrollbar->currentPos() + scrollbar->visibleSize() - scrollbar->totalSize(); |
- float proportion = (scrollbar->visibleSize() - overhang) / usedTotalSize(scrollbar); |
- int trackLen = trackLength(scrollbar); |
- int length = round(proportion * trackLen); |
- length = std::max(length, minimumThumbLength(scrollbar)); |
- if (length > trackLen) |
- length = 0; // Once the thumb is below the track length, it just goes away (to make more room for the track). |
- return length; |
-} |
- |
-int ScrollbarTheme::minimumThumbLength(ScrollbarThemeClient* scrollbar) |
-{ |
- return scrollbarThickness(scrollbar->controlSize()); |
-} |
- |
-int ScrollbarTheme::trackPosition(ScrollbarThemeClient* scrollbar) |
-{ |
- IntRect constrainedTrackRect = constrainTrackRectToTrackPieces(scrollbar, trackRect(scrollbar)); |
- return (scrollbar->orientation() == HorizontalScrollbar) ? constrainedTrackRect.x() - scrollbar->x() : constrainedTrackRect.y() - scrollbar->y(); |
-} |
- |
-int ScrollbarTheme::trackLength(ScrollbarThemeClient* scrollbar) |
-{ |
- IntRect constrainedTrackRect = constrainTrackRectToTrackPieces(scrollbar, trackRect(scrollbar)); |
- return (scrollbar->orientation() == HorizontalScrollbar) ? constrainedTrackRect.width() : constrainedTrackRect.height(); |
-} |
- |
-void ScrollbarTheme::paintScrollCorner(GraphicsContext* context, const IntRect& cornerRect) |
-{ |
- context->fillRect(cornerRect, Color::white); |
-} |
- |
-IntRect ScrollbarTheme::thumbRect(ScrollbarThemeClient* scrollbar) |
-{ |
- if (!hasThumb(scrollbar)) |
- return IntRect(); |
- |
- IntRect track = trackRect(scrollbar); |
- IntRect startTrackRect; |
- IntRect thumbRect; |
- IntRect endTrackRect; |
- splitTrack(scrollbar, track, startTrackRect, thumbRect, endTrackRect); |
- |
- return thumbRect; |
-} |
- |
-int ScrollbarTheme::thumbThickness(ScrollbarThemeClient* scrollbar) |
-{ |
- IntRect track = trackRect(scrollbar); |
- return scrollbar->orientation() == HorizontalScrollbar ? track.height() : track.width(); |
-} |
- |
-void ScrollbarTheme::paintOverhangBackground(GraphicsContext* context, const IntRect& horizontalOverhangRect, const IntRect& verticalOverhangRect, const IntRect& dirtyRect) |
-{ |
- context->setFillColor(Color::white); |
- if (!horizontalOverhangRect.isEmpty()) |
- context->fillRect(intersection(horizontalOverhangRect, dirtyRect)); |
- if (!verticalOverhangRect.isEmpty()) |
- context->fillRect(intersection(verticalOverhangRect, dirtyRect)); |
-} |
- |
-} |