1635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project/*
2635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * Copyright (C) 2008 Apple Inc. All Rights Reserved.
3635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * Copyright (C) 2008, 2009 Google Inc.
4635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project *
5635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * Redistribution and use in source and binary forms, with or without
6635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * modification, are permitted provided that the following conditions
7635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * are met:
8635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * 1. Redistributions of source code must retain the above copyright
9635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project *    notice, this list of conditions and the following disclaimer.
10635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright
11635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project *    notice, this list of conditions and the following disclaimer in the
12635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project *    documentation and/or other materials provided with the distribution.
13635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project *
14635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
15635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
17635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
18635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
19635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
20635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
21635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
22635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
24635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project */
26635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
27635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "config.h"
285f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#include "ScrollbarThemeChromiumWin.h"
29635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
30635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include <windows.h>
31635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include <vsstyle.h>
32635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
33635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "GraphicsContext.h"
34ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch#include "PlatformBridge.h"
35635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "PlatformContextSkia.h"
36635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "PlatformMouseEvent.h"
37635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "Scrollbar.h"
382bde8e466a4451c7319e3a072d118917957d6554Steve Block#include "SystemInfo.h"
39635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
40635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectnamespace WebCore {
41635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
425f1ab04193ad0130ca8204aadaceae083aca9881Feng QianScrollbarTheme* ScrollbarTheme::nativeTheme()
435f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian{
445f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    static ScrollbarThemeChromiumWin theme;
455f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    return &theme;
465f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian}
475f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
48635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project// The scrollbar size in DumpRenderTree on the Mac - so we can match their
49635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project// layout results.  Entries are for regular, small, and mini scrollbars.
50635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project// Metrics obtained using [NSScroller scrollerWidthForControlSize:]
51635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectstatic const int kMacScrollbarSize[3] = { 15, 11, 15 };
52635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
535f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian// Constants used to figure the drag rect outside which we should snap the
545f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian// scrollbar thumb back to its origin.  These calculations are based on
555f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian// observing the behavior of the MSVC8 main window scrollbar + some
565f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian// guessing/extrapolation.
575f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianstatic const int kOffEndMultiplier = 3;
585f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianstatic const int kOffSideMultiplier = 8;
595f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
605f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianint ScrollbarThemeChromiumWin::scrollbarThickness(ScrollbarControlSize controlSize)
61635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
62635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    static int thickness;
63635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (!thickness) {
64ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        if (PlatformBridge::layoutTestMode())
65635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            return kMacScrollbarSize[controlSize];
66635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        thickness = GetSystemMetrics(SM_CXVSCROLL);
67635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    }
68635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    return thickness;
69635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
70635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
715f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianbool ScrollbarThemeChromiumWin::invalidateOnMouseEnterExit()
72635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
732bde8e466a4451c7319e3a072d118917957d6554Steve Block    return windowsVersion() >= WindowsVista;
74635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
75635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
765f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianbool ScrollbarThemeChromiumWin::shouldSnapBackToDragOrigin(Scrollbar* scrollbar, const PlatformMouseEvent& evt)
775f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian{
785f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    // Find the rect within which we shouldn't snap, by expanding the track rect
795f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    // in both dimensions.
805f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    IntRect rect = trackRect(scrollbar);
815f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    const bool horz = scrollbar->orientation() == HorizontalScrollbar;
825f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    const int thickness = scrollbarThickness(scrollbar->controlSize());
835f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    rect.inflateX((horz ? kOffEndMultiplier : kOffSideMultiplier) * thickness);
845f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    rect.inflateY((horz ? kOffSideMultiplier : kOffEndMultiplier) * thickness);
855f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
865f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    // Convert the event to local coordinates.
875f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    IntPoint mousePosition = scrollbar->convertFromContainingWindow(evt.pos());
885f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    mousePosition.move(scrollbar->x(), scrollbar->y());
895f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
905f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    // We should snap iff the event is outside our calculated rect.
915f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    return !rect.contains(mousePosition);
925f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian}
935f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
945f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianvoid ScrollbarThemeChromiumWin::paintTrackPiece(GraphicsContext* gc, Scrollbar* scrollbar, const IntRect& rect, ScrollbarPart partType)
95635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
96635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    bool horz = scrollbar->orientation() == HorizontalScrollbar;
97635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
98635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    int partId;
99635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (partType == BackTrackPart)
100635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        partId = horz ? SBP_UPPERTRACKHORZ : SBP_UPPERTRACKVERT;
101635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    else
102635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        partId = horz ? SBP_LOWERTRACKHORZ : SBP_LOWERTRACKVERT;
103635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
104635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    IntRect alignRect = trackRect(scrollbar, false);
105635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
106635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // Draw the track area before/after the thumb on the scroll bar.
107ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    PlatformBridge::paintScrollbarTrack(
108635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        gc,
109635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        partId,
110635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        getThemeState(scrollbar, partType),
111635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        getClassicThemeState(scrollbar, partType),
112635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        rect,
113635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        alignRect);
114635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
115635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
1165f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianvoid ScrollbarThemeChromiumWin::paintButton(GraphicsContext* gc, Scrollbar* scrollbar, const IntRect& rect, ScrollbarPart part)
117635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
118635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    bool horz = scrollbar->orientation() == HorizontalScrollbar;
119635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
120635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    int partId;
121635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (part == BackButtonStartPart || part == ForwardButtonStartPart)
122635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        partId = horz ? DFCS_SCROLLLEFT : DFCS_SCROLLUP;
123635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    else
124635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        partId = horz ? DFCS_SCROLLRIGHT : DFCS_SCROLLDOWN;
125635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
126635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // Draw the thumb (the box you drag in the scroll bar to scroll).
127ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    PlatformBridge::paintScrollbarArrow(
128635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        gc,
129635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        getThemeArrowState(scrollbar, part),
130635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        partId | getClassicThemeState(scrollbar, part),
131635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        rect);
132635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
133635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
1345f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianvoid ScrollbarThemeChromiumWin::paintThumb(GraphicsContext* gc, Scrollbar* scrollbar, const IntRect& rect)
135635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
136635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    bool horz = scrollbar->orientation() == HorizontalScrollbar;
137635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
138635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // Draw the thumb (the box you drag in the scroll bar to scroll).
139ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    PlatformBridge::paintScrollbarThumb(
140635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        gc,
141635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        horz ? SBP_THUMBBTNHORZ : SBP_THUMBBTNVERT,
142635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        getThemeState(scrollbar, ThumbPart),
143635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        getClassicThemeState(scrollbar, ThumbPart),
144635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        rect);
145635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
146635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // Draw the gripper (the three little lines on the thumb).
147ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    PlatformBridge::paintScrollbarThumb(
148635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        gc,
149635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        horz ? SBP_GRIPPERHORZ : SBP_GRIPPERVERT,
150635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        getThemeState(scrollbar, ThumbPart),
151635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        getClassicThemeState(scrollbar, ThumbPart),
152635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        rect);
153635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
154635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
1555f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianint ScrollbarThemeChromiumWin::getThemeState(Scrollbar* scrollbar, ScrollbarPart part) const
156635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
157635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // When dragging the thumb, draw thumb pressed and other segments normal
158635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // regardless of where the cursor actually is.  See also four places in
159635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // getThemeArrowState().
160635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (scrollbar->pressedPart() == ThumbPart) {
161635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        if (part == ThumbPart)
162635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            return SCRBS_PRESSED;
1632bde8e466a4451c7319e3a072d118917957d6554Steve Block        return (windowsVersion() < WindowsVista) ? SCRBS_NORMAL : SCRBS_HOVER;
164635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    }
165635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (!scrollbar->enabled())
166635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        return SCRBS_DISABLED;
167635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (scrollbar->hoveredPart() != part || part == BackTrackPart || part == ForwardTrackPart)
1682bde8e466a4451c7319e3a072d118917957d6554Steve Block        return (scrollbar->hoveredPart() == NoPart || (windowsVersion() < WindowsVista)) ? SCRBS_NORMAL : SCRBS_HOVER;
169635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (scrollbar->pressedPart() == NoPart)
170635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        return SCRBS_HOT;
171635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    return (scrollbar->pressedPart() == part) ? SCRBS_PRESSED : SCRBS_NORMAL;
172635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
173635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
1745f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianint ScrollbarThemeChromiumWin::getThemeArrowState(Scrollbar* scrollbar, ScrollbarPart part) const
175635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
176635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // We could take advantage of knowing the values in the state enum to write
177635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // some simpler code, but treating the state enum as a black box seems
178635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // clearer and more future-proof.
179635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (part == BackButtonStartPart || part == ForwardButtonStartPart) {
180635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        if (scrollbar->orientation() == HorizontalScrollbar) {
181635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            if (scrollbar->pressedPart() == ThumbPart)
1822bde8e466a4451c7319e3a072d118917957d6554Steve Block                return (windowsVersion() < WindowsVista) ? ABS_LEFTNORMAL : ABS_LEFTHOVER;
183635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            if (!scrollbar->enabled())
184635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                return ABS_LEFTDISABLED;
185635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            if (scrollbar->hoveredPart() != part)
1862bde8e466a4451c7319e3a072d118917957d6554Steve Block                return ((scrollbar->hoveredPart() == NoPart) || (windowsVersion() < WindowsVista)) ? ABS_LEFTNORMAL : ABS_LEFTHOVER;
187635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            if (scrollbar->pressedPart() == NoPart)
188635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                return ABS_LEFTHOT;
189635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            return (scrollbar->pressedPart() == part) ?
190635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                ABS_LEFTPRESSED : ABS_LEFTNORMAL;
191635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        }
192635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        if (scrollbar->pressedPart() == ThumbPart)
1932bde8e466a4451c7319e3a072d118917957d6554Steve Block            return (windowsVersion() < WindowsVista) ? ABS_UPNORMAL : ABS_UPHOVER;
194635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        if (!scrollbar->enabled())
195635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            return ABS_UPDISABLED;
196635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        if (scrollbar->hoveredPart() != part)
1972bde8e466a4451c7319e3a072d118917957d6554Steve Block            return ((scrollbar->hoveredPart() == NoPart) || (windowsVersion() < WindowsVista)) ? ABS_UPNORMAL : ABS_UPHOVER;
198635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        if (scrollbar->pressedPart() == NoPart)
199635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            return ABS_UPHOT;
200635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        return (scrollbar->pressedPart() == part) ? ABS_UPPRESSED : ABS_UPNORMAL;
201635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    }
202635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (scrollbar->orientation() == HorizontalScrollbar) {
203635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        if (scrollbar->pressedPart() == ThumbPart)
2042bde8e466a4451c7319e3a072d118917957d6554Steve Block            return (windowsVersion() < WindowsVista) ? ABS_RIGHTNORMAL : ABS_RIGHTHOVER;
205635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        if (!scrollbar->enabled())
206635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            return ABS_RIGHTDISABLED;
207635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        if (scrollbar->hoveredPart() != part)
2082bde8e466a4451c7319e3a072d118917957d6554Steve Block            return ((scrollbar->hoveredPart() == NoPart) || (windowsVersion() < WindowsVista)) ? ABS_RIGHTNORMAL : ABS_RIGHTHOVER;
209635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        if (scrollbar->pressedPart() == NoPart)
210635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            return ABS_RIGHTHOT;
211635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        return (scrollbar->pressedPart() == part) ? ABS_RIGHTPRESSED : ABS_RIGHTNORMAL;
212635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    }
213635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (scrollbar->pressedPart() == ThumbPart)
2142bde8e466a4451c7319e3a072d118917957d6554Steve Block        return (windowsVersion() < WindowsVista) ? ABS_DOWNNORMAL : ABS_DOWNHOVER;
215635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (!scrollbar->enabled())
216635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        return ABS_DOWNDISABLED;
217635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (scrollbar->hoveredPart() != part)
2182bde8e466a4451c7319e3a072d118917957d6554Steve Block        return ((scrollbar->hoveredPart() == NoPart) || (windowsVersion() < WindowsVista)) ? ABS_DOWNNORMAL : ABS_DOWNHOVER;
219635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (scrollbar->pressedPart() == NoPart)
220635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        return ABS_DOWNHOT;
221635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    return (scrollbar->pressedPart() == part) ? ABS_DOWNPRESSED : ABS_DOWNNORMAL;
222635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
223635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
2245f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianint ScrollbarThemeChromiumWin::getClassicThemeState(Scrollbar* scrollbar, ScrollbarPart part) const
225635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
226635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // When dragging the thumb, draw the buttons normal even when hovered.
227635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (scrollbar->pressedPart() == ThumbPart)
228635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        return 0;
229635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (!scrollbar->enabled())
230635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        return DFCS_INACTIVE;
231635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (scrollbar->hoveredPart() != part || part == BackTrackPart || part == ForwardTrackPart)
232635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        return 0;
233635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (scrollbar->pressedPart() == NoPart)
234635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        return DFCS_HOT;
235635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    return (scrollbar->pressedPart() == part) ? (DFCS_PUSHED | DFCS_FLAT) : 0;
236635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
237635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
2380bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochbool ScrollbarThemeChromiumWin::shouldCenterOnThumb(Scrollbar*, const PlatformMouseEvent& evt)
2390bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
2400bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return evt.shiftKey() && evt.button() == LeftButton;
2410bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
2420bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
2435f1ab04193ad0130ca8204aadaceae083aca9881Feng QianIntSize ScrollbarThemeChromiumWin::buttonSize(Scrollbar* scrollbar)
2445f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian{
2455f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    // Our desired rect is essentially thickness by thickness.
2465f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
2475f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    // Our actual rect will shrink to half the available space when we have < 2
2485f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    // times thickness pixels left.  This allows the scrollbar to scale down
2495f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    // and function even at tiny sizes.
2505f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
2515f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    int thickness = scrollbarThickness(scrollbar->controlSize());
2525f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
2535f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    // In layout test mode, we force the button "girth" (i.e., the length of
2545f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    // the button along the axis of the scrollbar) to be a fixed size.
2555f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    // FIXME: This is retarded!  scrollbarThickness is already fixed in layout
2565f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    // test mode so that should be enough to result in repeatable results, but
2575f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    // preserving this hack avoids having to rebaseline pixel tests.
2585f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    const int kLayoutTestModeGirth = 17;
259ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    int girth = PlatformBridge::layoutTestMode() ? kLayoutTestModeGirth : thickness;
2605f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
2615f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    if (scrollbar->orientation() == HorizontalScrollbar) {
2625f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        int width = scrollbar->width() < 2 * girth ? scrollbar->width() / 2 : girth;
2635f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        return IntSize(width, thickness);
2645f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    }
2655f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
2665f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    int height = scrollbar->height() < 2 * girth ? scrollbar->height() / 2 : girth;
2675f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    return IntSize(thickness, height);
2685f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian}
2695f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
2705f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
271635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} // namespace WebCore
272