193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)/*
209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) * Copyright (C) 2010 Google Inc. All rights reserved.
393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) *
493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without
593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) * modification, are permitted provided that the following conditions are
693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) * met:
793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) *
893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) *     * Redistributions of source code must retain the above copyright
993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) * notice, this list of conditions and the following disclaimer.
1093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) *     * Redistributions in binary form must reproduce the above
1193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) * copyright notice, this list of conditions and the following disclaimer
1293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) * in the documentation and/or other materials provided with the
1393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) * distribution.
1493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) *     * Neither the name of Google Inc. nor the names of its
1593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) * contributors may be used to endorse or promote products derived from
1693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) * this software without specific prior written permission.
1793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) *
1893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
2093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
2193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) */
3093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
3193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)#ifndef WebThemeEngine_h
3293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)#define WebThemeEngine_h
3393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
3409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "WebCanvas.h"
3509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "WebColor.h"
3609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "WebSize.h"
3793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
3851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)namespace blink {
3993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
4093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)struct WebRect;
4193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
4209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)// FIXME: crbug.com/327471. We need to merge the Apple and non-Apple implementations.
4309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
4493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)class WebThemeEngine {
4593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)public:
4609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    // The current state of the associated Part.
4709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    enum State {
4809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        StateDisabled,
4909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        StateHover, // non-Apple
5009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        StateNormal, // non-Apple
5109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        StatePressed,
5209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        StateFocused, // non-Apple
5309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        StateReadonly, // non-Apple
5409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        StateInactive, // Apple-specific
5509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        StateActive, // Apple-specific
5609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    };
5709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
5809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    // FIXME: The next section describes stuff only used on the Apple port.
5909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    enum Size {
6009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        SizeRegular,
6109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        SizeSmall,
6209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    };
6309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
6409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    enum ScrollbarOrientation {
6509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        ScrollbarOrientationHorizontal,
6609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        ScrollbarOrientationVertical,
6709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    };
6809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
6909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    enum ScrollbarParent {
7009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        ScrollbarParentScrollView,
7109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        ScrollbarParentRenderLayer,
7209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    };
7309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
7409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    struct ScrollbarInfo {
7509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        ScrollbarOrientation orientation;
7609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        ScrollbarParent parent;
7709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        int maxValue;
7809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        int currentValue;
7909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        int visibleSize;
8009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        int totalSize;
8109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    };
8209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
8309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    virtual void paintScrollbarThumb(WebCanvas*, State, Size, const WebRect&, const ScrollbarInfo&) { }
8409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
8509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    // FIXME: The remaining definitions are only used on the non-Apple ports.
8609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
8793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    // The UI part which is being accessed.
8893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    enum Part {
8993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        // ScrollbarTheme parts
9093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        PartScrollbarDownArrow,
9193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        PartScrollbarLeftArrow,
9293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        PartScrollbarRightArrow,
9393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        PartScrollbarUpArrow,
9493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        PartScrollbarHorizontalThumb,
9593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        PartScrollbarVerticalThumb,
9693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        PartScrollbarHorizontalTrack,
9793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        PartScrollbarVerticalTrack,
9809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        PartScrollbarCorner,
9993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
10093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        // RenderTheme parts
10193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        PartCheckbox,
10293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        PartRadio,
10393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        PartButton,
10493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        PartTextField,
10593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        PartMenuList,
10693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        PartSliderTrack,
10793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        PartSliderThumb,
10893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        PartInnerSpinButton,
10993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        PartProgressBar
11093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    };
11193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
11293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
11393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    // Extra parameters for drawing the PartScrollbarHorizontalTrack and
11493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    // PartScrollbarVerticalTrack.
11593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    struct ScrollbarTrackExtraParams {
11609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        bool isBack; // Whether this is the 'back' part or the 'forward' part.
11709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
11893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        // The bounds of the entire track, as opposed to the part being painted.
11993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        int trackX;
12093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        int trackY;
12193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        int trackWidth;
12293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        int trackHeight;
12393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    };
12493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
12593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    // Extra parameters for PartCheckbox, PartPushButton and PartRadio.
12693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    struct ButtonExtraParams {
12793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        bool checked;
12893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        bool indeterminate; // Whether the button state is indeterminate.
12993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        bool isDefault; // Whether the button is default button.
13093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        bool hasBorder;
13193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        WebColor backgroundColor;
13293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    };
13393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
13493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    // Extra parameters for PartTextField
13593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    struct TextFieldExtraParams {
13693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        bool isTextArea;
13793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        bool isListbox;
13893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        WebColor backgroundColor;
13993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    };
14093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
14193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    // Extra parameters for PartMenuList
14293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    struct MenuListExtraParams {
14393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        bool hasBorder;
14493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        bool hasBorderRadius;
14593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        int arrowX;
14693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        int arrowY;
14709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        int arrowHeight;
14893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        WebColor backgroundColor;
14909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        bool fillContentArea;
15093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    };
15193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
15293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    // Extra parameters for PartSliderTrack and PartSliderThumb
15393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    struct SliderExtraParams {
15493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        bool vertical;
15593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        bool inDrag;
15693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    };
15793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
15893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    // Extra parameters for PartInnerSpinButton
15993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    struct InnerSpinButtonExtraParams {
16093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        bool spinUp;
16193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        bool readOnly;
16293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    };
16393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
16493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    // Extra parameters for PartProgressBar
16593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    struct ProgressBarExtraParams {
16693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        bool determinate;
16793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        int valueRectX;
16893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        int valueRectY;
16993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        int valueRectWidth;
17093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        int valueRectHeight;
17193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    };
17293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
17393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    union ExtraParams {
17493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        ScrollbarTrackExtraParams scrollbarTrack;
17593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        ButtonExtraParams button;
17693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        TextFieldExtraParams textField;
17793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        MenuListExtraParams menuList;
17893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        SliderExtraParams slider;
17993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        InnerSpinButtonExtraParams innerSpin;
18093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        ProgressBarExtraParams progressBar;
18193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    };
18293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
18393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    // Gets the size of the given theme part. For variable sized items
18493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    // like vertical scrollbar thumbs, the width will be the required width of
18593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    // the track while the height will be the minimum height.
18693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    virtual WebSize getSize(Part) { return WebSize(); }
18793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    // Paint the given the given theme part.
18893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    virtual void paint(WebCanvas*, Part, State, const WebRect&, const ExtraParams*) { }
18993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)};
19093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
19151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)} // namespace blink
19293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
19393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)#endif
194