18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
21890130f485b2a3365409653a1b83396a02eed94Andrei Popescu * Copyright 2009, The Android Open Source Project
38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Redistribution and use in source and binary forms, with or without
58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modification, are permitted provided that the following conditions
68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * are met:
78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *  * Redistributions of source code must retain the above copyright
88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *    notice, this list of conditions and the following disclaimer.
98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *  * Redistributions in binary form must reproduce the above copyright
108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *    notice, this list of conditions and the following disclaimer in the
118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *    documentation and/or other materials provided with the distribution.
128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY
148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
161890130f485b2a3365409653a1b83396a02eed94Andrei Popescu * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "config.h"
278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "RenderThemeAndroid.h"
288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
293c8902f607e797e45524ea76cc30ec24c1ed6d2eLeon Scroggins#include "Color.h"
30475b74acddb33a28347804dbb02a585517595f31Andrei Popescu#include "Element.h"
313c8902f607e797e45524ea76cc30ec24c1ed6d2eLeon Scroggins#include "GraphicsContext.h"
32ce5633cace44e557954c70720fac3b47502a6ca5Leon Scroggins#include "HTMLNames.h"
33ce5633cace44e557954c70720fac3b47502a6ca5Leon Scroggins#include "HTMLOptionElement.h"
34ce5633cace44e557954c70720fac3b47502a6ca5Leon Scroggins#include "HTMLSelectElement.h"
35ce5633cace44e557954c70720fac3b47502a6ca5Leon Scroggins#include "Node.h"
363c8902f607e797e45524ea76cc30ec24c1ed6d2eLeon Scroggins#include "PlatformGraphicsContext.h"
377f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard#if ENABLE(VIDEO)
387f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard#include "RenderMediaControls.h"
397f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard#endif
408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "RenderSkinAndroid.h"
418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "RenderSkinButton.h"
428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "RenderSkinCombo.h"
437f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard#include "RenderSkinMediaButton.h"
448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "RenderSkinRadio.h"
458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SkCanvas.h"
467f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard#include "UserAgentStyleSheets.h"
474de82d04a6a82fee6e2d924768e88af58e966982Leon Scroggins#include "WebCoreFrameBridge.h"
488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
490f03a62aac72e7a2e90983f8acc0ccd04de69289Feng Qiannamespace WebCore {
508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
510f03a62aac72e7a2e90983f8acc0ccd04de69289Feng Qian// Add padding to the fontSize of ListBoxes to get their maximum sizes.
520f03a62aac72e7a2e90983f8acc0ccd04de69289Feng Qian// Listboxes often have a specified size.  Since we change them into
530f03a62aac72e7a2e90983f8acc0ccd04de69289Feng Qian// dropdowns, we want a much smaller height, which encompasses the text.
541890130f485b2a3365409653a1b83396a02eed94Andrei Popescuconst int listboxPadding = 5;
558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
56f3a90aec9c4763a497ef64d704da10e9625e0da0Cary Clark// This is the color of selection in a textfield.  It was computed from
57f3a90aec9c4763a497ef64d704da10e9625e0da0Cary Clark// frameworks/base/core/res/res/values/colors.xml, which uses #9983CC39
58f3a90aec9c4763a497ef64d704da10e9625e0da0Cary Clark// (decimal a = 153, r = 131, g = 204, b = 57)
59f3a90aec9c4763a497ef64d704da10e9625e0da0Cary Clark// for all four highlighted text values. Blending this with white yields:
60f3a90aec9c4763a497ef64d704da10e9625e0da0Cary Clark// R = (131 * 153 + 255 * (255 - 153)) / 255  -> 180.6
61f3a90aec9c4763a497ef64d704da10e9625e0da0Cary Clark// G = (204 * 153 + 255 * (255 - 153)) / 255  -> 224.4
62f3a90aec9c4763a497ef64d704da10e9625e0da0Cary Clark// B = ( 57 * 153 + 255 * (255 - 153)) / 255  -> 136.2
63f3a90aec9c4763a497ef64d704da10e9625e0da0Cary Clark
64f3a90aec9c4763a497ef64d704da10e9625e0da0Cary Clarkconst RGBA32 selectionColor = makeRGB(181, 224, 136);
653c8902f607e797e45524ea76cc30ec24c1ed6d2eLeon Scroggins
66ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Blockstatic SkCanvas* getCanvasFromInfo(const PaintInfo& info)
678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return info.context->platformContext()->mCanvas;
698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
714de82d04a6a82fee6e2d924768e88af58e966982Leon Scrogginsstatic android::WebFrame* getWebFrame(const Node* node)
724de82d04a6a82fee6e2d924768e88af58e966982Leon Scroggins{
734de82d04a6a82fee6e2d924768e88af58e966982Leon Scroggins    if (!node)
744de82d04a6a82fee6e2d924768e88af58e966982Leon Scroggins        return 0;
754de82d04a6a82fee6e2d924768e88af58e966982Leon Scroggins    return android::WebFrame::getWebFrame(node->document()->frame());
764de82d04a6a82fee6e2d924768e88af58e966982Leon Scroggins}
774de82d04a6a82fee6e2d924768e88af58e966982Leon Scroggins
788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectRenderTheme* theme()
798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
801890130f485b2a3365409653a1b83396a02eed94Andrei Popescu    DEFINE_STATIC_LOCAL(RenderThemeAndroid, androidTheme, ());
818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return &androidTheme;
828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8401b3621287e7fe5318d3b7d0b74c5810dd717a57Andrei PopescuPassRefPtr<RenderTheme> RenderTheme::themeForPage(Page* page)
8501b3621287e7fe5318d3b7d0b74c5810dd717a57Andrei Popescu{
863b2690e8ce3643c6dab24021df8946fde45fcfe8Andrei Popescu    static RenderTheme* rt = RenderThemeAndroid::create().releaseRef();
873b2690e8ce3643c6dab24021df8946fde45fcfe8Andrei Popescu    return rt;
883b2690e8ce3643c6dab24021df8946fde45fcfe8Andrei Popescu}
893b2690e8ce3643c6dab24021df8946fde45fcfe8Andrei Popescu
903b2690e8ce3643c6dab24021df8946fde45fcfe8Andrei PopescuPassRefPtr<RenderTheme> RenderThemeAndroid::create()
913b2690e8ce3643c6dab24021df8946fde45fcfe8Andrei Popescu{
923b2690e8ce3643c6dab24021df8946fde45fcfe8Andrei Popescu    return adoptRef(new RenderThemeAndroid());
9301b3621287e7fe5318d3b7d0b74c5810dd717a57Andrei Popescu}
9401b3621287e7fe5318d3b7d0b74c5810dd717a57Andrei Popescu
958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectRenderThemeAndroid::RenderThemeAndroid()
968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectRenderThemeAndroid::~RenderThemeAndroid()
1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid RenderThemeAndroid::close()
1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1070f03a62aac72e7a2e90983f8acc0ccd04de69289Feng Qianbool RenderThemeAndroid::stateChanged(RenderObject* obj, ControlState state) const
1088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (CheckedState == state) {
1100f03a62aac72e7a2e90983f8acc0ccd04de69289Feng Qian        obj->repaint();
1118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return true;
1128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return false;
1148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectColor RenderThemeAndroid::platformActiveSelectionBackgroundColor() const
1178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1181890130f485b2a3365409653a1b83396a02eed94Andrei Popescu    return Color(selectionColor);
1198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectColor RenderThemeAndroid::platformInactiveSelectionBackgroundColor() const
1228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1233620888aeeb06e4dd2960323413709461cab663bLeon Scroggins    return Color(Color::transparent);
1248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectColor RenderThemeAndroid::platformActiveSelectionForegroundColor() const
1278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return Color::black;
1298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectColor RenderThemeAndroid::platformInactiveSelectionForegroundColor() const
1328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return Color::black;
1348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectColor RenderThemeAndroid::platformTextSearchHighlightColor() const
1378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1383620888aeeb06e4dd2960323413709461cab663bLeon Scroggins    return Color(Color::transparent);
1398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
141ce5633cace44e557954c70720fac3b47502a6ca5Leon ScrogginsColor RenderThemeAndroid::platformActiveListBoxSelectionBackgroundColor() const
142ce5633cace44e557954c70720fac3b47502a6ca5Leon Scroggins{
143ce5633cace44e557954c70720fac3b47502a6ca5Leon Scroggins    return Color(Color::transparent);
144ce5633cace44e557954c70720fac3b47502a6ca5Leon Scroggins}
145ce5633cace44e557954c70720fac3b47502a6ca5Leon Scroggins
146ce5633cace44e557954c70720fac3b47502a6ca5Leon ScrogginsColor RenderThemeAndroid::platformInactiveListBoxSelectionBackgroundColor() const
147ce5633cace44e557954c70720fac3b47502a6ca5Leon Scroggins{
148ce5633cace44e557954c70720fac3b47502a6ca5Leon Scroggins    return Color(Color::transparent);
149ce5633cace44e557954c70720fac3b47502a6ca5Leon Scroggins}
150ce5633cace44e557954c70720fac3b47502a6ca5Leon Scroggins
151ce5633cace44e557954c70720fac3b47502a6ca5Leon ScrogginsColor RenderThemeAndroid::platformActiveListBoxSelectionForegroundColor() const
152ce5633cace44e557954c70720fac3b47502a6ca5Leon Scroggins{
153ce5633cace44e557954c70720fac3b47502a6ca5Leon Scroggins    return Color(Color::transparent);
154ce5633cace44e557954c70720fac3b47502a6ca5Leon Scroggins}
155ce5633cace44e557954c70720fac3b47502a6ca5Leon Scroggins
156ce5633cace44e557954c70720fac3b47502a6ca5Leon ScrogginsColor RenderThemeAndroid::platformInactiveListBoxSelectionForegroundColor() const
157ce5633cace44e557954c70720fac3b47502a6ca5Leon Scroggins{
158ce5633cace44e557954c70720fac3b47502a6ca5Leon Scroggins    return Color(Color::transparent);
159ce5633cace44e557954c70720fac3b47502a6ca5Leon Scroggins}
160ce5633cace44e557954c70720fac3b47502a6ca5Leon Scroggins
1618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectint RenderThemeAndroid::baselinePosition(const RenderObject* obj) const
1628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // From the description of this function in RenderTheme.h:
1648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // A method to obtain the baseline position for a "leaf" control.  This will only be used if a baseline
1658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // position cannot be determined by examining child content. Checkboxes and radio buttons are examples of
1668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // controls that need to do this.
1678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    //
1688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Our checkboxes and radio buttons need to be offset to line up properly.
169de617918ccc283c8b5f7ad424732cbcc8597c837Leon Scroggins    return RenderTheme::baselinePosition(obj) - 2;
1708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid RenderThemeAndroid::addIntrinsicMargins(RenderStyle* style) const
1738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Cut out the intrinsic margins completely if we end up using a small font size
1758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (style->fontSize() < 11)
1768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
1778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Intrinsic margin value.
1798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const int m = 2;
1808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // FIXME: Using width/height alone and not also dealing with min-width/max-width is flawed.
1828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (style->width().isIntrinsicOrAuto()) {
1838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (style->marginLeft().quirk())
1848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            style->setMarginLeft(Length(m, Fixed));
1858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (style->marginRight().quirk())
1868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            style->setMarginRight(Length(m, Fixed));
1878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (style->height().isAuto()) {
1908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (style->marginTop().quirk())
1918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            style->setMarginTop(Length(m, Fixed));
1928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (style->marginBottom().quirk())
1938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            style->setMarginBottom(Length(m, Fixed));
1948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool RenderThemeAndroid::supportsFocus(ControlPart appearance)
1988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    switch (appearance) {
2000f03a62aac72e7a2e90983f8acc0ccd04de69289Feng Qian    case PushButtonPart:
2010f03a62aac72e7a2e90983f8acc0ccd04de69289Feng Qian    case ButtonPart:
2020f03a62aac72e7a2e90983f8acc0ccd04de69289Feng Qian    case TextFieldPart:
2030f03a62aac72e7a2e90983f8acc0ccd04de69289Feng Qian        return true;
2040f03a62aac72e7a2e90983f8acc0ccd04de69289Feng Qian    default:
2050f03a62aac72e7a2e90983f8acc0ccd04de69289Feng Qian        return false;
2068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return false;
2098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2110f03a62aac72e7a2e90983f8acc0ccd04de69289Feng Qianvoid RenderThemeAndroid::adjustButtonStyle(CSSStyleSelector*, RenderStyle* style, WebCore::Element*) const
2128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
21392294a3b75e1c95eca24f138802e4afed6972517Shimeng (Simon) Wang    // Code is taken from RenderThemeSafari.cpp
2148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // It makes sure we have enough space for the button text.
215bd6002b8c0c128b058995ad1ad2a75719de3d470John Reck    const int paddingHoriz = 12;
216bd6002b8c0c128b058995ad1ad2a75719de3d470John Reck    const int paddingVert = 8;
217bd6002b8c0c128b058995ad1ad2a75719de3d470John Reck    style->setPaddingLeft(Length(paddingHoriz, Fixed));
218bd6002b8c0c128b058995ad1ad2a75719de3d470John Reck    style->setPaddingRight(Length(paddingHoriz, Fixed));
219bd6002b8c0c128b058995ad1ad2a75719de3d470John Reck    style->setPaddingTop(Length(paddingVert, Fixed));
220bd6002b8c0c128b058995ad1ad2a75719de3d470John Reck    style->setPaddingBottom(Length(paddingVert, Fixed));
22192294a3b75e1c95eca24f138802e4afed6972517Shimeng (Simon) Wang
22292294a3b75e1c95eca24f138802e4afed6972517Shimeng (Simon) Wang    // Set a min-height so that we can't get smaller than the mini button.
22392294a3b75e1c95eca24f138802e4afed6972517Shimeng (Simon) Wang    style->setMinHeight(Length(15, Fixed));
2248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
226ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Blockbool RenderThemeAndroid::paintCheckbox(RenderObject* obj, const PaintInfo& info, const IntRect& rect)
2278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2280f03a62aac72e7a2e90983f8acc0ccd04de69289Feng Qian    RenderSkinRadio::Draw(getCanvasFromInfo(info), obj->node(), rect, true);
2298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return false;
2308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
232ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Blockbool RenderThemeAndroid::paintButton(RenderObject* obj, const PaintInfo& info, const IntRect& rect)
2338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // If it is a disabled button, simply paint it to the master picture.
2350f03a62aac72e7a2e90983f8acc0ccd04de69289Feng Qian    Node* node = obj->node();
236475b74acddb33a28347804dbb02a585517595f31Andrei Popescu    Element* formControlElement = static_cast<Element*>(node);
23782ccbd8ce95211b4b5afad6a653462fd3beb771bJohn Reck    if (formControlElement) {
2384de82d04a6a82fee6e2d924768e88af58e966982Leon Scroggins        android::WebFrame* webFrame = getWebFrame(node);
2394de82d04a6a82fee6e2d924768e88af58e966982Leon Scroggins        if (webFrame) {
240ce03c1c1203621e552d41a8b3831837636f364a9Ben Murdoch            RenderSkinAndroid* skins = webFrame->renderSkins();
24182ccbd8ce95211b4b5afad6a653462fd3beb771bJohn Reck            if (skins) {
24282ccbd8ce95211b4b5afad6a653462fd3beb771bJohn Reck                RenderSkinAndroid::State state = RenderSkinAndroid::kNormal;
24382ccbd8ce95211b4b5afad6a653462fd3beb771bJohn Reck                if (!formControlElement->isEnabledFormControl())
24482ccbd8ce95211b4b5afad6a653462fd3beb771bJohn Reck                    state = RenderSkinAndroid::kDisabled;
24582ccbd8ce95211b4b5afad6a653462fd3beb771bJohn Reck                skins->renderSkinButton()->draw(getCanvasFromInfo(info), rect, state);
24682ccbd8ce95211b4b5afad6a653462fd3beb771bJohn Reck            }
2474de82d04a6a82fee6e2d924768e88af58e966982Leon Scroggins        }
24882ccbd8ce95211b4b5afad6a653462fd3beb771bJohn Reck    }
2490bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
2508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // We always return false so we do not request to be redrawn.
2518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return false;
2528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2547f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard#if ENABLE(VIDEO)
2557f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard
2567f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas RoardString RenderThemeAndroid::extraMediaControlsStyleSheet()
2577f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard{
2587f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard      return String(mediaControlsAndroidUserAgentStyleSheet, sizeof(mediaControlsAndroidUserAgentStyleSheet));
2597f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard}
2607f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard
2617f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roardbool RenderThemeAndroid::shouldRenderMediaControlPart(ControlPart part, Element* e)
2627f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard{
2637f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard      HTMLMediaElement* mediaElement = static_cast<HTMLMediaElement*>(e);
2647f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard      switch (part) {
2657f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard      case MediaMuteButtonPart:
2667f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard          return false;
2677f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard      case MediaSeekBackButtonPart:
2687f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard      case MediaSeekForwardButtonPart:
269cc2679391d89b57997f78365d54d99c9ae062db3Nicolas Roard          return false;
2707f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard      case MediaRewindButtonPart:
271b5618de0bdd440dd8567ef1677dc4e514905dc0bTeng-Hui Zhu          return mediaElement->movieLoadType() != MediaPlayer::LiveStream;
2727f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard      case MediaReturnToRealtimeButtonPart:
2737f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard          return mediaElement->movieLoadType() == MediaPlayer::LiveStream;
2747f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard      case MediaFullscreenButtonPart:
2757f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard          return mediaElement->supportsFullscreen();
2767f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard      case MediaToggleClosedCaptionsButtonPart:
2777f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard          return mediaElement->hasClosedCaptions();
2787f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard      default:
2797f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard          return true;
2807f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard      }
2817f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard}
2827f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard
283833c9ceaa300f52cf2d1b12a9b3482ad417a3c21Nicolas Roardbool RenderThemeAndroid::paintMediaFullscreenButton(RenderObject* o, const PaintInfo& paintInfo, const IntRect& rect)
284cc2679391d89b57997f78365d54d99c9ae062db3Nicolas Roard{
285c7eaa372f2a1bece832b0efe7ffed793c8c742c4Nicolas Roard      bool translucent = false;
286c7eaa372f2a1bece832b0efe7ffed793c8c742c4Nicolas Roard      if (o && toParentMediaElement(o) && toParentMediaElement(o)->hasTagName(HTMLNames::videoTag))
287c7eaa372f2a1bece832b0efe7ffed793c8c742c4Nicolas Roard          translucent = true;
288833c9ceaa300f52cf2d1b12a9b3482ad417a3c21Nicolas Roard      RenderSkinMediaButton::Draw(getCanvasFromInfo(paintInfo), rect, RenderSkinMediaButton::FULLSCREEN, translucent);
289cc2679391d89b57997f78365d54d99c9ae062db3Nicolas Roard      return false;
290cc2679391d89b57997f78365d54d99c9ae062db3Nicolas Roard}
291cc2679391d89b57997f78365d54d99c9ae062db3Nicolas Roard
2929130a2f8733ef12edb2608a84469ddc461bed1f6Steve Blockbool RenderThemeAndroid::paintMediaMuteButton(RenderObject* o, const PaintInfo& paintInfo, const IntRect& rect)
2937f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard{
294c7eaa372f2a1bece832b0efe7ffed793c8c742c4Nicolas Roard      bool translucent = false;
295c7eaa372f2a1bece832b0efe7ffed793c8c742c4Nicolas Roard      if (o && toParentMediaElement(o) && toParentMediaElement(o)->hasTagName(HTMLNames::videoTag))
296c7eaa372f2a1bece832b0efe7ffed793c8c742c4Nicolas Roard          translucent = true;
297c7eaa372f2a1bece832b0efe7ffed793c8c742c4Nicolas Roard      RenderSkinMediaButton::Draw(getCanvasFromInfo(paintInfo), rect, RenderSkinMediaButton::MUTE, translucent);
2987f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard      return false;
2997f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard}
3007f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard
3019130a2f8733ef12edb2608a84469ddc461bed1f6Steve Blockbool RenderThemeAndroid::paintMediaPlayButton(RenderObject* o, const PaintInfo& paintInfo, const IntRect& rect)
3027f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard{
303c7eaa372f2a1bece832b0efe7ffed793c8c742c4Nicolas Roard      bool translucent = false;
304c7eaa372f2a1bece832b0efe7ffed793c8c742c4Nicolas Roard      if (o && toParentMediaElement(o) && toParentMediaElement(o)->hasTagName(HTMLNames::videoTag))
305c7eaa372f2a1bece832b0efe7ffed793c8c742c4Nicolas Roard          translucent = true;
3067f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard      if (MediaControlPlayButtonElement* btn = static_cast<MediaControlPlayButtonElement*>(o->node())) {
3077f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard          if (btn->displayType() == MediaPlayButton)
308c7eaa372f2a1bece832b0efe7ffed793c8c742c4Nicolas Roard              RenderSkinMediaButton::Draw(getCanvasFromInfo(paintInfo), rect, RenderSkinMediaButton::PLAY, translucent);
3097f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard          else
310c7eaa372f2a1bece832b0efe7ffed793c8c742c4Nicolas Roard              RenderSkinMediaButton::Draw(getCanvasFromInfo(paintInfo), rect, RenderSkinMediaButton::PAUSE, translucent);
3117f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard          return false;
3127f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard      }
3137f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard      return true;
3147f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard}
3157f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard
3169130a2f8733ef12edb2608a84469ddc461bed1f6Steve Blockbool RenderThemeAndroid::paintMediaSeekBackButton(RenderObject* o, const PaintInfo& paintInfo, const IntRect& rect)
3177f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard{
318c7eaa372f2a1bece832b0efe7ffed793c8c742c4Nicolas Roard      bool translucent = false;
319c7eaa372f2a1bece832b0efe7ffed793c8c742c4Nicolas Roard      if (o && toParentMediaElement(o) && toParentMediaElement(o)->hasTagName(HTMLNames::videoTag))
320c7eaa372f2a1bece832b0efe7ffed793c8c742c4Nicolas Roard          translucent = true;
321c7eaa372f2a1bece832b0efe7ffed793c8c742c4Nicolas Roard      RenderSkinMediaButton::Draw(getCanvasFromInfo(paintInfo), rect, RenderSkinMediaButton::REWIND, translucent);
3227f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard      return false;
3237f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard}
3247f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard
3259130a2f8733ef12edb2608a84469ddc461bed1f6Steve Blockbool RenderThemeAndroid::paintMediaSeekForwardButton(RenderObject* o, const PaintInfo& paintInfo, const IntRect& rect)
3267f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard{
327c7eaa372f2a1bece832b0efe7ffed793c8c742c4Nicolas Roard      bool translucent = false;
328c7eaa372f2a1bece832b0efe7ffed793c8c742c4Nicolas Roard      if (o && toParentMediaElement(o) && toParentMediaElement(o)->hasTagName(HTMLNames::videoTag))
329c7eaa372f2a1bece832b0efe7ffed793c8c742c4Nicolas Roard          translucent = true;
330c7eaa372f2a1bece832b0efe7ffed793c8c742c4Nicolas Roard      RenderSkinMediaButton::Draw(getCanvasFromInfo(paintInfo), rect, RenderSkinMediaButton::FORWARD, translucent);
3317f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard      return false;
3327f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard}
3337f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard
334c7eaa372f2a1bece832b0efe7ffed793c8c742c4Nicolas Roardbool RenderThemeAndroid::paintMediaControlsBackground(RenderObject* o, const PaintInfo& paintInfo, const IntRect& rect)
3357f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard{
336c7eaa372f2a1bece832b0efe7ffed793c8c742c4Nicolas Roard      bool translucent = false;
337c7eaa372f2a1bece832b0efe7ffed793c8c742c4Nicolas Roard      if (o && toParentMediaElement(o) && toParentMediaElement(o)->hasTagName(HTMLNames::videoTag))
338c7eaa372f2a1bece832b0efe7ffed793c8c742c4Nicolas Roard          translucent = true;
339c7eaa372f2a1bece832b0efe7ffed793c8c742c4Nicolas Roard      RenderSkinMediaButton::Draw(getCanvasFromInfo(paintInfo), rect, RenderSkinMediaButton::BACKGROUND_SLIDER, translucent);
3407f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard      return false;
3417f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard}
3427f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard
3439130a2f8733ef12edb2608a84469ddc461bed1f6Steve Blockbool RenderThemeAndroid::paintMediaSliderTrack(RenderObject* o, const PaintInfo& paintInfo, const IntRect& rect)
3447f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard{
345c7eaa372f2a1bece832b0efe7ffed793c8c742c4Nicolas Roard      bool translucent = false;
346c7eaa372f2a1bece832b0efe7ffed793c8c742c4Nicolas Roard      if (o && toParentMediaElement(o) && toParentMediaElement(o)->hasTagName(HTMLNames::videoTag))
347c7eaa372f2a1bece832b0efe7ffed793c8c742c4Nicolas Roard          translucent = true;
3489d867bf3af621a847929fdc13e4c36ffcaa580f2Leon Scroggins      RenderSkinMediaButton::Draw(getCanvasFromInfo(paintInfo), rect,
3499d867bf3af621a847929fdc13e4c36ffcaa580f2Leon Scroggins                                  RenderSkinMediaButton::SLIDER_TRACK, translucent, o);
3507f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard      return false;
3517f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard}
3527f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard
3539130a2f8733ef12edb2608a84469ddc461bed1f6Steve Blockbool RenderThemeAndroid::paintMediaSliderThumb(RenderObject* o, const PaintInfo& paintInfo, const IntRect& rect)
3547f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard{
355c7eaa372f2a1bece832b0efe7ffed793c8c742c4Nicolas Roard      bool translucent = false;
356c7eaa372f2a1bece832b0efe7ffed793c8c742c4Nicolas Roard      if (o && toParentMediaElement(o) && toParentMediaElement(o)->hasTagName(HTMLNames::videoTag))
357c7eaa372f2a1bece832b0efe7ffed793c8c742c4Nicolas Roard          translucent = true;
358c7eaa372f2a1bece832b0efe7ffed793c8c742c4Nicolas Roard      RenderSkinMediaButton::Draw(getCanvasFromInfo(paintInfo), rect, RenderSkinMediaButton::SLIDER_THUMB, translucent);
3597f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard      return false;
3607f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard}
3617f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard
3627f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roardvoid RenderThemeAndroid::adjustSliderThumbSize(RenderObject* o) const
3637f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard{
3647f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard    static const int sliderThumbWidth = RenderSkinMediaButton::sliderThumbWidth();
3657f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard    static const int sliderThumbHeight = RenderSkinMediaButton::sliderThumbHeight();
3667f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard    if (o->style()->appearance() == MediaSliderThumbPart) {
3677f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard        o->style()->setWidth(Length(sliderThumbWidth, Fixed));
3687f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard        o->style()->setHeight(Length(sliderThumbHeight, Fixed));
3697f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard    }
3707f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard}
3717f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard
3727f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard#endif
3737f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard
374ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Blockbool RenderThemeAndroid::paintRadio(RenderObject* obj, const PaintInfo& info, const IntRect& rect)
3758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3760f03a62aac72e7a2e90983f8acc0ccd04de69289Feng Qian    RenderSkinRadio::Draw(getCanvasFromInfo(info), obj->node(), rect, false);
3778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return false;
3788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid RenderThemeAndroid::setCheckboxSize(RenderStyle* style) const
3818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    style->setWidth(Length(19, Fixed));
3838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    style->setHeight(Length(19, Fixed));
3848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid RenderThemeAndroid::setRadioSize(RenderStyle* style) const
3878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // This is the same as checkboxes.
3898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    setCheckboxSize(style);
3908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3920f03a62aac72e7a2e90983f8acc0ccd04de69289Feng Qianvoid RenderThemeAndroid::adjustTextFieldStyle(CSSStyleSelector*, RenderStyle* style, WebCore::Element*) const
3938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addIntrinsicMargins(style);
3958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
397ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Blockbool RenderThemeAndroid::paintTextField(RenderObject*, const PaintInfo&, const IntRect&)
3988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return true;
4008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4020f03a62aac72e7a2e90983f8acc0ccd04de69289Feng Qianvoid RenderThemeAndroid::adjustTextAreaStyle(CSSStyleSelector*, RenderStyle* style, WebCore::Element*) const
4038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addIntrinsicMargins(style);
4058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
407ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Blockbool RenderThemeAndroid::paintTextArea(RenderObject* obj, const PaintInfo& info, const IntRect& rect)
4088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
40982160d9cd33152498ed3f4e701e713c15e50d7e5Leon Scroggins    if (obj->isMenuList())
41082160d9cd33152498ed3f4e701e713c15e50d7e5Leon Scroggins        paintCombo(obj, info, rect);
41182160d9cd33152498ed3f4e701e713c15e50d7e5Leon Scroggins    return true;
4128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4140f03a62aac72e7a2e90983f8acc0ccd04de69289Feng Qianvoid RenderThemeAndroid::adjustSearchFieldStyle(CSSStyleSelector*, RenderStyle* style, Element*) const
4158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addIntrinsicMargins(style);
4178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
419ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Blockbool RenderThemeAndroid::paintSearchField(RenderObject*, const PaintInfo&, const IntRect&)
4208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4212097884b9e1630c3855a8580f84a308163e085e7Leon Scroggins    return true;
4228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
42482160d9cd33152498ed3f4e701e713c15e50d7e5Leon Scrogginsstatic void adjustMenuListStyleCommon(RenderStyle* style)
4258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
426377929b9f78a89a370a95834beb8f32b2ed494b4Leon Clarke    // Added to make room for our arrow and make the touch target less cramped.
427377929b9f78a89a370a95834beb8f32b2ed494b4Leon Clarke    style->setPaddingLeft(Length(RenderSkinCombo::padding(), Fixed));
428377929b9f78a89a370a95834beb8f32b2ed494b4Leon Clarke    style->setPaddingTop(Length(RenderSkinCombo::padding(), Fixed));
429377929b9f78a89a370a95834beb8f32b2ed494b4Leon Clarke    style->setPaddingBottom(Length(RenderSkinCombo::padding(), Fixed));
4308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    style->setPaddingRight(Length(RenderSkinCombo::extraWidth(), Fixed));
431a742a8f1f62517167248dfc0186ee0b845146f56Michael Kolb    style->setMinHeight(Length(RenderSkinCombo::minHeight(), Fixed));
432411b0d686c41482e9934e2b311124109b0311d5fLeon Scroggins}
433411b0d686c41482e9934e2b311124109b0311d5fLeon Scroggins
43482160d9cd33152498ed3f4e701e713c15e50d7e5Leon Scrogginsvoid RenderThemeAndroid::adjustListboxStyle(CSSStyleSelector*, RenderStyle* style, Element*) const
43582160d9cd33152498ed3f4e701e713c15e50d7e5Leon Scroggins{
43682160d9cd33152498ed3f4e701e713c15e50d7e5Leon Scroggins    adjustMenuListButtonStyle(0, style, 0);
43782160d9cd33152498ed3f4e701e713c15e50d7e5Leon Scroggins}
43882160d9cd33152498ed3f4e701e713c15e50d7e5Leon Scroggins
4390f03a62aac72e7a2e90983f8acc0ccd04de69289Feng Qianvoid RenderThemeAndroid::adjustMenuListStyle(CSSStyleSelector*, RenderStyle* style, Element* e) const
440411b0d686c41482e9934e2b311124109b0311d5fLeon Scroggins{
44182160d9cd33152498ed3f4e701e713c15e50d7e5Leon Scroggins    adjustMenuListStyleCommon(style);
4428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addIntrinsicMargins(style);
4438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
445ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Blockbool RenderThemeAndroid::paintCombo(RenderObject* obj, const PaintInfo& info,  const IntRect& rect)
4468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
447605e3841dfeddd1eeaa36441c6bd4ec4667b89e8Steve Block  if (obj->style() && !obj->style()->visitedDependentColor(CSSPropertyBackgroundColor).alpha())
4488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return true;
4493b2690e8ce3643c6dab24021df8946fde45fcfe8Andrei Popescu    return RenderSkinCombo::Draw(getCanvasFromInfo(info), obj->node(), rect.x(), rect.y(), rect.width(), rect.height());
4508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
452ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Blockbool RenderThemeAndroid::paintMenuList(RenderObject* obj, const PaintInfo& info, const IntRect& rect)
4538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4540f03a62aac72e7a2e90983f8acc0ccd04de69289Feng Qian    return paintCombo(obj, info, rect);
4558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
45782160d9cd33152498ed3f4e701e713c15e50d7e5Leon Scrogginsvoid RenderThemeAndroid::adjustMenuListButtonStyle(CSSStyleSelector*,
45882160d9cd33152498ed3f4e701e713c15e50d7e5Leon Scroggins        RenderStyle* style, Element*) const
4598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Copied from RenderThemeSafari.
4618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const float baseFontSize = 11.0f;
4628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const int baseBorderRadius = 5;
4638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    float fontScale = style->fontSize() / baseFontSize;
4648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    style->resetPadding();
4668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    style->setBorderRadius(IntSize(int(baseBorderRadius + fontScale - 1), int(baseBorderRadius + fontScale - 1))); // FIXME: Round up?
4678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const int minHeight = 15;
4698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    style->setMinHeight(Length(minHeight, Fixed));
4708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    style->setLineHeight(RenderStyle::initialLineHeight());
4728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Found these padding numbers by trial and error.
4738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const int padding = 4;
4748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    style->setPaddingTop(Length(padding, Fixed));
4758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    style->setPaddingLeft(Length(padding, Fixed));
47682160d9cd33152498ed3f4e701e713c15e50d7e5Leon Scroggins    adjustMenuListStyleCommon(style);
4778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
479ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Blockbool RenderThemeAndroid::paintMenuListButton(RenderObject* obj, const PaintInfo& info, const IntRect& rect)
4808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4810f03a62aac72e7a2e90983f8acc0ccd04de69289Feng Qian    return paintCombo(obj, info, rect);
4828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool RenderThemeAndroid::supportsFocusRing(const RenderStyle* style) const
4858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4860f03a62aac72e7a2e90983f8acc0ccd04de69289Feng Qian    return style->opacity() > 0
4870f03a62aac72e7a2e90983f8acc0ccd04de69289Feng Qian        && style->hasAppearance()
4880f03a62aac72e7a2e90983f8acc0ccd04de69289Feng Qian        && style->appearance() != TextFieldPart
4890f03a62aac72e7a2e90983f8acc0ccd04de69289Feng Qian        && style->appearance() != SearchFieldPart
4900f03a62aac72e7a2e90983f8acc0ccd04de69289Feng Qian        && style->appearance() != TextAreaPart
4910f03a62aac72e7a2e90983f8acc0ccd04de69289Feng Qian        && style->appearance() != CheckboxPart
4920f03a62aac72e7a2e90983f8acc0ccd04de69289Feng Qian        && style->appearance() != RadioPart
4930f03a62aac72e7a2e90983f8acc0ccd04de69289Feng Qian        && style->appearance() != PushButtonPart
4940f03a62aac72e7a2e90983f8acc0ccd04de69289Feng Qian        && style->appearance() != SquareButtonPart
4950f03a62aac72e7a2e90983f8acc0ccd04de69289Feng Qian        && style->appearance() != ButtonPart
4960f03a62aac72e7a2e90983f8acc0ccd04de69289Feng Qian        && style->appearance() != ButtonBevelPart
4970f03a62aac72e7a2e90983f8acc0ccd04de69289Feng Qian        && style->appearance() != MenulistPart
4980f03a62aac72e7a2e90983f8acc0ccd04de69289Feng Qian        && style->appearance() != MenulistButtonPart;
4990f03a62aac72e7a2e90983f8acc0ccd04de69289Feng Qian}
5000f03a62aac72e7a2e90983f8acc0ccd04de69289Feng Qian
5010f03a62aac72e7a2e90983f8acc0ccd04de69289Feng Qian} // namespace WebCore
502