summaryrefslogtreecommitdiffstats
path: root/WebCore/platform/ScrollbarThemeComposite.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'WebCore/platform/ScrollbarThemeComposite.cpp')
-rw-r--r--WebCore/platform/ScrollbarThemeComposite.cpp304
1 files changed, 0 insertions, 304 deletions
diff --git a/WebCore/platform/ScrollbarThemeComposite.cpp b/WebCore/platform/ScrollbarThemeComposite.cpp
deleted file mode 100644
index bf00ebb..0000000
--- a/WebCore/platform/ScrollbarThemeComposite.cpp
+++ /dev/null
@@ -1,304 +0,0 @@
-/*
- * Copyright (C) 2008 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 "ScrollbarThemeComposite.h"
-
-#include "Chrome.h"
-#include "ChromeClient.h"
-#include "Frame.h"
-#include "FrameView.h"
-#include "GraphicsContext.h"
-#include "Page.h"
-#include "PlatformMouseEvent.h"
-#include "Scrollbar.h"
-#include "ScrollbarClient.h"
-#include "Settings.h"
-
-namespace WebCore {
-
-#if PLATFORM(WIN)
-static Page* pageForScrollView(ScrollView* view)
-{
- if (!view)
- return 0;
- if (!view->isFrameView())
- return 0;
- FrameView* frameView = static_cast<FrameView*>(view);
- if (!frameView->frame())
- return 0;
- return frameView->frame()->page();
-}
-#endif
-
-bool ScrollbarThemeComposite::paint(Scrollbar* 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;
- }
-
-#if PLATFORM(WIN)
- // FIXME: This API makes the assumption that the custom scrollbar's metrics will match
- // the theme's metrics. This is not a valid assumption. The ability for a client to paint
- // custom scrollbars should be removed once scrollbars can be styled via CSS.
- if (Page* page = pageForScrollView(scrollbar->parent())) {
- if (page->settings()->shouldPaintCustomScrollbars()) {
- float proportion = static_cast<float>(scrollbar->visibleSize()) / scrollbar->totalSize();
- float value = scrollbar->currentPos() / static_cast<float>(scrollbar->maximum());
- ScrollbarControlState s = 0;
- if (scrollbar->client()->isActive())
- s |= ActiveScrollbarState;
- if (scrollbar->enabled())
- s |= EnabledScrollbarState;
- if (scrollbar->pressedPart() != NoPart)
- s |= PressedScrollbarState;
- if (page->chrome()->client()->paintCustomScrollbar(graphicsContext,
- scrollbar->frameRect(),
- scrollbar->controlSize(),
- s,
- scrollbar->pressedPart(),
- scrollbar->orientation() == VerticalScrollbar,
- value,
- proportion,
- scrollMask))
- return true;
- }
- }
-#endif
-
- // 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 ScrollbarThemeComposite::hitTest(Scrollbar* scrollbar, const PlatformMouseEvent& evt)
-{
- ScrollbarPart result = NoPart;
- if (!scrollbar->enabled())
- return result;
-
- IntPoint mousePosition = scrollbar->convertFromContainingWindow(evt.pos());
- mousePosition.move(scrollbar->x(), scrollbar->y());
-
- if (!scrollbar->frameRect().contains(mousePosition))
- return NoPart;
-
- result = ScrollbarBGPart;
-
- IntRect track = trackRect(scrollbar);
- if (track.contains(mousePosition)) {
- IntRect beforeThumbRect;
- IntRect thumbRect;
- IntRect afterThumbRect;
- splitTrack(scrollbar, track, beforeThumbRect, thumbRect, afterThumbRect);
- if (thumbRect.contains(mousePosition))
- result = ThumbPart;
- else if (beforeThumbRect.contains(mousePosition))
- result = BackTrackPart;
- else if (afterThumbRect.contains(mousePosition))
- result = ForwardTrackPart;
- else
- result = TrackBGPart;
- } else if (backButtonRect(scrollbar, BackButtonStartPart).contains(mousePosition))
- result = BackButtonStartPart;
- else if (backButtonRect(scrollbar, BackButtonEndPart).contains(mousePosition))
- result = BackButtonEndPart;
- else if (forwardButtonRect(scrollbar, ForwardButtonStartPart).contains(mousePosition))
- result = ForwardButtonStartPart;
- else if (forwardButtonRect(scrollbar, ForwardButtonEndPart).contains(mousePosition))
- result = ForwardButtonEndPart;
- return result;
-}
-
-void ScrollbarThemeComposite::invalidatePart(Scrollbar* 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.move(-scrollbar->x(), -scrollbar->y());
- scrollbar->invalidateRect(result);
-}
-
-void ScrollbarThemeComposite::splitTrack(Scrollbar* 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 thickness = scrollbar->orientation() == HorizontalScrollbar ? scrollbar->height() : scrollbar->width();
- int thumbPos = thumbPosition(scrollbar);
- if (scrollbar->orientation() == HorizontalScrollbar) {
- thumbRect = IntRect(trackRect.x() + thumbPos, trackRect.y() + (trackRect.height() - thickness) / 2, thumbLength(scrollbar), thickness);
- beforeThumbRect = IntRect(trackRect.x(), trackRect.y(), thumbPos + thumbRect.width() / 2, trackRect.height());
- afterThumbRect = IntRect(trackRect.x() + beforeThumbRect.width(), trackRect.y(), trackRect.right() - beforeThumbRect.right(), trackRect.height());
- } else {
- thumbRect = IntRect(trackRect.x() + (trackRect.width() - thickness) / 2, trackRect.y() + thumbPos, thickness, 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.bottom() - beforeThumbRect.bottom());
- }
-}
-
-int ScrollbarThemeComposite::thumbPosition(Scrollbar* scrollbar)
-{
- if (scrollbar->enabled())
- return scrollbar->currentPos() * (trackLength(scrollbar) - thumbLength(scrollbar)) / scrollbar->maximum();
- return 0;
-}
-
-int ScrollbarThemeComposite::thumbLength(Scrollbar* scrollbar)
-{
- if (!scrollbar->enabled())
- return 0;
-
- float proportion = (float)scrollbar->visibleSize() / scrollbar->totalSize();
- int trackLen = trackLength(scrollbar);
- int length = proportion * trackLen;
- length = 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 ScrollbarThemeComposite::minimumThumbLength(Scrollbar* scrollbar)
-{
- return scrollbarThickness(scrollbar->controlSize());
-}
-
-int ScrollbarThemeComposite::trackPosition(Scrollbar* scrollbar)
-{
- IntRect constrainedTrackRect = constrainTrackRectToTrackPieces(scrollbar, trackRect(scrollbar));
- return (scrollbar->orientation() == HorizontalScrollbar) ? constrainedTrackRect.x() - scrollbar->x() : constrainedTrackRect.y() - scrollbar->y();
-}
-
-int ScrollbarThemeComposite::trackLength(Scrollbar* scrollbar)
-{
- IntRect constrainedTrackRect = constrainTrackRectToTrackPieces(scrollbar, trackRect(scrollbar));
- return (scrollbar->orientation() == HorizontalScrollbar) ? constrainedTrackRect.width() : constrainedTrackRect.height();
-}
-
-void ScrollbarThemeComposite::paintScrollCorner(ScrollView* view, GraphicsContext* context, const IntRect& cornerRect)
-{
- FrameView* frameView = static_cast<FrameView*>(view);
- Page* page = frameView->frame() ? frameView->frame()->page() : 0;
- if (page && page->settings()->shouldPaintCustomScrollbars() && page->chrome()->client()->paintCustomScrollCorner(context, cornerRect))
- return;
- context->fillRect(cornerRect, Color::white, ColorSpaceDeviceRGB);
-}
-
-}