Index: Source/WebCore/platform/win/ScrollbarThemeWin.cpp |
diff --git a/Source/WebCore/platform/win/ScrollbarThemeWin.cpp b/Source/WebCore/platform/win/ScrollbarThemeWin.cpp |
deleted file mode 100644 |
index ed49f2be6ef9b57d95e1648e111b5cc7e4b5abcd..0000000000000000000000000000000000000000 |
--- a/Source/WebCore/platform/win/ScrollbarThemeWin.cpp |
+++ /dev/null |
@@ -1,393 +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 "ScrollbarThemeWin.h" |
- |
-#include "GraphicsContext.h" |
-#include "LocalWindowsContext.h" |
-#include "PlatformMouseEvent.h" |
-#include "Scrollbar.h" |
-#include "SoftLinking.h" |
-#include "SystemInfo.h" |
- |
-// Generic state constants |
-#define TS_NORMAL 1 |
-#define TS_HOVER 2 |
-#define TS_ACTIVE 3 |
-#define TS_DISABLED 4 |
- |
-#define SP_BUTTON 1 |
-#define SP_THUMBHOR 2 |
-#define SP_THUMBVERT 3 |
-#define SP_TRACKSTARTHOR 4 |
-#define SP_TRACKENDHOR 5 |
-#define SP_TRACKSTARTVERT 6 |
-#define SP_TRACKENDVERT 7 |
-#define SP_GRIPPERHOR 8 |
-#define SP_GRIPPERVERT 9 |
- |
-#define TS_UP_BUTTON 0 |
-#define TS_DOWN_BUTTON 4 |
-#define TS_LEFT_BUTTON 8 |
-#define TS_RIGHT_BUTTON 12 |
-#define TS_UP_BUTTON_HOVER 17 |
-#define TS_DOWN_BUTTON_HOVER 18 |
-#define TS_LEFT_BUTTON_HOVER 19 |
-#define TS_RIGHT_BUTTON_HOVER 20 |
- |
-using namespace std; |
- |
-namespace WebCore { |
- |
-static HANDLE scrollbarTheme; |
-static bool runningVista; |
- |
-// FIXME: Refactor the soft-linking code so that it can be shared with RenderThemeWin |
-SOFT_LINK_LIBRARY(uxtheme) |
-SOFT_LINK(uxtheme, OpenThemeData, HANDLE, WINAPI, (HWND hwnd, LPCWSTR pszClassList), (hwnd, pszClassList)) |
-SOFT_LINK(uxtheme, CloseThemeData, HRESULT, WINAPI, (HANDLE hTheme), (hTheme)) |
-SOFT_LINK(uxtheme, DrawThemeBackground, HRESULT, WINAPI, (HANDLE hTheme, HDC hdc, int iPartId, int iStateId, const RECT* pRect, const RECT* pClipRect), (hTheme, hdc, iPartId, iStateId, pRect, pClipRect)) |
-SOFT_LINK(uxtheme, IsThemeActive, BOOL, WINAPI, (), ()) |
-SOFT_LINK(uxtheme, IsThemeBackgroundPartiallyTransparent, BOOL, WINAPI, (HANDLE hTheme, int iPartId, int iStateId), (hTheme, iPartId, iStateId)) |
- |
-// Constants used to figure the drag rect outside which we should snap the |
-// scrollbar thumb back to its origin. These calculations are based on |
-// observing the behavior of the MSVC8 main window scrollbar + some |
-// guessing/extrapolation. |
-static const int kOffEndMultiplier = 3; |
-static const int kOffSideMultiplier = 8; |
- |
-static void checkAndInitScrollbarTheme() |
-{ |
- if (uxthemeLibrary() && !scrollbarTheme && IsThemeActive()) |
- scrollbarTheme = OpenThemeData(0, L"Scrollbar"); |
-} |
- |
-#if !USE(SAFARI_THEME) |
-ScrollbarTheme* ScrollbarTheme::nativeTheme() |
-{ |
- static ScrollbarThemeWin winTheme; |
- return &winTheme; |
-} |
-#endif |
- |
-ScrollbarThemeWin::ScrollbarThemeWin() |
-{ |
- static bool initialized; |
- if (!initialized) { |
- initialized = true; |
- checkAndInitScrollbarTheme(); |
- runningVista = (windowsVersion() >= WindowsVista); |
- } |
-} |
- |
-ScrollbarThemeWin::~ScrollbarThemeWin() |
-{ |
-} |
- |
-int ScrollbarThemeWin::scrollbarThickness(ScrollbarControlSize) |
-{ |
- static int thickness; |
- if (!thickness) |
- thickness = ::GetSystemMetrics(SM_CXVSCROLL); |
- return thickness; |
-} |
- |
-void ScrollbarThemeWin::themeChanged() |
-{ |
- if (!scrollbarTheme) |
- return; |
- |
- CloseThemeData(scrollbarTheme); |
- scrollbarTheme = 0; |
-} |
- |
-bool ScrollbarThemeWin::invalidateOnMouseEnterExit() |
-{ |
- return runningVista; |
-} |
- |
-bool ScrollbarThemeWin::hasThumb(ScrollbarThemeClient* scrollbar) |
-{ |
- return thumbLength(scrollbar) > 0; |
-} |
- |
-IntRect ScrollbarThemeWin::backButtonRect(ScrollbarThemeClient* scrollbar, ScrollbarPart part, bool) |
-{ |
- // Windows just has single arrows. |
- if (part == BackButtonEndPart) |
- return IntRect(); |
- |
- // Our desired rect is essentially 17x17. |
- |
- // Our actual rect will shrink to half the available space when |
- // we have < 34 pixels left. This allows the scrollbar |
- // to scale down and function even at tiny sizes. |
- int thickness = scrollbarThickness(); |
- if (scrollbar->orientation() == HorizontalScrollbar) |
- return IntRect(scrollbar->x(), scrollbar->y(), |
- scrollbar->width() < 2 * thickness ? scrollbar->width() / 2 : thickness, thickness); |
- return IntRect(scrollbar->x(), scrollbar->y(), |
- thickness, scrollbar->height() < 2 * thickness ? scrollbar->height() / 2 : thickness); |
-} |
- |
-IntRect ScrollbarThemeWin::forwardButtonRect(ScrollbarThemeClient* scrollbar, ScrollbarPart part, bool) |
-{ |
- // Windows just has single arrows. |
- if (part == ForwardButtonStartPart) |
- return IntRect(); |
- |
- // Our desired rect is essentially 17x17. |
- |
- // Our actual rect will shrink to half the available space when |
- // we have < 34 pixels left. This allows the scrollbar |
- // to scale down and function even at tiny sizes. |
- int thickness = scrollbarThickness(); |
- if (scrollbar->orientation() == HorizontalScrollbar) { |
- int w = scrollbar->width() < 2 * thickness ? scrollbar->width() / 2 : thickness; |
- return IntRect(scrollbar->x() + scrollbar->width() - w, scrollbar->y(), w, thickness); |
- } |
- |
- int h = scrollbar->height() < 2 * thickness ? scrollbar->height() / 2 : thickness; |
- return IntRect(scrollbar->x(), scrollbar->y() + scrollbar->height() - h, thickness, h); |
-} |
- |
-IntRect ScrollbarThemeWin::trackRect(ScrollbarThemeClient* scrollbar, bool) |
-{ |
- int thickness = scrollbarThickness(); |
- if (scrollbar->orientation() == HorizontalScrollbar) { |
- if (scrollbar->width() < 2 * thickness) |
- return IntRect(); |
- return IntRect(scrollbar->x() + thickness, scrollbar->y(), scrollbar->width() - 2 * thickness, thickness); |
- } |
- if (scrollbar->height() < 2 * thickness) |
- return IntRect(); |
- return IntRect(scrollbar->x(), scrollbar->y() + thickness, thickness, scrollbar->height() - 2 * thickness); |
-} |
- |
-bool ScrollbarThemeWin::shouldCenterOnThumb(ScrollbarThemeClient*, const PlatformMouseEvent& evt) |
-{ |
- return evt.shiftKey() && evt.button() == LeftButton; |
-} |
- |
-bool ScrollbarThemeWin::shouldSnapBackToDragOrigin(ScrollbarThemeClient* scrollbar, const PlatformMouseEvent& evt) |
-{ |
- // Find the rect within which we shouldn't snap, by expanding the track rect |
- // in both dimensions. |
- IntRect rect = trackRect(scrollbar); |
- const bool horz = scrollbar->orientation() == HorizontalScrollbar; |
- const int thickness = scrollbarThickness(scrollbar->controlSize()); |
- rect.inflateX((horz ? kOffEndMultiplier : kOffSideMultiplier) * thickness); |
- rect.inflateY((horz ? kOffSideMultiplier : kOffEndMultiplier) * thickness); |
- |
- // Convert the event to local coordinates. |
- IntPoint mousePosition = scrollbar->convertFromContainingWindow(evt.position()); |
- mousePosition.move(scrollbar->x(), scrollbar->y()); |
- |
- // We should snap iff the event is outside our calculated rect. |
- return !rect.contains(mousePosition); |
-} |
- |
-void ScrollbarThemeWin::paintTrackBackground(GraphicsContext* context, ScrollbarThemeClient* scrollbar, const IntRect& rect) |
-{ |
- // Just assume a forward track part. We only paint the track as a single piece when there is no thumb. |
- if (!hasThumb(scrollbar)) |
- paintTrackPiece(context, scrollbar, rect, ForwardTrackPart); |
-} |
- |
-void ScrollbarThemeWin::paintTrackPiece(GraphicsContext* context, ScrollbarThemeClient* scrollbar, const IntRect& rect, ScrollbarPart partType) |
-{ |
- checkAndInitScrollbarTheme(); |
- |
- bool start = partType == BackTrackPart; |
- int part; |
- if (scrollbar->orientation() == HorizontalScrollbar) |
- part = start ? SP_TRACKSTARTHOR : SP_TRACKENDHOR; |
- else |
- part = start ? SP_TRACKSTARTVERT : SP_TRACKENDVERT; |
- |
- int state; |
- if (!scrollbar->enabled()) |
- state = TS_DISABLED; |
- else if ((scrollbar->hoveredPart() == BackTrackPart && start) || |
- (scrollbar->hoveredPart() == ForwardTrackPart && !start)) |
- state = (scrollbar->pressedPart() == scrollbar->hoveredPart() ? TS_ACTIVE : TS_HOVER); |
- else |
- state = TS_NORMAL; |
- |
- bool alphaBlend = false; |
- if (scrollbarTheme) |
- alphaBlend = IsThemeBackgroundPartiallyTransparent(scrollbarTheme, part, state); |
- |
- LocalWindowsContext windowsContext(context, rect, alphaBlend); |
- RECT themeRect(rect); |
- |
- if (scrollbarTheme) |
- DrawThemeBackground(scrollbarTheme, windowsContext.hdc(), part, state, &themeRect, 0); |
- else { |
- DWORD color3DFace = ::GetSysColor(COLOR_3DFACE); |
- DWORD colorScrollbar = ::GetSysColor(COLOR_SCROLLBAR); |
- DWORD colorWindow = ::GetSysColor(COLOR_WINDOW); |
- HDC hdc = windowsContext.hdc(); |
- if ((color3DFace != colorScrollbar) && (colorWindow != colorScrollbar)) |
- ::FillRect(hdc, &themeRect, HBRUSH(COLOR_SCROLLBAR+1)); |
- else { |
- static WORD patternBits[8] = { 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55 }; |
- HBITMAP patternBitmap = ::CreateBitmap(8, 8, 1, 1, patternBits); |
- HBRUSH brush = ::CreatePatternBrush(patternBitmap); |
- SaveDC(hdc); |
- ::SetTextColor(hdc, ::GetSysColor(COLOR_3DHILIGHT)); |
- ::SetBkColor(hdc, ::GetSysColor(COLOR_3DFACE)); |
- ::SetBrushOrgEx(hdc, rect.x(), rect.y(), NULL); |
- ::SelectObject(hdc, brush); |
- ::FillRect(hdc, &themeRect, brush); |
- ::RestoreDC(hdc, -1); |
- ::DeleteObject(brush); |
- ::DeleteObject(patternBitmap); |
- } |
- } |
- |
-#if !OS(WINCE) |
- if (!alphaBlend && !context->isInTransparencyLayer()) |
- DIBPixelData::setRGBABitmapAlpha(windowsContext.hdc(), rect, 255); |
-#endif |
-} |
- |
-void ScrollbarThemeWin::paintButton(GraphicsContext* context, ScrollbarThemeClient* scrollbar, const IntRect& rect, ScrollbarPart part) |
-{ |
- checkAndInitScrollbarTheme(); |
- |
- bool start = (part == BackButtonStartPart); |
- int xpState = 0; |
- int classicState = 0; |
- if (scrollbar->orientation() == HorizontalScrollbar) |
- xpState = start ? TS_LEFT_BUTTON : TS_RIGHT_BUTTON; |
- else |
- xpState = start ? TS_UP_BUTTON : TS_DOWN_BUTTON; |
- classicState = xpState / 4; |
- |
- if (!scrollbar->enabled()) { |
- xpState += TS_DISABLED; |
- classicState |= DFCS_INACTIVE; |
- } else if ((scrollbar->hoveredPart() == BackButtonStartPart && start) || |
- (scrollbar->hoveredPart() == ForwardButtonEndPart && !start)) { |
- if (scrollbar->pressedPart() == scrollbar->hoveredPart()) { |
- xpState += TS_ACTIVE; |
- classicState |= DFCS_PUSHED; |
-#if !OS(WINCE) |
- classicState |= DFCS_FLAT; |
-#endif |
- } else |
- xpState += TS_HOVER; |
- } else { |
- if (scrollbar->hoveredPart() == NoPart || !runningVista) |
- xpState += TS_NORMAL; |
- else { |
- if (scrollbar->orientation() == HorizontalScrollbar) |
- xpState = start ? TS_LEFT_BUTTON_HOVER : TS_RIGHT_BUTTON_HOVER; |
- else |
- xpState = start ? TS_UP_BUTTON_HOVER : TS_DOWN_BUTTON_HOVER; |
- } |
- } |
- |
- bool alphaBlend = false; |
- if (scrollbarTheme) |
- alphaBlend = IsThemeBackgroundPartiallyTransparent(scrollbarTheme, SP_BUTTON, xpState); |
- |
- LocalWindowsContext windowsContext(context, rect, alphaBlend); |
- RECT themeRect(rect); |
- if (scrollbarTheme) |
- DrawThemeBackground(scrollbarTheme, windowsContext.hdc(), SP_BUTTON, xpState, &themeRect, 0); |
- else |
- ::DrawFrameControl(windowsContext.hdc(), &themeRect, DFC_SCROLL, classicState); |
- |
-#if !OS(WINCE) |
- if (!alphaBlend && !context->isInTransparencyLayer()) |
- DIBPixelData::setRGBABitmapAlpha(windowsContext.hdc(), rect, 255); |
-#endif |
-} |
- |
-static IntRect gripperRect(int thickness, const IntRect& thumbRect) |
-{ |
- // Center in the thumb. |
- int gripperThickness = thickness / 2; |
- return IntRect(thumbRect.x() + (thumbRect.width() - gripperThickness) / 2, |
- thumbRect.y() + (thumbRect.height() - gripperThickness) / 2, |
- gripperThickness, gripperThickness); |
-} |
- |
-static void paintGripper(ScrollbarThemeClient* scrollbar, HDC hdc, const IntRect& rect) |
-{ |
- if (!scrollbarTheme) |
- return; // Classic look has no gripper. |
- |
- int state; |
- if (!scrollbar->enabled()) |
- state = TS_DISABLED; |
- else if (scrollbar->pressedPart() == ThumbPart) |
- state = TS_ACTIVE; // Thumb always stays active once pressed. |
- else if (scrollbar->hoveredPart() == ThumbPart) |
- state = TS_HOVER; |
- else |
- state = TS_NORMAL; |
- |
- RECT themeRect(rect); |
- DrawThemeBackground(scrollbarTheme, hdc, scrollbar->orientation() == HorizontalScrollbar ? SP_GRIPPERHOR : SP_GRIPPERVERT, state, &themeRect, 0); |
-} |
- |
-void ScrollbarThemeWin::paintThumb(GraphicsContext* context, ScrollbarThemeClient* scrollbar, const IntRect& rect) |
-{ |
- checkAndInitScrollbarTheme(); |
- |
- int state; |
- if (!scrollbar->enabled()) |
- state = TS_DISABLED; |
- else if (scrollbar->pressedPart() == ThumbPart) |
- state = TS_ACTIVE; // Thumb always stays active once pressed. |
- else if (scrollbar->hoveredPart() == ThumbPart) |
- state = TS_HOVER; |
- else |
- state = TS_NORMAL; |
- |
- bool alphaBlend = false; |
- if (scrollbarTheme) |
- alphaBlend = IsThemeBackgroundPartiallyTransparent(scrollbarTheme, scrollbar->orientation() == HorizontalScrollbar ? SP_THUMBHOR : SP_THUMBVERT, state); |
- LocalWindowsContext windowsContext(context, rect, alphaBlend); |
- RECT themeRect(rect); |
- if (scrollbarTheme) { |
- DrawThemeBackground(scrollbarTheme, windowsContext.hdc(), scrollbar->orientation() == HorizontalScrollbar ? SP_THUMBHOR : SP_THUMBVERT, state, &themeRect, 0); |
- paintGripper(scrollbar, windowsContext.hdc(), gripperRect(scrollbarThickness(), rect)); |
- } else |
- ::DrawEdge(windowsContext.hdc(), &themeRect, EDGE_RAISED, BF_RECT | BF_MIDDLE); |
- |
-#if !OS(WINCE) |
- if (!alphaBlend && !context->isInTransparencyLayer()) |
- DIBPixelData::setRGBABitmapAlpha(windowsContext.hdc(), rect, 255); |
-#endif |
-} |
- |
-} |
- |